From patchwork Wed Oct 4 09:51:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Schwab X-Patchwork-Id: 23320 Received: (qmail 50983 invoked by alias); 4 Oct 2017 09:51:21 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 50298 invoked by uid 89); 4 Oct 2017 09:51:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.suse.de From: Andreas Schwab To: Zack Weinberg Cc: Florian Weimer , Yury Norov , GNU C Library , Steve.Ellcey@cavium.com, maxim.kuvyrkov@linaro.org Subject: [PATCH] Move nss_compat from nis to nss subdir and install it unconditionally. References: <20170927215018.6nagohfthyezs3mo@yury-thinkpad> <20170928112847.i2hnrzr2zm66z2un@yury-thinkpad> <017aeba9-6400-6ef2-b70c-74db69b1aa39@redhat.com> <20170928122836.3srxfgn5vh5utngs@yury-thinkpad> X-Yow: Pardon me, but do you know what it means to be TRULY ONE with your BOOTH! Date: Wed, 04 Oct 2017 11:51:14 +0200 In-Reply-To: (Zack Weinberg's message of "Thu, 28 Sep 2017 10:00:49 -0400") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 This has been tested that local lookup still works with and without an installed libnss_nis, and that NIS lookup works when libnss_nis is available. * nis/Makefile (services): Remove compat. (libnss_compat-routines, libnss_compat-inhibit-o): Don't define. ($(objpfx)libnss_compat.so): Remove rule. * nis/Versions (libnss_compat): Remove. * nss/Makefile (services): Add compat. (libnss_compat-routines, libnss_compat-inhibit-o): Define. * nss/Versions (libnss_compat): Define. * nss/nss_compat/compat-grp.c: Moved here from nis/nss_compat. Don't include . Replace bool_t by bool. * nss/nss_compat/compat-initgroups.c: Likewise. * nss/nss_compat/compat-pwd.c: Likewise. Include "nisdomain.h" instead of . (getpwent_next_nss_netgr): Use __nss_get_default_domain instead of yp_get_default_domain. * nss/nss_compat/compat-pwd.c: Likewise. (getspent_next_nss_netgr): Use __nss_get_default_domain instead of yp_get_default_domain. * nss/nss_compat/nisdomain.c: New file. * nss/nss_compat/nisdomain.h: Likewise. --- nis/Makefile | 6 +-- nis/Versions | 11 ------ nss/Makefile | 6 ++- nss/Versions | 11 ++++++ {nis => nss}/nss_compat/compat-grp.c | 21 +++++------ {nis => nss}/nss_compat/compat-initgroups.c | 9 ++--- {nis => nss}/nss_compat/compat-pwd.c | 13 +++---- {nis => nss}/nss_compat/compat-spwd.c | 11 +++--- nss/nss_compat/nisdomain.c | 58 +++++++++++++++++++++++++++++ nss/nss_compat/nisdomain.h | 20 ++++++++++ 10 files changed, 120 insertions(+), 46 deletions(-) rename {nis => nss}/nss_compat/compat-grp.c (97%) rename {nis => nss}/nss_compat/compat-initgroups.c (98%) rename {nis => nss}/nss_compat/compat-pwd.c (99%) rename {nis => nss}/nss_compat/compat-spwd.c (98%) create mode 100644 nss/nss_compat/nisdomain.c create mode 100644 nss/nss_compat/nisdomain.h diff --git a/nis/Makefile b/nis/Makefile index 6b6f5ee72c..023916f446 100644 --- a/nis/Makefile +++ b/nis/Makefile @@ -33,7 +33,7 @@ databases = proto service hosts network grp pwd rpc ethers \ spwd netgrp alias publickey # Specify rules for the nss_* modules. -services := nis nisplus compat +services := nis nisplus endif extra-libs = libnsl @@ -63,9 +63,6 @@ libnsl-routines = yp_xdr ypclnt ypupdate_xdr \ nis_clone_res nss-default ifeq ($(build-obsolete-nsl),yes) -libnss_compat-routines := $(addprefix compat-,grp pwd spwd initgroups) -libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes)) - libnss_nis-routines := $(addprefix nis-,$(databases)) nis-initgroups \ nss-nis libnss_nis-inhibit-o = $(filter-out .os,$(object-suffixes)) @@ -79,7 +76,6 @@ include ../Rules ifeq ($(build-obsolete-nsl),yes) -$(objpfx)libnss_compat.so: $(objpfx)libnsl.so$(libnsl.so-version) $(objpfx)libnss_nis.so: $(objpfx)libnsl.so$(libnsl.so-version) \ $(common-objpfx)nss/libnss_files.so $(objpfx)libnss_nisplus.so: $(objpfx)libnsl.so$(libnsl.so-version) diff --git a/nis/Versions b/nis/Versions index ef9a512417..90d3d9dfaa 100644 --- a/nis/Versions +++ b/nis/Versions @@ -63,17 +63,6 @@ libnsl { } } -libnss_compat { - GLIBC_PRIVATE { - _nss_compat_endgrent; _nss_compat_endpwent; _nss_compat_endspent; - _nss_compat_getgrent_r; _nss_compat_getgrgid_r; _nss_compat_getgrnam_r; - _nss_compat_getpwent_r; _nss_compat_getpwnam_r; _nss_compat_getpwuid_r; - _nss_compat_getspent_r; _nss_compat_getspnam_r; - _nss_compat_setgrent; _nss_compat_setpwent; _nss_compat_setspent; - _nss_compat_initgroups_dyn; - } -} - libnss_nis { GLIBC_PRIVATE { _nss_nis_endaliasent; _nss_nis_endetherent; _nss_nis_endgrent; diff --git a/nss/Makefile b/nss/Makefile index c9a5200f96..f27bed11fc 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -72,7 +72,7 @@ tests += tst-cancel-getpwuid_r endif # Specify rules for the nss_* modules. We have some services. -services := files db +services := files db compat extra-libs = $(services:%=libnss_%) # These libraries will be built in the `others' pass rather than @@ -95,11 +95,15 @@ libnss_db-routines := $(libnss_db-dbs) db-open db-init hash-string generated += $(filter-out db-alias.c db-netgrp.c, \ $(addsuffix .c,$(libnss_db-dbs))) +libnss_compat-routines := $(addprefix compat-,grp pwd spwd initgroups) \ + nisdomain + install-others += $(inst_vardbdir)/Makefile # Build static module into libc if requested libnss_files-inhibit-o = $(filter-out .os,$(object-suffixes)) libnss_db-inhibit-o = $(filter-out .os,$(object-suffixes)) +libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes)) ifeq ($(build-static-nss),yes) routines += $(libnss_files-routines) static-only-routines += $(libnss_files-routines) diff --git a/nss/Versions b/nss/Versions index 50268ed9b5..7694998f1d 100644 --- a/nss/Versions +++ b/nss/Versions @@ -162,3 +162,14 @@ libnss_db { _nss_db_init; } } + +libnss_compat { + GLIBC_PRIVATE { + _nss_compat_endgrent; _nss_compat_endpwent; _nss_compat_endspent; + _nss_compat_getgrent_r; _nss_compat_getgrgid_r; _nss_compat_getgrnam_r; + _nss_compat_getpwent_r; _nss_compat_getpwnam_r; _nss_compat_getpwuid_r; + _nss_compat_getspent_r; _nss_compat_getspnam_r; + _nss_compat_setgrent; _nss_compat_setpwent; _nss_compat_setspent; + _nss_compat_initgroups_dyn; + } +} diff --git a/nis/nss_compat/compat-grp.c b/nss/nss_compat/compat-grp.c similarity index 97% rename from nis/nss_compat/compat-grp.c rename to nss/nss_compat/compat-grp.c index 0381458c0c..4d51fc95ed 100644 --- a/nis/nss_compat/compat-grp.c +++ b/nss/nss_compat/compat-grp.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -58,21 +57,21 @@ struct blacklist_t struct ent_t { - bool_t files; + bool files; enum nss_status setent_status; FILE *stream; struct blacklist_t blacklist; }; typedef struct ent_t ent_t; -static ent_t ext_ent = { TRUE, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; +static ent_t ext_ent = { true, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; /* Protect global state against multiple changers. */ __libc_lock_define_initialized (static, lock) /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); -static int in_blacklist (const char *, int, ent_t *); +static bool in_blacklist (const char *, int, ent_t *); /* Initialize the NSS interface/functions. The calling function must hold the lock. */ @@ -94,7 +93,7 @@ internal_setgrent (ent_t *ent, int stayopen, int needent) { enum nss_status status = NSS_STATUS_SUCCESS; - ent->files = TRUE; + ent->files = true; if (ent->blacklist.data != NULL) { @@ -321,7 +320,7 @@ getgrent_next_file (struct group *result, ent_t *ent, /* +:... */ if (result->gr_name[0] == '+' && result->gr_name[1] == '\0') { - ent->files = FALSE; + ent->files = false; return getgrent_next_nss (result, ent, buffer, buflen, errnop); } @@ -466,7 +465,7 @@ enum nss_status _nss_compat_getgrnam_r (const char *name, struct group *grp, char *buffer, size_t buflen, int *errnop) { - ent_t ent = { TRUE, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; + ent_t ent = { true, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; enum nss_status result; if (name[0] == '-' || name[0] == '+') @@ -598,7 +597,7 @@ enum nss_status _nss_compat_getgrgid_r (gid_t gid, struct group *grp, char *buffer, size_t buflen, int *errnop) { - ent_t ent = { TRUE, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; + ent_t ent = { true, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; enum nss_status result; __libc_lock_lock (lock); @@ -665,15 +664,15 @@ blacklist_store_name (const char *name, ent_t *ent) return; } -/* returns TRUE if ent->blacklist contains name, else FALSE */ -static bool_t +/* Return whether ent->blacklist contains name. */ +static bool in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; char *cp; if (ent->blacklist.data == NULL) - return FALSE; + return false; buf[0] = '|'; cp = stpcpy (&buf[1], name); diff --git a/nis/nss_compat/compat-initgroups.c b/nss/nss_compat/compat-initgroups.c similarity index 98% rename from nis/nss_compat/compat-initgroups.c rename to nss/nss_compat/compat-initgroups.c index 795213448c..c1a9301a3b 100644 --- a/nis/nss_compat/compat-initgroups.c +++ b/nss/nss_compat/compat-initgroups.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -79,7 +78,7 @@ typedef struct ent_t ent_t; /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); -static int in_blacklist (const char *, int, ent_t *); +static bool in_blacklist (const char *, int, ent_t *); /* Initialize the NSS interface/functions. The calling function must hold the lock. */ @@ -558,15 +557,15 @@ blacklist_store_name (const char *name, ent_t *ent) return; } -/* returns TRUE if ent->blacklist contains name, else FALSE */ -static bool_t +/* Return whether ent->blacklist contains name. */ +static bool in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; char *cp; if (ent->blacklist.data == NULL) - return FALSE; + return false; buf[0] = '|'; cp = stpcpy (&buf[1], name); diff --git a/nis/nss_compat/compat-pwd.c b/nss/nss_compat/compat-pwd.c similarity index 99% rename from nis/nss_compat/compat-pwd.c rename to nss/nss_compat/compat-pwd.c index 0583a10b84..b16eef5d44 100644 --- a/nis/nss_compat/compat-pwd.c +++ b/nss/nss_compat/compat-pwd.c @@ -25,12 +25,11 @@ #include #include #include -#include -#include #include #include #include "netgroup.h" +#include "nisdomain.h" static service_user *ni; static enum nss_status (*nss_setpwent) (int stayopen); @@ -82,7 +81,7 @@ __libc_lock_define_initialized (static, lock) /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); -static int in_blacklist (const char *, int, ent_t *); +static bool in_blacklist (const char *, int, ent_t *); /* Initialize the NSS interface/functions. The calling function must hold the lock. */ @@ -346,7 +345,7 @@ getpwent_next_nss_netgr (const char *name, struct passwd *result, ent_t *ent, if (domain != NULL) { if (curdomain == NULL - && yp_get_default_domain (&curdomain) != YPERR_SUCCESS) + && __nss_get_default_domain (&curdomain) != 0) { __internal_endnetgrent (&ent->netgrdata); ent->netgroup = false; @@ -1114,15 +1113,15 @@ blacklist_store_name (const char *name, ent_t *ent) return; } -/* Returns TRUE if ent->blacklist contains name, else FALSE. */ -static bool_t +/* Returns whether ent->blacklist contains name. */ +static bool in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; char *cp; if (ent->blacklist.data == NULL) - return FALSE; + return false; buf[0] = '|'; cp = stpcpy (&buf[1], name); diff --git a/nis/nss_compat/compat-spwd.c b/nss/nss_compat/compat-spwd.c similarity index 98% rename from nis/nss_compat/compat-spwd.c rename to nss/nss_compat/compat-spwd.c index eec3af3d15..8a875472fa 100644 --- a/nis/nss_compat/compat-spwd.c +++ b/nss/nss_compat/compat-spwd.c @@ -25,12 +25,11 @@ #include #include #include -#include -#include #include #include #include "netgroup.h" +#include "nisdomain.h" static service_user *ni; static enum nss_status (*nss_setspent) (int stayopen); @@ -79,7 +78,7 @@ __libc_lock_define_initialized (static, lock) /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); -static int in_blacklist (const char *, int, ent_t *); +static bool in_blacklist (const char *, int, ent_t *); /* Initialize the NSS interface/functions. The calling function must hold the lock. */ @@ -306,7 +305,7 @@ getspent_next_nss_netgr (const char *name, struct spwd *result, ent_t *ent, if (domain != NULL) { if (curdomain == NULL - && yp_get_default_domain (&curdomain) != YPERR_SUCCESS) + && __nss_get_default_domain (&curdomain) != 0) { __internal_endnetgrent (&ent->netgrdata); ent->netgroup = false; @@ -840,8 +839,8 @@ blacklist_store_name (const char *name, ent_t *ent) } -/* Returns TRUE if ent->blacklist contains name, else FALSE. */ -static bool_t +/* Returns whether ent->blacklist contains name. */ +static bool in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; diff --git a/nss/nss_compat/nisdomain.c b/nss/nss_compat/nisdomain.c new file mode 100644 index 0000000000..220ae27234 --- /dev/null +++ b/nss/nss_compat/nisdomain.c @@ -0,0 +1,58 @@ +/* Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include "nisdomain.h" + +#define MAXDOMAINNAMELEN 1024 + +static char domainname[MAXDOMAINNAMELEN]; + +__libc_lock_define_initialized (static, domainname_lock) + +int +__nss_get_default_domain (char **outdomain) +{ + int result = 0; + *outdomain = NULL; + + __libc_lock_lock (domainname_lock); + + if (domainname[0] != '\0') + { + if (getdomainname (domainname, MAXDOMAINNAMELEN) < 0) + result = errno; + else if (strcmp (domainname, "(none)") == 0) + { + /* If domainname is not set, some systems will return "(none)" */ + domainname[0] = '\0'; + result = ENOENT; + } + else + *outdomain = domainname; + } + else + *outdomain = domainname; + + __libc_lock_unlock (domainname_lock); + + return result; +} diff --git a/nss/nss_compat/nisdomain.h b/nss/nss_compat/nisdomain.h new file mode 100644 index 0000000000..314f3f7c06 --- /dev/null +++ b/nss/nss_compat/nisdomain.h @@ -0,0 +1,20 @@ +/* Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Set OUTDOMAIN to a pointer to the current NIS domain name, or NULL if + not set. Return zero on success, an error number on failure. */ +extern int __nss_get_default_domain (char **outdomain);