int gethostent_r(struct hostent* hptr, char* buffer, size_t buflen, struct hostent** result, int* h_errnop) { struct hostent_data* hed; struct hostent he; res_state statp; statp = __res_state(); if ((statp->options & RES_INIT) == 0 && res_ninit(statp) == -1) { RES_SET_H_ERRNO(statp, NETDB_INTERNAL); *h_errnop = statp->res_h_errno; return (-1); } if ((hed = __hostent_data_init()) == NULL) { RES_SET_H_ERRNO(statp, NETDB_INTERNAL); *h_errnop = statp->res_h_errno; return (-1); } if (gethostent_p(&he, hed, statp->options & RES_USE_INET6, statp) != 0) { return (-1); } if (__copy_hostent(&he, hptr, buffer, buflen) != 0) { return (-1); } *result = hptr; return (0); }
struct hostent * _gethostbynisaddr(const void *addr, socklen_t len, int af) { #ifdef YP struct hostent *he; struct hostent_data *hed; u_long oresopt; int error; res_state statp; statp = __res_state(); if ((he = __hostent_init()) == NULL || (hed = __hostent_data_init()) == NULL) { RES_SET_H_ERRNO(statp, NETDB_INTERNAL); return (NULL); } oresopt = statp->options; statp->options &= ~RES_USE_INET6; error = _gethostbynisaddr_r(addr, len, af, he, hed); statp->options = oresopt; return (error == 0) ? he : NULL; #else return (NULL); #endif }
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); }
int _nis_gethostbyaddr(void *rval, void *cb_data, va_list ap) { #ifdef YP 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; 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); } if (_gethostbynisaddr_r(addr, len, af, &he, hed) != 0) { *h_errnop = statp->res_h_errno; return (NS_NOTFOUND); } if (__copy_hostent(&he, hptr, buffer, buflen) != 0) { *errnop = errno; RES_SET_H_ERRNO(statp, NETDB_INTERNAL); *h_errnop = statp->res_h_errno; return (NS_RETURN); } *((struct hostent **)rval) = hptr; return (NS_SUCCESS); #else *((struct hostent **)rval) = NULL; return (NS_UNAVAIL); #endif }
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); }