diff options
Diffstat (limited to 'src/lib/libc')
| -rw-r--r-- | src/lib/libc/net/getrrsetbyname.c | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/src/lib/libc/net/getrrsetbyname.c b/src/lib/libc/net/getrrsetbyname.c index 76ca9ac6b7..bc4b88bbbd 100644 --- a/src/lib/libc/net/getrrsetbyname.c +++ b/src/lib/libc/net/getrrsetbyname.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: getrrsetbyname.c,v 1.2 2001/08/06 15:00:48 jakob Exp $ */ | 1 | /* $OpenBSD: getrrsetbyname.c,v 1.3 2001/08/07 10:16:00 deraadt Exp $ */ |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Copyright (c) 2001 Jakob Schlyter. All rights reserved. | 4 | * Copyright (c) 2001 Jakob Schlyter. All rights reserved. |
| @@ -43,7 +43,6 @@ | |||
| 43 | * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 43 | * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 44 | */ | 44 | */ |
| 45 | 45 | ||
| 46 | |||
| 47 | #include <sys/types.h> | 46 | #include <sys/types.h> |
| 48 | #include <netinet/in.h> | 47 | #include <netinet/in.h> |
| 49 | #include <arpa/nameser.h> | 48 | #include <arpa/nameser.h> |
| @@ -54,7 +53,6 @@ | |||
| 54 | 53 | ||
| 55 | #define ANSWER_BUFFER_SIZE 1024*64 | 54 | #define ANSWER_BUFFER_SIZE 1024*64 |
| 56 | 55 | ||
| 57 | |||
| 58 | struct dns_query { | 56 | struct dns_query { |
| 59 | char *name; | 57 | char *name; |
| 60 | u_int16_t type; | 58 | u_int16_t type; |
| @@ -94,15 +92,15 @@ static int count_dns_rr(struct dns_rr *, u_int16_t, u_int16_t); | |||
| 94 | 92 | ||
| 95 | int | 93 | int |
| 96 | getrrsetbyname(const char *hostname, unsigned int rdclass, | 94 | getrrsetbyname(const char *hostname, unsigned int rdclass, |
| 97 | unsigned int rdtype, unsigned int flags, | 95 | unsigned int rdtype, unsigned int flags, |
| 98 | struct rrsetinfo **res) | 96 | struct rrsetinfo **res) |
| 99 | { | 97 | { |
| 100 | int result; | 98 | int result; |
| 101 | struct rrsetinfo *rrset = NULL; | 99 | struct rrsetinfo *rrset = NULL; |
| 102 | struct dns_response *response; | 100 | struct dns_response *response; |
| 103 | struct dns_rr *rr; | 101 | struct dns_rr *rr; |
| 104 | struct rdatainfo *rdata; | 102 | struct rdatainfo *rdata; |
| 105 | unsigned length, index_ans, index_sig; | 103 | unsigned int length, index_ans, index_sig; |
| 106 | char answer[ANSWER_BUFFER_SIZE]; | 104 | char answer[ANSWER_BUFFER_SIZE]; |
| 107 | 105 | ||
| 108 | /* check for invalid class and type */ | 106 | /* check for invalid class and type */ |
| @@ -124,7 +122,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass, | |||
| 124 | } | 122 | } |
| 125 | 123 | ||
| 126 | /* initialize resolver */ | 124 | /* initialize resolver */ |
| 127 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) { | 125 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) { |
| 128 | result = ERRSET_FAIL; | 126 | result = ERRSET_FAIL; |
| 129 | goto fail; | 127 | goto fail; |
| 130 | } | 128 | } |
| @@ -162,7 +160,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass, | |||
| 162 | goto fail; | 160 | goto fail; |
| 163 | } | 161 | } |
| 164 | 162 | ||
| 165 | if (response->header.qdcount != 1 ) { | 163 | if (response->header.qdcount != 1) { |
| 166 | result = ERRSET_FAIL; | 164 | result = ERRSET_FAIL; |
| 167 | goto fail; | 165 | goto fail; |
| 168 | } | 166 | } |
| @@ -216,7 +214,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass, | |||
| 216 | for (rr = response->answer, index_ans = 0, index_sig = 0; | 214 | for (rr = response->answer, index_ans = 0, index_sig = 0; |
| 217 | rr; rr = rr->next) { | 215 | rr; rr = rr->next) { |
| 218 | 216 | ||
| 219 | rdata = NULL; | 217 | rdata = NULL; |
| 220 | 218 | ||
| 221 | if (rr->class == rrset->rri_rdclass && | 219 | if (rr->class == rrset->rri_rdclass && |
| 222 | rr->type == rrset->rri_rdtype) | 220 | rr->type == rrset->rri_rdtype) |
| @@ -229,7 +227,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass, | |||
| 229 | if (rdata) { | 227 | if (rdata) { |
| 230 | rdata->rdi_length = rr->size; | 228 | rdata->rdi_length = rr->size; |
| 231 | rdata->rdi_data = malloc(rr->size); | 229 | rdata->rdi_data = malloc(rr->size); |
| 232 | 230 | ||
| 233 | if (rdata->rdi_data == NULL) { | 231 | if (rdata->rdi_data == NULL) { |
| 234 | result = ERRSET_NOMEMORY; | 232 | result = ERRSET_NOMEMORY; |
| 235 | goto fail; | 233 | goto fail; |
| @@ -252,9 +250,8 @@ freerrset(struct rrsetinfo *rrset) | |||
| 252 | { | 250 | { |
| 253 | u_int16_t i; | 251 | u_int16_t i; |
| 254 | 252 | ||
| 255 | if (rrset == NULL) { | 253 | if (rrset == NULL) |
| 256 | return; | 254 | return; |
| 257 | } | ||
| 258 | 255 | ||
| 259 | for (i = 0; i < rrset->rri_nrdatas; i++) { | 256 | for (i = 0; i < rrset->rri_nrdatas; i++) { |
| 260 | if (rrset->rri_rdatas[i].rdi_data == NULL) | 257 | if (rrset->rri_rdatas[i].rdi_data == NULL) |
| @@ -269,17 +266,13 @@ freerrset(struct rrsetinfo *rrset) | |||
| 269 | free(rrset->rri_sigs[i].rdi_data); | 266 | free(rrset->rri_sigs[i].rdi_data); |
| 270 | } | 267 | } |
| 271 | free(rrset->rri_sigs); | 268 | free(rrset->rri_sigs); |
| 272 | |||
| 273 | free(rrset->rri_name); | 269 | free(rrset->rri_name); |
| 274 | |||
| 275 | free(rrset); | 270 | free(rrset); |
| 276 | } | 271 | } |
| 277 | 272 | ||
| 278 | 273 | /* | |
| 279 | /* | ||
| 280 | * DNS response parsing routines | 274 | * DNS response parsing routines |
| 281 | */ | 275 | */ |
| 282 | |||
| 283 | static struct dns_response * | 276 | static struct dns_response * |
| 284 | parse_dns_response(const char *answer, int size) | 277 | parse_dns_response(const char *answer, int size) |
| 285 | { | 278 | { |
| @@ -381,11 +374,11 @@ parse_dns_qsection(const char *answer, int size, const char **cp, int count) | |||
| 381 | 374 | ||
| 382 | /* type */ | 375 | /* type */ |
| 383 | curr->type = _getshort(*cp); | 376 | curr->type = _getshort(*cp); |
| 384 | *cp += INT16SZ; | 377 | *cp += INT16SZ; |
| 385 | 378 | ||
| 386 | /* class */ | 379 | /* class */ |
| 387 | curr->class = _getshort(*cp); | 380 | curr->class = _getshort(*cp); |
| 388 | *cp += INT16SZ; | 381 | *cp += INT16SZ; |
| 389 | } | 382 | } |
| 390 | 383 | ||
| 391 | return (head); | 384 | return (head); |
| @@ -427,15 +420,15 @@ parse_dns_rrsection(const char *answer, int size, const char **cp, int count) | |||
| 427 | 420 | ||
| 428 | /* type */ | 421 | /* type */ |
| 429 | curr->type = _getshort(*cp); | 422 | curr->type = _getshort(*cp); |
| 430 | *cp += INT16SZ; | 423 | *cp += INT16SZ; |
| 431 | 424 | ||
| 432 | /* class */ | 425 | /* class */ |
| 433 | curr->class = _getshort(*cp); | 426 | curr->class = _getshort(*cp); |
| 434 | *cp += INT16SZ; | 427 | *cp += INT16SZ; |
| 435 | 428 | ||
| 436 | /* ttl */ | 429 | /* ttl */ |
| 437 | curr->ttl = _getlong(*cp); | 430 | curr->ttl = _getlong(*cp); |
| 438 | *cp += INT32SZ; | 431 | *cp += INT32SZ; |
| 439 | 432 | ||
| 440 | /* rdata size */ | 433 | /* rdata size */ |
| 441 | curr->size = _getshort(*cp); | 434 | curr->size = _getshort(*cp); |
| @@ -454,7 +447,6 @@ parse_dns_rrsection(const char *answer, int size, const char **cp, int count) | |||
| 454 | return (head); | 447 | return (head); |
| 455 | } | 448 | } |
| 456 | 449 | ||
| 457 | |||
| 458 | static void | 450 | static void |
| 459 | free_dns_query(struct dns_query *p) | 451 | free_dns_query(struct dns_query *p) |
| 460 | { | 452 | { |
| @@ -500,7 +492,7 @@ count_dns_rr(struct dns_rr *p, u_int16_t class, u_int16_t type) | |||
| 500 | if (p->class == class && p->type == type) | 492 | if (p->class == class && p->type == type) |
| 501 | n++; | 493 | n++; |
| 502 | p = p->next; | 494 | p = p->next; |
| 503 | }; | 495 | } |
| 504 | 496 | ||
| 505 | return (n); | 497 | return (n); |
| 506 | } | 498 | } |
