diff options
Diffstat (limited to 'nss/getXXbyYY_r.c')
-rw-r--r-- | nss/getXXbyYY_r.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index a4dc0011a2..8a38b0d628 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -88,6 +88,12 @@ extern struct __res_state _res; /* The lookup function for the first entry of this service. */ extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp); +/* Nonzero if the NSCD is not available. This variable will be increased + whenever we try to use the NSCD but see it is not avilable. So we + can recheck the presence every once in a while. */ +extern int __nss_nscd_not_available; +/* Interval in which we transfer retry to contact the NSCD. */ +#define NSS_NSCD_RETRY 100 int @@ -111,11 +117,21 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, #endif #ifdef USE_NSCD - nscd_status = NSCD_NAME (ADD_VARIABLES, resbuf, buffer, buflen H_ERRNO_VAR); - if (nscd_status < 1) + if (__nss_nscd_not_available && ++__nss_nscd_not_available > NSS_NSCD_RETRY) + __nss_nscd_not_available = 0; + + if (!__nss_nscd_not_available) { - *result = nscd_status == 0 ? resbuf : NULL; - return nscd_status; + nscd_status = NSCD_NAME (ADD_VARIABLES, resbuf, buffer, buflen + H_ERRNO_VAR); + if (nscd_status < 1) + { + *result = nscd_status == 0 ? resbuf : NULL; + return nscd_status; + } + if (nscd_status == 2) + /* This return value indicates that contacting the server failed. */ + __nss_nscd_not_available = 1; } #endif @@ -152,7 +168,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, status = (*fct) (ADD_VARIABLES, resbuf, buffer, buflen, __errno_location () H_ERRNO_VAR); - /* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the + /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the provided buffer is too small. In this case we should give the user the possibility to enlarge the buffer and we should not simply go on with the next service (even if the TRYAGAIN |