From patchwork Fri Feb 11 10:29:35 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Engelhardt X-Patchwork-Id: 548981 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p1BATePU022323 for ; Fri, 11 Feb 2011 10:29:43 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752324Ab1BKK3m (ORCPT ); Fri, 11 Feb 2011 05:29:42 -0500 Received: from borg.medozas.de ([188.40.89.202]:45624 "EHLO borg.medozas.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750699Ab1BKK3l (ORCPT ); Fri, 11 Feb 2011 05:29:41 -0500 Received: by borg.medozas.de (Postfix, from userid 25121) id B5D3EF0CE63BA; Fri, 11 Feb 2011 11:29:40 +0100 (CET) From: Jan Engelhardt To: linux-nfs@vger.kernel.org Subject: [PATCH 2/2] nss: allow domainless lookups Date: Fri, 11 Feb 2011 11:29:35 +0100 Message-Id: <1297420176-24960-3-git-send-email-jengelh@medozas.de> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1297420176-24960-1-git-send-email-jengelh@medozas.de> References: <1297420176-24960-1-git-send-email-jengelh@medozas.de> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 11 Feb 2011 10:29:43 +0000 (UTC) diff --git a/nss.c b/nss.c index 04aff19..095794c 100644 --- a/nss.c +++ b/nss.c @@ -37,7 +37,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -160,6 +162,14 @@ struct pwbuf { char buf[1]; }; +static bool only_digits(const char *s) +{ + for (; *s != '\0'; ++s) + if (!isdigit(*s)) + return false; + return true; +} + static struct passwd *nss_getpwnam(const char *name, const char *domain, int *err_p) { struct passwd *pw; @@ -172,6 +182,16 @@ static struct passwd *nss_getpwnam(const char *name, const char *domain, int *er if (buf == NULL) goto err; + if (strchr(name, '@') == NULL && only_digits(name)) { + char *end; + long uid = strtoul(name, &end, 10); + err = getpwuid_r(uid, &buf->pwbuf, buf->buf, buflen, &pw); + IDMAP_LOG(0, ("%s: pure UID %ld lookup (result=%d,errno=%s)\n", + __func__, uid, err, strerror(errno))); + if (err == 0) + goto done; + } + err = EINVAL; localname = strip_domain(name, domain); IDMAP_LOG(4, ("nss_getpwnam: name '%s' domain '%s': " @@ -189,6 +209,7 @@ static struct passwd *nss_getpwnam(const char *name, const char *domain, int *er ("nss_getpwnam: name '%s' not found in domain '%s'\n", localname, domain)); free(localname); +done: if (err == 0 && pw != NULL) { *err_p = 0; return pw;