Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does gcc/cygwin get the DNS server?

I have some code I'm writing under cygwin (using GCC) that successfully uses gethostbyname(); however when I try to use the resolver directly to retrieve the IP address of the DNS server it fails (all entries in nsaddr_list[] are null and nscount is -1). If gethostbyname() is working, then obviously it is able to connect to the DNS server.
This code...

    if (res_init() == -1) {
        fprintf(stderr,"res_init() failed\n");
        exit(1);
    }

    if (_res.nscount <= 0) {
        fprintf(stderr,"nscount = %d\n",_res.nscount);
    }
    else {
        for(i=0;i<_res.nscount;i++) {
            fprintf(stderr, "dnssrvr: %d.%d.%d.%d\n",
                (_res.nsaddr_list[i].sin_addr.s_addr & 0xff) >> 0,
                (_res.nsaddr_list[i].sin_addr.s_addr & 0xff00) >> 8,
                (_res.nsaddr_list[i].sin_addr.s_addr & 0xff0000) >> 16,
                (_res.nsaddr_list[i].sin_addr.s_addr & 0xff000000) >> 24);
        }
    }

works on unix/linux, but returns nscount=-1 on cygwin. Is there some trick to getting the DNS server when using cygwin/gcc?

like image 281
Ed. Avatar asked May 09 '12 20:05

Ed.


1 Answers

res_init does not necessarily populate _res.nsaddr_list. Instead, on Windows it directs the resolver to use DnsQuery_A, unless you have the resolv.conf file, in which case DNS servers from that file are used.

See the source here, files minires.c and minires-os-if.c.

If you need to know your DNS servers, you probably have to use DnsQueryConfig or GetNetworkParams.

NB: _res is undocumented and should not be used.

UPDATE Apparently the "newer" (ca 2010 and later) versions of cygwin do populate _res.nsaddr_list, via a call to get_dns_info and then get_registry_dns. You may want to make sure that you have the newest cygwin, and if the problem persists, try to use a debug version and trace calls to the mentioned functions.

UPDATE 2 No, _res is not populated, my mistake.

like image 114
n. 1.8e9-where's-my-share m. Avatar answered Oct 03 '22 06:10

n. 1.8e9-where's-my-share m.