-# Copyright (C) 1996-1998,2000-2002,2007,2009,2010,2011
-# Free Software Foundation, Inc.
+# Copyright (C) 1996-2019 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
# 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, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
+# License along with the GNU C Library; if not, see
+# <https://www.gnu.org/licenses/>.
#
# Makefile for name service switch.
#
subdir := nss
+include ../Makeconfig
+
headers := nss.h
-distribute := nsswitch.h XXX-lookup.c getXXbyYY.c getXXbyYY_r.c \
- getXXent.c getXXent_r.c databases.def \
- nsswitch.conf digits_dots.c function.def
# This is the trivial part which goes into libc itself.
routines = nsswitch getnssent getnssent_r digits_dots \
- $(addsuffix -lookup,$(databases))
+ valid_field valid_list_field rewrite_field \
+ $(addsuffix -lookup,$(databases)) \
+ compat-lookup nss_hash
# These are the databases that go through nss dispatch.
# Caution: if you add a database here, you must add its real name
# in databases.def, too.
-databases = proto service hosts network grp pwd rpc ethers \
- spwd netgrp key alias sgrp
-
-others := getent
-install-bin := getent
-
-tests = test-netdb tst-nss-test1
+databases = proto service hosts network grp pwd ethers \
+ spwd netgrp alias sgrp
+
+ifneq (,$(filter sunrpc,$(subdirs)))
+databases += key rpc
+have-sunrpc := 1
+else
+have-sunrpc := 0
+endif
+CPPFLAGS-getent.c = -DHAVE_SUNRPC=$(have-sunrpc)
+
+others := getent makedb
+install-bin := getent makedb
+makedb-modules = xmalloc hash-string
+others-extras = $(makedb-modules)
+extra-objs += $(makedb-modules:=.o)
+
+tests-static = tst-field
+tests-internal = tst-field
+tests = test-netdb test-digits-dots tst-nss-getpwent bug17079 \
+ tst-nss-test1 \
+ tst-nss-test2 \
+ tst-nss-test4 \
+ tst-nss-test5
xtests = bug-erange
-include ../Makeconfig
+tests-container = \
+ tst-nss-test3 \
+ tst-nss-files-hosts-long \
+ tst-nss-db-endpwent \
+ tst-nss-db-endgrent
+
+# Tests which need libdl
+ifeq (yes,$(build-shared))
+tests += tst-nss-files-hosts-erange
+tests += tst-nss-files-hosts-multi
+tests += tst-nss-files-hosts-getent
+tests += tst-nss-files-alias-leak
+tests += tst-nss-files-alias-truncated
+endif
-ifeq (yes,$(build-static-nss))
-otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \
- $(resolvobjdir)/libresolv.a
+# If we have a thread library then we can test cancellation against
+# some routines like getpwuid_r.
+ifeq (yes,$(have-thread-library))
+tests += tst-cancel-getpwuid_r
endif
# Specify rules for the nss_* modules. We have some services.
-services := files
+services := files db compat
extra-libs = $(services:%=libnss_%)
# These libraries will be built in the `others' pass rather than
# The sources are found in the appropriate subdir.
subdir-dirs = $(services:%=nss_%)
-vpath %.c $(subdir-dirs)
+vpath %.c $(subdir-dirs) ../locale/programs ../intl
libnss_files-routines := $(addprefix files-,$(databases)) \
- files-have_o_cloexec
-distribute += files-XXX.c files-parse.c
+ files-initgroups files-init
+
+libnss_db-dbs := $(addprefix db-,\
+ $(filter-out hosts network key alias,\
+ $(databases))) \
+ db-initgroups
+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 if requested
-ifneq ($(build-static-nss),yes)
+# 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)
+tests-static += tst-nss-static
endif
+extra-test-objs += nss_test1.os nss_test2.os
include ../Rules
-
-ifeq (yes,$(build-static-nss))
-$(objpfx)getent: $(objpfx)libnss_files.a
+ifeq (yes,$(have-selinux))
+LDLIBS-makedb := -lselinux
endif
-# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
-# This ensures they will load libc.so for needed symbols if loaded by
-# a statically-linked program that hasn't already loaded it.
libnss-libc = $(common-objpfx)linkobj/libc.so
-$(services:%=$(objpfx)libnss_%.so): $(libnss-libc) \
- $(common-objpfx)libc_nonshared.a
+# Target-specific variable setting to link objects using deprecated
+# RPC interfaces with the version of libc.so that makes them available
+# for new links:
+$(services:%=$(objpfx)libnss_%.so): libc-for-link = $(libnss-libc)
+
+$(objpfx)libnss_db.so: $(objpfx)libnss_files.so
+$(libnss_db-dbs:%=$(objpfx)%.c): $(objpfx)db-%.c: nss_files/files-%.c
+ @rm -f $@.new
+ (echo '#define EXTERN_PARSER';\
+ echo '#define GENERIC "../nss_db/db-XXX.c"';\
+ echo '#include "$<"') > $@.new
+ mv -f $@.new $@
-distribute += nss_test1.c
-CFLAGS-nss_test1.c = -DNOT_IN_libc=1
-$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(common-objpfx)libc.so \
- $(common-objpfx)libc_nonshared.a
+$(objpfx)makedb: $(makedb-modules:%=$(objpfx)%.o)
+
+$(inst_vardbdir)/Makefile: db-Makefile $(+force)
+ $(do-install)
+
+libnss_test1.so-no-z-defs = 1
+libnss_test2.so-no-z-defs = 1
+
+rtld-tests-LDFLAGS += -Wl,--dynamic-list=nss_test.ver
+
+libof-nss_test1 = extramodules
+libof-nss_test2 = extramodules
+$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(link-libc-deps)
+ $(build-module)
+$(objpfx)/libnss_test2.so: $(objpfx)nss_test2.os $(link-libc-deps)
$(build-module)
+$(objpfx)nss_test2.os : nss_test1.c
+ifdef libnss_test1.so-version
$(objpfx)/libnss_test1.so$(libnss_test1.so-version): $(objpfx)/libnss_test1.so
$(make-link)
-$(objpfx)tst-nss-test1.out: $(objpfx)/libnss_test1.so$(libnss_test1.so-version)
+endif
+ifdef libnss_test2.so-version
+$(objpfx)/libnss_test2.so$(libnss_test2.so-version): $(objpfx)/libnss_test2.so
+ $(make-link)
+endif
+$(patsubst %,$(objpfx)%.out,$(tests) $(tests-container)) : \
+ $(objpfx)/libnss_test1.so$(libnss_test1.so-version) \
+ $(objpfx)/libnss_test2.so$(libnss_test2.so-version)
+
+ifeq (yes,$(have-thread-library))
+$(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library)
+endif
+
+$(objpfx)tst-nss-files-hosts-erange: $(libdl)
+$(objpfx)tst-nss-files-hosts-multi: $(libdl)
+$(objpfx)tst-nss-files-hosts-getent: $(libdl)
+$(objpfx)tst-nss-files-alias-leak: $(libdl)
+$(objpfx)tst-nss-files-alias-leak.out: $(objpfx)/libnss_files.so
+$(objpfx)tst-nss-files-alias-truncated: $(libdl)
+$(objpfx)tst-nss-files-alias-truncated.out: $(objpfx)/libnss_files.so