86 |
|
REQ_IDLE, /**< We're doing not much at all */ |
87 |
|
REQ_PTR, /**< Looking up a PTR */ |
88 |
|
REQ_A, /**< Looking up an A, possibly because AAAA failed */ |
89 |
– |
#ifdef IPV6 |
89 |
|
REQ_AAAA, /**< Looking up an AAAA */ |
91 |
– |
#endif |
90 |
|
REQ_CNAME /**< We got a CNAME in response, we better get a real answer next */ |
91 |
|
} request_state; |
92 |
|
|
160 |
|
static int |
161 |
|
res_ourserver(const struct irc_ssaddr *inp) |
162 |
|
{ |
165 |
– |
#ifdef IPV6 |
163 |
|
const struct sockaddr_in6 *v6; |
164 |
|
const struct sockaddr_in6 *v6in = (const struct sockaddr_in6 *)inp; |
168 |
– |
#endif |
165 |
|
const struct sockaddr_in *v4; |
166 |
|
const struct sockaddr_in *v4in = (const struct sockaddr_in *)inp; |
167 |
|
|
168 |
|
for (unsigned int i = 0; i < irc_nscount; ++i) |
169 |
|
{ |
170 |
|
const struct irc_ssaddr *srv = &irc_nsaddr_list[i]; |
175 |
– |
#ifdef IPV6 |
171 |
|
v6 = (const struct sockaddr_in6 *)srv; |
177 |
– |
#endif |
172 |
|
v4 = (const struct sockaddr_in *)srv; |
173 |
|
|
174 |
|
/* |
177 |
|
*/ |
178 |
|
switch (srv->ss.ss_family) |
179 |
|
{ |
186 |
– |
#ifdef IPV6 |
180 |
|
case AF_INET6: |
181 |
|
if (srv->ss.ss_family == inp->ss.ss_family) |
182 |
|
if (v6->sin6_port == v6in->sin6_port) |
184 |
|
sizeof(struct in6_addr))) |
185 |
|
return 1; |
186 |
|
break; |
194 |
– |
#endif |
187 |
|
case AF_INET: |
188 |
|
if (srv->ss.ss_family == inp->ss.ss_family) |
189 |
|
if (v4->sin_port == v4in->sin_port) |
345 |
|
request = make_request(callback, ctx); |
346 |
|
request->type = type; |
347 |
|
request->namelength = strlcpy(request->name, host_name, sizeof(request->name)); |
348 |
< |
#ifdef IPV6 |
348 |
> |
|
349 |
|
if (type != T_A) |
350 |
|
request->state = REQ_AAAA; |
351 |
|
else |
352 |
< |
#endif |
361 |
< |
request->state = REQ_A; |
352 |
> |
request->state = REQ_A; |
353 |
|
} |
354 |
|
|
355 |
|
request->type = type; |
375 |
|
(unsigned int)(cp[3]), (unsigned int)(cp[2]), |
376 |
|
(unsigned int)(cp[1]), (unsigned int)(cp[0])); |
377 |
|
} |
387 |
– |
#ifdef IPV6 |
378 |
|
else if (addr->ss.ss_family == AF_INET6) |
379 |
|
{ |
380 |
|
const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr; |
400 |
|
(unsigned int)(cp[1] & 0xf), (unsigned int)(cp[1] >> 4), |
401 |
|
(unsigned int)(cp[0] & 0xf), (unsigned int)(cp[0] >> 4)); |
402 |
|
} |
403 |
< |
#endif |
403 |
> |
|
404 |
|
if (request == NULL) |
405 |
|
{ |
406 |
|
request = make_request(callback, ctx); |
428 |
|
void |
429 |
|
gethost_byname(dns_callback_fnc callback, void *ctx, const char *name) |
430 |
|
{ |
441 |
– |
#ifdef IPV6 |
431 |
|
gethost_byname_type(callback, ctx, name, T_AAAA); |
443 |
– |
#else |
444 |
– |
gethost_byname_type(callback, ctx, name, T_A); |
445 |
– |
#endif |
432 |
|
} |
433 |
|
|
434 |
|
/* |
454 |
|
case T_A: |
455 |
|
do_query_name(NULL, NULL, request->name, request, request->type); |
456 |
|
break; |
471 |
– |
#ifdef IPV6 |
457 |
|
case T_AAAA: /* Didn't work, try A */ |
458 |
|
if (request->state == REQ_AAAA) |
459 |
|
do_query_name(NULL, NULL, request->name, request, T_A); |
475 |
– |
#endif |
460 |
|
default: |
461 |
|
break; |
462 |
|
} |
474 |
|
int n; /* temp count */ |
475 |
|
int rd_length; |
476 |
|
struct sockaddr_in *v4; /* conversion */ |
493 |
– |
#ifdef IPV6 |
477 |
|
struct sockaddr_in6 *v6; |
478 |
< |
#endif |
478 |
> |
|
479 |
|
current = (unsigned char *)buf + sizeof(HEADER); |
480 |
|
|
481 |
|
for (; header->qdcount > 0; --header->qdcount) |
539 |
|
memcpy(&v4->sin_addr, current, sizeof(struct in_addr)); |
540 |
|
return 1; |
541 |
|
break; |
559 |
– |
#ifdef IPV6 |
542 |
|
case T_AAAA: |
543 |
|
if (request->type != T_AAAA) |
544 |
|
return 0; |
552 |
|
memcpy(&v6->sin6_addr, current, sizeof(struct in6_addr)); |
553 |
|
return 1; |
554 |
|
break; |
573 |
– |
#endif |
555 |
|
case T_PTR: |
556 |
|
if (request->type != T_PTR) |
557 |
|
return 0; |
646 |
|
(*request->callback)(request->callback_ctx, NULL, NULL, 0); |
647 |
|
rem_request(request); |
648 |
|
} |
668 |
– |
#ifdef IPV6 |
649 |
|
else |
650 |
|
{ |
651 |
|
/* |
657 |
|
resend_query(request); |
658 |
|
} |
659 |
|
} |
660 |
< |
#endif |
660 |
> |
|
661 |
|
continue; |
662 |
|
} |
663 |
|
|
689 |
|
/* |
690 |
|
* Lookup the 'authoritative' name that we were given for the ip#. |
691 |
|
*/ |
712 |
– |
#ifdef IPV6 |
692 |
|
if (request->addr.ss.ss_family == AF_INET6) |
693 |
|
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_AAAA); |
694 |
|
else |
695 |
< |
#endif |
717 |
< |
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_A); |
695 |
> |
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_A); |
696 |
|
rem_request(request); |
697 |
|
} |
698 |
|
else |