This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH roland/disable-nscd] BZ#13696: --disable-nscd configure option


This adds the --disable-nscd configure option to make libc not try
to contact nscd at all.  I've only done the most basic testing (on
x86_64-linux-gnu): 'make check' has no regressions, but that doesn't
really test any of the functionality affected.  I did a few random
'getent' runs by hand with the just-built (not installed) binaries
from a --disable-nscd build (on a system that didn't have nscd
running anyway), and they seemed to work fine.

I would definitely like some review and testing on this, though
I also would like to get it committed pretty soon.

Note that --disable-nscd is technically orthogonal to
--disable-build-nscd (posted separately yesterday, branch
roland/build-nscd):

* You can build a libc that uses nscd, but not build nscd itself.
  That is potentially useful, as there may already be a compatible
  nscd on the system that your libc will work with.

* You can build a libc that doesn't use nscd, but still build nscd
  itself.  This could theoretically be useful, as you might want to
  install a new nscd on a system where a different libc build (one
  that's compatible with the new nscd) is in use elsewhere.
  However:
  * The new nscd must run use the new libc at runtime, not an
    existing libc that uses nscd, because the new nscd won't call
    the libc hooks to tell its nsswitch to avoid using nscd itself.
  * The new nscd (and the new nss_* modules) will not have the
    support for automatically invalidating caches when nss_{files,db}
    files on disk change.  Hence, you may need to use 'nscd -i'
    commands explicitly more often than otherwise.

I haven't decided what I think about that.  Obvious options:

1. Leave it as it is, wholly separate options.  People who use
   --disable-nscd alone will get the subtly-different nscd built
   (and installed).

2. Leave both options, but make --disable-build-nscd default to on
   when --disable-nscd is given.

3. Remove --disable-build-nscd entirely and just don't build nscd
   under --disable-nscd.

#1 seems unwise.  #3 seems likely to be all that anyone will ever
actually want to use, but my pedanticism itches at removing a degree
of freedom to which there is no technical barrier.


Thanks,
Roland


2012-08-16  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.

diff --git a/config.h.in b/config.h.in
index e27e86d..10a9925 100644
--- a/config.h.in
+++ b/config.h.in
@@ -174,6 +174,9 @@
 /* Define if Systemtap <sys/sdt.h> probes should be defined.  */
 #undef USE_STAP_PROBE
 
+/* Define if library functions should try to contact the nscd daemon.  */
+#undef USE_NSCD
+
 /*
  */
 
diff --git a/config.make.in b/config.make.in
index 65410ab..62aea26 100644
--- a/config.make.in
+++ b/config.make.in
@@ -99,6 +99,7 @@ sysdeps-add-ons = @sysdeps_add_ons@
 cross-compiling = @cross_compiling@
 force-install = @force_install@
 link-obsolete-rpc = @link_obsolete_rpc@
+use-nscd = @use_nscd@
 
 # Build tools.
 CC = @CC@
diff --git a/configure b/configure
index facb6a5..c61a1ca 100755
--- a/configure
+++ b/configure
@@ -597,6 +597,7 @@ libc_cv_sysconfdir
 libc_cv_localedir
 libc_cv_slibdir
 old_glibc_headers
+use_nscd
 libc_cv_gcc_unwind_find_fde
 libc_extra_cflags
 CPPUNDEFS
@@ -749,6 +750,7 @@ enable_multi_arch
 enable_nss_crypt
 enable_obsolete_rpc
 enable_systemtap
+enable_nscd
 with_cpu
 '
       ac_precious_vars='build_alias
@@ -1407,6 +1409,7 @@ Optional Features:
   --enable-obsolete-rpc   build and install the obsolete RPC code for
                           link-time usage
   --enable-systemtap      enable systemtap static probe points [default=no]
+  --disable-nscd          library functions will not contact the nscd daemon
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -3751,6 +3754,15 @@ See \`config.log' for more details" "$LINENO" 5; }
   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
 # 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
@@ -7402,6 +7414,14 @@ if test x$libc_cv_gcc_unwind_find_fde = xyes; then
 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
 # Search only in includedir.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for old glibc 2.0.x headers" >&5
diff --git a/configure.in b/configure.in
index 1219b9f..c490fde 100644
--- a/configure.in
+++ b/configure.in
@@ -292,6 +292,13 @@ void foo (int i, void *p)
   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
 # 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
@@ -2098,6 +2105,13 @@ if test x$libc_cv_gcc_unwind_find_fde = xyes; then
 fi
 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
 # Search only in includedir.
 AC_MSG_CHECKING(for old glibc 2.0.x headers)
diff --git a/grp/Makefile b/grp/Makefile
index 127310f..d09537c 100644
--- a/grp/Makefile
+++ b/grp/Makefile
@@ -39,14 +39,14 @@ include ../Rules
 
 ifeq ($(have-thread-library),yes)
 
-CFLAGS-getgrgid_r.c = -DUSE_NSCD=1 -fexceptions
-CFLAGS-getgrnam_r.c = -DUSE_NSCD=1 -fexceptions
+CFLAGS-getgrgid_r.c = -fexceptions
+CFLAGS-getgrnam_r.c = -fexceptions
 CFLAGS-getgrent_r.c = -fexceptions
 CFLAGS-getgrent.c = -fexceptions
 CFLAGS-fgetgrent.c = -fexceptions
 CFLAGS-fgetgrent_r.c = -fexceptions -D_IO_MTSAFE_IO
 CFLAGS-putgrent.c = -fexceptions -D_IO_MTSAFE_IO
-CFLAGS-initgroups.c = -DUSE_NSCD=1 -fexceptions
+CFLAGS-initgroups.c = -fexceptions
 CFLAGS-getgrgid.c = -fexceptions
 
 endif
diff --git a/inet/Makefile b/inet/Makefile
index 80e2d7a..1af5dc7 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -56,11 +56,11 @@ include ../Rules
 
 ifeq ($(have-thread-library),yes)
 
-CFLAGS-gethstbyad_r.c = -DUSE_NSCD=1 -fexceptions
+CFLAGS-gethstbyad_r.c = -fexceptions
 CFLAGS-gethstbyad.c = -fexceptions
-CFLAGS-gethstbynm_r.c = -DUSE_NSCD=1 -fexceptions
+CFLAGS-gethstbynm_r.c = -fexceptions
 CFLAGS-gethstbynm.c = -fexceptions
-CFLAGS-gethstbynm2_r.c = -DUSE_NSCD=1 -fexceptions
+CFLAGS-gethstbynm2_r.c = -fexceptions
 CFLAGS-gethstbynm2.c = -fexceptions
 CFLAGS-gethstent_r.c = -fexceptions
 CFLAGS-gethstent.c = -fexceptions
@@ -77,8 +77,6 @@ CFLAGS-getrpcent_r.c = -fexceptions
 CFLAGS-getrpcent.c = -fexceptions
 CFLAGS-getservent_r.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.c = -fexceptions
 CFLAGS-either_ntoh.c = -fexceptions
diff --git a/inet/getnetgrent_r.c b/inet/getnetgrent_r.c
index c57e7de..8e69ec7 100644
--- a/inet/getnetgrent_r.c
+++ b/inet/getnetgrent_r.c
@@ -182,28 +182,32 @@ __internal_setnetgrent (const char *group, struct __netgrent *datap)
 }
 libc_hidden_def (__internal_setnetgrent)
 
-int
-setnetgrent (const char *group)
+static int
+nscd_setnetgrent (const char *group)
 {
-  int result;
-
-  __libc_lock_lock (lock);
-
+#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])
-    {
-      result = __nscd_setnetgrent (group, &dataset);
-      if (result >= 0)
-	goto out;
-    }
+    return __nscd_setnetgrent (group, &dataset);
+#endif
+  return -1;
+}
 
+int
+setnetgrent (const char *group)
+{
+  int result;
+
+  __libc_lock_lock (lock);
+
+  result = nscd_setnetgrent (group);
+  if (result < 0)
   result = __internal_setnetgrent (group, &dataset);
 
- out:
   __libc_lock_unlock (lock);
 
   return result;
@@ -230,7 +234,7 @@ endnetgrent (void)
   __libc_lock_unlock (lock);
 }
 
-
+#ifdef USE_NSCD
 static enum nss_status
 nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
 		  int *errnop)
@@ -248,7 +252,7 @@ nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
 
   return NSS_STATUS_SUCCESS;
 }
-
+#endif
 
 int
 internal_function
@@ -267,9 +271,14 @@ __internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
   int no_more = datap->nip == NULL;
   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)
 	fct = nscd_getnetgrent;
       else
+#endif
 	{
 	  fct = __nss_lookup_function (datap->nip, "getnetgrent_r");
 	  no_more = fct == NULL;
@@ -375,6 +384,7 @@ int
 innetgr (const char *netgroup, const char *host, const char *user,
 	 const char *domain)
 {
+#ifdef USE_NSCD
   if (__nss_not_use_nscd_netgroup > 0
       && ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY)
     __nss_not_use_nscd_netgroup = 0;
@@ -386,6 +396,7 @@ innetgr (const char *netgroup, const char *host, const char *user,
       if (result >= 0)
 	return result;
     }
+#endif
 
   union
   {
diff --git a/nscd/Makefile b/nscd/Makefile
index ba052eb..de26f06 100644
--- a/nscd/Makefile
+++ b/nscd/Makefile
@@ -20,11 +20,13 @@
 #
 subdir	:= nscd
 
+include ../Makeconfig
+
+ifneq ($(use-nscd),no)
 routines := nscd_getpw_r nscd_getgr_r nscd_gethst_r nscd_getai \
 	    nscd_initgroups nscd_getserv_r nscd_netgroup
 aux	:= nscd_helper
-
-include ../Makeconfig
+endif
 
 # To find xmalloc.c
 vpath %.c ../locale/programs
diff --git a/nscd/nscd.c b/nscd/nscd.c
index 79fb32f..bee9ed4 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -305,8 +305,10 @@ main (int argc, char **argv)
 # endif
 #endif
 
+#ifdef USE_NSCD
   /* Make sure we do not get recursive calls.  */
   __nss_disable_nscd (register_traced_file);
+#endif
 
   /* Init databases.  */
   nscd_init ();
diff --git a/nss/nss_db/db-init.c b/nss/nss_db/db-init.c
index d23e8f8..26508c2 100644
--- a/nss/nss_db/db-init.c
+++ b/nss/nss_db/db-init.c
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifdef USE_NSCD
+
 #include <paths.h>
 #include <nscd/nscd.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");
   cb (servdb, &serv_traced_file.file);
 }
+
+#endif
diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c
index 18757cb..d58bd82 100644
--- a/nss/nss_files/files-init.c
+++ b/nss/nss_files/files-init.c
@@ -1,5 +1,5 @@
 /* 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.
 
    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
    <http://www.gnu.org/licenses/>.  */
 
+#ifdef USE_NSCD
+
 #include <nscd/nscd.h>
 
 
@@ -55,3 +57,5 @@ _nss_files_init (void (*cb) (size_t, struct traced_file *))
 
   cb (netgrdb, &netgr_traced_file.file);
 }
+
+#endif
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index a2628c7..750cd02 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -92,10 +92,12 @@ static name_database *service_table;
 static name_database_entry *defconfig_entries;
 
 
+#ifdef USE_NSCD
 /* Nonzero if this is the nscd process.  */
 static bool is_nscd;
 /* The callback passed to the init functions when nscd is used.  */
 static void (*nscd_init_cb) (size_t, struct traced_file *);
+#endif
 
 
 /* -1 == database not found
@@ -358,6 +360,7 @@ nss_load_library (service_user *ni)
 	  ni->library->lib_handle = (void *) -1l;
 	  __set_errno (saved_errno);
 	}
+# ifdef USE_NSCD
       else if (is_nscd)
 	{
 	  /* Call the init function when nscd is used.  */
@@ -383,6 +386,7 @@ nss_load_library (service_user *ni)
 	      ifct (cb);
 	    }
 	}
+# endif
     }
 
   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.  */
 static void
 nss_load_all_libraries (const char *service, const char *def)
diff --git a/posix/Makefile b/posix/Makefile
index 922f9c0..3560bb2 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -134,7 +134,7 @@ $(objpfx)config-name.h: $(..)scripts/config-uname.sh $(common-objpfx)config.make
 	mv -f $@.new $@
 
 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-pread64.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables
diff --git a/pwd/Makefile b/pwd/Makefile
index 1da4059..5f2c4c1 100644
--- a/pwd/Makefile
+++ b/pwd/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991,1996-1999,2003,2004 Free Software Foundation, Inc.
+# Copyright (C) 1991-2012 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -31,8 +31,6 @@ include ../Rules
 
 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.c = -fexceptions
 CFLAGS-getpw.c = -fexceptions
diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c
index 950498a..eebb3a4 100644
--- a/sysdeps/unix/sysv/linux/check_pf.c
+++ b/sysdeps/unix/sysv/linux/check_pf.c
@@ -78,6 +78,29 @@ __bump_nl_timestamp (void)
 }
 #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 *
 make_request (int fd, pid_t pid)
@@ -253,11 +276,7 @@ make_request (int fd, pid_t pid)
       if (result == NULL)
 	goto out_fail;
 
-#ifdef IS_IN_nscd
-      result->timestamp = nl_timestamp;
-#else
-      result->timestamp = __nscd_get_nl_timestamp ();
-#endif
+      result->timestamp = get_nl_timestamp ();
       result->usecnt = 2;
       result->seen_ipv4 = seen_ipv4;
       result->seen_ipv6 = true;
@@ -302,14 +321,7 @@ __check_pf (bool *seen_ipv4, bool *seen_ipv6,
 
   __libc_lock_lock (lock);
 
-#ifdef IS_IN_nscd
-# 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 ())
+  if (cache_valid_p ())
     {
       data = cache;
       atomic_increment (&cache->usecnt);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]