]> andersk Git - nss_nonlocal.git/blobdiff - nonlocal-passwd.c
glibc uses regparms for internal functions on i386.
[nss_nonlocal.git] / nonlocal-passwd.c
index 15173416b0a24180bd8c877369da8eee5e3de174..6d70ea2d287a871a46e938608c7646f5292600e4 100644 (file)
@@ -2,7 +2,8 @@
  * nonlocal-passwd.c
  * passwd database for nss_nonlocal proxy.
  *
- * Copyright © 2007 Anders Kaseorg <andersk@mit.edu>
+ * Copyright © 2007 Anders Kaseorg <andersk@mit.edu> and Tim Abbott
+ * <tabbott@mit.edu>
  *
  * Permission is hereby granted, free of charge, to any person
  * obtaining a copy of this software and associated documentation
@@ -71,7 +72,6 @@ check_nonlocal_uid(const char *user, uid_t uid, int *errnop)
        errno = old_errno;
        return NSS_STATUS_TRYAGAIN;
     }
-    errno = 0;
     ret = getpwuid_r(uid, pwbufp, buf, buflen, &pwbufp);
     if (ret != 0) {
        *errnop = errno;
@@ -85,6 +85,33 @@ check_nonlocal_uid(const char *user, uid_t uid, int *errnop)
     return status;
 }
 
+enum nss_status
+check_nonlocal_user(const char *user, int *errnop)
+{
+    enum nss_status status = NSS_STATUS_SUCCESS;
+    struct passwd pwbuf;
+    struct passwd *pwbufp = &pwbuf;
+    int ret;
+    int old_errno = errno;
+    int buflen = MAGIC_LOCAL_PW_BUFLEN;
+    char *buf = malloc(buflen);
+    if (buf == NULL) {
+       *errnop = ENOMEM;
+       errno = old_errno;
+       return NSS_STATUS_TRYAGAIN;
+    }
+    ret = getpwnam_r(user, pwbufp, buf, buflen, &pwbufp);
+    if (ret != 0) {
+       *errnop = errno;
+       status = NSS_STATUS_TRYAGAIN;
+    } else if (pwbufp != NULL) {
+       status = NSS_STATUS_NOTFOUND;
+    }
+    free(buf);
+    errno = old_errno;
+    return status;
+}
+
 
 static service_user *pwent_nip = NULL;
 static void *pwent_fct_start;
@@ -163,6 +190,12 @@ _nss_nonlocal_getpwent_r(struct passwd *pwd, char *buffer, size_t buflen,
                         int *errnop)
 {
     enum nss_status status;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (buflen == MAGIC_LOCAL_PW_BUFLEN ||
+       (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0'))
+       return NSS_STATUS_UNAVAIL;
+
     if (pwent_nip == NULL) {
        status = _nss_nonlocal_setpwent(0);
        if (status != NSS_STATUS_SUCCESS)
@@ -174,7 +207,7 @@ _nss_nonlocal_getpwent_r(struct passwd *pwd, char *buffer, size_t buflen,
        else {
            int nonlocal_errno;
            do
-               status = DL_CALL_FCT(pwent_fct.l, (pwd, buffer, buflen, errnop));       
+               status = DL_CALL_FCT(pwent_fct.l, (pwd, buffer, buflen, errnop));
            while (status == NSS_STATUS_SUCCESS &&
                   check_nonlocal_uid(pwd->pw_name, pwd->pw_uid, &nonlocal_errno) != NSS_STATUS_SUCCESS);
        }
@@ -205,6 +238,11 @@ _nss_nonlocal_getpwnam_r(const char *name, struct passwd *pwd,
     } fct;
     int group_errno;
 
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (buflen == MAGIC_LOCAL_PW_BUFLEN ||
+       (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0'))
+       return NSS_STATUS_UNAVAIL;
+
     nip = nss_passwd_nonlocal_database();
     if (nip == NULL)
        return NSS_STATUS_UNAVAIL;
@@ -247,7 +285,9 @@ _nss_nonlocal_getpwuid_r(uid_t uid, struct passwd *pwd,
     } fct;
     int group_errno;
 
-    if (buflen == MAGIC_LOCAL_PW_BUFLEN)
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (buflen == MAGIC_LOCAL_PW_BUFLEN ||
+       (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0'))
        return NSS_STATUS_UNAVAIL;
 
     nip = nss_passwd_nonlocal_database();
This page took 0.069949 seconds and 4 git commands to generate.