* 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
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;
+ }
+ errno = 0;
+ 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;
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)
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);
}
} 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;
} 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();