aboutsummaryrefslogtreecommitdiff
path: root/inet/getnetgrent_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'inet/getnetgrent_r.c')
-rw-r--r--inet/getnetgrent_r.c41
1 files changed, 26 insertions, 15 deletions
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;
+}
- result = __internal_setnetgrent (group, &dataset);
+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
{