1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
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.
This commit is contained in:
Ulrich Drepper
2004-02-27 00:55:39 +00:00
parent f15e552893
commit 261eada2ca
8 changed files with 107 additions and 61 deletions

View File

@ -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> 2004-02-26 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/clock_settime.c (SYSDEP_SETTIME): Set * sysdeps/unix/sysv/linux/clock_settime.c (SYSDEP_SETTIME): Set

View File

@ -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> 2004-02-25 Ulrich Drepper <drepper@redhat.com>
* Makefile (tests-nolibpthread): Add tst-unload. Don't link with * Makefile (tests-nolibpthread): Add tst-unload. Don't link with

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -32,13 +32,9 @@ __pthread_attr_getstackaddr (attr, stackaddr)
assert (sizeof (*attr) >= sizeof (struct pthread_attr)); assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* XXX This function has a stupid definition. The standard /* Some code assumes this function to work even if no stack address
specifies no error value but what is if no stack address was set? has been set. Let them figure it our for themselves what the
We return an error anyway. */ value means. Simply store the result. */
if ((iattr->flags & ATTR_FLAG_STACKADDR) == 0)
return EINVAL;
/* Store the result. */
*stackaddr = iattr->stackaddr; *stackaddr = iattr->stackaddr;
return 0; return 0;

View File

