From 18d6d9564f59dca657e1932ddc811c43d905c9ef Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Tue, 7 Sep 2004 10:34:35 +0000 Subject: Implement gethostent_r --- libc/inet/resolv.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'libc/inet/resolv.c') diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index bc1899cad..d96b2b79a 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -111,8 +111,8 @@ * and read_etc_hosts; getnameinfo() port from glibc; defined * defined ip6addr_any and in6addr_loopback) * - * 2-Feb-2002 Erik Andersen - * Added gethostent(), sethostent(), and endhostent() + * 2-Feb-2002 Erik Andersen + * Added gethostent(), sethostent(), and endhostent() * * 17-Aug-2002 Manuel Novoa III * Fixed __read_etc_hosts_r to return alias list, and modified buffer @@ -128,6 +128,9 @@ * and ns_name_ntop() from glibc 2.3.2 for compatibility with ipsec-tools * and openldap. * + * 7-Sep-2004 Erik Andersen + * Added gethostent_r() + * */ #define __FORCE_GLIBC @@ -1042,6 +1045,8 @@ struct hostent *gethostbyname2(const char *name, int family) } #endif + + #ifdef L_res_init struct __res_state _res; @@ -1554,6 +1559,29 @@ void sethostent (int stay_open) UNLOCK; } +int gethostent_r(struct hostent *result_buf, char *buf, size_t buflen, + struct hostent **result, int *h_errnop) +{ + int ret; + + LOCK; + if (__gethostent_fp == NULL) { + __open_etc_hosts(&__gethostent_fp); + if (__gethostent_fp == NULL) { + UNLOCK; + *result=NULL; + return 0; + } + } + + ret = __read_etc_hosts_r(__gethostent_fp, NULL, AF_INET, GETHOSTENT, + result_buf, buf, buflen, result, h_errnop); + if (__stay_open==0) { + fclose(__gethostent_fp); + } + UNLOCK; + return(ret); +} struct hostent *gethostent (void) { @@ -1569,19 +1597,7 @@ struct hostent *gethostent (void) struct hostent *host; LOCK; - if (__gethostent_fp == NULL) { - __open_etc_hosts(&__gethostent_fp); - if (__gethostent_fp == NULL) { - UNLOCK; - return((struct hostent *)NULL); - } - } - - __read_etc_hosts_r(__gethostent_fp, NULL, AF_INET, GETHOSTENT, - &h, buf, sizeof(buf), &host, &h_errno); - if (__stay_open==0) { - fclose(__gethostent_fp); - } + gethostent_r(&h, buf, sizeof(buf), &host, &h_errno); UNLOCK; return(host); } -- cgit v1.2.3