diff options
Diffstat (limited to 'nss/nsswitch.c')
-rw-r--r-- | nss/nsswitch.c | 27 |
1 files changed, 22 insertions, 5 deletions
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 |