aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog22
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/pthread_attr_getstackaddr.c12
-rw-r--r--nscd/nscd_getgr_r.c32
-rw-r--r--nscd/nscd_gethst_r.c35
-rw-r--r--nscd/nscd_getpw_r.c33
-rw-r--r--nscd/nscd_proto.h20
-rw-r--r--nss/getXXbyYY_r.c9
8 files changed, 107 insertions, 61 deletions
diff --git a/ChangeLog b/ChangeLog
index 4aafcd3..4b5e2dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2004-02-26 Ulrich Drepper <drepper@redhat.com>
+
+ * nss/getXXbyYY_r.c: Pass result also to the nscd_* function. Don't
+ set *result here.
+ * nscd/nscd_proto.h: Add new argument for pointer to result pointer
+ to all nscd_* functions.
+ * nscd/nscd_getgr_r.c (nscd_getgr_r): Add new parameter. Store result
+ pointer in the address provided by the new parameter if successful.
+ Otherwise store NULL. Return zero if no entry found.
+ (__nscd_getgrnam_r, __nscd_getgrgid_r): Add new parameter and pass
+ it on.
+ * nscd/nscd_gethst_r.c (nscd_gethst_r): Add new parameter. Store
+ result pointer in the address provided by the new parameter if
+ successful. Otherwise store NULL. Return zero if no entry found.
+ (__nscd_gethostbyname_r, __nscd_gethostbyname2_r,
+ __nscd_gethostbyaddr_r): Add new parameter and pass it on.
+ * nscd/nscd_getpw_r.c (nscd_getpw_r): Add new parameter. Store result
+ pointer in the address provided by the new parameter if successful.
+ Otherwise store NULL. Return zero if no entry found.
+ (__nscd_getpwnam_r, __nscd_getpwuid_r): Add new parameter and pass
+ it on.
+
2004-02-26 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/clock_settime.c (SYSDEP_SETTIME): Set
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index a9dc41a..8fb8dd4 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-26 Ulrich Drepper <drepper@redhat.com>
+
+ * pthread_attr_getstackaddr.c (__pthread_attr_getstackaddr): Don't
+ fail if stack address hasn't been set. Just return 0.
+
2004-02-25 Ulrich Drepper <drepper@redhat.com>
* Makefile (tests-nolibpthread): Add tst-unload. Don't link with
diff --git a/nptl/pthread_attr_getstackaddr.c b/nptl/pthread_attr_getstackaddr.c
index f483dc8..e6e2588 100644
--- a/nptl/pthread_attr_getstackaddr.c
+++ b/nptl/pthread_attr_getstackaddr.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -32,13 +32,9 @@ __pthread_attr_getstackaddr (attr, stackaddr)
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr;
- /* XXX This function has a stupid definition. The standard
- specifies no error value but what is if no stack address was set?
- We return an error anyway. */
- if ((iattr->flags & ATTR_FLAG_STACKADDR) == 0)
- return EINVAL;
-
- /* Store the result. */
+ /* Some code assumes this function to work even if no stack address
+ has been set. Let them figure it our for themselves what the
+ value means. Simply store the result. */
*stackaddr = iattr->stackaddr;
return 0;
diff --git a/nscd/nscd_getgr_r.c b/nscd/nscd_getgr_r.c
index 9d9d7d5..5093266 100644
--- a/nscd/nscd_getgr_r.c
+++ b/nscd/nscd_getgr_r.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2002, 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,42 +36,44 @@ int __nss_not_use_nscd_group;
static int nscd_getgr_r (const char *key, size_t keylen, request_type type,
struct group *resultbuf, char *buffer,
- size_t buflen) internal_function;
+ size_t buflen, struct group **result)
+ internal_function;
int
__nscd_getgrnam_r (const char *name, struct group *resultbuf, char *buffer,
- size_t buflen)
+ size_t buflen, struct group **result)
{
return nscd_getgr_r (name, strlen (name) + 1, GETGRBYNAME, resultbuf,
- buffer, buflen);
+ buffer, buflen, result);
}
int
__nscd_getgrgid_r (gid_t gid, struct group *resultbuf, char *buffer,
- size_t buflen)
+ size_t buflen, struct group **result)
{
char buf[12];
size_t n;
n = __snprintf (buf, sizeof (buf), "%d", gid) + 1;
- return nscd_getgr_r (buf, n, GETGRBYGID, resultbuf, buffer, buflen);
+ return nscd_getgr_r (buf, n, GETGRBYGID, resultbuf, buffer, buflen, result);
}
static int
internal_function
nscd_getgr_r (const char *key, size_t keylen, request_type type,
- struct group *resultbuf, char *buffer, size_t buflen)
+ struct group *resultbuf, char *buffer, size_t buflen,
+ struct group **result)
{
int sock = __nscd_open_socket ();
request_header req;
gr_response_header gr_resp;
ssize_t nbytes;
struct iovec vec[2];
- int result = -1;
+ int retval = -1;
if (sock == -1)
{
@@ -121,7 +124,7 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
{
no_room:
__set_errno (ERANGE);
- result = ERANGE;
+ retval = ERANGE;
goto out;
}
buflen -= total_len;
@@ -169,25 +172,28 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
if (__builtin_expect (total_len > buflen, 0))
goto no_room;
- result = 0;
+ retval = 0;
n = TEMP_FAILURE_RETRY (__read (sock, resultbuf->gr_mem[0],
total_len));
if (__builtin_expect (n != total_len, 0))
{
/* The `errno' to some value != ERANGE. */
__set_errno (ENOENT);
- result = ENOENT;
+ retval = ENOENT;
}
+ else
+ *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;
}
diff --git a/nscd/nscd_gethst_r.c b/nscd/nscd_gethst_r.c
index 69e7990..1089b96 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;
}
diff --git a/nscd/nscd_getpw_r.c b/nscd/nscd_getpw_r.c
index b0135d4..747c39b 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;
}
diff --git a/nscd/nscd_proto.h b/nscd/nscd_proto.h
index 0a02938..0c3cc73 100644
--- a/nscd/nscd_proto.h
+++ b/nscd/nscd_proto.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@@ -30,24 +30,28 @@ extern int __nss_not_use_nscd_group attribute_hidden;
extern int __nss_not_use_nscd_hosts attribute_hidden;
extern int __nscd_getpwnam_r (const char *name, struct passwd *resultbuf,
- char *buffer, size_t buflen);
+ char *buffer, size_t buflen,
+ struct passwd **result);
extern int __nscd_getpwuid_r (uid_t uid, struct passwd *resultbuf,
- char *buffer, size_t buflen);
+ char *buffer, size_t buflen,
+ struct passwd **result);
extern int __nscd_getgrnam_r (const char *name, struct group *resultbuf,
- char *buffer, size_t buflen);
+ char *buffer, size_t buflen,
+ struct group **result);
extern int __nscd_getgrgid_r (uid_t uid, struct group *resultbuf,
- char *buffer, size_t buflen);
+ char *buffer, size_t buflen,
+ struct group **result);
extern int __nscd_gethostbyname_r (const char *name,
struct hostent *resultbuf,
char *buffer, size_t buflen,
- int *h_errnop);
+ struct hostent **result, int *h_errnop);
extern int __nscd_gethostbyname2_r (const char *name, int af,
struct hostent *resultbuf,
char *buffer, size_t buflen,
- int *h_errnop);
+ struct hostent **result, int *h_errnop);
extern 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);
#endif /* _NSCD_PROTO_H */
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
index 9963959..65bc8e9 100644
--- a/nss/getXXbyYY_r.c
+++ b/nss/getXXbyYY_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -168,13 +168,10 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
if (!NOT_USENSCD_NAME)
{
- nscd_status = NSCD_NAME (ADD_VARIABLES, resbuf, buffer, buflen
+ nscd_status = NSCD_NAME (ADD_VARIABLES, resbuf, buffer, buflen, result
H_ERRNO_VAR);
if (nscd_status >= 0)
- {
- *result = nscd_status == 0 ? resbuf : NULL;
- return nscd_status;
- }
+ return nscd_status;
}
#endif