692 |
|
} |
693 |
|
|
694 |
|
/* |
695 |
< |
* If this fails there was an error decoding the received packet, |
696 |
< |
* try it again and hope it works the next time. |
695 |
> |
* If this fails there was an error decoding the received packet. |
696 |
> |
* We only give it one shot. If it fails, just leave the client |
697 |
> |
* unresolved. |
698 |
|
*/ |
699 |
< |
if (proc_answer(request, header, buf, buf + rc)) |
699 |
> |
if (!proc_answer(request, header, buf, buf + rc)) |
700 |
|
{ |
701 |
< |
if (request->type == T_PTR) |
702 |
< |
{ |
703 |
< |
if (request->name == NULL) |
704 |
< |
{ |
704 |
< |
/* |
705 |
< |
* Got a PTR response with no name, something bogus is happening |
706 |
< |
* don't bother trying again, the client address doesn't resolve |
707 |
< |
*/ |
708 |
< |
(*request->callback)(request->callback_ctx, NULL, NULL); |
709 |
< |
rem_request(request); |
710 |
< |
return; |
711 |
< |
} |
701 |
> |
(*request->callback)(request->callback_ctx, NULL, NULL); |
702 |
> |
rem_request(request); |
703 |
> |
return; |
704 |
> |
} |
705 |
|
|
706 |
< |
/* |
707 |
< |
* Lookup the 'authoritative' name that we were given for the ip#. |
708 |
< |
*/ |
716 |
< |
#ifdef IPV6 |
717 |
< |
if (request->addr.ss.ss_family == AF_INET6) |
718 |
< |
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_AAAA); |
719 |
< |
else |
720 |
< |
#endif |
721 |
< |
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_A); |
722 |
< |
rem_request(request); |
723 |
< |
} |
724 |
< |
else |
706 |
> |
if (request->type == T_PTR) |
707 |
> |
{ |
708 |
> |
if (request->name == NULL) |
709 |
|
{ |
710 |
|
/* |
711 |
< |
* Got a name and address response, client resolved |
711 |
> |
* Got a PTR response with no name, something bogus is happening |
712 |
> |
* don't bother trying again, the client address doesn't resolve |
713 |
|
*/ |
714 |
< |
(*request->callback)(request->callback_ctx, &request->addr, request->name); |
714 |
> |
(*request->callback)(request->callback_ctx, NULL, NULL); |
715 |
|
rem_request(request); |
716 |
+ |
return; |
717 |
|
} |
718 |
+ |
|
719 |
+ |
/* |
720 |
+ |
* Lookup the 'authoritative' name that we were given for the ip#. |
721 |
+ |
*/ |
722 |
+ |
#ifdef IPV6 |
723 |
+ |
if (request->addr.ss.ss_family == AF_INET6) |
724 |
+ |
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_AAAA); |
725 |
+ |
else |
726 |
+ |
#endif |
727 |
+ |
gethost_byname_type(request->callback, request->callback_ctx, request->name, T_A); |
728 |
+ |
rem_request(request); |
729 |
|
} |
730 |
< |
else if (!request->sent) |
730 |
> |
else |
731 |
|
{ |
732 |
< |
/* XXX - we got a response for a query we didn't send with a valid id? |
733 |
< |
* this should never happen, bail here and leave the client unresolved |
732 |
> |
/* |
733 |
> |
* Got a name and address response, client resolved |
734 |
|
*/ |
735 |
< |
assert(0); |
739 |
< |
|
740 |
< |
(*request->callback)(request->callback_ctx, NULL, NULL); |
741 |
< |
/* XXX don't leak it */ |
735 |
> |
(*request->callback)(request->callback_ctx, &request->addr, request->name); |
736 |
|
rem_request(request); |
737 |
|
} |
738 |
|
} |