@ -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. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998. 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, static int nscd_getgr_r (const char *key, size_t keylen, request_type type,
struct group *resultbuf, char *buffer, struct group *resultbuf, char *buffer,
size_t buflen) internal_function; size_t buflen, struct group **result)
internal_function;
int int
__nscd_getgrnam_r (const char *name, struct group *resultbuf, char *buffer, __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, return nscd_getgr_r (name, strlen (name) + 1, GETGRBYNAME, resultbuf,
buffer, buflen); buffer, buflen, result);
} }
int int
__nscd_getgrgid_r (gid_t gid, struct group *resultbuf, char *buffer, __nscd_getgrgid_r (gid_t gid, struct group *resultbuf, char *buffer,
size_t buflen) size_t buflen, struct group **result)
{ {
char buf[12]; char buf[12];
size_t n; size_t n;
n = __snprintf (buf, sizeof (buf), "%d", gid) + 1; 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 static int
internal_function internal_function
nscd_getgr_r (const char *key, size_t keylen, request_type type, 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 (); int sock = __nscd_open_socket ();
request_header req; request_header req;
gr_response_header gr_resp; gr_response_header gr_resp;
ssize_t nbytes; ssize_t nbytes;
struct iovec vec[2]; struct iovec vec[2];
int result = -1; int retval = -1;
if (sock == -1) if (sock == -1)
{ {
@ -121,7 +124,7 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
{ {
no_room: no_room:
__set_errno (ERANGE); __set_errno (ERANGE);
result = ERANGE; retval = ERANGE;
goto out; goto out;
} }
buflen -= total_len; 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)) if (__builtin_expect (total_len > buflen, 0))
goto no_room; goto no_room;
result = 0; retval = 0;
n = TEMP_FAILURE_RETRY (__read (sock, resultbuf->gr_mem[0], n = TEMP_FAILURE_RETRY (__read (sock, resultbuf->gr_mem[0],
total_len)); total_len));
if (__builtin_expect (n != total_len, 0)) if (__builtin_expect (n != total_len, 0))
{ {
/* The `errno' to some value != ERANGE. */ /* The `errno' to some value != ERANGE. */
__set_errno (ENOENT); __set_errno (ENOENT);
result = ENOENT; retval = ENOENT;
} }
else
*result = resultbuf;
} }
else else
{ {
/* The `errno' to some value != ERANGE. */ /* The `errno' to some value != ERANGE. */
__set_errno (ENOENT); __set_errno (ENOENT);
result = ENOENT; /* Even though we have not found anything, the result is zero. */
retval = 0;
} }
out: out:
__close (sock); __close (sock);
return result; return retval;
} }

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. 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, static int nscd_gethst_r (const char *key, size_t keylen, request_type type,
struct hostent *resultbuf, char *buffer, 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 int
__nscd_gethostbyname_r (const char *name, struct hostent *resultbuf, __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; request_type reqtype;
reqtype = (_res.options & RES_USE_INET6) ? GETHOSTBYNAMEv6 : GETHOSTBYNAME; reqtype = (_res.options & RES_USE_INET6) ? GETHOSTBYNAMEv6 : GETHOSTBYNAME;
return nscd_gethst_r (name, strlen (name) + 1, reqtype, resultbuf, return nscd_gethst_r (name, strlen (name) + 1, reqtype, resultbuf,
buffer, buflen, h_errnop); buffer, buflen, result, h_errnop);
} }
int int
__nscd_gethostbyname2_r (const char *name, int af, struct hostent *resultbuf, __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; request_type reqtype;
reqtype = af == AF_INET6 ? GETHOSTBYNAMEv6 : GETHOSTBYNAME; reqtype = af == AF_INET6 ? GETHOSTBYNAMEv6 : GETHOSTBYNAME;
return nscd_gethst_r (name, strlen (name) + 1, reqtype, resultbuf, return nscd_gethst_r (name, strlen (name) + 1, reqtype, resultbuf,
buffer, buflen, h_errnop); buffer, buflen, result, h_errnop);
} }
int int
__nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type, __nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
struct hostent *resultbuf, char *buffer, size_t buflen, struct hostent *resultbuf, char *buffer, size_t buflen,
int *h_errnop) struct hostent **result, int *h_errnop)
{ {
request_type reqtype; request_type reqtype;
@ -80,7 +83,7 @@ __nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
reqtype = type == AF_INET6 ? GETHOSTBYADDRv6 : GETHOSTBYADDR; 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); h_errnop);
} }
@ -117,14 +120,14 @@ static int
internal_function internal_function
nscd_gethst_r (const char *key, size_t keylen, request_type type, nscd_gethst_r (const char *key, size_t keylen, request_type type,
struct hostent *resultbuf, char *buffer, size_t buflen, struct hostent *resultbuf, char *buffer, size_t buflen,
int *h_errnop) struct hostent **result, int *h_errnop)
{ {
int sock = __nscd_open_socket (); int sock = __nscd_open_socket ();
hst_response_header hst_resp; hst_response_header hst_resp;
request_header req; request_header req;
ssize_t nbytes; ssize_t nbytes;
struct iovec vec[4]; struct iovec vec[4];
int result = -1; int retval = -1;
if (sock == -1) if (sock == -1)
{ {
@ -184,7 +187,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
{ {
no_room: no_room:
__set_errno (ERANGE); __set_errno (ERANGE);
result = ERANGE; retval = ERANGE;
goto out; goto out;
} }
cp += align1; cp += align1;
@ -277,7 +280,10 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
/* And finally read the aliases. */ /* And finally read the aliases. */
if ((size_t) TEMP_FAILURE_RETRY (__read (sock, resultbuf->h_aliases[0], if ((size_t) TEMP_FAILURE_RETRY (__read (sock, resultbuf->h_aliases[0],
total_len)) == total_len) total_len)) == total_len)
result = 0; {
retval = 0;
*result = resultbuf;
}
} }
else else
{ {
@ -286,11 +292,12 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
/* The `errno' to some value != ERANGE. */ /* The `errno' to some value != ERANGE. */
__set_errno (ENOENT); __set_errno (ENOENT);
result = ENOENT; /* Even though we have not found anything, the result is zero. */
retval = 0;
} }
out: out:
__close (sock); __close (sock);
return result; return retval;
} }

View File

