1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
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;
}
|