2004-06-05  Ulrich Drepper  <drepper@redhat.com>

	* stdio-common/_itoa.h: Don't expand _itoa inline for libc.
	* stdio-common/_itoa.c: Add _itoa implementation.

	* nscd/nscd_gethst_r.c (__nscd_open_socket): Change implementation
	to also send request.  Add parameter to allow this.
	Change callers.
	* nscd/nscd_getgr_r.c: Change __nscd_open_socket caller.
	* nscd/nscd_getpw_r.c: Likewise.
	* nscd/nscd-client.h: Change __nscd_open_socket prototype.
This commit is contained in:
Ulrich Drepper 2004-06-06 06:06:02 +00:00
parent d4c4ee1ed5
commit 40c38b6c9d
6 changed files with 109 additions and 91 deletions

View File

@ -1,3 +1,15 @@
2004-06-05 Ulrich Drepper <drepper@redhat.com>
* stdio-common/_itoa.h: Don't expand _itoa inline for libc.
* stdio-common/_itoa.c: Add _itoa implementation.
* nscd/nscd_gethst_r.c (__nscd_open_socket): Change implementation
to also send request. Add parameter to allow this.
Change callers.
* nscd/nscd_getgr_r.c: Change __nscd_open_socket caller.
* nscd/nscd_getpw_r.c: Likewise.
* nscd/nscd-client.h: Change __nscd_open_socket prototype.
2004-06-05 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/x86_64/makecontext.c (__makecontext):

View File

@ -1,4 +1,4 @@
/* Copyright (c) 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
/* Copyright (c) 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@ -111,6 +111,8 @@ typedef struct
/* Open socket connection to nscd server. */
extern int __nscd_open_socket (void) attribute_hidden;
extern int __nscd_open_socket (const char *key, size_t keylen,
request_type type, void *response,
size_t responselen) attribute_hidden;
#endif /* nscd.h */

View File

@ -28,6 +28,7 @@
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/un.h>
#include <not-cancel.h>
#include "nscd-client.h"
#include "nscd_proto.h"
@ -53,12 +54,12 @@ int
__nscd_getgrgid_r (gid_t gid, struct group *resultbuf, char *buffer,
size_t buflen, struct group **result)
{
char buf[12];
size_t n;
char buf[3 * sizeof (gid_t)];
buf[sizeof (buf) - 1] = '\0';
char *cp = _itoa_word (gid, buf + sizeof (buf) - 1, 10, 0);
n = __snprintf (buf, sizeof (buf), "%d", gid) + 1;
return nscd_getgr_r (buf, n, GETGRBYGID, resultbuf, buffer, buflen, result);
return nscd_getgr_r (cp, buf + sizeof (buf) - cp, GETGRBYGID, resultbuf,
buffer, buflen, result);
}
@ -68,13 +69,9 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
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 retval = -1;
int sock = __nscd_open_socket (key, keylen, type, &gr_resp,
sizeof (gr_resp));
if (sock == -1)
{
__nss_not_use_nscd_group = 1;
@ -82,26 +79,9 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
}
/* No value found so far. */
int retval = -1;
*result = NULL;
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
vec[0].iov_base = &req;
vec[0].iov_len = sizeof (request_header);
vec[1].iov_base = (void *) key;
vec[1].iov_len = keylen;
nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
if (nbytes != (ssize_t) (sizeof (request_header) + keylen))
goto out;
nbytes = TEMP_FAILURE_RETRY (__read (sock, &gr_resp,
sizeof (gr_response_header)));
if (nbytes != (ssize_t) sizeof (gr_response_header))
goto out;
if (gr_resp.found == -1)
{
/* The daemon does not cache this database. */
@ -111,6 +91,7 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
if (gr_resp.found == 1)
{
struct iovec vec[2];
uint32_t *len;
char *p = buffer;
size_t total_len;
@ -196,7 +177,7 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
}
out:
__close (sock);
close_not_cancel_no_status (sock);
return retval;
}

View File