@ -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. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998. 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, static int nscd_getpw_r (const char *key, size_t keylen, request_type type,
struct passwd *resultbuf, char *buffer, struct passwd *resultbuf, char *buffer,
size_t buflen) internal_function; size_t buflen, struct passwd **result)
internal_function;
int int
__nscd_getpwnam_r (const char *name, struct passwd *resultbuf, char *buffer, __nscd_getpwnam_r (const char *name, struct passwd *resultbuf, char *buffer,
size_t buflen) size_t buflen, struct passwd **result)
{ {
if (name == NULL) if (name == NULL)
return -1; return -1;
return nscd_getpw_r (name, strlen (name) + 1, GETPWBYNAME, resultbuf, return nscd_getpw_r (name, strlen (name) + 1, GETPWBYNAME, resultbuf,
buffer, buflen); buffer, buflen, result);
} }
int int
__nscd_getpwuid_r (uid_t uid, struct passwd *resultbuf, char *buffer, __nscd_getpwuid_r (uid_t uid, struct passwd *resultbuf, char *buffer,
size_t buflen) size_t buflen, struct passwd **result)
{ {
char buf[12]; char buf[12];
size_t n; size_t n;
n = __snprintf (buf, sizeof (buf), "%d", uid) + 1; 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 static int
internal_function internal_function
nscd_getpw_r (const char *key, size_t keylen, request_type type, 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 (); int sock = __nscd_open_socket ();
request_header req; request_header req;
pw_response_header pw_resp; pw_response_header pw_resp;
ssize_t nbytes; ssize_t nbytes;
struct iovec vec[2]; struct iovec vec[2];
int result = -1; int retval = -1;
if (sock == -1) if (sock == -1)
{ {
@ -79,6 +81,9 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
return -1; return -1;
} }
/* No value found so far. */
*result = NULL;
req.version = NSCD_VERSION; req.version = NSCD_VERSION;
req.type = type; req.type = type;
req.key_len = keylen; 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)) if (__builtin_expect (buflen < total, 0))
{ {
__set_errno (ERANGE); __set_errno (ERANGE);
result = ERANGE; retval = ERANGE;
goto out; 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)); nbytes = TEMP_FAILURE_RETRY (__read (sock, buffer, total));
if (nbytes == (ssize_t) total) if (nbytes == (ssize_t) total)
result = 0; {
retval = 0;
*result = resultbuf;
}
} }
else else
{ {
/* The `errno' to some value != ERANGE. */ /* The `errno' to some value != ERANGE. */
__set_errno (ENOENT); __set_errno (ENOENT);
result = ENOENT; /* Even though we have not found anything, the result is zero. */
retval = 0;
} }
out: out:
__close (sock); __close (sock);
return result; return retval;
} }

View File

@ -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. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998. 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 __nss_not_use_nscd_hosts attribute_hidden;
extern int __nscd_getpwnam_r (const char *name, struct passwd *resultbuf, 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, 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, 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, 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, extern int __nscd_gethostbyname_r (const char *name,
struct hostent *resultbuf, struct hostent *resultbuf,
char *buffer, size_t buflen, char *buffer, size_t buflen,
int *h_errnop); struct hostent **result, int *h_errnop);
extern int __nscd_gethostbyname2_r (const char *name, int af, extern int __nscd_gethostbyname2_r (const char *name, int af,
struct hostent *resultbuf, struct hostent *resultbuf,
char *buffer, size_t buflen, 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, extern int __nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
struct hostent *resultbuf, struct hostent *resultbuf,
char *buffer, size_t buflen, char *buffer, size_t buflen,
int *h_errnop); struct hostent **result, int *h_errnop);
#endif /* _NSCD_PROTO_H */ #endif /* _NSCD_PROTO_H */

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. 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) 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); H_ERRNO_VAR);
if (nscd_status >= 0) if (nscd_status >= 0)
{ return nscd_status;
*result = nscd_status == 0 ? resbuf : NULL;
return nscd_status;
}
} }
#endif #endif