1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

BZ#13696: Add --disable-nscd configure option.

This commit is contained in:
Roland McGrath
2012-08-22 13:31:12 -07:00
parent 07e5155066
commit 3cc3ef96d6
17 changed files with 164 additions and 49 deletions

View File

@ -1,3 +1,42 @@
2012-08-22 Roland McGrath <roland@hack.frob.com>
[BZ# 13696]
* configure.in (use_nscd): New substituted variable, set by
--disable-nscd. If enabled, define USE_NSCD.
* configure: Regenerated.
* config.h.in: Add USE_NSCD.
* config.make.in (use-nscd): New substituted variable.
* inet/Makefile (CFLAGS-gethstbyad_r.c): Likewise.
(CFLAGS-gethstbynm_r.c, CFLAGS-gethstbynm2_r.c): Likewise.
(CFLAGS-getsrvbynm_r.c, CFLAGS-getsrvbypt_r.c): Variables removed.
* grp/Makefile (CFLAGS-getgrgid_r.c): Remove -DUSE_NSCD.
(CFLAGS-getgrnam_r.c): Likewise.
(CFLAGS-initgroups.c): Likewise.
* posix/Makefile (CFLAGS-getaddrinfo.c): Remove -DUSE_NSCD.
* pwd/Makefile (CFLAGS-getpwuid_r.c, CFLAGS-getpwnam_r.c):
Variables removed.
* inet/getnetgrent_r.c
(nscd_setnetgrent): New function, broken out of ...
(setnetgrent): ... here. Call it.
(innetgr): Conditionalize nscd bits on [USE_NSCD].
(nscd_getnetgrent): Conditionalize on [USE_NSCD].
(__internal_getnetgrent_r): Conditionalize its use on [USE_NSCD].
* nscd/Makefile (routines, aux): Move definitions after include of
Makeconfig. Conditionalize on [$(use-nscd) != no].
* nss/nsswitch.c (nss_load_all_libraries, __nss_disable_nscd):
Conditionalize on [USE_NSCD].
(is_nscd, nscd_init_cb): Likewise.
(nss_load_library): Conditionalize init callback on [USE_NSCD].
* nss/nss_files/files-init.c: Conditionalize body on [USE_NSCD].
* nss/nss_db/db-init.c: Likewise.
* nscd/nscd.c (main): Conditionalize __nss_disable_nscd call on
[USE_NSCD].
* sysdeps/unix/sysv/linux/check_pf.c (get_nl_timestamp): New function.
(make_request): Use it.
(cache_valid_p): New function.
(__check_pf): Use it.
* NEWS: Add item for --disable-nscd.
2012-08-22 Dmitry V. Levin <ldv@altlinux.org> 2012-08-22 Dmitry V. Levin <ldv@altlinux.org>
* configure.in (SED): Update AC_CHECK_PROG_VER's version extract regexp * configure.in (SED): Update AC_CHECK_PROG_VER's version extract regexp

9
NEWS
View File

@ -9,9 +9,9 @@ Version 2.17
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
6778, 6808, 9685, 11607, 13717, 13939, 14042, 14090, 14166, 14150, 14151, 6778, 6808, 9685, 11607, 13717, 13696, 13939, 14042, 14090, 14166, 14150,
14154, 14157, 14166, 14173, 14195, 14252, 14283, 14298, 14303, 14307, 14151, 14154, 14157, 14166, 14173, 14195, 14252, 14283, 14298, 14303,
14328, 14331, 14336, 14337, 14347, 14349, 14505 14307, 14328, 14331, 14336, 14337, 14347, 14349, 14505
* Support for STT_GNU_IFUNC symbols added for s390 and s390x. * Support for STT_GNU_IFUNC symbols added for s390 and s390x.
Optimized versions of memcpy, memset, and memcmp added for System z10 and Optimized versions of memcpy, memset, and memcmp added for System z10 and
@ -34,6 +34,9 @@ Version 2.17
* Optimizations of string functions memchr, wcschr, wcscpy, and wcsrchr for * Optimizations of string functions memchr, wcschr, wcscpy, and wcsrchr for
powerpc POWER7. Implemented by Will Schmidt. powerpc POWER7. Implemented by Will Schmidt.
* New configure option --disable-nscd builds the C library such that it
never attempts to contact the Name Service Caching Daemon (nscd).
Version 2.16 Version 2.16

View File

@ -174,6 +174,9 @@
/* Define if Systemtap <sys/sdt.h> probes should be defined. */ /* Define if Systemtap <sys/sdt.h> probes should be defined. */
#undef USE_STAP_PROBE #undef USE_STAP_PROBE
/* Define if library functions should try to contact the nscd daemon. */
#undef USE_NSCD
/* /*
*/ */

View File

@ -100,6 +100,7 @@ sysdeps-add-ons = @sysdeps_add_ons@
cross-compiling = @cross_compiling@ cross-compiling = @cross_compiling@
force-install = @force_install@ force-install = @force_install@
link-obsolete-rpc = @link_obsolete_rpc@ link-obsolete-rpc = @link_obsolete_rpc@
use-nscd = @use_nscd@
# Build tools. # Build tools.
CC = @CC@ CC = @CC@

20
configure vendored
View File

@ -597,6 +597,7 @@ libc_cv_sysconfdir
libc_cv_localedir libc_cv_localedir
libc_cv_slibdir libc_cv_slibdir
old_glibc_headers old_glibc_headers
use_nscd
libc_cv_gcc_unwind_find_fde libc_cv_gcc_unwind_find_fde
libc_extra_cflags libc_extra_cflags
CPPUNDEFS CPPUNDEFS
@ -750,6 +751,7 @@ enable_multi_arch
enable_nss_crypt enable_nss_crypt
enable_obsolete_rpc enable_obsolete_rpc
enable_systemtap enable_systemtap
enable_nscd
with_cpu with_cpu
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
@ -1408,6 +1410,7 @@ Optional Features:
--enable-obsolete-rpc build and install the obsolete RPC code for --enable-obsolete-rpc build and install the obsolete RPC code for
link-time usage link-time usage
--enable-systemtap enable systemtap static probe points [default=no] --enable-systemtap enable systemtap static probe points [default=no]
--disable-nscd library functions will not contact the nscd daemon
Optional Packages: Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@ -3753,6 +3756,15 @@ See \`config.log' for more details" "$LINENO" 5; }
fi fi
fi fi
# Note the use of $use_nscd is near the bottom of the file.
# Check whether --enable-nscd was given.
if test "${enable_nscd+set}" = set; then :
enableval=$enable_nscd; use_nscd=$enableval
else
use_nscd=yes
fi
# The way shlib-versions is used to generate soversions.mk uses a # The way shlib-versions is used to generate soversions.mk uses a
# fairly simplistic model for name recognition that can't distinguish # fairly simplistic model for name recognition that can't distinguish
# i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os # i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os
@ -7404,6 +7416,14 @@ if test x$libc_cv_gcc_unwind_find_fde = xyes; then
fi fi
# This is far from the AC_ARG_ENABLE that sets it so that a sysdeps
# configure fragment can override the value to prevent this AC_DEFINE.
if test "x$use_nscd" != xno; then
$as_echo "#define USE_NSCD 1" >>confdefs.h
fi
# Test for old glibc 2.0.x headers so that they can be removed properly # Test for old glibc 2.0.x headers so that they can be removed properly
# Search only in includedir. # Search only in includedir.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for old glibc 2.0.x headers" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for old glibc 2.0.x headers" >&5

View File

@ -293,6 +293,13 @@ void foo (int i, void *p)
fi fi
fi fi
# Note the use of $use_nscd is near the bottom of the file.
AC_ARG_ENABLE([nscd],
[AS_HELP_STRING([--disable-nscd],
[library functions will not contact the nscd daemon])],
[use_nscd=$enableval],
[use_nscd=yes])
# The way shlib-versions is used to generate soversions.mk uses a # The way shlib-versions is used to generate soversions.mk uses a
# fairly simplistic model for name recognition that can't distinguish # fairly simplistic model for name recognition that can't distinguish
# i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os # i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os
@ -2099,6 +2106,13 @@ if test x$libc_cv_gcc_unwind_find_fde = xyes; then
fi fi
AC_SUBST(libc_cv_gcc_unwind_find_fde) AC_SUBST(libc_cv_gcc_unwind_find_fde)
# This is far from the AC_ARG_ENABLE that sets it so that a sysdeps
# configure fragment can override the value to prevent this AC_DEFINE.
AC_SUBST(use_nscd)
if test "x$use_nscd" != xno; then
AC_DEFINE([USE_NSCD])
fi
# Test for old glibc 2.0.x headers so that they can be removed properly # Test for old glibc 2.0.x headers so that they can be removed properly
# Search only in includedir. # Search only in includedir.
AC_MSG_CHECKING(for old glibc 2.0.x headers) AC_MSG_CHECKING(for old glibc 2.0.x headers)

View File

@ -38,14 +38,14 @@ include ../Rules
ifeq ($(have-thread-library),yes) ifeq ($(have-thread-library),yes)
CFLAGS-getgrgid_r.c = -DUSE_NSCD=1 -fexceptions CFLAGS-getgrgid_r.c = -fexceptions
CFLAGS-getgrnam_r.c = -DUSE_NSCD=1 -fexceptions CFLAGS-getgrnam_r.c = -fexceptions
CFLAGS-getgrent_r.c = -fexceptions CFLAGS-getgrent_r.c = -fexceptions
CFLAGS-getgrent.c = -fexceptions CFLAGS-getgrent.c = -fexceptions
CFLAGS-fgetgrent.c = -fexceptions CFLAGS-fgetgrent.c = -fexceptions
CFLAGS-fgetgrent_r.c = -fexceptions $(libio-mtsafe) CFLAGS-fgetgrent_r.c = -fexceptions $(libio-mtsafe)
CFLAGS-putgrent.c = -fexceptions $(libio-mtsafe) CFLAGS-putgrent.c = -fexceptions $(libio-mtsafe)
CFLAGS-initgroups.c = -DUSE_NSCD=1 -fexceptions CFLAGS-initgroups.c = -fexceptions
CFLAGS-getgrgid.c = -fexceptions CFLAGS-getgrgid.c = -fexceptions
endif endif

View File

@ -56,11 +56,11 @@ include ../Rules
ifeq ($(have-thread-library),yes) ifeq ($(have-thread-library),yes)
CFLAGS-gethstbyad_r.c = -DUSE_NSCD=1 -fexceptions CFLAGS-gethstbyad_r.c = -fexceptions
CFLAGS-gethstbyad.c = -fexceptions CFLAGS-gethstbyad.c = -fexceptions
CFLAGS-gethstbynm_r.c = -DUSE_NSCD=1 -fexceptions CFLAGS-gethstbynm_r.c = -fexceptions
CFLAGS-gethstbynm.c = -fexceptions CFLAGS-gethstbynm.c = -fexceptions
CFLAGS-gethstbynm2_r.c = -DUSE_NSCD=1 -fexceptions CFLAGS-gethstbynm2_r.c = -fexceptions
CFLAGS-gethstbynm2.c = -fexceptions CFLAGS-gethstbynm2.c = -fexceptions
CFLAGS-gethstent_r.c = -fexceptions CFLAGS-gethstent_r.c = -fexceptions
CFLAGS-gethstent.c = -fexceptions CFLAGS-gethstent.c = -fexceptions
@ -77,8 +77,6 @@ CFLAGS-getrpcent_r.c = -fexceptions
CFLAGS-getrpcent.c = -fexceptions CFLAGS-getrpcent.c = -fexceptions
CFLAGS-getservent_r.c = -fexceptions CFLAGS-getservent_r.c = -fexceptions
CFLAGS-getservent.c = -fexceptions CFLAGS-getservent.c = -fexceptions
CFLAGS-getsrvbynm_r.c = -DUSE_NSCD=1
CFLAGS-getsrvbypt_r.c = -DUSE_NSCD=1
CFLAGS-getprtent_r.c = -fexceptions CFLAGS-getprtent_r.c = -fexceptions
CFLAGS-getprtent.c = -fexceptions CFLAGS-getprtent.c = -fexceptions
CFLAGS-either_ntoh.c = -fexceptions CFLAGS-either_ntoh.c = -fexceptions

View File

@ -182,6 +182,21 @@ __internal_setnetgrent (const char *group, struct __netgrent *datap)
} }
libc_hidden_def (__internal_setnetgrent) libc_hidden_def (__internal_setnetgrent)
static int
nscd_setnetgrent (const char *group)
{
#ifdef USE_NSCD
if (__nss_not_use_nscd_netgroup > 0
&& ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY)
__nss_not_use_nscd_netgroup = 0;
if (!__nss_not_use_nscd_netgroup
&& !__nss_database_custom[NSS_DBSIDX_netgroup])
return __nscd_setnetgrent (group, &dataset);
#endif
return -1;
}
int int
setnetgrent (const char *group) setnetgrent (const char *group)
{ {
@ -189,21 +204,10 @@ setnetgrent (const char *group)
__libc_lock_lock (lock); __libc_lock_lock (lock);
if (__nss_not_use_nscd_netgroup > 0 result = nscd_setnetgrent (group);
&& ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY) if (result < 0)
__nss_not_use_nscd_netgroup = 0; result = __internal_setnetgrent (group, &dataset);
if (!__nss_not_use_nscd_netgroup
&& !__nss_database_custom[NSS_DBSIDX_netgroup])
{
result = __nscd_setnetgrent (group, &dataset);
if (result >= 0)
goto out;
}
result = __internal_setnetgrent (group, &dataset);
out:
__libc_lock_unlock (lock); __libc_lock_unlock (lock);
return result; return result;
@ -230,7 +234,7 @@ endnetgrent (void)
__libc_lock_unlock (lock); __libc_lock_unlock (lock);
} }
#ifdef USE_NSCD
static enum nss_status static enum nss_status
nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen, nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
int *errnop) int *errnop)
@ -248,7 +252,7 @@ nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
return NSS_STATUS_SUCCESS; return NSS_STATUS_SUCCESS;
} }
#endif
int int
internal_function internal_function
@ -267,9 +271,14 @@ __internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
int no_more = datap->nip == NULL; int no_more = datap->nip == NULL;
if (! no_more) if (! no_more)
{ {
#ifdef USE_NSCD
/* This bogus function pointer is a special marker left by
__nscd_setnetgrent to tell us to use the data it left
before considering any modules. */
if (datap->nip == (service_user *) -1l) if (datap->nip == (service_user *) -1l)
fct = nscd_getnetgrent; fct = nscd_getnetgrent;
else else
#endif
{ {
fct = __nss_lookup_function (datap->nip, "getnetgrent_r"); fct = __nss_lookup_function (datap->nip, "getnetgrent_r");
no_more = fct == NULL; no_more = fct == NULL;
@ -375,6 +384,7 @@ int
innetgr (const char *netgroup, const char *host, const char *user, innetgr (const char *netgroup, const char *host, const char *user,
const char *domain) const char *domain)
{ {
#ifdef USE_NSCD
if (__nss_not_use_nscd_netgroup > 0 if (__nss_not_use_nscd_netgroup > 0
&& ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY) && ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY)
__nss_not_use_nscd_netgroup = 0; __nss_not_use_nscd_netgroup = 0;
@ -386,6 +396,7 @@ innetgr (const char *netgroup, const char *host, const char *user,
if (result >= 0) if (result >= 0)
return result; return result;
} }
#endif
union union
{ {

View File

@ -20,11 +20,13 @@
# #
subdir := nscd subdir := nscd
include ../Makeconfig
ifneq ($(use-nscd),no)
routines := nscd_getpw_r nscd_getgr_r nscd_gethst_r nscd_getai \ routines := nscd_getpw_r nscd_getgr_r nscd_gethst_r nscd_getai \
nscd_initgroups nscd_getserv_r nscd_netgroup nscd_initgroups nscd_getserv_r nscd_netgroup
aux := nscd_helper aux := nscd_helper
endif
include ../Makeconfig
# To find xmalloc.c # To find xmalloc.c
vpath %.c ../locale/programs vpath %.c ../locale/programs

View File

@ -305,8 +305,10 @@ main (int argc, char **argv)
# endif # endif
#endif #endif
#ifdef USE_NSCD
/* Make sure we do not get recursive calls. */ /* Make sure we do not get recursive calls. */
__nss_disable_nscd (register_traced_file); __nss_disable_nscd (register_traced_file);
#endif
/* Init databases. */ /* Init databases. */
nscd_init (); nscd_init ();

View File

@ -16,6 +16,8 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifdef USE_NSCD
#include <paths.h> #include <paths.h>
#include <nscd/nscd.h> #include <nscd/nscd.h>
#include <string.h> #include <string.h>
@ -51,3 +53,5 @@ _nss_db_init (void (*cb) (size_t, struct traced_file *))
strcpy (serv_traced_file.file.fname, _PATH_VARDB "services.db"); strcpy (serv_traced_file.file.fname, _PATH_VARDB "services.db");
cb (servdb, &serv_traced_file.file); cb (servdb, &serv_traced_file.file);
} }
#endif

View File

@ -1,5 +1,5 @@
/* Initialization in nss_files module. /* Initialization in nss_files module.
Copyright (C) 2011 Free Software Foundation, Inc. Copyright (C) 2011-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,6 +16,8 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifdef USE_NSCD
#include <nscd/nscd.h> #include <nscd/nscd.h>
@ -55,3 +57,5 @@ _nss_files_init (void (*cb) (size_t, struct traced_file *))
cb (netgrdb, &netgr_traced_file.file); cb (netgrdb, &netgr_traced_file.file);
} }
#endif

View File

@ -92,10 +92,12 @@ static name_database *service_table;
static name_database_entry *defconfig_entries; static name_database_entry *defconfig_entries;
#ifdef USE_NSCD
/* Nonzero if this is the nscd process. */ /* Nonzero if this is the nscd process. */
static bool is_nscd; static bool is_nscd;
/* The callback passed to the init functions when nscd is used. */ /* The callback passed to the init functions when nscd is used. */
static void (*nscd_init_cb) (size_t, struct traced_file *); static void (*nscd_init_cb) (size_t, struct traced_file *);
#endif
/* -1 == database not found /* -1 == database not found
@ -358,6 +360,7 @@ nss_load_library (service_user *ni)
ni->library->lib_handle = (void *) -1l; ni->library->lib_handle = (void *) -1l;
__set_errno (saved_errno); __set_errno (saved_errno);
} }
# ifdef USE_NSCD
else if (is_nscd) else if (is_nscd)
{ {
/* Call the init function when nscd is used. */ /* Call the init function when nscd is used. */
@ -377,12 +380,13 @@ nss_load_library (service_user *ni)
if (ifct != NULL) if (ifct != NULL)
{ {
void (*cb) (size_t, struct traced_file *) = nscd_init_cb; void (*cb) (size_t, struct traced_file *) = nscd_init_cb;
# ifdef PTR_DEMANGLE # ifdef PTR_DEMANGLE
PTR_DEMANGLE (cb); PTR_DEMANGLE (cb);
# endif # endif
ifct (cb); ifct (cb);
} }
} }
# endif
} }
return 0; return 0;
@ -808,7 +812,7 @@ nss_new_service (name_database *database, const char *name)
} }
#ifdef SHARED #if defined SHARED && defined USE_NSCD
/* Load all libraries for the service. */ /* Load all libraries for the service. */
static void static void
nss_load_all_libraries (const char *service, const char *def) nss_load_all_libraries (const char *service, const char *def)

View File

@ -134,7 +134,7 @@ $(objpfx)config-name.h: $(..)scripts/config-uname.sh $(common-objpfx)config.make
mv -f $@.new $@ mv -f $@.new $@
CFLAGS-regex.c = -Wno-strict-prototypes CFLAGS-regex.c = -Wno-strict-prototypes
CFLAGS-getaddrinfo.c = -DRESOLVER -fexceptions -DUSE_NSCD CFLAGS-getaddrinfo.c = -DRESOLVER -fexceptions
CFLAGS-pread.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pread.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-pread64.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pread64.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables

View File

@ -31,8 +31,6 @@ include ../Rules
ifeq ($(have-thread-library),yes) ifeq ($(have-thread-library),yes)
CFLAGS-getpwuid_r.c = -DUSE_NSCD=1
CFLAGS-getpwnam_r.c = -DUSE_NSCD=1
CFLAGS-getpwent_r.c = -fexceptions CFLAGS-getpwent_r.c = -fexceptions
CFLAGS-getpwent.c = -fexceptions CFLAGS-getpwent.c = -fexceptions
CFLAGS-getpw.c = -fexceptions CFLAGS-getpw.c = -fexceptions

View File

@ -78,6 +78,29 @@ __bump_nl_timestamp (void)
} }
#endif #endif
static inline uint32_t
get_nl_timestamp (void)
{
#ifdef IS_IN_nscd
return nl_timestamp;
#elif defined USE_NSCD
return __nscd_get_nl_timestamp ();
#else
return 0;
#endif
}
static inline bool
cache_valid_p (void)
{
if (cache != NULL)
{
uint32_t timestamp = get_nl_timestamp ();
return timestamp != 0 && cache->timestamp == timestamp;
}
return false;
}
static struct cached_data * static struct cached_data *
make_request (int fd, pid_t pid) make_request (int fd, pid_t pid)
@ -253,11 +276,7 @@ make_request (int fd, pid_t pid)
if (result == NULL) if (result == NULL)
goto out_fail; goto out_fail;
#ifdef IS_IN_nscd result->timestamp = get_nl_timestamp ();
result->timestamp = nl_timestamp;
#else
result->timestamp = __nscd_get_nl_timestamp ();
#endif
result->usecnt = 2; result->usecnt = 2;
result->seen_ipv4 = seen_ipv4; result->seen_ipv4 = seen_ipv4;
result->seen_ipv6 = true; result->seen_ipv6 = true;
@ -302,14 +321,7 @@ __check_pf (bool *seen_ipv4, bool *seen_ipv6,
__libc_lock_lock (lock); __libc_lock_lock (lock);
#ifdef IS_IN_nscd if (cache_valid_p ())
# define cache_valid() nl_timestamp != 0 && cache->timestamp == nl_timestamp
#else
# define cache_valid() \
({ uint32_t val = __nscd_get_nl_timestamp (); \
val != 0 && cache->timestamp == val; })
#endif
if (cache != NULL && cache_valid ())
{ {
data = cache; data = cache;
atomic_increment (&cache->usecnt); atomic_increment (&cache->usecnt);