X-Git-Url: http://git.csclub.uwaterloo.ca/?p=kopensolaris-gnu%2Fglibc.git;a=blobdiff_plain;f=nss%2Fnsswitch.c;h=c968502cdfa4482bc99be25194fbce6c6b66e6f6;hp=7dd3e0526f87bb967c224de62a0071ae7a568fc1;hb=c4f2ca5fddd04ccecb2a90a79865b4bca21a513c;hpb=a34f4d7fe4e59dc08198c64cc425cef68635453f diff --git a/nss/nsswitch.c b/nss/nsswitch.c index 7dd3e0526f..c968502cdf 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -22,11 +22,11 @@ #include #include #include -#include /* We need some help from ld.so. */ #include #include #include #include +#include /* We need some help from ld.so. */ #if !defined DO_STATIC_NSS || defined PIC # include @@ -35,12 +35,14 @@ #include "nsswitch.h" /* Prototypes for the local functions. */ -static void *nss_lookup_function (service_user *ni, const char *fct_name); -static name_database *nss_parse_file (const char *fname); -static name_database_entry *nss_getline (char *line); -static service_user *nss_parse_service_list (const char *line); +static void *nss_lookup_function (service_user *ni, const char *fct_name) + internal_function; +static name_database *nss_parse_file (const char *fname) internal_function; +static name_database_entry *nss_getline (char *line) internal_function; +static service_user *nss_parse_service_list (const char *line) + internal_function; static service_library *nss_new_service (name_database *database, - const char *name); + const char *name) internal_function; /* Declare external database variables. */ @@ -66,7 +68,6 @@ static struct __libc_lock_define_initialized (static, lock) - #if !defined DO_STATIC_NSS || defined PIC /* String with revision number of the shared object files. */ static const char *const __nss_shlib_revision = LIBNSS_FILES_SO + 15; @@ -134,7 +135,8 @@ __nss_database_lookup (const char *database, const char *alternate_name, /* -1 == not found - 0 == adjusted for next function */ + 0 == function found + 1 == finished */ int __nss_lookup (service_user **ni, const char *fct_name, void **fctp) { @@ -149,7 +151,7 @@ __nss_lookup (service_user **ni, const char *fct_name, void **fctp) *fctp = nss_lookup_function (*ni, fct_name); } - return *fctp != NULL ? 0 : -1; + return *fctp != NULL ? 0 : (*ni)->next == NULL ? 1 : -1; } @@ -250,10 +252,9 @@ static int nss_dlerror_run (void (*operate) (void *), void *args) { char *last_errstring = NULL; - const char *last_object_name = NULL; int result; - (void) _dl_catch_error (&last_errstring, &last_object_name, operate, args); + (void) _dl_catch_error (&last_errstring, operate, args); result = last_errstring != NULL; if (result) @@ -310,6 +311,7 @@ known_compare (const void *p1, const void *p2) static void * +internal_function nss_lookup_function (service_user *ni, const char *fct_name) { void **found, *result; @@ -376,7 +378,7 @@ nss_lookup_function (service_user *ni, const char *fct_name) /* Load the shared library. */ size_t shlen = (7 + strlen (ni->library->name) + 3 + strlen (__nss_shlib_revision) + 1); - + int saved_errno = errno; struct do_open_args args; args.shlib_name = __alloca (shlen); args.ni = ni; @@ -389,8 +391,11 @@ nss_lookup_function (service_user *ni, const char *fct_name) __nss_shlib_revision); if (nss_dlerror_run (do_open, &args) != 0) - /* Failed to load the library. */ - ni->library->lib_handle = (void *) -1l; + { + /* Failed to load the library. */ + ni->library->lib_handle = (void *) -1l; + __set_errno (saved_errno); + } } if (ni->library->lib_handle == (void *) -1l) @@ -476,6 +481,7 @@ nss_lookup_function (service_user *ni, const char *fct_name) static name_database * +internal_function nss_parse_file (const char *fname) { FILE *fp; @@ -548,6 +554,7 @@ nss_parse_file (const char *fname) `( ( "[" "!"? ( "=" )+ "]" )? )*' */ static service_user * +internal_function nss_parse_service_list (const char *line) { service_user *result = NULL, **nextp = &result; @@ -582,8 +589,7 @@ nss_parse_service_list (const char *line) free (new_service); return result; } - memcpy (source, name, line - name); - source[line - name] = '\0'; + *((char *) __mempcpy (source, name, line - name)) = '\0'; new_service->name = source; } @@ -697,6 +703,7 @@ nss_parse_service_list (const char *line) } static name_database_entry * +internal_function nss_getline (char *line) { const char *name; @@ -743,6 +750,7 @@ nss_getline (char *line) static service_library * +internal_function nss_new_service (name_database *database, const char *name) { service_library **currentp = &database->library;