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?
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;
}
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.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER