From 261eada2ca65277dcc68565370cb2d321f402c21 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 27 Feb 2004 00:55:39 +0000 Subject: [PATCH] Update. 2004-02-26 Ulrich Drepper * 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. --- ChangeLog | 22 ++++++++++++++++++++++ nptl/ChangeLog | 5 +++++ nptl/pthread_attr_getstackaddr.c | 12 ++++-------- nscd/nscd_getgr_r.c | 32 +++++++++++++++++++------------- nscd/nscd_gethst_r.c | 35 +++++++++++++++++++++-------------- nscd/nscd_getpw_r.c | 33 +++++++++++++++++++++------------ nscd/nscd_proto.h | 20 ++++++++++++-------- nss/getXXbyYY_r.c | 9 +++------ 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 + + * 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 * 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 + + * 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 * 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 , 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 , 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 , 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 , 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 , 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 , 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 -- 2.7.4