Lines Matching +full:mx +full:- +full:specific
2 * Copyright (c) 1995 - 2006 Kungliga Tekniska Högskolan
19 * without specific prior written permission.
67 DECL(mx),
85 for(p = stot; p->name; p++) in rk_dns_string_to_type()
86 if(strcasecmp(name, p->name) == 0) in rk_dns_string_to_type()
87 return p->type; in rk_dns_string_to_type()
88 return -1; in rk_dns_string_to_type()
95 for(p = stot; p->name; p++) in rk_dns_type_to_string()
96 if(type == p->type) in rk_dns_type_to_string()
97 return p->name; in rk_dns_type_to_string()
106 if(rr->domain) in dns_free_rr()
107 free(rr->domain); in dns_free_rr()
108 if(rr->u.data) in dns_free_rr()
109 free(rr->u.data); in dns_free_rr()
117 if(r->q.domain) in rk_dns_free_data()
118 free(r->q.domain); in rk_dns_free_data()
119 for(rr = r->head; rr;){ in rk_dns_free_data()
121 rr = rr->next; in rk_dns_free_data()
144 return -1; in parse_record()
146 return -1; in parse_record()
159 return -1; in parse_record()
163 return -1; in parse_record()
164 rr->domain = strdup(host); in parse_record()
165 if(rr->domain == NULL) { in parse_record()
167 return -1; in parse_record()
169 rr->type = type; in parse_record()
170 rr->class = class; in parse_record()
171 rr->ttl = ttl; in parse_record()
172 rr->size = size; in parse_record()
180 return -1; in parse_record()
182 rr->u.txt = strdup(host); in parse_record()
183 if(rr->u.txt == NULL) { in parse_record()
185 return -1; in parse_record()
195 return -1; in parse_record()
199 return -1; in parse_record()
203 rr->u.mx = (struct mx_record*)malloc(sizeof(struct mx_record) + in parse_record()
205 if(rr->u.mx == NULL) { in parse_record()
207 return -1; in parse_record()
209 rr->u.mx->preference = (p[0] << 8) | p[1]; in parse_record()
210 strlcpy(rr->u.mx->domain, host, hostlen + 1); in parse_record()
218 return -1; in parse_record()
222 return -1; in parse_record()
226 rr->u.srv = in parse_record()
229 if(rr->u.srv == NULL) { in parse_record()
231 return -1; in parse_record()
233 rr->u.srv->priority = (p[0] << 8) | p[1]; in parse_record()
234 rr->u.srv->weight = (p[2] << 8) | p[3]; in parse_record()
235 rr->u.srv->port = (p[4] << 8) | p[5]; in parse_record()
236 strlcpy(rr->u.srv->target, host, hostlen + 1); in parse_record()
242 return -1; in parse_record()
244 rr->u.txt = (char*)malloc(*p + 1); in parse_record()
245 if(rr->u.txt == NULL) { in parse_record()
247 return -1; in parse_record()
249 strncpy(rr->u.txt, (const char*)(p + 1), *p); in parse_record()
250 rr->u.txt[*p] = '\0'; in parse_record()
258 return -1; in parse_record()
261 key_len = size - 4; in parse_record()
262 rr->u.key = malloc (sizeof(*rr->u.key) + key_len - 1); in parse_record()
263 if (rr->u.key == NULL) { in parse_record()
265 return -1; in parse_record()
268 rr->u.key->flags = (p[0] << 8) | p[1]; in parse_record()
269 rr->u.key->protocol = p[2]; in parse_record()
270 rr->u.key->algorithm = p[3]; in parse_record()
271 rr->u.key->key_len = key_len; in parse_record()
272 memcpy (rr->u.key->key_data, p + 4, key_len); in parse_record()
280 return -1; in parse_record()
285 return -1; in parse_record()
289 return -1; in parse_record()
294 includes the zero-termination if the structure itself. in parse_record()
297 sig_len = size - 18 - status; in parse_record()
299 rr->u.sig = malloc(sizeof(*rr->u.sig) in parse_record()
301 if (rr->u.sig == NULL) { in parse_record()
303 return -1; in parse_record()
305 rr->u.sig->type = (p[0] << 8) | p[1]; in parse_record()
306 rr->u.sig->algorithm = p[2]; in parse_record()
307 rr->u.sig->labels = p[3]; in parse_record()
308 rr->u.sig->orig_ttl = (p[4] << 24) | (p[5] << 16) in parse_record()
310 rr->u.sig->sig_expiration = (p[8] << 24) | (p[9] << 16) in parse_record()
312 rr->u.sig->sig_inception = (p[12] << 24) | (p[13] << 16) in parse_record()
314 rr->u.sig->key_tag = (p[16] << 8) | p[17]; in parse_record()
315 rr->u.sig->sig_len = sig_len; in parse_record()
316 memcpy (rr->u.sig->sig_data, p + 18 + status, sig_len); in parse_record()
317 rr->u.sig->signer = &rr->u.sig->sig_data[sig_len]; in parse_record()
318 strlcpy(rr->u.sig->signer, host, hostlen + 1); in parse_record()
327 return -1; in parse_record()
330 cert_len = size - 5; in parse_record()
331 rr->u.cert = malloc (sizeof(*rr->u.cert) + cert_len - 1); in parse_record()
332 if (rr->u.cert == NULL) { in parse_record()
334 return -1; in parse_record()
337 rr->u.cert->type = (p[0] << 8) | p[1]; in parse_record()
338 rr->u.cert->tag = (p[2] << 8) | p[3]; in parse_record()
339 rr->u.cert->algorithm = p[4]; in parse_record()
340 rr->u.cert->cert_len = cert_len; in parse_record()
341 memcpy (rr->u.cert->cert_data, p + 5, cert_len); in parse_record()
349 return -1; in parse_record()
352 sshfp_len = size - 2; in parse_record()
354 rr->u.sshfp = malloc (sizeof(*rr->u.sshfp) + sshfp_len - 1); in parse_record()
355 if (rr->u.sshfp == NULL) { in parse_record()
357 return -1; in parse_record()
360 rr->u.sshfp->algorithm = p[0]; in parse_record()
361 rr->u.sshfp->type = p[1]; in parse_record()
362 rr->u.sshfp->sshfp_len = sshfp_len; in parse_record()
363 memcpy (rr->u.sshfp->sshfp_data, p + 2, sshfp_len); in parse_record()
371 return -1; in parse_record()
374 digest_len = size - 4; in parse_record()
376 rr->u.ds = malloc (sizeof(*rr->u.ds) + digest_len - 1); in parse_record()
377 if (rr->u.ds == NULL) { in parse_record()
379 return -1; in parse_record()
382 rr->u.ds->key_tag = (p[0] << 8) | p[1]; in parse_record()
383 rr->u.ds->algorithm = p[2]; in parse_record()
384 rr->u.ds->digest_type = p[3]; in parse_record()
385 rr->u.ds->digest_len = digest_len; in parse_record()
386 memcpy (rr->u.ds->digest_data, p + 4, digest_len); in parse_record()
390 rr->u.data = (unsigned char*)malloc(size); in parse_record()
391 if(size != 0 && rr->u.data == NULL) { in parse_record()
393 return -1; in parse_record()
396 memcpy(rr->u.data, p, size); in parse_record()
424 r->h.id = (p[0] << 8) | p[1]; in parse_reply()
425 r->h.flags = 0; in parse_reply()
427 r->h.flags |= rk_DNS_HEADER_RESPONSE_FLAG; in parse_reply()
428 r->h.opcode = (p[2] >> 1) & 0xf; in parse_reply()
430 r->h.flags |= rk_DNS_HEADER_AUTHORITIVE_ANSWER; in parse_reply()
432 r->h.flags |= rk_DNS_HEADER_TRUNCATED_MESSAGE; in parse_reply()
434 r->h.flags |= rk_DNS_HEADER_RECURSION_DESIRED; in parse_reply()
436 r->h.flags |= rk_DNS_HEADER_RECURSION_AVAILABLE; in parse_reply()
438 r->h.flags |= rk_DNS_HEADER_AUTHORITIVE_ANSWER; in parse_reply()
440 r->h.flags |= rk_DNS_HEADER_CHECKING_DISABLED; in parse_reply()
441 r->h.response_code = (p[3] >> 4) & 0xf; in parse_reply()
442 r->h.qdcount = (p[4] << 8) | p[5]; in parse_reply()
443 r->h.ancount = (p[6] << 8) | p[7]; in parse_reply()
444 r->h.nscount = (p[8] << 8) | p[9]; in parse_reply()
445 r->h.arcount = (p[10] << 8) | p[11]; in parse_reply()
449 if(r->h.qdcount != 1) { in parse_reply()
458 r->q.domain = strdup(host); in parse_reply()
459 if(r->q.domain == NULL) { in parse_reply()
468 r->q.type = (p[0] << 8 | p[1]); in parse_reply()
470 r->q.class = (p[0] << 8 | p[1]); in parse_reply()
473 rr = &r->head; in parse_reply()
474 for(i = 0; i < r->h.ancount; i++) { in parse_reply()
479 rr = &(*rr)->next; in parse_reply()
481 for(i = 0; i < r->h.nscount; i++) { in parse_reply()
486 rr = &(*rr)->next; in parse_reply()
488 for(i = 0; i < r->h.arcount; i++) { in parse_reply()
493 rr = &(*rr)->next; in parse_reply()
568 fprintf(stderr, "dns_lookup(%s, %d, %s) --> %d\n", in dns_lookup_int()
604 if(type == -1) { in rk_dns_lookup()
620 if((*aa)->u.srv->priority == (*bb)->u.srv->priority) in compare_srv()
621 return ((*aa)->u.srv->weight - (*bb)->u.srv->weight); in compare_srv()
622 return ((*aa)->u.srv->priority - (*bb)->u.srv->priority); in compare_srv()
625 /* try to rearrange the srv-records by the algorithm in RFC2782 */
635 for(rr = r->head; rr; rr = rr->next) in rk_dns_srv_order()
636 if(rr->type == rk_ns_t_srv) in rk_dns_srv_order()
646 /* unlink all srv-records from the linked list and put them in in rk_dns_srv_order()
648 for(ss = srvs, headp = &r->head; *headp; ) in rk_dns_srv_order()
649 if((*headp)->type == rk_ns_t_srv) { in rk_dns_srv_order()
651 *headp = (*headp)->next; in rk_dns_srv_order()
652 (*ss)->next = NULL; in rk_dns_srv_order()
655 headp = &(*headp)->next; in rk_dns_srv_order()
660 headp = &r->head; in rk_dns_srv_order()
669 if((*tt)->u.srv->priority != (*ss)->u.srv->priority) in rk_dns_srv_order()
671 sum += (*tt)->u.srv->weight; in rk_dns_srv_order()
681 count += (*tt)->u.srv->weight; in rk_dns_srv_order()
690 (*tt)->next = *headp; in rk_dns_srv_order()
692 headp = &(*tt)->next; in rk_dns_srv_order()
693 sum -= (*tt)->u.srv->weight; in rk_dns_srv_order()
718 rr->domain = strdup(pRec->pName); in parse_dns_record()
719 rr->type = pRec->wType; in parse_dns_record()
720 rr->class = 0; in parse_dns_record()
721 rr->ttl = pRec->dwTtl; in parse_dns_record()
722 rr->size = 0; in parse_dns_record()
724 switch (rr->type) { in parse_dns_record()
728 rr->u.txt = strdup(pRec->Data.NS.pNameHost); in parse_dns_record()
729 if(rr->u.txt == NULL) { in parse_dns_record()
737 size_t hostlen = strnlen(pRec->Data.MX.pNameExchange, DNS_MAX_NAME_LENGTH); in parse_dns_record()
739 rr->u.mx = (struct mx_record *)malloc(sizeof(struct mx_record) + in parse_dns_record()
741 if (rr->u.mx == NULL) { in parse_dns_record()
746 strcpy_s(rr->u.mx->domain, hostlen + 1, pRec->Data.MX.pNameExchange); in parse_dns_record()
747 rr->u.mx->preference = pRec->Data.MX.wPreference; in parse_dns_record()
752 size_t hostlen = strnlen(pRec->Data.SRV.pNameTarget, DNS_MAX_NAME_LENGTH); in parse_dns_record()
754 rr->u.srv = in parse_dns_record()
757 if(rr->u.srv == NULL) { in parse_dns_record()
762 rr->u.srv->priority = pRec->Data.SRV.wPriority; in parse_dns_record()
763 rr->u.srv->weight = pRec->Data.SRV.wWeight; in parse_dns_record()
764 rr->u.srv->port = pRec->Data.SRV.wPort; in parse_dns_record()
765 strcpy_s(rr->u.srv->target, hostlen + 1, pRec->Data.SRV.pNameTarget); in parse_dns_record()
773 if (pRec->Data.TXT.dwStringCount == 0) { in parse_dns_record()
774 rr->u.txt = strdup(""); in parse_dns_record()
778 len = strnlen(pRec->Data.TXT.pStringArray[0], DNS_MAX_TEXT_STRING_LENGTH); in parse_dns_record()
780 rr->u.txt = (char *)malloc(len + 1); in parse_dns_record()
781 strcpy_s(rr->u.txt, len + 1, pRec->Data.TXT.pStringArray[0]); in parse_dns_record()
789 if (pRec->wDataLength < 4) { in parse_dns_record()
794 key_len = pRec->wDataLength - 4; in parse_dns_record()
795 rr->u.key = malloc (sizeof(*rr->u.key) + key_len - 1); in parse_dns_record()
796 if (rr->u.key == NULL) { in parse_dns_record()
801 rr->u.key->flags = pRec->Data.KEY.wFlags; in parse_dns_record()
802 rr->u.key->protocol = pRec->Data.KEY.chProtocol; in parse_dns_record()
803 rr->u.key->algorithm = pRec->Data.KEY.chAlgorithm; in parse_dns_record()
804 rr->u.key->key_len = key_len; in parse_dns_record()
805 memcpy_s (rr->u.key->key_data, key_len, in parse_dns_record()
806 pRec->Data.KEY.Key, key_len); in parse_dns_record()
813 if(pRec->wDataLength <= 18) { in parse_dns_record()
818 sig_len = pRec->wDataLength; in parse_dns_record()
820 hostlen = strnlen(pRec->Data.SIG.pNameSigner, DNS_MAX_NAME_LENGTH); in parse_dns_record()
822 rr->u.sig = malloc(sizeof(*rr->u.sig) in parse_dns_record()
824 if (rr->u.sig == NULL) { in parse_dns_record()
828 rr->u.sig->type = pRec->Data.SIG.wTypeCovered; in parse_dns_record()
829 rr->u.sig->algorithm = pRec->Data.SIG.chAlgorithm; in parse_dns_record()
830 rr->u.sig->labels = pRec->Data.SIG.chLabelCount; in parse_dns_record()
831 rr->u.sig->orig_ttl = pRec->Data.SIG.dwOriginalTtl; in parse_dns_record()
832 rr->u.sig->sig_expiration = pRec->Data.SIG.dwExpiration; in parse_dns_record()
833 rr->u.sig->sig_inception = pRec->Data.SIG.dwTimeSigned; in parse_dns_record()
834 rr->u.sig->key_tag = pRec->Data.SIG.wKeyTag; in parse_dns_record()
835 rr->u.sig->sig_len = sig_len; in parse_dns_record()
836 memcpy_s (rr->u.sig->sig_data, sig_len, in parse_dns_record()
837 pRec->Data.SIG.Signature, sig_len); in parse_dns_record()
838 rr->u.sig->signer = &rr->u.sig->sig_data[sig_len]; in parse_dns_record()
839 strcpy_s(rr->u.sig->signer, hostlen + 1, pRec->Data.SIG.pNameSigner); in parse_dns_record()
845 rr->u.ds = malloc (sizeof(*rr->u.ds) + pRec->Data.DS.wDigestLength - 1); in parse_dns_record()
846 if (rr->u.ds == NULL) { in parse_dns_record()
851 rr->u.ds->key_tag = pRec->Data.DS.wKeyTag; in parse_dns_record()
852 rr->u.ds->algorithm = pRec->Data.DS.chAlgorithm; in parse_dns_record()
853 rr->u.ds->digest_type = pRec->Data.DS.chDigestType; in parse_dns_record()
854 rr->u.ds->digest_len = pRec->Data.DS.wDigestLength; in parse_dns_record()
855 memcpy_s (rr->u.ds->digest_data, pRec->Data.DS.wDigestLength, in parse_dns_record()
856 pRec->Data.DS.Digest, pRec->Data.DS.wDigestLength); in parse_dns_record()
866 rr->next = parse_dns_record(pRec->pNext); in parse_dns_record()
881 if(type == -1) { in rk_dns_lookup()
894 r->q.domain = strdup(domain); in rk_dns_lookup()
895 r->q.type = type; in rk_dns_lookup()
896 r->q.class = 0; in rk_dns_lookup()
898 r->head = parse_dns_record(pRec); in rk_dns_lookup()
900 if (r->head == NULL) { in rk_dns_lookup()