+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):
-/* 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.
/* 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 */
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/un.h>
+#include <not-cancel.h>
#include "nscd-client.h"
#include "nscd_proto.h"
__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);
}
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;
}
/* 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. */
if (gr_resp.found == 1)
{
+ struct iovec vec[2];
uint32_t *len;
char *p = buffer;
size_t total_len;
}
out:
- __close (sock);
+ close_not_cancel_no_status (sock);
return retval;
}
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/un.h>
+#include <not-cancel.h>
#include "nscd-client.h"
#include "nscd_proto.h"
/* 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;
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;
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;
}
/* 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. */
if (hst_resp.found == 1)
{
+ struct iovec vec[4];
uint32_t *aliases_len;
char *cp = buffer;
uintptr_t align1;
#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"
__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);
}
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;
}
/* 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. */
/* 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)
{
}
out:
- __close (sock);
+ close_not_cancel_no_status (sock);
return retval;
}
/* 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>
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;
char *buflim;