about summary refs log tree commit diff
path: root/nss
diff options
context:
space:
mode:
Diffstat (limited to 'nss')
-rw-r--r--nss/Versions5
-rw-r--r--nss/XXX-lookup.c23
-rw-r--r--nss/getXXbyYY_r.c63
-rw-r--r--nss/getXXent_r.c7
-rw-r--r--nss/getnssent_r.c18
-rw-r--r--nss/nsswitch.c27
-rw-r--r--nss/nsswitch.h11
-rw-r--r--nss/service-lookup.c3
8 files changed, 112 insertions, 45 deletions
diff --git a/nss/Versions b/nss/Versions
index 365f9e229b..8f2f0fb371 100644
--- a/nss/Versions
+++ b/nss/Versions
@@ -9,7 +9,10 @@ libc {
   }
   GLIBC_PRIVATE {
     _nss_files_parse_grent; _nss_files_parse_pwent; _nss_files_parse_spent;
-    __nss_disable_nscd; __nss_lookup_function; __nss_services_lookup;
+    __nss_disable_nscd; __nss_lookup_function;
+
+    __nss_passwd_lookup2; __nss_group_lookup2; __nss_hosts_lookup2;
+    __nss_services_lookup2; __nss_next2;
   }
 }
 
diff --git a/nss/XXX-lookup.c b/nss/XXX-lookup.c
index da0e6f4510..f88d69e9ec 100644
--- a/nss/XXX-lookup.c
+++ b/nss/XXX-lookup.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1999, 2000, 2002, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -34,7 +34,8 @@
 |* 								   *|
 \*******************************************************************/
 
-#define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
+#define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2)
+#define DB_COMPAT_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
 #define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
 #define CONCAT3_2(Pre, Name, Post) Pre##Name##Post
 
@@ -56,12 +57,14 @@
 service_user *DATABASE_NAME_SYMBOL attribute_hidden;
 
 extern int DB_LOOKUP_FCT (service_user **ni, const char *fct_name,
-			  void **fctp) internal_function;
+			  const char *fct2_name, void **fctp)
+  internal_function;
 libc_hidden_proto (DB_LOOKUP_FCT)
 
 int
 internal_function
