summaryrefslogtreecommitdiff
path: root/nscd/nscd_getpw_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'nscd/nscd_getpw_r.c')
-rw-r--r--nscd/nscd_getpw_r.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/nscd/nscd_getpw_r.c b/nscd/nscd_getpw_r.c
index b0135d443c..747c39bed9 100644
--- a/nscd/nscd_getpw_r.c
+++ b/nscd/nscd_getpw_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998.
@@ -35,43 +35,45 @@ int __nss_not_use_nscd_passwd;
static int nscd_getpw_r (const char *key, size_t keylen, request_type type,
struct passwd *resultbuf, char *buffer,
- size_t buflen) internal_function;
+ size_t buflen, struct passwd **result)
+ internal_function;
int
__nscd_getpwnam_r (const char *name, struct passwd *resultbuf, char *buffer,
- size_t buflen)
+ size_t buflen, struct passwd **result)
{
if (name == NULL)
return -1;
return nscd_getpw_r (name, strlen (name) + 1, GETPWBYNAME, resultbuf,
- buffer, buflen);
+ buffer, buflen, result);
}
int
__nscd_getpwuid_r (uid_t uid, struct passwd *resultbuf, char *buffer,
- size_t buflen)
+ size_t buflen, struct passwd **result)
{
char buf[12];
size_t n;
n = __snprintf (buf, sizeof (buf), "%d", uid) + 1;
- return nscd_getpw_r (buf, n, GETPWBYUID, resultbuf, buffer, buflen);
+ return nscd_getpw_r (buf, n, GETPWBYUID, resultbuf, buffer, buflen, result);
}
static int
internal_function
nscd_getpw_r (const char *key, size_t keylen, request_type type,
- struct passwd *resultbuf, char *buffer, size_t buflen)
+ struct passwd *resultbuf, char *buffer, size_t buflen,
+ struct passwd **result)
{
int sock = __nscd_open_socket ();
request_header req;
pw_response_header pw_resp;
ssize_t nbytes;
struct iovec vec[2];
- int result = -1;
+ int retval = -1;
if (sock == -1)
{
@@ -79,6 +81,9 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
return -1;
}
+ /* No value found so far. */
+ *result = NULL;
+
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
@@ -114,7 +119,7 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
if (__builtin_expect (buflen < total, 0))
{
__set_errno (ERANGE);
- result = ERANGE;
+ retval = ERANGE;
goto out;
}
@@ -140,17 +145,21 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
nbytes = TEMP_FAILURE_RETRY (__read (sock, buffer, total));
if (nbytes == (ssize_t) total)
- result = 0;
+ {
+ retval = 0;
+ *result = resultbuf;
+ }
}
else
{
/* 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;
}