aboutsummaryrefslogtreecommitdiff
path: root/nscd/nscd_gethst_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'nscd/nscd_gethst_r.c')
-rw-r--r--nscd/nscd_gethst_r.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/nscd/nscd_gethst_r.c b/nscd/nscd_gethst_r.c
index 69e7990eac..1089b967d0 100644
--- a/nscd/nscd_gethst_r.c
+++ b/nscd/nscd_gethst_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998-2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1998-2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -37,39 +37,42 @@ int __nss_not_use_nscd_hosts;
static int nscd_gethst_r (const char *key, size_t keylen, request_type type,
struct hostent *resultbuf, char *buffer,
- size_t buflen, int *h_errnop) internal_function;
+ size_t buflen, struct hostent **result,
+ int *h_errnop) internal_function;
int
__nscd_gethostbyname_r (const char *name, struct hostent *resultbuf,
- char *buffer, size_t buflen, int *h_errnop)
+ char *buffer, size_t buflen, struct hostent **result,
+ int *h_errnop)
{
request_type reqtype;
reqtype = (_res.options & RES_USE_INET6) ? GETHOSTBYNAMEv6 : GETHOSTBYNAME;
return nscd_gethst_r (name, strlen (name) + 1, reqtype, resultbuf,
- buffer, buflen, h_errnop);
+ buffer, buflen, result, h_errnop);
}
int
__nscd_gethostbyname2_r (const char *name, int af, struct hostent *resultbuf,
- char *buffer, size_t buflen, int *h_errnop)
+ char *buffer, size_t buflen, struct hostent **result,
+ int *h_errnop)
{
request_type reqtype;
reqtype = af == AF_INET6 ? GETHOSTBYNAMEv6 : GETHOSTBYNAME;
return nscd_gethst_r (name, strlen (name) + 1, reqtype, resultbuf,
- buffer, buflen, h_errnop);
+ buffer, buflen, result, h_errnop);
}
int
__nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
struct hostent *resultbuf, char *buffer, size_t buflen,
- int *h_errnop)
+ struct hostent **result, int *h_errnop)
{
request_type reqtype;
@@ -80,7 +83,7 @@ __nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
reqtype = type == AF_INET6 ? GETHOSTBYADDRv6 : GETHOSTBYADDR;
- return nscd_gethst_r (addr, len, reqtype, resultbuf, buffer, buflen,
+ return nscd_gethst_r (addr, len, reqtype, resultbuf, buffer, buflen, result,
h_errnop);
}
@@ -117,14 +120,14 @@ static int
internal_function
nscd_gethst_r (const char *key, size_t keylen, request_type type,
struct hostent *resultbuf, char *buffer, size_t buflen,
- int *h_errnop)
+ struct hostent **result, int *h_errnop)
{
int sock = __nscd_open_socket ();
hst_response_header hst_resp;
request_header req;
ssize_t nbytes;
struct iovec vec[4];
- int result = -1;
+ int retval = -1;
if (sock == -1)
{
@@ -184,7 +187,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
{
no_room:
__set_errno (ERANGE);
- result = ERANGE;
+ retval = ERANGE;
goto out;
}
cp += align1;
@@ -277,7 +280,10 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
/* And finally read the aliases. */
if ((size_t) TEMP_FAILURE_RETRY (__read (sock, resultbuf->h_aliases[0],
total_len)) == total_len)
- result = 0;
+ {
+ retval = 0;
+ *result = resultbuf;
+ }
}
else
{
@@ -286,11 +292,12 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
/* The `errno' to some value != ERANGE. */
__set_errno (ENOENT);
- result = ENOENT;
+ /* Even though we have not found anything, the result is zero. */
+ retval = 0;
}
out:
__close (sock);
- return result;
+ return retval;
}