-DB_LOOKUP_FCT (service_user **ni, const char *fct_name, void **fctp)
+DB_LOOKUP_FCT (service_user **ni, const char *fct_name, const char *fct2_name,
+	       void **fctp)
 {
   if (DATABASE_NAME_SYMBOL == NULL
       && __nss_database_lookup (DATABASE_NAME_STRING, ALTERNATE_NAME_STRING,
@@ -70,6 +73,16 @@ DB_LOOKUP_FCT (service_user **ni, const char *fct_name, void **fctp)
 
   *ni = DATABASE_NAME_SYMBOL;
 
-  return __nss_lookup (ni, fct_name, fctp);
+  return __nss_lookup (ni, fct_name, fct2_name, fctp);
 }
 libc_hidden_def (DB_LOOKUP_FCT)
+
+
+#ifndef NO_COMPAT
+int
+internal_function attribute_compat_text_section
+DB_COMPAT_FCT (service_user **ni, const char *fct_name, void **fctp)
+{
+  return DB_LOOKUP_FCT (ni, fct_name, NULL, fctp);
+}
+#endif
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
index 6c90ba543d..b535f67a7b 100644
--- a/nss/getXXbyYY_r.c
+++ b/nss/getXXbyYY_r.c
@@ -42,12 +42,18 @@
 |* DATABASE_NAME - name of the database the function accesses	   *|
 |*		   (e.g., host, services, ...)			   *|
 |*								   *|
-|* ADD_PARAMS    - additional parameter, can vary in number	   *|
+|* ADD_PARAMS    - additional parameters, can vary in number	   *|
 |*								   *|
-|* ADD_VARIABLES - names of additional parameter		   *|
+|* ADD_VARIABLES - names of additional parameters		   *|
 |*								   *|
 |* Optionally the following vars can be defined:		   *|
 |*								   *|
+|* EXTRA_PARAMS  - optional parameters, can vary in number	   *|
+|*								   *|
+|* EXTRA_VARIABLES - names of optional parameter		   *|
+|*								   *|
+|* FUNCTION_NAME - alternative name of the non-reentrant function  *|
+|*								   *|
 |* NEED_H_ERRNO  - an extra parameter will be passed to point to   *|
 |*		   the global `h_errno' variable.		   *|
 |*								   *|
@@ -62,6 +68,11 @@
 
 /* To make the real sources a bit prettier.  */
 #define REENTRANT_NAME APPEND_R (FUNCTION_NAME)
+#ifdef FUNCTION2_NAME
+# define REENTRANT2_NAME APPEND_R (FUNCTION2_NAME)
+#else
+# define REENTRANT2_NAME NULL
+#endif
 #define APPEND_R(name) APPEND_R1 (name)
 #define APPEND_R1(name) name##_r
 #define INTERNAL(name) INTERNAL1 (name)
@@ -80,12 +91,17 @@
 
 #define FUNCTION_NAME_STRING STRINGIZE (FUNCTION_NAME)
 #define REENTRANT_NAME_STRING STRINGIZE (REENTRANT_NAME)
+#ifdef FUNCTION2_NAME
+# define REENTRANT2_NAME_STRING STRINGIZE (REENTRANT2_NAME)
+#else
+# define REENTRANT2_NAME_STRING NULL
+#endif
 #define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME)
 #define STRINGIZE(name) STRINGIZE1 (name)
 #define STRINGIZE1(name) #name
 
 #ifndef DB_LOOKUP_FCT
-# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
+# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2)
 # define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
 # define CONCAT3_2(Pre, Name, Post) Pre##Name##Post
 #endif
@@ -101,6 +117,13 @@
 # define H_ERRNO_VAR_P NULL
 #endif
 
+#ifndef EXTRA_PARAMS
+# define EXTRA_PARAMS
+#endif
+#ifndef EXTRA_VARIABLES
+# define EXTRA_VARIABLES
+#endif
+
 #ifdef HAVE_AF
 # define AF_VAL af
 #else
@@ -109,17 +132,20 @@
 
 /* Type of the lookup function we need here.  */
 typedef enum nss_status (*lookup_function) (ADD_PARAMS, LOOKUP_TYPE *, char *,
-					    size_t, int * H_ERRNO_PARM);
+					    size_t, int * H_ERRNO_PARM
+					    EXTRA_PARAMS);
 
 /* The lookup function for the first entry of this service.  */
-extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp)
+extern int DB_LOOKUP_FCT (service_user **nip, const char *name,
+			  const char *name2, void **fctp)
      internal_function;
 libc_hidden_proto (DB_LOOKUP_FCT)
 
 
 int
 INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
-			   size_t buflen, LOOKUP_TYPE **result H_ERRNO_PARM)
+			   size_t buflen, LOOKUP_TYPE **result H_ERRNO_PARM
+			   EXTRA_PARAMS)
 {
   static bool startp_initialized;
   static service_user *startp;
@@ -171,7 +197,8 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
 
   if (! startp_initialized)
     {
-      no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, &fct.ptr);
+      no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING,
+			       REENTRANT2_NAME_STRING, &fct.ptr);
       if (no_more)
 	{
 	  void *tmp_ptr = (service_user *) -1l;
@@ -224,7 +251,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
 #endif
 
       status = DL_CALL_FCT (fct.l, (ADD_VARIABLES, resbuf, buffer, buflen,
-				    &errno H_ERRNO_VAR));
+				    &errno H_ERRNO_VAR EXTRA_VARIABLES));
 
       /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
 	 provided buffer is too small.  In this case we should give
@@ -238,8 +265,8 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
 	  && errno == ERANGE)
 	break;
 
-      no_more = __nss_next (&nip, REENTRANT_NAME_STRING,
-			    &fct.ptr, status, 0);
+      no_more = __nss_next2 (&nip, REENTRANT_NAME_STRING,
+			     REENTRANT2_NAME_STRING, &fct.ptr, status, 0);
     }
 
 #ifdef HANDLE_DIGITS_DOTS
@@ -274,10 +301,11 @@ done:
 }
 
 
-#include <shlib-compat.h>
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1_2)
-#define OLD(name) OLD1 (name)
-#define OLD1(name) __old_##name
+#ifndef FUNCTION2_NAME
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1_2)
+#  define OLD(name) OLD1 (name)
+#  define OLD1(name) __old_##name
 
 int
 attribute_compat_text_section
@@ -293,19 +321,20 @@ OLD (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
   return ret;
 }
 
-#define do_symbol_version(real, name, version) \
+#  define do_symbol_version(real, name, version) \
   compat_symbol (libc, real, name, version)
 do_symbol_version (OLD (REENTRANT_NAME), REENTRANT_NAME, GLIBC_2_0);
-#endif
+# endif
 
 /* As INTERNAL (REENTRANT_NAME) may be hidden, we need an alias
    in between so that the REENTRANT_NAME@@GLIBC_2.1.2 is not
    hidden too.  */
 strong_alias (INTERNAL (REENTRANT_NAME), NEW (REENTRANT_NAME));
 
-#define do_default_symbol_version(real, name, version) \
+# define do_default_symbol_version(real, name, version) \
   versioned_symbol (libc, real, name, version)
 do_default_symbol_version (NEW (REENTRANT_NAME),
 			   REENTRANT_NAME, GLIBC_2_1_2);
+#endif
 
 static_link_warning (REENTRANT_NAME)
diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c
index db4abaf5d7..7a881c02ac 100644
--- a/nss/getXXent_r.c
+++ b/nss/getXXent_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,97,98,99,2000,2002,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2000,2002,2004,2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -64,7 +64,7 @@
 #define STRINGIZE1(Name) #Name
 
 #ifndef DB_LOOKUP_FCT
-# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
+# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2)
 # define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
 # define CONCAT3_2(Pre, Name, Post) Pre##Name##Post
 #endif
@@ -113,7 +113,8 @@ static STAYOPEN_TMP;
 __libc_lock_define_initialized (static, lock)
 
 /* The lookup function for the first entry of this service.  */
-extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp)
+extern int DB_LOOKUP_FCT (service_user **nip, const char *name,
+			  const char *name2, void **fctp)
      internal_function;
 libc_hidden_proto (DB_LOOKUP_FCT)
 
diff --git a/nss/getnssent_r.c b/nss/getnssent_r.c
index a0cfa72bd2..f50667a18e 100644
--- a/nss/getnssent_r.c
+++ b/nss/getnssent_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2002, 2004, 2007 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
@@ -30,7 +30,7 @@ setup (const char *func_name, db_lookup_function lookup_fct,
   int no_more;
   if (*startp == NULL)
     {
-      no_more = lookup_fct (nip, func_name, fctp);
+      no_more = lookup_fct (nip, func_name, NULL, fctp);
       *startp = no_more ? (service_user *) -1l : *nip;
     }
   else if (*startp == (service_user *) -1l)
@@ -42,7 +42,7 @@ setup (const char *func_name, db_lookup_function lookup_fct,
 	/* Reset to the beginning of the service list.  */
 	*nip = *startp;
       /* Look up the first function.  */
-      no_more = __nss_lookup (nip, func_name, fctp);
+      no_more = __nss_lookup (nip, func_name, NULL, fctp);
     }
   return no_more;
 }
@@ -80,8 +80,7 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
       else
 	status = DL_CALL_FCT (fct.f, (0));
 
-      no_more = __nss_next (nip, func_name, &fct.ptr,
-			    status, 0);
+      no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, status, 0);
       if (is_last_nip)
 	*last_nip = *nip;
     }
@@ -120,7 +119,7 @@ __nss_endent (const char *func_name, db_lookup_function lookup_fct,
 	/* We have processed all services which were used.  */
 	break;
 
-      no_more = __nss_next (nip, func_name, &fct.ptr, 0, 1);
+      no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, 0, 1);
     }
   *last_nip = *nip = NULL;
 }
@@ -177,8 +176,8 @@ __nss_getent_r (const char *getent_func_name,
 
       do
 	{
-	  no_more = __nss_next (nip, getent_func_name, &fct.ptr,
-				status, 0);
+	  no_more = __nss_next2 (nip, getent_func_name, NULL, &fct.ptr,
+				 status, 0);
 
 	  if (is_last_nip)
 	    *last_nip = *nip;
@@ -192,8 +191,7 @@ __nss_getent_r (const char *getent_func_name,
 		void *ptr;
 	      } sfct;
 
-	      no_more = __nss_lookup (nip, setent_func_name,
-				      &sfct.ptr);
+	      no_more = __nss_lookup (nip, setent_func_name, NULL, &sfct.ptr);
 
 	      if (! no_more)
 	        {
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index 46965fd8ff..28aa1b4f34 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -145,9 +145,12 @@ libc_hidden_def (__nss_database_lookup)
     0 == function found
     1 == finished */
 int
-__nss_lookup (service_user **ni, const char *fct_name, void **fctp)
+__nss_lookup (service_user **ni, const char *fct_name, const char *fct2_name,
+	      void **fctp)
 {
   *fctp = __nss_lookup_function (*ni, fct_name);
+  if (*fctp == NULL && fct2_name != NULL)
+    *fctp = __nss_lookup_function (*ni, fct_name);
 
   while (*fctp == NULL
 	 && nss_next_action (*ni, NSS_STATUS_UNAVAIL) == NSS_ACTION_CONTINUE
@@ -156,6 +159,8 @@ __nss_lookup (service_user **ni, const char *fct_name, void **fctp)
       *ni = (*ni)->next;
 
       *fctp = __nss_lookup_function (*ni, fct_name);
+      if (*fctp == NULL && fct2_name != NULL)
+	*fctp = __nss_lookup_function (*ni, fct_name);
     }
 
   return *fctp != NULL ? 0 : (*ni)->next == NULL ? 1 : -1;
@@ -166,8 +171,8 @@ __nss_lookup (service_user **ni, const char *fct_name, void **fctp)
     0 == adjusted for next function
     1 == finished */
 int
-__nss_next (service_user **ni, const char *fct_name, void **fctp, int status,
-	    int all_values)
+__nss_next2 (service_user **ni, const char *fct_name, const char *fct2_name,
+	     void **fctp, int status, int all_values)
 {
   if (all_values)
     {
@@ -180,7 +185,8 @@ __nss_next (service_user **ni, const char *fct_name, void **fctp, int status,
   else
     {
       /* This is really only for debugging.  */
-       if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+      if (__builtin_expect (NSS_STATUS_TRYAGAIN > status
+			    || status > NSS_STATUS_RETURN, 0))
 	 __libc_fatal ("illegal status in __nss_next");
 
        if (nss_next_action (*ni, status) == NSS_ACTION_RETURN)
@@ -195,6 +201,8 @@ __nss_next (service_user **ni, const char *fct_name, void **fctp, int status,
       *ni = (*ni)->next;
 
       *fctp = __nss_lookup_function (*ni, fct_name);
+      if (*fctp == NULL && fct2_name != NULL)
+	*fctp = __nss_lookup_function (*ni, fct2_name);
     }
   while (*fctp == NULL
 	 && nss_next_action (*ni, NSS_STATUS_UNAVAIL) == NSS_ACTION_CONTINUE
@@ -202,7 +210,16 @@ __nss_next (service_user **ni, const char *fct_name, void **fctp, int status,
 
   return *fctp != NULL ? 0 : -1;
 }
-libc_hidden_def (__nss_next)
+libc_hidden_def (__nss_next2)
+
+
+int
+attribute_compat_text_section
+__nss_next (service_user **ni, const char *fct_name, void **fctp, int status,
+	    int all_values)
+{
+  return __nss_next2 (ni, fct_name, NULL, fctp, status, all_values);
+}
 
 
 int
diff --git a/nss/nsswitch.h b/nss/nsswitch.h
index d222e0d443..b80edef651 100644
--- a/nss/nsswitch.h
+++ b/nss/nsswitch.h
@@ -110,7 +110,8 @@ libc_hidden_proto (__nss_database_lookup)
 /* Put first function with name FCT_NAME for SERVICE in FCTP.  The
    position is remembered in NI.  The function returns a value < 0 if
    an error occurred or no such function exists.  */
-extern int __nss_lookup (service_user **ni, const char *fct_name, void **fctp);
+extern int __nss_lookup (service_user **ni, const char *fct_name,
+			 const char *fct2_name, void **fctp) attribute_hidden;
 
 /* Determine the next step in the lookup process according to the
    result STATUS of the call to the last function returned by
@@ -125,9 +126,12 @@ extern int __nss_lookup (service_user **ni, const char *fct_name, void **fctp);
    services.  In other words, only if all four lookup results have
    the action RETURN associated the lookup process stops before the
    natural end.  */
+extern int __nss_next2 (service_user **ni, const char *fct_name,
+			const char *fct2_name, void **fctp, int status,
+			int all_values) attribute_hidden;
+libc_hidden_proto (__nss_next2)
 extern int __nss_next (service_user **ni, const char *fct_name, void **fctp,
 		       int status, int all_values);
-libc_hidden_proto (__nss_next)
 
 /* Search for the service described in NI for a function named FCT_NAME
    and return a pointer to this function if successful.  */
@@ -139,7 +143,8 @@ libc_hidden_proto (__nss_lookup_function)
 extern void __nss_disable_nscd (void);
 
 
-typedef int (*db_lookup_function) (service_user **, const char *, void **)
+typedef int (*db_lookup_function) (service_user **, const char *, const char *,
+				   void **)
      internal_function;
 typedef enum nss_status (*setent_function) (int);
 typedef enum nss_status (*endent_function) (void);
diff --git a/nss/service-lookup.c b/nss/service-lookup.c
index 67d401e080..f3561855d4 100644
--- a/nss/service-lookup.c
+++ b/nss/service-lookup.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -18,5 +18,6 @@
    02111-1307 USA.  */
 
 #define DATABASE_NAME services
+#define NO_COMPAT
 
 #include "XXX-lookup.c"