#include #include #include #include #include #include #include #include /* This is dumb, but glibc doesn't like to do hostname lookups w/o libc.so */ union dns_response{ HEADER hdr; u_char buf[PACKETSZ]; } ; static int doQuery(char * query, int queryType, char ** domainName, struct in_addr * ipNum) { int rc, len; u_char * data, * end; char name[MAXDNAME]; union dns_response response; _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; if (ntohs(response.hdr.ancount) != 1) return -1; data = response.buf + sizeof(HEADER); end = response.buf + len; /* skip the question */ data += dn_skipname(data, end) + QFIXEDSZ; /* skip the domain name portion of the RR record */ data += dn_skipname(data, end); /* skip the fixed RR data */ data += RRFIXEDSZ; if (queryType == T_PTR && domainName) { if ((rc = dn_expand(response.buf, end, data, name, sizeof(name))) <= 0) return -1; if (domainName) { *domainName = malloc(strlen(name) + 1); strcpy(*domainName, name); } } if (ipNum && queryType == T_A) { memcpy(ipNum, data, sizeof(*ipNum)); } return 0; } char * mygethostbyaddr(char * ipnum) { int rc; char * result; char * strbuf; char * chptr; char * splits[4]; int i; _res.retry = 1; strbuf = alloca(strlen(ipnum) + 1); strcpy(strbuf, ipnum); ipnum = alloca(strlen(strbuf) + 20); for (i = 0; i < 4; i++) { chptr = strbuf; while (*chptr && *chptr != '.') chptr++; *chptr = '\0'; if (chptr - strbuf > 3) return NULL; splits[i] = strbuf; strbuf = chptr + 1; } sprintf(ipnum, "%s.%s.%s.%s.in-addr.arpa", splits[3], splits[2], splits[1], splits[0]); rc = doQuery(ipnum, T_PTR, &result, NULL); if (rc) return NULL; else return result; } int mygethostbyname(char * name, struct in_addr * addr) { return doQuery(name, T_A, NULL, addr); }