int _ht_gethostbyaddr(void* rval, void* cb_data, va_list ap) { const void* addr; socklen_t len; int af; char* buffer; size_t buflen; int* errnop, *h_errnop; struct hostent* hptr, he; struct hostent_data* hed; res_state statp; int error; addr = va_arg(ap, const void*); len = va_arg(ap, socklen_t); af = va_arg(ap, int); hptr = va_arg(ap, struct hostent*); buffer = va_arg(ap, char*); buflen = va_arg(ap, size_t); errnop = va_arg(ap, int*); h_errnop = va_arg(ap, int*); *((struct hostent**)rval) = NULL; statp = __res_state(); if ((hed = __hostent_data_init()) == NULL) { RES_SET_H_ERRNO(statp, NETDB_INTERNAL); *h_errnop = statp->res_h_errno; return (NS_NOTFOUND); } _sethosthtent(0, hed); while ((error = gethostent_p(&he, hed, 0, statp)) == 0) if (he.h_addrtype == af && !bcmp(he.h_addr, addr, len)) { if (he.h_addrtype == AF_INET && statp->options & RES_USE_INET6) { _map_v4v6_address(he.h_addr, he.h_addr); he.h_length = IN6ADDRSZ; he.h_addrtype = AF_INET6; } break; } _endhosthtent(hed); if (error != 0) { return (NS_NOTFOUND); } if (__copy_hostent(&he, hptr, buffer, buflen) != 0) { *h_errnop = statp->res_h_errno; return (NS_NOTFOUND); } *((struct hostent**)rval) = hptr; return (NS_SUCCESS); }
static void hostent_data_free(void *ptr) { struct hostent_data *hed = ptr; if (hed == NULL) return; hed->stayopen = 0; _endhosthtent(hed); free(hed); }
int _ht_gethostbyname(void* rval, void* cb_data, va_list ap) { const char* name; int af; char* buffer; size_t buflen; int* errnop, *h_errnop; struct hostent* hptr, he; struct hostent_data* hed; char** cp; res_state statp; int error; name = va_arg(ap, const char*); af = va_arg(ap, int); hptr = va_arg(ap, struct hostent*); buffer = va_arg(ap, char*); buflen = va_arg(ap, size_t); errnop = va_arg(ap, int*); h_errnop = va_arg(ap, int*); *((struct hostent**)rval) = NULL; statp = __res_state(); if ((hed = __hostent_data_init()) == NULL) { RES_SET_H_ERRNO(statp, NETDB_INTERNAL); *h_errnop = statp->res_h_errno; return (NS_NOTFOUND); } _sethosthtent(0, hed); while ((error = gethostent_p(&he, hed, 0, statp)) == 0) { if (he.h_addrtype != af) { continue; } if (he.h_addrtype == AF_INET && statp->options & RES_USE_INET6) { _map_v4v6_address(he.h_addr, he.h_addr); he.h_length = IN6ADDRSZ; he.h_addrtype = AF_INET6; } if (strcasecmp(he.h_name, name) == 0) { break; } for (cp = he.h_aliases; *cp != 0; cp++) if (strcasecmp(*cp, name) == 0) { goto found; } } found: _endhosthtent(hed); if (error != 0) { *h_errnop = statp->res_h_errno; return (NS_NOTFOUND); } if (__copy_hostent(&he, hptr, buffer, buflen) != 0) { *h_errnop = statp->res_h_errno; return (NS_NOTFOUND); } *((struct hostent**)rval) = hptr; return (NS_SUCCESS); }