@ -29,6 +29,7 @@
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/un.h>
#include <not-cancel.h>
#include "nscd-client.h"
#include "nscd_proto.h"
@ -90,7 +91,8 @@ __nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
/* Create a socket connected to a name. */
int
__nscd_open_socket (void)
__nscd_open_socket (const char *key, size_t keylen, request_type type,
void *response, size_t responselen)
{
struct sockaddr_un addr;
int sock;
@ -107,9 +109,33 @@ __nscd_open_socket (void)
strcpy (addr.sun_path, _PATH_NSCDSOCKET);
if (__connect (sock, (struct sockaddr *) &addr, sizeof (addr)) < 0)
{
__close (sock);
__set_errno (saved_errno);
return -1;
goto out;
}
request_header req;
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
struct iovec vec[2];
vec[0].iov_base = &req;
vec[0].iov_len = sizeof (request_header);
vec[1].iov_base = (void *) key;
vec[1].iov_len = keylen;
ssize_t nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
if (nbytes != (ssize_t) (sizeof (request_header) + keylen))
{
out:
close_not_cancel_no_status (sock);
sock = -1;
}
else
{
nbytes = TEMP_FAILURE_RETRY (__read (sock, response, responselen));
if (nbytes != (ssize_t) responselen)
goto out;
}
return sock;
@ -122,13 +148,9 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
struct hostent *resultbuf, char *buffer, size_t buflen,
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 retval = -1;
int sock = __nscd_open_socket (key, keylen, type, &hst_resp,
sizeof (hst_resp));
if (sock == -1)
{
__nss_not_use_nscd_hosts = 1;
@ -136,26 +158,9 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
}
/* No value found so far. */
int retval = -1;
*result = NULL;
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
vec[0].iov_base = &req;
vec[0].iov_len = sizeof (request_header);
vec[1].iov_base = (void *) key;
vec[1].iov_len = req.key_len;
nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
if ((size_t) nbytes != sizeof (request_header) + req.key_len)
goto out;
nbytes = TEMP_FAILURE_RETRY (__read (sock, &hst_resp,
sizeof (hst_response_header)));
if (__builtin_expect (nbytes != sizeof (hst_response_header), 0))
goto out;
if (hst_resp.found == -1)
{
/* The daemon does not cache this database. */
@ -165,6 +170,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
if (hst_resp.found == 1)
{
struct iovec vec[4];
uint32_t *aliases_len;
char *cp = buffer;
uintptr_t align1;

View File

@ -27,6 +27,8 @@
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/un.h>
#include <not-cancel.h>
#include <stdio-common/_itoa.h>
#include "nscd-client.h"
#include "nscd_proto.h"
@ -53,12 +55,12 @@ int
__nscd_getpwuid_r (uid_t uid, struct passwd *resultbuf, char *buffer,
size_t buflen, struct passwd **result)
{
char buf[12];
size_t n;
char buf[3 * sizeof (uid_t)];
buf[sizeof (buf) - 1] = '\0';
char *cp = _itoa_word (uid, buf + sizeof (buf) - 1, 10, 0);
n = __snprintf (buf, sizeof (buf), "%d", uid) + 1;
return nscd_getpw_r (buf, n, GETPWBYUID, resultbuf, buffer, buflen, result);
return nscd_getpw_r (cp, buf + sizeof (buf) - cp, GETPWBYUID, resultbuf,
buffer, buflen, result);
}
@ -68,13 +70,9 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
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 retval = -1;
int sock = __nscd_open_socket (key, keylen, type, &pw_resp,
sizeof (pw_resp));
if (sock == -1)
{
__nss_not_use_nscd_passwd = 1;
@ -82,26 +80,9 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
}
/* No value found so far. */
int retval = -1;
*result = NULL;
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
vec[0].iov_base = &req;
vec[0].iov_len = sizeof (request_header);
vec[1].iov_base = (void *) key;
vec[1].iov_len = keylen;
nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
if (nbytes != (ssize_t) (sizeof (request_header) + keylen))
goto out;
nbytes = TEMP_FAILURE_RETRY (__read (sock, &pw_resp,
sizeof (pw_response_header)));
if (nbytes != (ssize_t) sizeof (pw_response_header))
goto out;
if (__builtin_expect (pw_resp.found == -1, 0))
{
/* The daemon does not cache this database. */
@ -142,7 +123,7 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
/* get pw_pshell */
resultbuf->pw_shell = p;
nbytes = TEMP_FAILURE_RETRY (__read (sock, buffer, total));
ssize_t nbytes = TEMP_FAILURE_RETRY (__read (sock, buffer, total));
if (nbytes == (ssize_t) total)
{
@ -159,7 +140,7 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
}
out:
__close (sock);
close_not_cancel_no_status (sock);
return retval;
}

View File

@ -1,5 +1,5 @@
/* Internal function for converting integers to ASCII.
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003, 2004
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Torbjorn Granlund <tege@matematik.su.se>
@ -165,6 +165,42 @@ extern const char _itoa_upper_digits[];
extern const char _itoa_upper_digits_internal[] attribute_hidden;
char *
_itoa_word (unsigned long value, char *buflim,
unsigned int base, int upper_case)
{
const char *digits = (upper_case
#if !defined NOT_IN_libc || defined IS_IN_rtld
? INTUSE(_itoa_upper_digits)
: INTUSE(_itoa_lower_digits)
#else
? _itoa_upper_digits
: _itoa_lower_digits
#endif
);
switch (base)
{
#define SPECIAL(Base) \
case Base: \
do \
*--buflim = digits[value % Base]; \
while ((value /= Base) != 0); \
break
SPECIAL (10);
SPECIAL (16);
SPECIAL (8);
default:
do
*--buflim = digits[value % base];
while ((value /= base) != 0);
}
return buflim;
}
#undef SPECIAL
char *
_itoa (value, buflim, base, upper_case)
unsigned long long int value;