use diagnostics; use strict; # This is dumb, but glibc doesn't like to do hostname lookups w/o libc.so #TODO TODO sub doQuery { # my ($query, $queryType, $domainName, $ipNum) = @_; # # _res.retry = 2; # # len = res_search(query, C_IN, queryType, (void *) &response, # sizeof(response)); # if (len <= 0) return -1; # # if (ntohs(response.hdr.rcode) != NOERROR) return -1; # ancount = ntohs(response.hdr.ancount); # if (ancount < 1) return -1; # # data = response.buf + sizeof(HEADER); # end = response.buf + len; # # # skip the question # data += dn_skipname(data, end) + QFIXEDSZ; # # # parse the answer(s) # while (--ancount >= 0 && data < end) { # # # skip the domain name portion of the RR record # data += dn_skipname(data, end); # # # get RR information # GETSHORT(type, data); # data += INT16SZ; # skipp class # data += INT32SZ; # skipp TTL # GETSHORT(len, data); # # if (type == T_PTR) { # # we got a pointer # len = dn_expand(response.buf, end, data, name, sizeof(name)); # if (len <= 0) return -1; # if (queryType == T_PTR && domainName) { # # we wanted a pointer # *domainName = malloc(strlen(name) + 1); # strcpy(*domainName, name); # return 0; # } # } else if (type == T_A) { # # we got an address # if (queryType == T_A && ipNum) { # # we wanted an address # memcpy(ipNum, data, sizeof(*ipNum)); # return 0; # } # } # # # move ahead to next RR # data += len; # } # # return -1; }