Link to home
Start Free TrialLog in
Avatar of Dr. Klahn
Dr. Klahn

asked on

Setting nameservers after res_init fails doing res_query

I have an Apache module which needs to find the "real" IP address of its host.  This became an issue after my own server went behind a firewall; the previous use of gethostbyname then returned 192.168.0.x rather than the "real" address.

I found some code that looked likely and wrote a short test program, below.

Unfortunately the results indicate that it is using the default nameservers from resolv.conf, not the nameservers loaded into _res.nsaddr_list after the call to res_init.  This was called out as an issue in the original code, but the original solution (a "dummy" call to res_query) does not work on my system.

Can someone suggest where the problem lies?


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <resolv.h>
#include <netdb.h>

#define N 4096

/* --------------------------------- */
/* CODE BEGINS                       */
/* --------------------------------- */

int main (int argc, char *argv[]) {
    u_char nsbuf[N];
    char dispbuf[N];
    ns_msg msg;
    ns_rr rr;
    int i, l;

    if (argc < 2) {
        printf ("Usage: %s <domain>\n", argv[0]);
        exit (1);
    }

/* Initialize to use the Google nameservers */
     res_init();
     _res.nscount = 2;
     _res.nsaddr_list[0].sin_family = AF_INET;
     _res.nsaddr_list[0].sin_addr.s_addr = inet_addr ("8.8.8.8");
     _res.nsaddr_list[0].sin_port = htons(53);
     _res.nsaddr_list[1].sin_family = AF_INET;
     _res.nsaddr_list[1].sin_addr.s_addr = inet_addr ("8.8.4.4");
     _res.nsaddr_list[1].sin_port = htons(53);

    printf("Domain : %s\n", argv[1]);

 /* Print the A record return or the error code */
    printf("A records : \n");
    l = res_query(argv[1], ns_c_any, ns_t_a, nsbuf, sizeof(nsbuf));
    if (l < 0) perror(argv[1]);
    ns_initparse(nsbuf, l, &msg);
    l = ns_msg_count(msg, ns_s_an);
    for (i = 0; i < l; i++)
    {
      ns_parserr(&msg, ns_s_an, i, &rr);
      ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
      printf("\t%s \n", dispbuf);
    }


    // NS RECORD
    printf("NS records : \n");
    l = res_query(argv[1], ns_c_any, ns_t_ns, nsbuf, sizeof(nsbuf));
    if (l < 0)
    {
      perror(argv[1]);
    }
    ns_initparse(nsbuf, l, &msg);
    l = ns_msg_count(msg, ns_s_an);
    for (i = 0; i < l; i++)
    {
      ns_parserr(&msg, ns_s_an, 0, &rr);
      ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
      printf("\t%s \n", dispbuf);
    }
    // ---------
    return 0;
}

Open in new window


sysmgr@www:~$ ./a.out www.*******.com
Domain : www.*******.com
A records :
        www.*******.com.           6H IN A         192.168.0.209
NS records :
        www.*******.com.           6H IN NS        localhost.

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Dr. Klahn
Dr. Klahn

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Dr. Klahn
Dr. Klahn

ASKER

Manual close.  No solution found.