static void handle_query_response(DNSServiceRef sdr, ipc_msg_hdr *hdr, char *data) { DNSServiceFlags flags; uint32_t interfaceIndex, ttl; DNSServiceErrorType errorCode; char name[kDNSServiceMaxDomainName]; uint16_t rrtype, rrclass, rdlen; char *rdata; int str_error = 0; (void)hdr;//Unused flags = get_flags(&data); interfaceIndex = get_long(&data); errorCode = get_error_code(&data); if (get_string(&data, name, kDNSServiceMaxDomainName) < 0) str_error = 1; rrtype = get_short(&data); rrclass = get_short(&data); rdlen = get_short(&data); rdata = get_rdata(&data, rdlen); ttl = get_long(&data); if (!errorCode && str_error) errorCode = kDNSServiceErr_Unknown; ((DNSServiceQueryRecordReply)sdr->app_callback)(sdr, flags, interfaceIndex, errorCode, name, rrtype, rrclass, rdlen, rdata, ttl, sdr->app_context); return; }
static void handle_resolve_response(DNSServiceRef sdr, ipc_msg_hdr *hdr, char *data) { DNSServiceFlags flags; char fullname[kDNSServiceMaxDomainName]; char target[kDNSServiceMaxDomainName]; uint16_t txtlen; union { uint16_t s; u_char b[2]; } port; uint32_t ifi; DNSServiceErrorType err; unsigned char *txtrecord; int str_error = 0; (void)hdr; //unused flags = get_flags(&data); ifi = get_long(&data); err = get_error_code(&data); if (get_string(&data, fullname, kDNSServiceMaxDomainName) < 0) str_error = 1; if (get_string(&data, target, kDNSServiceMaxDomainName) < 0) str_error = 1; port.b[0] = *data++; port.b[1] = *data++; txtlen = get_short(&data); txtrecord = (unsigned char *)get_rdata(&data, txtlen); if (!err && str_error) err = kDNSServiceErr_Unknown; ((DNSServiceResolveReply)sdr->app_callback)(sdr, flags, ifi, err, fullname, target, port.s, txtlen, txtrecord, sdr->app_context); }
static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int rrsetidx, unsigned char **rrset, char *buff1, char *buff2) { int swap, quit, i; do { for (swap = 0, i = 0; i < rrsetidx-1; i++) { int rdlen1, rdlen2, left1, left2, len1, len2, len, rc; u16 *dp1, *dp2; unsigned char *end1, *end2; unsigned char *p1 = skip_name(rrset[i], header, plen, 10); unsigned char *p2 = skip_name(rrset[i+1], header, plen, 10); p1 += 8; /* skip class, type, ttl */ GETSHORT(rdlen1, p1); end1 = p1 + rdlen1; p2 += 8; /* skip class, type, ttl */ GETSHORT(rdlen2, p2); end2 = p2 + rdlen2; dp1 = dp2 = rr_desc; for (quit = 0, left1 = 0, left2 = 0, len1 = 0, len2 = 0; !quit;) { if (left1 != 0) memmove(buff1, buff1 + len1 - left1, left1); if ((len1 = get_rdata(header, plen, end1, buff1 + left1, &p1, &dp1)) == 0) { quit = 1; len1 = end1 - p1; memcpy(buff1 + left1, p1, len1); } len1 += left1; if (left2 != 0) memmove(buff2, buff2 + len2 - left2, left2); if ((len2 = get_rdata(header, plen, end2, buff2 + left2, &p2, &dp2)) == 0) { quit = 1; len2 = end2 - p2; memcpy(buff2 + left2, p2, len2); } len2 += left2; if (len1 > len2) left1 = len1 - len2, left2 = 0, len = len2; else left2 = len2 - len1, left1 = 0, len = len1; rc = memcmp(buff1, buff2, len); if (rc == 1 || (rc == 0 && quit && len1 > len2)) { unsigned char *tmp = rrset[i+1]; rrset[i+1] = rrset[i]; rrset[i] = tmp; swap = quit = 1; } } } } while (swap); }