+ int old_errno = errno;
+ char *end;
+ unsigned long uid;
+
+ errno = 0;
+ uid = strtoul(pwd->pw_name, &end, 10);
+ if (errno == 0 && *end == '\0' && (uid_t)uid == uid)
+ status = check_nonlocal_uid(user, uid, errnop);
+ errno = old_errno;
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
+
+ return check_nonlocal_uid(user, pwd->pw_uid, errnop);
+}
+
+enum nss_status
+check_nonlocal_user(const char *user, int *errnop)
+{
+ static const char *fct_name = "getpwnam_r";
+ static service_user *startp = NULL;
+ static void *fct_start = NULL;
+ enum nss_status status;
+ service_user *nip;
+ union {
+ enum nss_status (*l)(const char *name, struct passwd *pwd,
+ char *buffer, size_t buflen, int *errnop);
+ void *ptr;
+ } fct;