diff options
Diffstat (limited to 'nss')
69 files changed, 0 insertions, 10323 deletions
diff --git a/nss/Depend b/nss/Depend deleted file mode 100644 index d755539902..0000000000 --- a/nss/Depend +++ /dev/null @@ -1,2 +0,0 @@ -dlfcn -resolv diff --git a/nss/Makefile b/nss/Makefile deleted file mode 100644 index 430be8726f..0000000000 --- a/nss/Makefile +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright (C) 1996-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 -# <http://www.gnu.org/licenses/>. - -# -# Makefile for name service switch. -# -subdir := nss - -include ../Makeconfig - -headers := nss.h - -# This is the trivial part which goes into libc itself. -routines = nsswitch getnssent getnssent_r digits_dots \ - valid_field valid_list_field rewrite_field \ - $(addsuffix -lookup,$(databases)) - -# 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 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 -extra-objs += $(makedb-modules:=.o) - -tests-static = tst-field -tests-internal = tst-field -tests = test-netdb tst-nss-test1 test-digits-dots \ - tst-nss-getpwent bug17079 -xtests = bug-erange - -# 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 db - -extra-libs = $(services:%=libnss_%) -# These libraries will be built in the `others' pass rather than -# the `lib' pass, because they depend on libc.so being built already. -extra-libs-others = $(extra-libs) - -# The sources are found in the appropriate subdir. -subdir-dirs = $(services:%=nss_%) -vpath %.c $(subdir-dirs) ../locale/programs ../intl - - -libnss_files-routines := $(addprefix files-,$(databases)) \ - 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))) - -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)) -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 - -include ../Rules - -ifeq (yes,$(have-selinux)) -LDLIBS-makedb := -lselinux -endif - -libnss-libc = $(common-objpfx)linkobj/libc.so -# 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 $@ - - -$(objpfx)makedb: $(makedb-modules:%=$(objpfx)%.o) - -$(inst_vardbdir)/Makefile: db-Makefile $(+force) - $(do-install) - -libof-nss_test1 = extramodules -$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(link-libc-deps) - $(build-module) -ifdef libnss_test1.so-version -$(objpfx)/libnss_test1.so$(libnss_test1.so-version): $(objpfx)/libnss_test1.so - $(make-link) -endif -$(objpfx)tst-nss-test1.out: $(objpfx)/libnss_test1.so$(libnss_test1.so-version) - -ifeq (yes,$(have-thread-library)) -$(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library) -endif diff --git a/nss/Versions b/nss/Versions deleted file mode 100644 index f8ababccc7..0000000000 --- a/nss/Versions +++ /dev/null @@ -1,162 +0,0 @@ -libc { - GLIBC_2.0 { - # functions used in other libraries - __nss_passwd_lookup; __nss_group_lookup; __nss_hosts_lookup; __nss_next; - __nss_database_lookup; __nss_configure_lookup; - } - GLIBC_2.2.2 { - __nss_hostname_digits_dots; - } - GLIBC_PRIVATE { - _nss_files_parse_grent; _nss_files_parse_pwent; _nss_files_parse_spent; - __nss_disable_nscd; __nss_lookup_function; _nss_files_parse_sgent; - - __nss_passwd_lookup2; __nss_group_lookup2; __nss_hosts_lookup2; - __nss_services_lookup2; __nss_next2; __nss_lookup; - } -} - -libnss_files { - GLIBC_PRIVATE { - _nss_files_setaliasent; - _nss_files_endaliasent; - _nss_files_getaliasbyname_r; - _nss_files_getaliasent_r; - - _nss_files_setetherent; - _nss_files_endetherent; - _nss_files_getetherent_r; - _nss_files_parse_etherent; - _nss_files_gethostton_r; - _nss_files_getntohost_r; - - _nss_files_setgrent; - _nss_files_endgrent; - _nss_files_getgrent_r; - _nss_files_getgrgid_r; - _nss_files_getgrnam_r; - - _nss_files_sethostent; - _nss_files_endhostent; - _nss_files_gethostbyaddr_r; - _nss_files_gethostbyname2_r; - _nss_files_gethostbyname3_r; - _nss_files_gethostbyname4_r; - _nss_files_gethostbyname_r; - _nss_files_gethostent_r; - - _nss_files_setnetent; - _nss_files_endnetent; - _nss_files_getnetbyaddr_r; - _nss_files_getnetbyname_r; - _nss_files_getnetent_r; - _nss_files_parse_netent; - - _nss_files_setnetgrent; - _nss_files_endnetgrent; - _nss_files_getnetgrent_r; - - _nss_files_setprotoent; - _nss_files_endprotoent; - _nss_files_getprotobyname_r; - _nss_files_getprotobynumber_r; - _nss_files_getprotoent_r; - _nss_files_parse_protoent; - - _nss_files_setpwent; - _nss_files_endpwent; - _nss_files_getpwent_r; - _nss_files_getpwnam_r; - _nss_files_getpwuid_r; - - _nss_files_setrpcent; - _nss_files_endrpcent; - _nss_files_getrpcbyname_r; - _nss_files_getrpcbynumber_r; - _nss_files_getrpcent_r; - _nss_files_parse_rpcent; - - _nss_files_setservent; - _nss_files_endservent; - _nss_files_getservbyname_r; - _nss_files_getservbyport_r; - _nss_files_getservent_r; - _nss_files_parse_servent; - - _nss_files_setspent; - _nss_files_endspent; - _nss_files_getspent_r; - _nss_files_getspnam_r; - - _nss_files_setsgent; - _nss_files_endsgent; - _nss_files_getsgent_r; - _nss_files_getsgnam_r; - - _nss_netgroup_parseline; - _nss_files_getpublickey; - _nss_files_getsecretkey; - - _nss_files_initgroups_dyn; - - _nss_files_init; - } -} - -libnss_db { - GLIBC_PRIVATE { - _nss_db_setetherent; - _nss_db_endetherent; - _nss_db_getetherent_r; - _nss_db_gethostton_r; - _nss_db_getntohost_r; - - _nss_db_setgrent; - _nss_db_endgrent; - _nss_db_getgrent_r; - _nss_db_getgrgid_r; - _nss_db_getgrnam_r; - - _nss_db_setnetgrent; - _nss_db_endnetgrent; - _nss_db_getnetgrent_r; - - _nss_db_setprotoent; - _nss_db_endprotoent; - _nss_db_getprotoent_r; - _nss_db_getprotobyname_r; - _nss_db_getprotobynumber_r; - - _nss_db_setpwent; - _nss_db_endpwent; - _nss_db_getpwent_r; - _nss_db_getpwnam_r; - _nss_db_getpwuid_r; - - _nss_db_setrpcent; - _nss_db_endrpcent; - _nss_db_getrpcent_r; - _nss_db_getrpcbyname_r; - _nss_db_getrpcbynumber_r; - - _nss_db_setservent; - _nss_db_endservent; - _nss_db_getservent_r; - _nss_db_getservbyname_r; - _nss_db_getservbyport_r; - - _nss_db_setsgent; - _nss_db_endsgent; - _nss_db_getsgent_r; - _nss_db_getsgnam_r; - - _nss_db_setspent; - _nss_db_endspent; - _nss_db_getspent_r; - _nss_db_getspnam_r; - - _nss_db_initgroups_dyn; - - _nss_db_init; - } -} diff --git a/nss/XXX-lookup.c b/nss/XXX-lookup.c deleted file mode 100644 index 5a37fdae08..0000000000 --- a/nss/XXX-lookup.c +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include "nsswitch.h" - -/*******************************************************************\ -|* Here we assume one symbol to be defined: *| -|* *| -|* DATABASE_NAME - name of the database the function accesses *| -|* (e.g., hosts, services, ...) *| -|* *| -|* One additional symbol may optionally be defined: *| -|* *| -|* ALTERNATE_NAME - name of another service which is examined in *| -|* case DATABASE_NAME is not found *| -|* *| -|* DEFAULT_CONFIG - string for default conf (e.g. "dns files") *| -|* *| -\*******************************************************************/ - -#define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2) -#define DB_COMPAT_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup) -#define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post) -#define CONCAT3_2(Pre, Name, Post) Pre##Name##Post - -#define DATABASE_NAME_SYMBOL CONCAT3_1 (__nss_, DATABASE_NAME, _database) -#define DATABASE_NAME_STRING STRINGIFY1 (DATABASE_NAME) -#define STRINGIFY1(Name) STRINGIFY2 (Name) -#define STRINGIFY2(Name) #Name - -#ifdef ALTERNATE_NAME -#define ALTERNATE_NAME_STRING STRINGIFY1 (ALTERNATE_NAME) -#else -#define ALTERNATE_NAME_STRING NULL -#endif - -#ifndef DEFAULT_CONFIG -#define DEFAULT_CONFIG NULL -#endif - -service_user *DATABASE_NAME_SYMBOL attribute_hidden; - -extern int DB_LOOKUP_FCT (service_user **ni, const char *fct_name, - const char *fct2_name, void **fctp) - internal_function; -libc_hidden_proto (DB_LOOKUP_FCT) - -int -internal_function -DB_LOOKUP_FCT (service_user **ni, const char *fct_name, const char *fct2_name, - void **fctp) -{ - if (DATABASE_NAME_SYMBOL == NULL - && __nss_database_lookup (DATABASE_NAME_STRING, ALTERNATE_NAME_STRING, - DEFAULT_CONFIG, &DATABASE_NAME_SYMBOL) < 0) - return -1; - - *ni = DATABASE_NAME_SYMBOL; - - return __nss_lookup (ni, fct_name, fct2_name, fctp); -} -libc_hidden_def (DB_LOOKUP_FCT) - - -#ifndef NO_COMPAT -int -internal_function attribute_compat_text_section -DB_COMPAT_FCT (service_user **ni, const char *fct_name, void **fctp) -{ - return DB_LOOKUP_FCT (ni, fct_name, NULL, fctp); -} -#endif diff --git a/nss/alias-lookup.c b/nss/alias-lookup.c deleted file mode 100644 index 4e7e5d5921..0000000000 --- a/nss/alias-lookup.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME aliases - -#include "XXX-lookup.c" diff --git a/nss/bug-erange.c b/nss/bug-erange.c deleted file mode 100644 index b709418b5c..0000000000 --- a/nss/bug-erange.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Test case for gethostbyname_r bug when buffer expansion required. */ - -#include <netdb.h> -#include <arpa/inet.h> -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -int -main (void) -{ - const char *host = "www.gnu.org"; - - /* This code approximates the example code in the library manual. */ - - struct hostent hostbuf, *hp; - size_t hstbuflen; - char *tmphstbuf; - int res; - int herr; - - hstbuflen = 16; /* Make it way small to ensure ERANGE. */ - /* Allocate buffer, remember to free it to avoid memory leakage. */ - tmphstbuf = malloc (hstbuflen); - - while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - - if (res != 0 || hp == NULL) - { - printf ("gethostbyname_r failed: %s (errno: %m)\n", strerror (res)); - - if (access ("/etc/resolv.conf", R_OK)) - { - puts ("DNS probably not set up"); - return 0; - } - - return 1; - } - - printf ("Got: %s %s\n", hp->h_name, - inet_ntoa (*(struct in_addr *) hp->h_addr)); - return 0; -} diff --git a/nss/bug17079.c b/nss/bug17079.c deleted file mode 100644 index 4171c7db55..0000000000 --- a/nss/bug17079.c +++ /dev/null @@ -1,244 +0,0 @@ -/* Test for bug 17079: heap overflow in NSS with small buffers. - Copyright (C) 2015-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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pwd.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -/* Check if two passwd structs contain the same data. */ -static bool -equal (const struct passwd *a, const struct passwd *b) -{ - return strcmp (a->pw_name, b->pw_name) == 0 - && strcmp (a->pw_passwd, b->pw_passwd) == 0 - && a->pw_uid == b->pw_uid - && a->pw_gid == b->pw_gid - && strcmp (a->pw_gecos, b->pw_gecos) == 0 - && strcmp (a->pw_dir, b->pw_dir) == 0 - && strcmp (a->pw_shell, b->pw_shell) == 0; -} - -enum { MAX_TEST_ITEMS = 10 }; -static struct passwd test_items[MAX_TEST_ITEMS]; -static int test_count; - -/* Initialize test_items and test_count above, with data from the - passwd database. */ -static bool -init_test_items (void) -{ - setpwent (); - do - { - struct passwd *pwd = getpwent (); - if (pwd == NULL) - break; - struct passwd *target = test_items + test_count; - target->pw_name = strdup (pwd->pw_name); - target->pw_passwd = strdup (pwd->pw_passwd); - target->pw_uid = pwd->pw_uid; - target->pw_gid = pwd->pw_gid; - target->pw_gecos = strdup (pwd->pw_gecos); - target->pw_dir = strdup (pwd->pw_dir); - target->pw_shell = strdup (pwd->pw_shell); - } - while (++test_count < MAX_TEST_ITEMS); - endpwent (); - - /* Filter out those test items which cannot be looked up by name or - UID. */ - bool found = false; - for (int i = 0; i < test_count; ++i) - { - struct passwd *pwd1 = getpwnam (test_items[i].pw_name); - struct passwd *pwd2 = getpwuid (test_items[i].pw_uid); - if (pwd1 == NULL || !equal (pwd1, test_items + i) - || pwd2 == NULL || !equal (pwd2, test_items + i)) - { - printf ("info: skipping user \"%s\", UID %ld due to inconsistency\n", - test_items[i].pw_name, (long) test_items[i].pw_uid); - test_items[i].pw_name = NULL; - } - else - found = true; - } - - if (!found) - puts ("error: no accounts found which can be looked up by name and UID."); - return found; -} - -/* Set to true if an error is encountered. */ -static bool errors; - -/* Return true if the padding has not been tampered with. */ -static bool -check_padding (char *buffer, size_t size, char pad) -{ - char *end = buffer + size; - while (buffer < end) - { - if (*buffer != pad) - return false; - ++buffer; - } - return true; -} - -/* Test one buffer size and padding combination. */ -static void -test_one (const struct passwd *item, size_t buffer_size, - char pad, size_t padding_size) -{ - char *buffer = malloc (buffer_size + padding_size); - if (buffer == NULL) - { - puts ("error: malloc failure"); - errors = true; - return; - } - - struct passwd pwd; - struct passwd *result; - int ret; - - /* Test getpwname_r. */ - memset (buffer, pad, buffer_size + padding_size); - pwd = (struct passwd) {}; - ret = getpwnam_r (item->pw_name, &pwd, buffer, buffer_size, &result); - if (!check_padding (buffer + buffer_size, padding_size, pad)) - { - printf ("error: padding change: " - "name \"%s\", buffer size %zu, padding size %zu, pad 0x%02x\n", - item->pw_name, buffer_size, padding_size, (unsigned char) pad); - errors = true; - } - if (ret == 0) - { - if (result == NULL) - { - printf ("error: no data: name \"%s\", buffer size %zu\n", - item->pw_name, buffer_size); - errors = true; - } - else if (!equal (item, result)) - { - printf ("error: lookup mismatch: name \"%s\", buffer size %zu\n", - item->pw_name, buffer_size); - errors = true; - } - } - else if (ret != ERANGE) - { - errno = ret; - printf ("error: lookup failure for name \"%s\": %m (%d)\n", - item->pw_name, ret); - errors = true; - } - - /* Test getpwuid_r. */ - memset (buffer, pad, buffer_size + padding_size); - pwd = (struct passwd) {}; - ret = getpwuid_r (item->pw_uid, &pwd, buffer, buffer_size, &result); - if (!check_padding (buffer + buffer_size, padding_size, pad)) - { - printf ("error: padding change: " - "UID %ld, buffer size %zu, padding size %zu, pad 0x%02x\n", - (long) item->pw_uid, buffer_size, padding_size, - (unsigned char) pad); - errors = true; - } - if (ret == 0) - { - if (result == NULL) - { - printf ("error: no data: UID %ld, buffer size %zu\n", - (long) item->pw_uid, buffer_size); - errors = true; - } - else if (!equal (item, result)) - { - printf ("error: lookup mismatch: UID %ld, buffer size %zu\n", - (long) item->pw_uid, buffer_size); - errors = true; - } - } - else if (ret != ERANGE) - { - errno = ret; - printf ("error: lookup failure for UID \"%ld\": %m (%d)\n", - (long) item->pw_uid, ret); - errors = true; - } - - free (buffer); -} - -/* Test one buffer size with different paddings. */ -static void -test_buffer_size (size_t buffer_size) -{ - for (int i = 0; i < test_count; ++i) - for (size_t padding_size = 0; padding_size < 3; ++padding_size) - { - /* Skip entries with inconsistent name/UID lookups. */ - if (test_items[i].pw_name == NULL) - continue; - - test_one (test_items + i, buffer_size, '\0', padding_size); - if (padding_size > 0) - { - test_one (test_items + i, buffer_size, ':', padding_size); - test_one (test_items + i, buffer_size, '\n', padding_size); - test_one (test_items + i, buffer_size, '\xff', padding_size); - test_one (test_items + i, buffer_size, '@', padding_size); - } - } -} - -int -do_test (void) -{ - if (!init_test_items ()) - return 1; - printf ("info: %d test items\n", test_count); - - for (size_t buffer_size = 0; buffer_size <= 65; ++buffer_size) - test_buffer_size (buffer_size); - for (size_t buffer_size = 64 + 4; buffer_size < 256; buffer_size += 4) - test_buffer_size (buffer_size); - test_buffer_size (255); - test_buffer_size (257); - for (size_t buffer_size = 256; buffer_size < 512; buffer_size += 8) - test_buffer_size (buffer_size); - test_buffer_size (511); - test_buffer_size (513); - test_buffer_size (1024); - test_buffer_size (2048); - - if (errors) - return 1; - else - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nss/databases.def b/nss/databases.def deleted file mode 100644 index 8a46839618..0000000000 --- a/nss/databases.def +++ /dev/null @@ -1,42 +0,0 @@ -/* List of all databases defined for the NSS in GNU C Library. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* This list must be kept sorted!!! If any long name is added the - field size for it must be increases. */ - -DEFINE_DATABASE (aliases) -DEFINE_DATABASE (ethers) -DEFINE_DATABASE (group) -DEFINE_DATABASE (gshadow) -DEFINE_DATABASE (hosts) -DEFINE_DATABASE (initgroups) -DEFINE_DATABASE (netgroup) -DEFINE_DATABASE (networks) -DEFINE_DATABASE (passwd) -DEFINE_DATABASE (protocols) -DEFINE_DATABASE (publickey) -DEFINE_DATABASE (rpc) -DEFINE_DATABASE (services) -DEFINE_DATABASE (shadow) - -/* - Local Variables: - mode:C - End: - */ diff --git a/nss/db-Makefile b/nss/db-Makefile deleted file mode 100644 index aa22ed0d5b..0000000000 --- a/nss/db-Makefile +++ /dev/null @@ -1,166 +0,0 @@ -# Makefile to (re-)generate db versions of system database files. -# Copyright (C) 1996-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. -# - -# 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 -# <http://www.gnu.org/licenses/>. - -DATABASES = $(wildcard /etc/passwd /etc/group /etc/ethers /etc/protocols \ - /etc/rpc /etc/services /etc/shadow /etc/gshadow \ - /etc/netgroup) - -VAR_DB = /var/db - -AWK = awk -MAKEDB = makedb --quiet - -all: $(patsubst %,$(VAR_DB)/%.db,$(notdir $(DATABASES))) - - -$(VAR_DB)/passwd.db: /etc/passwd - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) 'BEGIN { FS=":"; OFS=":" } \ - /^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print; \ - printf "=%s ", $$3; print }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." - -$(VAR_DB)/group.db: /etc/group - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) 'BEGIN { FS=":"; OFS=":" } \ - /^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print; \ - printf "=%s ", $$3; print; \ - if ($$4 != "") { \ - split($$4, grmems, ","); \ - for (memidx in grmems) { \ - mem=grmems[memidx]; \ - if (members[mem] == "") \ - members[mem]=$$3; \ - else \ - members[mem]=members[mem] "," $$3; \ - } \ - delete grmems; } } \ - END { for (mem in members) \ - printf ":%s %s %s\n", mem, mem, members[mem]; }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." - -$(VAR_DB)/ethers.db: /etc/ethers - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) '/^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print; \ - printf "=%s ", $$2; print }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." - -$(VAR_DB)/protocols.db: /etc/protocols - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) '/^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print; \ - printf "=%s ", $$2; print; \ - for (i = 3; i <= NF && !($$i ~ /^#/); ++i) \ - { printf ".%s ", $$i; print } }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." - -$(VAR_DB)/rpc.db: /etc/rpc - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) '/^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print; \ - printf "=%s ", $$2; print; \ - for (i = 3; i <= NF && !($$i ~ /^#/); ++i) \ - { printf ".%s ", $$i; print } }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." - -$(VAR_DB)/services.db: /etc/services - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) 'BEGIN { FS="[ \t/]+" } \ - /^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { sub(/[ \t]*#.*$$/, "");\ - printf ":%s/%s ", $$1, $$3; print; \ - printf ":%s/ ", $$1; print; \ - printf "=%s/%s ", $$2, $$3; print; \ - printf "=%s/ ", $$2; print; \ - for (i = 4; i <= NF && !($$i ~ /^#/); ++i) \ - { printf ":%s/%s ", $$i, $$3; print; \ - printf ":%s/ ", $$i; print } }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." - -$(VAR_DB)/shadow.db: /etc/shadow - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) 'BEGIN { FS=":"; OFS=":" } \ - /^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print }' $^ | \ - (umask 077 && $(MAKEDB) -o $@ -) - @echo "done." - @if chgrp shadow $@ 2>/dev/null; then \ - chmod g+r $@; \ - else \ - chown 0 $@; chgrp 0 $@; chmod 600 $@; \ - echo; \ - echo "Warning: The shadow password database $@"; \ - echo "has been set to be readable only by root. You may want"; \ - echo "to make it readable by the \`shadow' group depending"; \ - echo "on your configuration."; \ - echo; \ - fi - -$(VAR_DB)/gshadow.db: /etc/gshadow - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) 'BEGIN { FS=":"; OFS=":" } \ - /^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { printf ".%s ", $$1; print }' $^ | \ - (umask 077 && $(MAKEDB) -o $@ -) - @echo "done." - @if chgrp shadow $@ 2>/dev/null; then \ - chmod g+r $@; \ - else \ - chown 0 $@; chgrp 0 $@; chmod 600 $@; \ - echo; \ - echo "Warning: The shadow group database $@"; \ - echo "has been set to be readable only by root. You may want"; \ - echo "to make it readable by the \`shadow' group depending"; \ - echo "on your configuration."; \ - echo; \ - fi - -$(VAR_DB)/netgroup.db: /etc/netgroup - @printf %s "$(patsubst %.db,%,$(@F))... " - @$(AWK) 'BEGIN { ini=1 } \ - /^[ \t]*$$/ { next } \ - /^[ \t]*#/ { next } \ - /^[^#]/ { if (sub(/[ \t]*\\$$/, " ") == 0) end="\n"; \ - else end=""; \ - gsub(/[ \t]+/, " "); \ - sub(/^[ \t]*/, ""); \ - if (ini == 0) printf "%s%s", $$0, end; \ - else printf ".%s %s%s", $$1, $$0, end; \ - ini=end == "" ? 0 : 1; } \ - END { if (ini==0) printf "\n" }' $^ | \ - $(MAKEDB) -o $@ - - @echo "done." diff --git a/nss/digits_dots.c b/nss/digits_dots.c deleted file mode 100644 index 8dcbf9eb0a..0000000000 --- a/nss/digits_dots.c +++ /dev/null @@ -1,283 +0,0 @@ -/* Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by H.J. Lu <hjl@gnu.ai.mit.edu>, 1997. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <ctype.h> -#include <wctype.h> -#include <resolv/resolv-internal.h> -#include <netdb.h> -#include <arpa/inet.h> -#include "nsswitch.h" - -#ifdef USE_NSCD -# define inet_aton __inet_aton -# include <nscd/nscd_proto.h> -#endif - -int -__nss_hostname_digits_dots (const char *name, struct hostent *resbuf, - char **buffer, size_t *buffer_size, - size_t buflen, struct hostent **result, - enum nss_status *status, int af, int *h_errnop) -{ - int save; - - /* We have to test for the use of IPv6 which can only be done by - examining `_res'. */ - if (__res_maybe_init (&_res, 0) == -1) - { - if (h_errnop) - *h_errnop = NETDB_INTERNAL; - if (buffer_size == NULL) - *status = NSS_STATUS_TRYAGAIN; - else - *result = NULL; - return -1; - } - - /* - * disallow names consisting only of digits/dots, unless - * they end in a dot. - */ - if (isdigit (name[0]) || isxdigit (name[0]) || name[0] == ':') - { - const char *cp; - char *hostname; - typedef unsigned char host_addr_t[16]; - host_addr_t *host_addr; - typedef char *host_addr_list_t[2]; - host_addr_list_t *h_addr_ptrs; - char **h_alias_ptr; - size_t size_needed; - int addr_size; - - switch (af) - { - case AF_INET: - addr_size = INADDRSZ; - break; - - case AF_INET6: - addr_size = IN6ADDRSZ; - break; - - default: - af = res_use_inet6 () ? AF_INET6 : AF_INET; - addr_size = af == AF_INET6 ? IN6ADDRSZ : INADDRSZ; - break; - } - - size_needed = (sizeof (*host_addr) - + sizeof (*h_addr_ptrs) - + sizeof (*h_alias_ptr) + strlen (name) + 1); - - if (buffer_size == NULL) - { - if (buflen < size_needed) - { - *status = NSS_STATUS_TRYAGAIN; - if (h_errnop != NULL) - *h_errnop = NETDB_INTERNAL; - __set_errno (ERANGE); - goto done; - } - } - else if (buffer_size != NULL && *buffer_size < size_needed) - { - char *new_buf; - *buffer_size = size_needed; - new_buf = (char *) realloc (*buffer, *buffer_size); - - if (new_buf == NULL) - { - save = errno; - free (*buffer); - *buffer = NULL; - *buffer_size = 0; - __set_errno (save); - if (h_errnop != NULL) - *h_errnop = NETDB_INTERNAL; - *result = NULL; - goto done; - } - *buffer = new_buf; - } - - memset (*buffer, '\0', size_needed); - - host_addr = (host_addr_t *) *buffer; - h_addr_ptrs = (host_addr_list_t *) - ((char *) host_addr + sizeof (*host_addr)); - h_alias_ptr = (char **) ((char *) h_addr_ptrs + sizeof (*h_addr_ptrs)); - hostname = (char *) h_alias_ptr + sizeof (*h_alias_ptr); - - if (isdigit (name[0])) - { - for (cp = name;; ++cp) - { - if (*cp == '\0') - { - int ok; - - if (*--cp == '.') - break; - - /* All-numeric, no dot at the end. Fake up a hostent as if - we'd actually done a lookup. What if someone types - 255.255.255.255? The test below will succeed - spuriously... ??? */ - if (af == AF_INET) - ok = __inet_aton (name, (struct in_addr *) host_addr); - else - { - assert (af == AF_INET6); - ok = inet_pton (af, name, host_addr) > 0; - } - if (! ok) - { - *h_errnop = HOST_NOT_FOUND; - if (buffer_size == NULL) - *status = NSS_STATUS_NOTFOUND; - else - *result = NULL; - goto done; - } - - resbuf->h_name = strcpy (hostname, name); - h_alias_ptr[0] = NULL; - resbuf->h_aliases = h_alias_ptr; - (*h_addr_ptrs)[0] = (char *) host_addr; - (*h_addr_ptrs)[1] = NULL; - resbuf->h_addr_list = *h_addr_ptrs; - if (af == AF_INET && res_use_inet6 ()) - { - /* We need to change the IP v4 address into the - IP v6 address. */ - char tmp[INADDRSZ]; - char *p = (char *) host_addr; - int i; - - /* Save a copy of the IP v4 address. */ - memcpy (tmp, host_addr, INADDRSZ); - /* Mark this ipv6 addr as a mapped ipv4. */ - for (i = 0; i < 10; i++) - *p++ = 0x00; - *p++ = 0xff; - *p++ = 0xff; - /* Copy the IP v4 address. */ - memcpy (p, tmp, INADDRSZ); - resbuf->h_addrtype = AF_INET6; - resbuf->h_length = IN6ADDRSZ; - } - else - { - resbuf->h_addrtype = af; - resbuf->h_length = addr_size; - } - if (h_errnop != NULL) - *h_errnop = NETDB_SUCCESS; - if (buffer_size == NULL) - *status = NSS_STATUS_SUCCESS; - else - *result = resbuf; - goto done; - } - - if (!isdigit (*cp) && *cp != '.') - break; - } - } - - if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':') - { - switch (af) - { - default: - af = res_use_inet6 () ? AF_INET6 : AF_INET; - if (af == AF_INET6) - { - addr_size = IN6ADDRSZ; - break; - } - /* FALLTHROUGH */ - - case AF_INET: - /* This is not possible. We cannot represent an IPv6 address - in an `struct in_addr' variable. */ - *h_errnop = HOST_NOT_FOUND; - if (buffer_size == NULL) - *status = NSS_STATUS_NOTFOUND; - else - *result = NULL; - goto done; - - case AF_INET6: - addr_size = IN6ADDRSZ; - break; - } - - for (cp = name;; ++cp) - { - if (!*cp) - { - if (*--cp == '.') - break; - - /* All-IPv6-legal, no dot at the end. Fake up a - hostent as if we'd actually done a lookup. */ - if (inet_pton (AF_INET6, name, host_addr) <= 0) - { - *h_errnop = HOST_NOT_FOUND; - if (buffer_size == NULL) - *status = NSS_STATUS_NOTFOUND; - else - *result = NULL; - goto done; - } - - resbuf->h_name = strcpy (hostname, name); - h_alias_ptr[0] = NULL; - resbuf->h_aliases = h_alias_ptr; - (*h_addr_ptrs)[0] = (char *) host_addr; - (*h_addr_ptrs)[1] = (char *) 0; - resbuf->h_addr_list = *h_addr_ptrs; - resbuf->h_addrtype = AF_INET6; - resbuf->h_length = addr_size; - *h_errnop = NETDB_SUCCESS; - if (buffer_size == NULL) - *status = NSS_STATUS_SUCCESS; - else - *result = resbuf; - goto done; - } - - if (!isxdigit (*cp) && *cp != ':' && *cp != '.') - break; - } - } - } - - return 0; - -done: - return 1; -} -libc_hidden_def (__nss_hostname_digits_dots) diff --git a/nss/ethers-lookup.c b/nss/ethers-lookup.c deleted file mode 100644 index ae073dd7a7..0000000000 --- a/nss/ethers-lookup.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME ethers - -#include "XXX-lookup.c" diff --git a/nss/function.def b/nss/function.def deleted file mode 100644 index 638fcc8126..0000000000 --- a/nss/function.def +++ /dev/null @@ -1,78 +0,0 @@ -/* List of functions defined for static NSS in GNU C Library. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -/* - This is a minimal config. Only services `files' and `dns' are supported. -*/ - -/* aliases */ -DEFINE_ENT (files, alias) -DEFINE_GETBY (files, alias, name) - -/* ethers */ -DEFINE_ENT (files, ether) - -/* group */ -DEFINE_ENT (files, gr) -DEFINE_GET (files, grgid) -DEFINE_GET (files, grnam) - -/* hosts */ -DEFINE_ENT (files, host) -DEFINE_GETBY (files, host, addr) -DEFINE_GETBY (files, host, name) -DEFINE_GETBY (files, host, name2) -DEFINE_GET (files, hostton) -DEFINE_GET (files, ntohost) -DEFINE_GETBY (dns, host, addr) -DEFINE_GETBY (dns, host, name) -DEFINE_GETBY (dns, host, name2) - -/* netgroup */ -DEFINE_ENT (files, netgr) - -/* networks */ -DEFINE_ENT (files, net) -DEFINE_GETBY (files, net, name) -DEFINE_GETBY (files, net, addr) -DEFINE_GETBY (dns, net, name) -DEFINE_GETBY (dns, net, addr) - -/* protocols */ -DEFINE_ENT (files, proto) -DEFINE_GETBY (files, proto, name) -DEFINE_GETBY (files, proto, number) - -/* passwd */ -DEFINE_ENT (files, pw) -DEFINE_GET (files, pwnam) -DEFINE_GET (files, pwuid) - -/* rpc */ -DEFINE_ENT (files, rpc) -DEFINE_GETBY (files, rpc, name) -DEFINE_GETBY (files, rpc, number) - -/* services */ -DEFINE_ENT (files, serv) -DEFINE_GETBY (files, serv, name) -DEFINE_GETBY (files, serv, port) - -/* shadow */ -DEFINE_ENT (files, sp) -DEFINE_GET (files, spnam) diff --git a/nss/getXXbyYY.c b/nss/getXXbyYY.c deleted file mode 100644 index d027b14250..0000000000 --- a/nss/getXXbyYY.c +++ /dev/null @@ -1,154 +0,0 @@ -/* Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <libc-lock.h> -#include <stdlib.h> -#include <resolv.h> - -#include "nsswitch.h" - -/*******************************************************************\ -|* Here we assume several symbols to be defined: *| -|* *| -|* LOOKUP_TYPE - the return type of the function *| -|* *| -|* FUNCTION_NAME - name of the non-reentrant function *| -|* *| -|* DATABASE_NAME - name of the database the function accesses *| -|* (e.g., host, services, ...) *| -|* *| -|* ADD_PARAMS - additional parameter, can vary in number *| -|* *| -|* ADD_VARIABLES - names of additional parameter *| -|* *| -|* BUFLEN - length of buffer allocated for the non *| -|* reentrant version *| -|* *| -|* Optionally the following vars can be defined: *| -|* *| -|* NEED_H_ERRNO - an extra parameter will be passed to point to *| -|* the global `h_errno' variable. *| -|* *| -\*******************************************************************/ - -/* To make the real sources a bit prettier. */ -#define REENTRANT_NAME APPEND_R (FUNCTION_NAME) -#define APPEND_R(name) APPEND_R1 (name) -#define APPEND_R1(name) name##_r -#define INTERNAL(name) INTERNAL1 (name) -#define INTERNAL1(name) __##name - -/* Sometimes we need to store error codes in the `h_errno' variable. */ -#ifdef NEED_H_ERRNO -# define H_ERRNO_PARM , int *h_errnop -# define H_ERRNO_VAR , &h_errno_tmp -# define H_ERRNO_VAR_P &h_errno_tmp -#else -# define H_ERRNO_PARM -# define H_ERRNO_VAR -# define H_ERRNO_VAR_P NULL -#endif - -#ifdef HAVE_AF -# define AF_VAL af -#else -# define AF_VAL AF_INET -#endif - -/* Prototype for reentrant version we use here. */ -extern int INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, - char *buffer, size_t buflen, - LOOKUP_TYPE **result H_ERRNO_PARM); - -/* We need to protect the dynamic buffer handling. */ -__libc_lock_define_initialized (static, lock); - -/* This points to the static buffer used. */ -libc_freeres_ptr (static char *buffer); - - -LOOKUP_TYPE * -FUNCTION_NAME (ADD_PARAMS) -{ - static size_t buffer_size; - static LOOKUP_TYPE resbuf; - LOOKUP_TYPE *result; -#ifdef NEED_H_ERRNO - int h_errno_tmp = 0; -#endif - - /* Get lock. */ - __libc_lock_lock (lock); - - if (buffer == NULL) - { - buffer_size = BUFLEN; - buffer = (char *) malloc (buffer_size); - } - -#ifdef HANDLE_DIGITS_DOTS - if (buffer != NULL) - { - if (__nss_hostname_digits_dots (name, &resbuf, &buffer, - &buffer_size, 0, &result, NULL, AF_VAL, - H_ERRNO_VAR_P)) - goto done; - } -#endif - - while (buffer != NULL - && (INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, &resbuf, buffer, - buffer_size, &result H_ERRNO_VAR) - == ERANGE) -#ifdef NEED_H_ERRNO - && h_errno_tmp == NETDB_INTERNAL -#endif - ) - { - char *new_buf; - buffer_size *= 2; - new_buf = (char *) realloc (buffer, buffer_size); - if (new_buf == NULL) - { - /* We are out of memory. Free the current buffer so that the - process gets a chance for a normal termination. */ - free (buffer); - __set_errno (ENOMEM); - } - buffer = new_buf; - } - - if (buffer == NULL) - result = NULL; - -#ifdef HANDLE_DIGITS_DOTS -done: -#endif - /* Release lock. */ - __libc_lock_unlock (lock); - -#ifdef NEED_H_ERRNO - if (h_errno_tmp != 0) - __set_h_errno (h_errno_tmp); -#endif - - return result; -} - -nss_interface_function (FUNCTION_NAME) diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c deleted file mode 100644 index 5962475737..0000000000 --- a/nss/getXXbyYY_r.c +++ /dev/null @@ -1,465 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <atomic.h> -#include <errno.h> -#include <stdbool.h> -#include "nsswitch.h" -#include "sysdep.h" -#ifdef USE_NSCD -# include <nscd/nscd_proto.h> -#endif -#ifdef NEED__RES_HCONF -# include <resolv/res_hconf.h> -#endif -#ifdef NEED__RES -# include <resolv.h> -#endif -/*******************************************************************\ -|* Here we assume several symbols to be defined: *| -|* *| -|* LOOKUP_TYPE - the return type of the function *| -|* *| -|* FUNCTION_NAME - name of the non-reentrant function *| -|* *| -|* DATABASE_NAME - name of the database the function accesses *| -|* (e.g., host, services, ...) *| -|* *| -|* ADD_PARAMS - additional parameters, can vary in number *| -|* *| -|* ADD_VARIABLES - names of additional parameters *| -|* *| -|* Optionally the following vars can be defined: *| -|* *| -|* EXTRA_PARAMS - optional parameters, can vary in number *| -|* *| -|* EXTRA_VARIABLES - names of optional parameter *| -|* *| -|* FUNCTION2_NAME - alternative name of the non-reentrant function *| -|* *| -|* NEED_H_ERRNO - an extra parameter will be passed to point to *| -|* the global `h_errno' variable. *| -|* *| -|* NEED__RES - the global _res variable might be used so we *| -|* will have to initialize it if necessary *| -|* *| -|* PREPROCESS - code run before anything else *| -|* *| -|* POSTPROCESS - code run after the lookup *| -|* *| -\*******************************************************************/ - -/* To make the real sources a bit prettier. */ -#define REENTRANT_NAME APPEND_R (FUNCTION_NAME) -#ifdef FUNCTION2_NAME -# define REENTRANT2_NAME APPEND_R (FUNCTION2_NAME) -#else -# define REENTRANT2_NAME NULL -#endif -#define APPEND_R(name) APPEND_R1 (name) -#define APPEND_R1(name) name##_r -#define INTERNAL(name) INTERNAL1 (name) -#define INTERNAL1(name) __##name -#define NEW(name) NEW1 (name) -#define NEW1(name) __new_##name - -#ifdef USE_NSCD -# define NSCD_NAME ADD_NSCD (REENTRANT_NAME) -# define ADD_NSCD(name) ADD_NSCD1 (name) -# define ADD_NSCD1(name) __nscd_##name -# define NOT_USENSCD_NAME ADD_NOT_NSCDUSE (DATABASE_NAME) -# define ADD_NOT_NSCDUSE(name) ADD_NOT_NSCDUSE1 (name) -# define ADD_NOT_NSCDUSE1(name) __nss_not_use_nscd_##name -# define CONCAT2(arg1, arg2) CONCAT2_2 (arg1, arg2) -# define CONCAT2_2(arg1, arg2) arg1##arg2 -#endif - -#define FUNCTION_NAME_STRING STRINGIZE (FUNCTION_NAME) -#define REENTRANT_NAME_STRING STRINGIZE (REENTRANT_NAME) -#ifdef FUNCTION2_NAME -# define REENTRANT2_NAME_STRING STRINGIZE (REENTRANT2_NAME) -#else -# define REENTRANT2_NAME_STRING NULL -#endif -#define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME) -#define STRINGIZE(name) STRINGIZE1 (name) -#define STRINGIZE1(name) #name - -#ifndef DB_LOOKUP_FCT -# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2) -# define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post) -# define CONCAT3_2(Pre, Name, Post) Pre##Name##Post -#endif - -/* Sometimes we need to store error codes in the `h_errno' variable. */ -#ifdef NEED_H_ERRNO -# define H_ERRNO_PARM , int *h_errnop -# define H_ERRNO_VAR , h_errnop -# define H_ERRNO_VAR_P h_errnop -#else -# define H_ERRNO_PARM -# define H_ERRNO_VAR -# define H_ERRNO_VAR_P NULL -#endif - -#ifndef EXTRA_PARAMS -# define EXTRA_PARAMS -#endif -#ifndef EXTRA_VARIABLES -# define EXTRA_VARIABLES -#endif - -#ifdef HAVE_AF -# define AF_VAL af -#else -# define AF_VAL AF_INET -#endif - - -/* Set defaults for merge functions that haven't been defined. */ -#ifndef DEEPCOPY_FN -static inline int -__copy_einval (LOOKUP_TYPE a, - const size_t b, - LOOKUP_TYPE *c, - char *d, - char **e) -{ - return EINVAL; -} -# define DEEPCOPY_FN __copy_einval -#endif - -#ifndef MERGE_FN -static inline int -__merge_einval (LOOKUP_TYPE *a, - char *b, - char *c, - size_t d, - LOOKUP_TYPE *e, - char *f) -{ - return EINVAL; -} -# define MERGE_FN __merge_einval -#endif - -#define CHECK_MERGE(err, status) \ - ({ \ - do \ - { \ - if (err) \ - { \ - __set_errno (err); \ - if (err == ERANGE) \ - status = NSS_STATUS_TRYAGAIN; \ - else \ - status = NSS_STATUS_UNAVAIL; \ - break; \ - } \ - } \ - while (0); \ - }) - -/* Type of the lookup function we need here. */ -typedef enum nss_status (*lookup_function) (ADD_PARAMS, LOOKUP_TYPE *, char *, - size_t, int * H_ERRNO_PARM - EXTRA_PARAMS); - -/* The lookup function for the first entry of this service. */ -extern int DB_LOOKUP_FCT (service_user **nip, const char *name, - const char *name2, void **fctp) - internal_function; -libc_hidden_proto (DB_LOOKUP_FCT) - - -int -INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, - size_t buflen, LOOKUP_TYPE **result H_ERRNO_PARM - EXTRA_PARAMS) -{ - static bool startp_initialized; - static service_user *startp; - static lookup_function start_fct; - service_user *nip; - int do_merge = 0; - LOOKUP_TYPE mergegrp; - char *mergebuf = NULL; - char *endptr = NULL; - union - { - lookup_function l; - void *ptr; - } fct; - int no_more, err; - enum nss_status status = NSS_STATUS_UNAVAIL; -#ifdef USE_NSCD - int nscd_status; -#endif -#ifdef NEED_H_ERRNO - bool any_service = false; -#endif - -#ifdef PREPROCESS - PREPROCESS; -#endif - -#ifdef HANDLE_DIGITS_DOTS - switch (__nss_hostname_digits_dots (name, resbuf, &buffer, NULL, - buflen, result, &status, AF_VAL, - H_ERRNO_VAR_P)) - { - case -1: - return errno; - case 1: -#ifdef NEED_H_ERRNO - any_service = true; -#endif - goto done; - } -#endif - -#ifdef USE_NSCD - if (NOT_USENSCD_NAME > 0 && ++NOT_USENSCD_NAME > NSS_NSCD_RETRY) - NOT_USENSCD_NAME = 0; - - if (!NOT_USENSCD_NAME - && !__nss_database_custom[CONCAT2 (NSS_DBSIDX_, DATABASE_NAME)]) - { - nscd_status = NSCD_NAME (ADD_VARIABLES, resbuf, buffer, buflen, result - H_ERRNO_VAR); - if (nscd_status >= 0) - return nscd_status; - } -#endif - - if (! startp_initialized) - { - no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, - REENTRANT2_NAME_STRING, &fct.ptr); - if (no_more) - { - void *tmp_ptr = (service_user *) -1l; -#ifdef PTR_MANGLE - PTR_MANGLE (tmp_ptr); -#endif - startp = tmp_ptr; - } - else - { -#ifdef NEED__RES - /* The resolver code will really be used so we have to - initialize it. */ - if (__res_maybe_init (&_res, 0) == -1) - { - *h_errnop = NETDB_INTERNAL; - *result = NULL; - return errno; - } -#endif /* need _res */ -#ifdef NEED__RES_HCONF - _res_hconf_init (); -#endif /* need _res_hconf */ - - void *tmp_ptr = fct.l; -#ifdef PTR_MANGLE - PTR_MANGLE (tmp_ptr); -#endif - start_fct = tmp_ptr; - tmp_ptr = nip; -#ifdef PTR_MANGLE - PTR_MANGLE (tmp_ptr); -#endif - startp = tmp_ptr; - } - - /* Make sure start_fct and startp are written before - startp_initialized. */ - atomic_write_barrier (); - startp_initialized = true; - } - else - { - fct.l = start_fct; - nip = startp; -#ifdef PTR_DEMANGLE - PTR_DEMANGLE (fct.l); - PTR_DEMANGLE (nip); -#endif - no_more = nip == (service_user *) -1l; - } - - while (no_more == 0) - { -#ifdef NEED_H_ERRNO - any_service = true; -#endif - - status = DL_CALL_FCT (fct.l, (ADD_VARIABLES, resbuf, buffer, buflen, - &errno H_ERRNO_VAR EXTRA_VARIABLES)); - - /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the - provided buffer is too small. In this case we should give - the user the possibility to enlarge the buffer and we should - not simply go on with the next service (even if the TRYAGAIN - action tells us so). */ - if (status == NSS_STATUS_TRYAGAIN -#ifdef NEED_H_ERRNO - && *h_errnop == NETDB_INTERNAL -#endif - && errno == ERANGE) - break; - - if (do_merge) - { - - if (status == NSS_STATUS_SUCCESS) - { - /* The previous loop saved a buffer for merging. - Perform the merge now. */ - err = MERGE_FN (&mergegrp, mergebuf, endptr, buflen, resbuf, - buffer); - CHECK_MERGE (err,status); - do_merge = 0; - } - else - { - /* If the result wasn't SUCCESS, copy the saved buffer back - into the result buffer and set the status back to - NSS_STATUS_SUCCESS to match the previous pass through the - loop. - * If the next action is CONTINUE, it will overwrite the value - currently in the buffer and return the new value. - * If the next action is RETURN, we'll return the previously- - acquired values. - * If the next action is MERGE, then it will be added to the - buffer saved from the previous source. */ - err = DEEPCOPY_FN (mergegrp, buflen, resbuf, buffer, NULL); - CHECK_MERGE (err, status); - status = NSS_STATUS_SUCCESS; - } - } - - /* If we were are configured to merge this value with the next one, - save the current value of the group struct. */ - if (nss_next_action (nip, status) == NSS_ACTION_MERGE - && status == NSS_STATUS_SUCCESS) - { - /* Copy the current values into a buffer to be merged with the next - set of retrieved values. */ - if (mergebuf == NULL) - { - /* Only allocate once and reuse it for as many merges as we need - to perform. */ - mergebuf = malloc (buflen); - if (mergebuf == NULL) - { - __set_errno (ENOMEM); - status = NSS_STATUS_UNAVAIL; - break; - } - } - - err = DEEPCOPY_FN (*resbuf, buflen, &mergegrp, mergebuf, &endptr); - CHECK_MERGE (err, status); - do_merge = 1; - } - - no_more = __nss_next2 (&nip, REENTRANT_NAME_STRING, - REENTRANT2_NAME_STRING, &fct.ptr, status, 0); - } - free (mergebuf); - mergebuf = NULL; - -#ifdef HANDLE_DIGITS_DOTS -done: -#endif - *result = status == NSS_STATUS_SUCCESS ? resbuf : NULL; -#ifdef NEED_H_ERRNO - if (status == NSS_STATUS_UNAVAIL && !any_service && errno != ENOENT) - /* This happens when we weren't able to use a service for reasons other - than the module not being found. In such a case, we'd want to tell the - caller that errno has the real reason for failure. */ - *h_errnop = NETDB_INTERNAL; - else if (status != NSS_STATUS_SUCCESS && !any_service) - /* We were not able to use any service. */ - *h_errnop = NO_RECOVERY; -#endif -#ifdef POSTPROCESS - POSTPROCESS; -#endif - - int res; - if (status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND) - res = 0; - /* Don't pass back ERANGE if this is not for a too-small buffer. */ - else if (errno == ERANGE && status != NSS_STATUS_TRYAGAIN) - res = EINVAL; -#ifdef NEED_H_ERRNO - /* These functions only set errno if h_errno is NETDB_INTERNAL. */ - else if (status == NSS_STATUS_TRYAGAIN && *h_errnop != NETDB_INTERNAL) - res = EAGAIN; -#endif - else - return errno; - - __set_errno (res); - return res; -} - - -#ifdef NO_COMPAT_NEEDED -strong_alias (INTERNAL (REENTRANT_NAME), REENTRANT_NAME); -#elif !defined FUNCTION2_NAME -# include <shlib-compat.h> -# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1_2) -# define OLD(name) OLD1 (name) -# define OLD1(name) __old_##name - -int -attribute_compat_text_section -OLD (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, - size_t buflen, LOOKUP_TYPE **result H_ERRNO_PARM) -{ - int ret = INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, resbuf, buffer, - buflen, result H_ERRNO_VAR); - - if (ret != 0 || result == NULL) - ret = -1; - - return ret; -} - -# define do_symbol_version(real, name, version) \ - compat_symbol (libc, real, name, version) -do_symbol_version (OLD (REENTRANT_NAME), REENTRANT_NAME, GLIBC_2_0); -# endif - -/* As INTERNAL (REENTRANT_NAME) may be hidden, we need an alias - in between so that the REENTRANT_NAME@@GLIBC_2.1.2 is not - hidden too. */ -strong_alias (INTERNAL (REENTRANT_NAME), NEW (REENTRANT_NAME)); - -# define do_default_symbol_version(real, name, version) \ - versioned_symbol (libc, real, name, version) -do_default_symbol_version (NEW (REENTRANT_NAME), - REENTRANT_NAME, GLIBC_2_1_2); -#endif - -nss_interface_function (REENTRANT_NAME) diff --git a/nss/getXXent.c b/nss/getXXent.c deleted file mode 100644 index aad374197f..0000000000 --- a/nss/getXXent.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <libc-lock.h> -#include <stdlib.h> - -#include "nsswitch.h" - -/*******************************************************************\ -|* Here we assume several symbols to be defined: *| -|* *| -|* LOOKUP_TYPE - the return type of the function *| -|* *| -|* GETFUNC_NAME - name of the non-reentrant getXXXent function *| -|* *| -|* BUFLEN - size of static buffer *| -|* *| -|* Optionally the following vars can be defined: *| -|* *| -|* NEED_H_ERRNO - an extra parameter will be passed to point to *| -|* the global `h_errno' variable. *| -|* *| -\*******************************************************************/ - -/* To make the real sources a bit prettier. */ -#define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME) -#define APPEND_R(name) APPEND_R1 (name) -#define APPEND_R1(name) name##_r -#define INTERNAL(name) INTERNAL1 (name) -#define INTERNAL1(name) __##name - -/* Sometimes we need to store error codes in the `h_errno' variable. */ -#ifdef NEED_H_ERRNO -# define H_ERRNO_PARM , int *h_errnop -# define H_ERRNO_VAR &h_errno -#else -# define H_ERRNO_PARM -# define H_ERRNO_VAR NULL -#endif - -/* Prototype of the reentrant version. */ -extern int INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, - size_t buflen, LOOKUP_TYPE **result - H_ERRNO_PARM); - -/* We need to protect the dynamic buffer handling. */ -__libc_lock_define_initialized (static, lock); - -/* This points to the static buffer used. */ -libc_freeres_ptr (static char *buffer); - - -LOOKUP_TYPE * -GETFUNC_NAME (void) -{ - static size_t buffer_size; - static union - { - LOOKUP_TYPE l; - void *ptr; - } resbuf; - LOOKUP_TYPE *result; - int save; - - /* Get lock. */ - __libc_lock_lock (lock); - - result = (LOOKUP_TYPE *) - __nss_getent ((getent_r_function) INTERNAL (REENTRANT_GETNAME), - &resbuf.ptr, &buffer, BUFLEN, &buffer_size, - H_ERRNO_VAR); - - save = errno; - __libc_lock_unlock (lock); - __set_errno (save); - return result; -} - -nss_interface_function (GETFUNC_NAME) diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c deleted file mode 100644 index 2710c1cd51..0000000000 --- a/nss/getXXent_r.c +++ /dev/null @@ -1,212 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <libc-lock.h> - -#include "nsswitch.h" - -/*******************************************************************\ -|* Here we assume several symbols to be defined: *| -|* *| -|* LOOKUP_TYPE - the return type of the function *| -|* *| -|* SETFUNC_NAME - name of the non-reentrant setXXXent function *| -|* *| -|* GETFUNC_NAME - name of the non-reentrant getXXXent function *| -|* *| -|* ENDFUNC_NAME - name of the non-reentrant endXXXent function *| -|* *| -|* DATABASE_NAME - name of the database the function accesses *| -|* (e.g., host, services, ...) *| -|* *| -|* Optionally the following vars can be defined: *| -|* *| -|* STAYOPEN - variable declaration for setXXXent function *| -|* *| -|* STAYOPEN_VAR - variable name for setXXXent function *| -|* *| -|* NEED_H_ERRNO - an extra parameter will be passed to point to *| -|* the global `h_errno' variable. *| -|* *| -\*******************************************************************/ - -/* To make the real sources a bit prettier. */ -#define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME) -#define APPEND_R(Name) CONCAT2_2 (Name, _r) -#define INTERNAL(Name) CONCAT2_2 (__, Name) -#define CONCAT2_1(Pre, Post) CONCAT2_2 (Pre, Post) -#define CONCAT2_2(Pre, Post) Pre##Post -#define NEW(name) NEW1 (name) -#define NEW1(name) __new_##name - -#define SETFUNC_NAME_STRING STRINGIZE (SETFUNC_NAME) -#define GETFUNC_NAME_STRING STRINGIZE (REENTRANT_GETNAME) -#define ENDFUNC_NAME_STRING STRINGIZE (ENDFUNC_NAME) -#define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME) -#define STRINGIZE(Name) STRINGIZE1 (Name) -#define STRINGIZE1(Name) #Name - -#ifndef DB_LOOKUP_FCT -# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2) -# define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post) -# define CONCAT3_2(Pre, Name, Post) Pre##Name##Post -#endif - -/* Sometimes we need to store error codes in the `h_errno' variable. */ -#ifdef NEED_H_ERRNO -# define H_ERRNO_PARM , int *h_errnop -# define H_ERRNO_VAR , &h_errno -# define H_ERRNO_VAR_P &h_errno -#else -# define H_ERRNO_PARM -# define H_ERRNO_VAR -# define H_ERRNO_VAR_P NULL -#endif - -/* Some databases take the `stayopen' flag. */ -#ifdef STAYOPEN -# define STAYOPEN_TMP CONCAT2_1 (STAYOPEN, _tmp) -# define STAYOPEN_TMPVAR &CONCAT2_1 (STAYOPEN_VAR, _tmp) -#else -# define STAYOPEN void -# define STAYOPEN_VAR 0 -# define STAYOPEN_TMPVAR NULL -#endif - -#ifndef NEED__RES -# define NEED__RES 0 -#endif - -/* This handle for the NSS data base is shared between all - set/get/endXXXent functions. */ -static service_user *nip; -/* Remember the last service used since the last call to `endXXent'. */ -static service_user *last_nip; -/* Remember the first service_entry, it's always the same. */ -static service_user *startp; - -#ifdef STAYOPEN_TMP -/* We need to remember the last `stayopen' flag given by the user - since the `setent' function is only called for the first available - service. */ -static STAYOPEN_TMP; -#endif - -/* Protect above variable against multiple uses at the same time. */ -__libc_lock_define_initialized (static, lock) - -/* The lookup function for the first entry of this service. */ -extern int DB_LOOKUP_FCT (service_user **nip, const char *name, - const char *name2, void **fctp) - internal_function; -libc_hidden_proto (DB_LOOKUP_FCT) - -void -SETFUNC_NAME (STAYOPEN) -{ - int save; - - __libc_lock_lock (lock); - __nss_setent (SETFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp, - &last_nip, STAYOPEN_VAR, STAYOPEN_TMPVAR, NEED__RES); - - save = errno; - __libc_lock_unlock (lock); - __set_errno (save); -} - - -void -ENDFUNC_NAME (void) -{ - int save; - - /* If the service has not been used before do not do anything. */ - if (startp != NULL) - { - __libc_lock_lock (lock); - __nss_endent (ENDFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp, - &last_nip, NEED__RES); - save = errno; - __libc_lock_unlock (lock); - __set_errno (save); - } -} - - -int -INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, - LOOKUP_TYPE **result H_ERRNO_PARM) -{ - int status; - int save; - - __libc_lock_lock (lock); - status = __nss_getent_r (GETFUNC_NAME_STRING, SETFUNC_NAME_STRING, - DB_LOOKUP_FCT, &nip, &startp, &last_nip, - STAYOPEN_TMPVAR, NEED__RES, resbuf, buffer, - buflen, (void **) result, H_ERRNO_VAR_P); - save = errno; - __libc_lock_unlock (lock); - __set_errno (save); - return status; -} - - -#ifdef NO_COMPAT_NEEDED -strong_alias (INTERNAL (REENTRANT_GETNAME), REENTRANT_GETNAME); -#else -# include <shlib-compat.h> -# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1_2) -# define OLD(name) OLD1 (name) -# define OLD1(name) __old_##name - -int -attribute_compat_text_section -OLD (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, - LOOKUP_TYPE **result H_ERRNO_PARM) -{ - int ret = INTERNAL (REENTRANT_GETNAME) (resbuf, buffer, buflen, - result H_ERRNO_VAR); - - if (ret != 0) - ret = -1; - - return ret; -} - -# define do_symbol_version(real, name, version) \ - compat_symbol (libc, real, name, version) -do_symbol_version (OLD (REENTRANT_GETNAME), REENTRANT_GETNAME, GLIBC_2_0); -# endif - -/* As INTERNAL (REENTRANT_GETNAME) may be hidden, we need an alias - in between so that the REENTRANT_GETNAME@@GLIBC_2.1.2 is not - hidden too. */ -strong_alias (INTERNAL (REENTRANT_GETNAME), NEW (REENTRANT_GETNAME)); - -# define do_default_symbol_version(real, name, version) \ - versioned_symbol (libc, real, name, version) -do_default_symbol_version (NEW (REENTRANT_GETNAME), - REENTRANT_GETNAME, GLIBC_2_1_2); -#endif - -nss_interface_function (SETFUNC_NAME) -nss_interface_function (ENDFUNC_NAME) -nss_interface_function (REENTRANT_GETNAME) diff --git a/nss/getent.c b/nss/getent.c deleted file mode 100644 index 8f8c3fe80a..0000000000 --- a/nss/getent.c +++ /dev/null @@ -1,960 +0,0 @@ -/* Copyright (c) 1998-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* getent: get entries from administrative database. */ - -#include <aliases.h> -#include <argp.h> -#include <ctype.h> -#include <error.h> -#include <grp.h> -#include <gshadow.h> -#include <libintl.h> -#include <locale.h> -#include <mcheck.h> -#include <netdb.h> -#include <pwd.h> -#include <shadow.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <netinet/ether.h> -#include <netinet/in.h> -#include <sys/socket.h> - -/* Get libc version number. */ -#include <version.h> - -#define PACKAGE _libc_intl_domainname - -/* Name and version of program. */ -static void print_version (FILE *stream, struct argp_state *state); -void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; - -/* Short description of parameters. */ -static const char args_doc[] = N_("database [key ...]"); - -/* Supported options. */ -static const struct argp_option args_options[] = - { - { "service", 's', N_("CONFIG"), 0, N_("Service configuration to be used") }, - { "no-idn", 'i', NULL, 0, N_("disable IDN encoding") }, - { NULL, 0, NULL, 0, NULL }, - }; - -/* Short description of program. */ -static const char doc[] = N_("Get entries from administrative database."); - -/* Prototype for option handler. */ -static error_t parse_option (int key, char *arg, struct argp_state *state); - -/* Function to print some extra text in the help message. */ -static char *more_help (int key, const char *text, void *input); - -/* Data structure to communicate with argp functions. */ -static struct argp argp = - { - args_options, parse_option, args_doc, doc, NULL, more_help - }; - -/* Additional getaddrinfo flags for IDN encoding. */ -static int idn_flags = AI_IDN | AI_CANONIDN; - -/* Print the version information. */ -static void -print_version (FILE *stream, struct argp_state *state) -{ - fprintf (stream, "getent %s%s\n", PKGVERSION, VERSION); - fprintf (stream, gettext ("\ -Copyright (C) %s Free Software Foundation, Inc.\n\ -This is free software; see the source for copying conditions. There is NO\n\ -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ -"), "2017"); - fprintf (stream, gettext ("Written by %s.\n"), "Thorsten Kukuk"); -} - -/* This is for aliases */ -static void -print_aliases (struct aliasent *alias) -{ - unsigned int i = 0; - - printf ("%s: ", alias->alias_name); - for (i = strlen (alias->alias_name); i < 14; ++i) - fputs_unlocked (" ", stdout); - - for (i = 0; i < alias->alias_members_len; ++i) - printf ("%s%s", - alias->alias_members [i], - i + 1 == alias->alias_members_len ? "\n" : ", "); -} - -static int -aliases_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct aliasent *alias; - - if (number == 0) - { - setaliasent (); - while ((alias = getaliasent ()) != NULL) - print_aliases (alias); - endaliasent (); - return result; - } - - for (i = 0; i < number; ++i) - { - alias = getaliasbyname (key[i]); - - if (alias == NULL) - result = 2; - else - print_aliases (alias); - } - - return result; -} - -/* This is for ethers */ -static int -ethers_keys (int number, char *key[]) -{ - int result = 0; - int i; - - if (number == 0) - { - fprintf (stderr, _("Enumeration not supported on %s\n"), "ethers"); - return 3; - } - - for (i = 0; i < number; ++i) - { - struct ether_addr *ethp, eth; - char buffer [1024], *p; - - ethp = ether_aton (key[i]); - if (ethp != NULL) - { - if (ether_ntohost (buffer, ethp)) - { - result = 2; - continue; - } - p = buffer; - } - else - { - if (ether_hostton (key[i], ð)) - { - result = 2; - continue; - } - p = key[i]; - ethp = ð - } - printf ("%s %s\n", ether_ntoa (ethp), p); - } - - return result; -} - -/* This is for group */ -static void -print_group (struct group *grp) -{ - if (putgrent (grp, stdout) != 0) - fprintf (stderr, "error writing group entry: %m\n"); -} - -static int -group_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct group *grp; - - if (number == 0) - { - setgrent (); - while ((grp = getgrent ()) != NULL) - print_group (grp); - endgrent (); - return result; - } - - for (i = 0; i < number; ++i) - { - errno = 0; - char *ep; - gid_t arg_gid = strtoul(key[i], &ep, 10); - - if (errno != EINVAL && *key[i] != '\0' && *ep == '\0') - /* Valid numeric gid. */ - grp = getgrgid (arg_gid); - else - grp = getgrnam (key[i]); - - if (grp == NULL) - result = 2; - else - print_group (grp); - } - - return result; -} - -/* This is for gshadow */ -static void -print_gshadow (struct sgrp *sg) -{ - if (putsgent (sg, stdout) != 0) - fprintf (stderr, "error writing gshadow entry: %m\n"); -} - -static int -gshadow_keys (int number, char *key[]) -{ - int result = 0; - int i; - - if (number == 0) - { - struct sgrp *sg; - - setsgent (); - while ((sg = getsgent ()) != NULL) - print_gshadow (sg); - endsgent (); - return result; - } - - for (i = 0; i < number; ++i) - { - struct sgrp *sg; - - sg = getsgnam (key[i]); - - if (sg == NULL) - result = 2; - else - print_gshadow (sg); - } - - return result; -} - -/* This is for hosts */ -static void -print_hosts (struct hostent *host) -{ - unsigned int cnt; - - for (cnt = 0; host->h_addr_list[cnt] != NULL; ++cnt) - { - char buf[INET6_ADDRSTRLEN]; - const char *ip = inet_ntop (host->h_addrtype, host->h_addr_list[cnt], - buf, sizeof (buf)); - - printf ("%-15s %s", ip, host->h_name); - - unsigned int i; - for (i = 0; host->h_aliases[i] != NULL; ++i) - { - putchar_unlocked (' '); - fputs_unlocked (host->h_aliases[i], stdout); - } - putchar_unlocked ('\n'); - } -} - -static int -hosts_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct hostent *host; - - if (number == 0) - { - sethostent (0); - while ((host = gethostent ()) != NULL) - print_hosts (host); - endhostent (); - return result; - } - - for (i = 0; i < number; ++i) - { - struct hostent *host = NULL; - char addr[IN6ADDRSZ]; - - if (inet_pton (AF_INET6, key[i], &addr) > 0) - host = gethostbyaddr (addr, IN6ADDRSZ, AF_INET6); - else if (inet_pton (AF_INET, key[i], &addr) > 0) - host = gethostbyaddr (addr, INADDRSZ, AF_INET); - else if ((host = gethostbyname2 (key[i], AF_INET6)) == NULL) - host = gethostbyname2 (key[i], AF_INET); - - if (host == NULL) - result = 2; - else - print_hosts (host); - } - - return result; -} - -/* This is for hosts, but using getaddrinfo */ -static int -ahosts_keys_int (int af, int xflags, int number, char *key[]) -{ - int result = 0; - int i; - struct hostent *host; - - if (number == 0) - { - sethostent (0); - while ((host = gethostent ()) != NULL) - print_hosts (host); - endhostent (); - return result; - } - - struct addrinfo hint; - memset (&hint, '\0', sizeof (hint)); - hint.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME - | idn_flags | xflags); - hint.ai_family = af; - - for (i = 0; i < number; ++i) - { - struct addrinfo *res; - - if (getaddrinfo (key[i], NULL, &hint, &res) != 0) - result = 2; - else - { - struct addrinfo *runp = res; - - while (runp != NULL) - { - char sockbuf[20]; - const char *sockstr; - if (runp->ai_socktype == SOCK_STREAM) - sockstr = "STREAM"; - else if (runp->ai_socktype == SOCK_DGRAM) - sockstr = "DGRAM"; - else if (runp->ai_socktype == SOCK_RAW) - sockstr = "RAW"; -#ifdef SOCK_SEQPACKET - else if (runp->ai_socktype == SOCK_SEQPACKET) - sockstr = "SEQPACKET"; -#endif -#ifdef SOCK_RDM - else if (runp->ai_socktype == SOCK_RDM) - sockstr = "RDM"; -#endif -#ifdef SOCK_DCCP - else if (runp->ai_socktype == SOCK_DCCP) - sockstr = "DCCP"; -#endif -#ifdef SOCK_PACKET - else if (runp->ai_socktype == SOCK_PACKET) - sockstr = "PACKET"; -#endif - else - { - snprintf (sockbuf, sizeof (sockbuf), "%d", - runp->ai_socktype); - sockstr = sockbuf; - } - - char buf[INET6_ADDRSTRLEN]; - printf ("%-15s %-6s %s\n", - inet_ntop (runp->ai_family, - runp->ai_family == AF_INET - ? (void *) &((struct sockaddr_in *) runp->ai_addr)->sin_addr - : (void *) &((struct sockaddr_in6 *) runp->ai_addr)->sin6_addr, - buf, sizeof (buf)), - sockstr, - runp->ai_canonname ?: ""); - - runp = runp->ai_next; - } - - freeaddrinfo (res); - } - } - - return result; -} - -static int -ahosts_keys (int number, char *key[]) -{ - return ahosts_keys_int (AF_UNSPEC, 0, number, key); -} - -static int -ahostsv4_keys (int number, char *key[]) -{ - return ahosts_keys_int (AF_INET, 0, number, key); -} - -static int -ahostsv6_keys (int number, char *key[]) -{ - return ahosts_keys_int (AF_INET6, AI_V4MAPPED, number, key); -} - -/* This is for netgroup */ -static int -netgroup_keys (int number, char *key[]) -{ - int result = 0; - - if (number == 0) - { - fprintf (stderr, _("Enumeration not supported on %s\n"), "netgroup"); - return 3; - } - - if (number == 4) - { - char *host = strcmp (key[1], "*") == 0 ? NULL : key[1]; - char *user = strcmp (key[2], "*") == 0 ? NULL : key[2]; - char *domain = strcmp (key[3], "*") == 0 ? NULL : key[3]; - - printf ("%-21s (%s,%s,%s) = %d\n", - key[0], host ?: "", user ?: "", domain ?: "", - innetgr (key[0], host, user, domain)); - } - else if (number == 1) - { - if (!setnetgrent (key[0])) - result = 2; - else - { - char *p[3]; - - printf ("%-21s", key[0]); - - while (getnetgrent (p, p + 1, p + 2)) - printf (" (%s,%s,%s)", p[0] ?: " ", p[1] ?: "", p[2] ?: ""); - putchar_unlocked ('\n'); - } - } - - endnetgrent (); - - return result; -} - -/* This is for initgroups */ -static int -initgroups_keys (int number, char *key[]) -{ - int ngrps = 100; - size_t grpslen = ngrps * sizeof (gid_t); - gid_t *grps = alloca (grpslen); - - if (number == 0) - { - fprintf (stderr, _("Enumeration not supported on %s\n"), "initgroups"); - return 3; - } - - for (int i = 0; i < number; ++i) - { - int no = ngrps; - int n; - while ((n = getgrouplist (key[i], -1, grps, &no)) == -1 - && no > ngrps) - { - grps = extend_alloca (grps, grpslen, no * sizeof (gid_t)); - ngrps = no; - } - - if (n == -1) - return 1; - - printf ("%-21s", key[i]); - for (int j = 0; j < n; ++j) - if (grps[j] != -1) - printf (" %ld", (long int) grps[j]); - putchar_unlocked ('\n'); - } - - return 0; -} - -/* This is for networks */ -static void -print_networks (struct netent *net) -{ - unsigned int i; - struct in_addr ip; - ip.s_addr = htonl (net->n_net); - - printf ("%-21s %s", net->n_name, inet_ntoa (ip)); - - i = 0; - while (net->n_aliases[i] != NULL) - { - putchar_unlocked (' '); - fputs_unlocked (net->n_aliases[i], stdout); - ++i; - } - putchar_unlocked ('\n'); -} - -static int -networks_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct netent *net; - - if (number == 0) - { - setnetent (0); - while ((net = getnetent ()) != NULL) - print_networks (net); - endnetent (); - return result; - } - - for (i = 0; i < number; ++i) - { - if (isdigit (key[i][0])) - net = getnetbyaddr (ntohl (inet_addr (key[i])), AF_UNSPEC); - else - net = getnetbyname (key[i]); - - if (net == NULL) - result = 2; - else - print_networks (net); - } - - return result; -} - -/* Now is all for passwd */ -static void -print_passwd (struct passwd *pwd) -{ - if (putpwent (pwd, stdout) != 0) - fprintf (stderr, "error writing passwd entry: %m\n"); -} - -static int -passwd_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct passwd *pwd; - - if (number == 0) - { - setpwent (); - while ((pwd = getpwent ()) != NULL) - print_passwd (pwd); - endpwent (); - return result; - } - - for (i = 0; i < number; ++i) - { - errno = 0; - char *ep; - uid_t arg_uid = strtoul(key[i], &ep, 10); - - if (errno != EINVAL && *key[i] != '\0' && *ep == '\0') - /* Valid numeric uid. */ - pwd = getpwuid (arg_uid); - else - pwd = getpwnam (key[i]); - - if (pwd == NULL) - result = 2; - else - print_passwd (pwd); - } - - return result; -} - -/* This is for protocols */ -static void -print_protocols (struct protoent *proto) -{ - unsigned int i; - - printf ("%-21s %d", proto->p_name, proto->p_proto); - - i = 0; - while (proto->p_aliases[i] != NULL) - { - putchar_unlocked (' '); - fputs_unlocked (proto->p_aliases[i], stdout); - ++i; - } - putchar_unlocked ('\n'); -} - -static int -protocols_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct protoent *proto; - - if (number == 0) - { - setprotoent (0); - while ((proto = getprotoent ()) != NULL) - print_protocols (proto); - endprotoent (); - return result; - } - - for (i = 0; i < number; ++i) - { - if (isdigit (key[i][0])) - proto = getprotobynumber (atol (key[i])); - else - proto = getprotobyname (key[i]); - - if (proto == NULL) - result = 2; - else - print_protocols (proto); - } - - return result; -} - -#if HAVE_SUNRPC -/* Now is all for rpc */ -static void -print_rpc (struct rpcent *rpc) -{ - int i; - - printf ("%-15s %d%s", - rpc->r_name, rpc->r_number, rpc->r_aliases[0] ? " " : ""); - - for (i = 0; rpc->r_aliases[i]; ++i) - printf (" %s", rpc->r_aliases[i]); - putchar_unlocked ('\n'); -} - -static int -rpc_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct rpcent *rpc; - - if (number == 0) - { - setrpcent (0); - while ((rpc = getrpcent ()) != NULL) - print_rpc (rpc); - endrpcent (); - return result; - } - - for (i = 0; i < number; ++i) - { - if (isdigit (key[i][0])) - rpc = getrpcbynumber (atol (key[i])); - else - rpc = getrpcbyname (key[i]); - - if (rpc == NULL) - result = 2; - else - print_rpc (rpc); - } - - return result; -} -#endif - -/* for services */ -static void -print_services (struct servent *serv) -{ - unsigned int i; - - printf ("%-21s %d/%s", serv->s_name, ntohs (serv->s_port), serv->s_proto); - - i = 0; - while (serv->s_aliases[i] != NULL) - { - putchar_unlocked (' '); - fputs_unlocked (serv->s_aliases[i], stdout); - ++i; - } - putchar_unlocked ('\n'); -} - -static int -services_keys (int number, char *key[]) -{ - int result = 0; - int i; - struct servent *serv; - - if (!number) - { - setservent (0); - while ((serv = getservent ()) != NULL) - print_services (serv); - endservent (); - return result; - } - - for (i = 0; i < number; ++i) - { - struct servent *serv; - char *proto = strchr (key[i], '/'); - - if (proto != NULL) - *proto++ = '\0'; - - char *endptr; - long port = strtol (key[i], &endptr, 10); - - if (isdigit (key[i][0]) && *endptr == '\0' - && 0 <= port && port <= 65535) - serv = getservbyport (htons (port), proto); - else - serv = getservbyname (key[i], proto); - - if (serv == NULL) - result = 2; - else - print_services (serv); - } - - return result; -} - -/* This is for shadow */ -static void -print_shadow (struct spwd *sp) -{ - if (putspent (sp, stdout) != 0) - fprintf (stderr, "error writing shadow entry: %m\n"); -} - -static int -shadow_keys (int number, char *key[]) -{ - int result = 0; - int i; - - if (number == 0) - { - struct spwd *sp; - - setspent (); - while ((sp = getspent ()) != NULL) - print_shadow (sp); - endspent (); - return result; - } - - for (i = 0; i < number; ++i) - { - struct spwd *sp; - - sp = getspnam (key[i]); - - if (sp == NULL) - result = 2; - else - print_shadow (sp); - } - - return result; -} - -struct - { - const char *name; - int (*func) (int number, char *key[]); - } databases[] = - { -#define D(name) { #name, name ## _keys }, -D(ahosts) -D(ahostsv4) -D(ahostsv6) -D(aliases) -D(ethers) -D(group) -D(gshadow) -D(hosts) -D(initgroups) -D(netgroup) -D(networks) -D(passwd) -D(protocols) -#if HAVE_SUNRPC -D(rpc) -#endif -D(services) -D(shadow) -#undef D - { NULL, NULL } - }; - -/* Handle arguments found by argp. */ -static error_t -parse_option (int key, char *arg, struct argp_state *state) -{ - char *endp; - switch (key) - { - case 's': - endp = strchr (arg, ':'); - if (endp == NULL) - /* No specific database, change them all. */ - for (int i = 0; databases[i].name != NULL; ++i) - __nss_configure_lookup (databases[i].name, arg); - else - { - int i; - for (i = 0; databases[i].name != NULL; ++i) - if (strncmp (databases[i].name, arg, endp - arg) == 0) - { - __nss_configure_lookup (databases[i].name, endp + 1); - break; - } - if (databases[i].name == NULL) - error (EXIT_FAILURE, 0, gettext ("Unknown database name")); - } - break; - - case 'i': - idn_flags = 0; - break; - - default: - return ARGP_ERR_UNKNOWN; - } - - return 0; -} - - -static char * -more_help (int key, const char *text, void *input) -{ - switch (key) - { - size_t len; - char *doc; - FILE *fp; - - case ARGP_KEY_HELP_EXTRA: - /* We print some extra information. */ - fp = open_memstream (&doc, &len); - if (fp != NULL) - { - fputs_unlocked (_("Supported databases:\n"), fp); - - for (int i = 0, col = 0; databases[i].name != NULL; ++i) - { - len = strlen (databases[i].name); - if (i != 0) - { - if (col + len > 72) - { - col = 0; - fputc_unlocked ('\n', fp); - } - else - fputc_unlocked (' ', fp); - } - - fputs_unlocked (databases[i].name, fp); - col += len + 1; - } - - fputs ("\n\n", fp); - - fprintf (fp, gettext ("\ -For bug reporting instructions, please see:\n\ -%s.\n"), REPORT_BUGS_TO); - - if (fclose (fp) == 0) - return doc; - } - break; - - default: - break; - } - return (char *) text; -} - - -/* the main function */ -int -main (int argc, char *argv[]) -{ - /* Debugging support. */ - mtrace (); - - /* Set locale via LC_ALL. */ - setlocale (LC_ALL, ""); - /* Set the text message domain. */ - textdomain (PACKAGE); - - /* Parse and process arguments. */ - int remaining; - argp_parse (&argp, argc, argv, 0, &remaining, NULL); - - if ((argc - remaining) < 1) - { - error (0, 0, gettext ("wrong number of arguments")); - argp_help (&argp, stdout, ARGP_HELP_SEE, program_invocation_short_name); - return 1; - } - - for (int i = 0; databases[i].name; ++i) - if (argv[remaining][0] == databases[i].name[0] - && !strcmp (argv[remaining], databases[i].name)) - return databases[i].func (argc - remaining - 1, &argv[remaining + 1]); - - fprintf (stderr, _("Unknown database: %s\n"), argv[remaining]); - argp_help (&argp, stdout, ARGP_HELP_SEE, program_invocation_short_name); - return 1; -} diff --git a/nss/getnssent.c b/nss/getnssent.c deleted file mode 100644 index fdaeed1e7b..0000000000 --- a/nss/getnssent.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2000-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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <netdb.h> -#include "nsswitch.h" - -void * -__nss_getent (getent_r_function func, void **resbuf, char **buffer, - size_t buflen, size_t *buffer_size, int *h_errnop) -{ - void *result; - - if (*buffer == NULL) - { - *buffer_size = buflen; - *buffer = malloc (*buffer_size); - } - - while (*buffer != NULL - && func (resbuf, *buffer, *buffer_size, &result, h_errnop) == ERANGE - && (h_errnop == NULL || *h_errnop == NETDB_INTERNAL)) - { - char *new_buf; - *buffer_size *= 2; - new_buf = realloc (*buffer, *buffer_size); - if (new_buf == NULL) - { - /* We are out of memory. Free the current buffer so that the - process gets a chance for a normal termination. */ - int save = errno; - free (*buffer); - __set_errno (save); - } - *buffer = new_buf; - } - - if (*buffer == NULL) - result = NULL; - - return result; -} diff --git a/nss/getnssent_r.c b/nss/getnssent_r.c deleted file mode 100644 index 5fdbf3be00..0000000000 --- a/nss/getnssent_r.c +++ /dev/null @@ -1,236 +0,0 @@ -/* Copyright (C) 2000-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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <netdb.h> -#include "nsswitch.h" - -/* Set up NIP to run through the services. If ALL is zero, use NIP's - current location if it's not nil. Return nonzero if there are no - services (left). */ -static int -setup (const char *func_name, db_lookup_function lookup_fct, - void **fctp, service_user **nip, service_user **startp, int all) -{ - int no_more; - if (*startp == NULL) - { - no_more = lookup_fct (nip, func_name, NULL, fctp); - *startp = no_more ? (service_user *) -1l : *nip; - } - else if (*startp == (service_user *) -1l) - /* No services at all. */ - return 1; - else - { - if (all || !*nip) - /* Reset to the beginning of the service list. */ - *nip = *startp; - /* Look up the first function. */ - no_more = __nss_lookup (nip, func_name, NULL, fctp); - } - return no_more; -} - -void -__nss_setent (const char *func_name, db_lookup_function lookup_fct, - service_user **nip, service_user **startp, - service_user **last_nip, int stayopen, int *stayopen_tmp, - int res) -{ - union - { - setent_function f; - void *ptr; - } fct; - int no_more; - - if (res && __res_maybe_init (&_res, 0) == -1) - { - __set_h_errno (NETDB_INTERNAL); - return; - } - - /* Cycle through the services and run their `setXXent' functions until - we find an available service. */ - no_more = setup (func_name, lookup_fct, &fct.ptr, nip, - startp, 1); - while (! no_more) - { - int is_last_nip = *nip == *last_nip; - enum nss_status status; - - if (stayopen_tmp) - status = DL_CALL_FCT (fct.f, (*stayopen_tmp)); - else - status = DL_CALL_FCT (fct.f, (0)); - - - /* This is a special-case. When [SUCCESS=merge] is in play, - _nss_next2() will skip to the next database. Due to the - implementation of that function, we can't know whether we're - in an enumeration or an individual lookup, which behaves - differently with regards to merging. We'll treat SUCCESS as - an indication to start the enumeration at this database. */ - if (nss_next_action (*nip, status) == NSS_ACTION_MERGE) - no_more = 1; - else - no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, status, 0); - - if (is_last_nip) - *last_nip = *nip; - } - - if (stayopen_tmp) - *stayopen_tmp = stayopen; -} - - -void -__nss_endent (const char *func_name, db_lookup_function lookup_fct, - service_user **nip, service_user **startp, - service_user **last_nip, int res) -{ - union - { - endent_function f; - void *ptr; - } fct; - int no_more; - - if (res && __res_maybe_init (&_res, 0) == -1) - { - __set_h_errno (NETDB_INTERNAL); - return; - } - - /* Cycle through all the services and run their endXXent functions. */ - no_more = setup (func_name, lookup_fct, &fct.ptr, nip, startp, 1); - while (! no_more) - { - /* Ignore status, we force check in __NSS_NEXT. */ - DL_CALL_FCT (fct.f, ()); - - if (*nip == *last_nip) - /* We have processed all services which were used. */ - break; - - no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, 0, 1); - } - *last_nip = *nip = NULL; -} - - -int -__nss_getent_r (const char *getent_func_name, - const char *setent_func_name, - db_lookup_function lookup_fct, - service_user **nip, service_user **startp, - service_user **last_nip, int *stayopen_tmp, int res, - void *resbuf, char *buffer, size_t buflen, - void **result, int *h_errnop) -{ - union - { - getent_function f; - void *ptr; - } fct; - int no_more; - enum nss_status status; - - if (res && __res_maybe_init (&_res, 0) == -1) - { - *h_errnop = NETDB_INTERNAL; - *result = NULL; - return errno; - } - - /* Initialize status to return if no more functions are found. */ - status = NSS_STATUS_NOTFOUND; - - /* Run through available functions, starting with the same function last - run. We will repeat each function as long as it succeeds, and then go - on to the next service action. */ - no_more = setup (getent_func_name, lookup_fct, &fct.ptr, nip, - startp, 0); - while (! no_more) - { - int is_last_nip = *nip == *last_nip; - - status = DL_CALL_FCT (fct.f, - (resbuf, buffer, buflen, &errno, &h_errno)); - - /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the - provided buffer is too small. In this case we should give - the user the possibility to enlarge the buffer and we should - not simply go on with the next service (even if the TRYAGAIN - action tells us so). */ - if (status == NSS_STATUS_TRYAGAIN - && (h_errnop == NULL || *h_errnop == NETDB_INTERNAL) - && errno == ERANGE) - break; - - do - { - /* This is a special-case. When [SUCCESS=merge] is in play, - _nss_next2() will skip to the next database. Due to the - implementation of that function, we can't know whether we're - in an enumeration or an individual lookup, which behaves - differently with regards to merging. We'll treat SUCCESS as - an indication to return the results here. */ - if (status == NSS_STATUS_SUCCESS - && nss_next_action (*nip, status) == NSS_ACTION_MERGE) - no_more = 1; - else - no_more = __nss_next2 (nip, getent_func_name, NULL, &fct.ptr, - status, 0); - - if (is_last_nip) - *last_nip = *nip; - - if (! no_more) - { - /* Call the `setXXent' function. This wasn't done before. */ - union - { - setent_function f; - void *ptr; - } sfct; - - no_more = __nss_lookup (nip, setent_func_name, NULL, &sfct.ptr); - - if (! no_more) - { - if (stayopen_tmp) - status = DL_CALL_FCT (sfct.f, (*stayopen_tmp)); - else - status = DL_CALL_FCT (sfct.f, (0)); - } - else - status = NSS_STATUS_NOTFOUND; - } - } - while (! no_more && status != NSS_STATUS_SUCCESS); - } - - *result = status == NSS_STATUS_SUCCESS ? resbuf : NULL; - return (status == NSS_STATUS_SUCCESS ? 0 - : status != NSS_STATUS_TRYAGAIN ? ENOENT - /* h_errno functions only set errno if h_errno is NETDB_INTERNAL. */ - : (h_errnop == NULL || *h_errnop == NETDB_INTERNAL) ? errno - : EAGAIN); -} diff --git a/nss/grp-lookup.c b/nss/grp-lookup.c deleted file mode 100644 index 8cb00aa22f..0000000000 --- a/nss/grp-lookup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME group -#define DEFAULT_CONFIG "compat [NOTFOUND=return] files" - -#include "XXX-lookup.c" diff --git a/nss/hosts-lookup.c b/nss/hosts-lookup.c deleted file mode 100644 index 9fdf958a97..0000000000 --- a/nss/hosts-lookup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME hosts -#define DEFAULT_CONFIG "dns [!UNAVAIL=return] files" - -#include "XXX-lookup.c" diff --git a/nss/key-lookup.c b/nss/key-lookup.c deleted file mode 100644 index cce0ddf1e7..0000000000 --- a/nss/key-lookup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME publickey -#define DEFAULT_CONFIG "nis nisplus" - -#include "XXX-lookup.c" diff --git a/nss/makedb.c b/nss/makedb.c deleted file mode 100644 index 542244dd35..0000000000 --- a/nss/makedb.c +++ /dev/null @@ -1,879 +0,0 @@ -/* Create simple DB database from textual input. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <argp.h> -#include <assert.h> -#include <ctype.h> -#include <errno.h> -#include <error.h> -#include <fcntl.h> -#include <inttypes.h> -#include <libintl.h> -#include <locale.h> -#include <search.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/param.h> -#include <sys/stat.h> -#include <sys/uio.h> -#include "nss_db/nss_db.h" - -/* Get libc version number. */ -#include "../version.h" - -/* The hashing function we use. */ -#include "../intl/hash-string.h" - -/* SELinux support. */ -#ifdef HAVE_SELINUX -# include <selinux/selinux.h> -#endif - -#ifndef MAP_POPULATE -# define MAP_POPULATE 0 -#endif - -#define PACKAGE _libc_intl_domainname - -/* List of data bases. */ -struct database -{ - char dbid; - bool extra_string; - struct database *next; - void *entries; - size_t nentries; - size_t nhashentries; - stridx_t *hashtable; - size_t keystrlen; - stridx_t *keyidxtab; - char *keystrtab; -} *databases; -static size_t ndatabases; -static size_t nhashentries_total; -static size_t valstrlen; -static void *valstrtree; -static char *valstrtab; -static size_t extrastrlen; - -/* Database entry. */ -struct dbentry -{ - stridx_t validx; - uint32_t hashval; - char str[0]; -}; - -/* Stored string entry. */ -struct valstrentry -{ - stridx_t idx; - bool extra_string; - char str[0]; -}; - - -/* True if any entry has been added. */ -static bool any_dbentry; - -/* If non-zero convert key to lower case. */ -static int to_lowercase; - -/* If non-zero print content of input file, one entry per line. */ -static int do_undo; - -/* If non-zero do not print informational messages. */ -static int be_quiet; - -/* Name of output file. */ -static const char *output_name; - -/* Name and version of program. */ -static void print_version (FILE *stream, struct argp_state *state); -void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; - -/* Definitions of arguments for argp functions. */ -static const struct argp_option options[] = -{ - { "fold-case", 'f', NULL, 0, N_("Convert key to lower case") }, - { "output", 'o', N_("NAME"), 0, N_("Write output to file NAME") }, - { "quiet", 'q', NULL, 0, - N_("Do not print messages while building database") }, - { "undo", 'u', NULL, 0, - N_("Print content of database file, one entry a line") }, - { "generated", 'g', N_("CHAR"), 0, - N_("Generated line not part of iteration") }, - { NULL, 0, NULL, 0, NULL } -}; - -/* Short description of program. */ -static const char doc[] = N_("Create simple database from textual input."); - -/* Strings for arguments in help texts. */ -static const char args_doc[] = N_("\ -INPUT-FILE OUTPUT-FILE\n-o OUTPUT-FILE INPUT-FILE\n-u INPUT-FILE"); - -/* Prototype for option handler. */ -static error_t parse_opt (int key, char *arg, struct argp_state *state); - -/* Function to print some extra text in the help message. */ -static char *more_help (int key, const char *text, void *input); - -/* Data structure to communicate with argp functions. */ -static struct argp argp = -{ - options, parse_opt, args_doc, doc, NULL, more_help -}; - - -/* List of databases which are not part of the iteration table. */ -static struct db_option -{ - char dbid; - struct db_option *next; -} *db_options; - - -/* Prototypes for local functions. */ -static int process_input (FILE *input, const char *inname, - int to_lowercase, int be_quiet); -static int print_database (int fd); -static void compute_tables (void); -static int write_output (int fd); - -/* SELinux support. */ -#ifdef HAVE_SELINUX -/* Set the SELinux file creation context for the given file. */ -static void set_file_creation_context (const char *outname, mode_t mode); -static void reset_file_creation_context (void); -#else -# define set_file_creation_context(_outname,_mode) -# define reset_file_creation_context() -#endif - - -/* External functions. */ -#include <programs/xmalloc.h> - - -int -main (int argc, char *argv[]) -{ - const char *input_name; - FILE *input_file; - int remaining; - int mode = 0644; - - /* Set locale via LC_ALL. */ - setlocale (LC_ALL, ""); - - /* Set the text message domain. */ - textdomain (_libc_intl_domainname); - - /* Initialize local variables. */ - input_name = NULL; - - /* Parse and process arguments. */ - argp_parse (&argp, argc, argv, 0, &remaining, NULL); - - /* Determine file names. */ - if (do_undo || output_name != NULL) - { - if (remaining + 1 != argc) - { - wrong_arguments: - error (0, 0, gettext ("wrong number of arguments")); - argp_help (&argp, stdout, ARGP_HELP_SEE, - program_invocation_short_name); - exit (1); - } - input_name = argv[remaining]; - } - else - { - if (remaining + 2 != argc) - goto wrong_arguments; - - input_name = argv[remaining++]; - output_name = argv[remaining]; - } - - /* Special handling if we are asked to print the database. */ - if (do_undo) - { - int fd = open (input_name, O_RDONLY); - if (fd == -1) - error (EXIT_FAILURE, errno, gettext ("cannot open database file `%s'"), - input_name); - - int status = print_database (fd); - - close (fd); - - return status; - } - - /* Open input file. */ - if (strcmp (input_name, "-") == 0 || strcmp (input_name, "/dev/stdin") == 0) - input_file = stdin; - else - { - struct stat64 st; - - input_file = fopen64 (input_name, "r"); - if (input_file == NULL) - error (EXIT_FAILURE, errno, gettext ("cannot open input file `%s'"), - input_name); - - /* Get the access rights from the source file. The output file should - have the same. */ - if (fstat64 (fileno (input_file), &st) >= 0) - mode = st.st_mode & ACCESSPERMS; - } - - /* Start the real work. */ - int status = process_input (input_file, input_name, to_lowercase, be_quiet); - - /* Close files. */ - if (input_file != stdin) - fclose (input_file); - - /* No need to continue when we did not read the file successfully. */ - if (status != EXIT_SUCCESS) - return status; - - /* Bail out if nothing is to be done. */ - if (!any_dbentry) - { - if (be_quiet) - return EXIT_SUCCESS; - else - error (EXIT_SUCCESS, 0, gettext ("no entries to be processed")); - } - - /* Compute hash and string tables. */ - compute_tables (); - - /* Open output file. This must not be standard output so we don't - handle "-" and "/dev/stdout" special. */ - char *tmp_output_name; - if (asprintf (&tmp_output_name, "%s.XXXXXX", output_name) == -1) - error (EXIT_FAILURE, errno, gettext ("cannot create temporary file name")); - - set_file_creation_context (output_name, mode); - int fd = mkstemp (tmp_output_name); - reset_file_creation_context (); - if (fd == -1) - error (EXIT_FAILURE, errno, gettext ("cannot create temporary file")); - - status = write_output (fd); - - if (status == EXIT_SUCCESS) - { - struct stat64 st; - - if (fstat64 (fd, &st) == 0) - { - if ((st.st_mode & ACCESSPERMS) != mode) - /* We ignore problems with changing the mode. */ - fchmod (fd, mode); - } - else - { - error (0, errno, gettext ("cannot stat newly created file")); - status = EXIT_FAILURE; - } - } - - close (fd); - - if (status == EXIT_SUCCESS) - { - if (rename (tmp_output_name, output_name) != 0) - { - error (0, errno, gettext ("cannot rename temporary file")); - status = EXIT_FAILURE; - goto do_unlink; - } - } - else - do_unlink: - unlink (tmp_output_name); - - return status; -} - - -/* Handle program arguments. */ -static error_t -parse_opt (int key, char *arg, struct argp_state *state) -{ - struct db_option *newp; - - switch (key) - { - case 'f': - to_lowercase = 1; - break; - case 'o': - output_name = arg; - break; - case 'q': - be_quiet = 1; - break; - case 'u': - do_undo = 1; - break; - case 'g': - newp = xmalloc (sizeof (*newp)); - newp->dbid = arg[0]; - newp->next = db_options; - db_options = newp; - break; - default: - return ARGP_ERR_UNKNOWN; - } - return 0; -} - - -static char * -more_help (int key, const char *text, void *input) -{ - char *tp = NULL; - switch (key) - { - case ARGP_KEY_HELP_EXTRA: - /* We print some extra information. */ - if (asprintf (&tp, gettext ("\ -For bug reporting instructions, please see:\n\ -%s.\n"), REPORT_BUGS_TO) < 0) - return NULL; - return tp; - default: - break; - } - return (char *) text; -} - -/* Print the version information. */ -static void -print_version (FILE *stream, struct argp_state *state) -{ - fprintf (stream, "makedb %s%s\n", PKGVERSION, VERSION); - fprintf (stream, gettext ("\ -Copyright (C) %s Free Software Foundation, Inc.\n\ -This is free software; see the source for copying conditions. There is NO\n\ -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ -"), "2017"); - fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); -} - - -static int -dbentry_compare (const void *p1, const void *p2) -{ - const struct dbentry *d1 = (const struct dbentry *) p1; - const struct dbentry *d2 = (const struct dbentry *) p2; - - if (d1->hashval != d2->hashval) - return d1->hashval < d2->hashval ? -1 : 1; - - return strcmp (d1->str, d2->str); -} - - -static int -valstr_compare (const void *p1, const void *p2) -{ - const struct valstrentry *d1 = (const struct valstrentry *) p1; - const struct valstrentry *d2 = (const struct valstrentry *) p2; - - return strcmp (d1->str, d2->str); -} - - -static int -process_input (FILE *input, const char *inname, int to_lowercase, int be_quiet) -{ - char *line; - size_t linelen; - int status; - size_t linenr; - - line = NULL; - linelen = 0; - status = EXIT_SUCCESS; - linenr = 0; - - struct database *last_database = NULL; - - while (!feof_unlocked (input)) - { - ssize_t n = getline (&line, &linelen, input); - if (n < 0) - /* This means end of file or some bug. */ - break; - if (n == 0) - /* Short read. Probably interrupted system call. */ - continue; - - ++linenr; - - if (line[n - 1] == '\n') - /* Remove trailing newline. */ - line[--n] = '\0'; - - char *cp = line; - while (isspace (*cp)) - ++cp; - - if (*cp == '#' || *cp == '\0') - /* First non-space character in line '#': it's a comment. - Also go to the next line if it is empty except for whitespaces. */ - continue; - - /* Skip over the character indicating the database so that it is not - affected by TO_LOWERCASE. */ - char *key = cp++; - while (*cp != '\0' && !isspace (*cp)) - { - if (to_lowercase) - *cp = tolower (*cp); - ++cp; - } - - if (*cp == '\0') - /* It's a line without a value field. */ - continue; - - *cp++ = '\0'; - size_t keylen = cp - key; - - while (isspace (*cp)) - ++cp; - - char *data = cp; - size_t datalen = (&line[n] - cp) + 1; - - /* Find the database. */ - if (last_database == NULL || last_database->dbid != key[0]) - { - last_database = databases; - while (last_database != NULL && last_database->dbid != key[0]) - last_database = last_database->next; - - if (last_database == NULL) - { - last_database = xmalloc (sizeof (*last_database)); - last_database->dbid = key[0]; - last_database->extra_string = false; - last_database->next = databases; - last_database->entries = NULL; - last_database->nentries = 0; - last_database->keystrlen = 0; - databases = last_database; - - struct db_option *runp = db_options; - while (runp != NULL) - if (runp->dbid == key[0]) - { - last_database->extra_string = true; - break; - } - else - runp = runp->next; - } - } - - /* Skip the database selector. */ - ++key; - --keylen; - - /* Store the data. */ - struct valstrentry *nentry = xmalloc (sizeof (struct valstrentry) - + datalen); - if (last_database->extra_string) - nentry->idx = extrastrlen; - else - nentry->idx = valstrlen; - nentry->extra_string = last_database->extra_string; - memcpy (nentry->str, data, datalen); - - struct valstrentry **fdata = tsearch (nentry, &valstrtree, - valstr_compare); - if (fdata == NULL) - error (EXIT_FAILURE, errno, gettext ("cannot create search tree")); - - if (*fdata != nentry) - { - /* We can reuse a string. */ - free (nentry); - nentry = *fdata; - } - else - if (last_database->extra_string) - extrastrlen += datalen; - else - valstrlen += datalen; - - /* Store the key. */ - struct dbentry *newp = xmalloc (sizeof (struct dbentry) + keylen); - newp->validx = nentry->idx; - newp->hashval = __hash_string (key); - memcpy (newp->str, key, keylen); - - struct dbentry **found = tsearch (newp, &last_database->entries, - dbentry_compare); - if (found == NULL) - error (EXIT_FAILURE, errno, gettext ("cannot create search tree")); - - if (*found != newp) - { - free (newp); - if (!be_quiet) - error_at_line (0, 0, inname, linenr, gettext ("duplicate key")); - continue; - } - - ++last_database->nentries; - last_database->keystrlen += keylen; - - any_dbentry = true; - } - - if (ferror_unlocked (input)) - { - error (0, 0, gettext ("problems while reading `%s'"), inname); - status = EXIT_FAILURE; - } - - return status; -} - - -static void -copy_valstr (const void *nodep, const VISIT which, const int depth) -{ - if (which != leaf && which != postorder) - return; - - const struct valstrentry *p = *(const struct valstrentry **) nodep; - - strcpy (valstrtab + (p->extra_string ? valstrlen : 0) + p->idx, p->str); -} - - -/* Determine if the candidate is prime by using a modified trial division - algorithm. The candidate must be both odd and greater than 4. */ -static int -is_prime (size_t candidate) -{ - size_t divn = 3; - size_t sq = divn * divn; - - assert (candidate > 4 && candidate % 2 != 0); - - while (sq < candidate && candidate % divn != 0) - { - ++divn; - sq += 4 * divn; - ++divn; - } - - return candidate % divn != 0; -} - - -static size_t -next_prime (size_t seed) -{ - /* Make sure that we're always greater than 4. */ - seed = (seed + 4) | 1; - - while (!is_prime (seed)) - seed += 2; - - return seed; -} - - -static void -compute_tables (void) -{ - valstrtab = xmalloc (roundup (valstrlen + extrastrlen, sizeof (stridx_t))); - while ((valstrlen + extrastrlen) % sizeof (stridx_t) != 0) - valstrtab[valstrlen++] = '\0'; - twalk (valstrtree, copy_valstr); - - static struct database *db; - for (db = databases; db != NULL; db = db->next) - if (db->nentries != 0) - { - ++ndatabases; - - /* We simply use an odd number large than twice the number of - elements to store in the hash table for the size. This gives - enough efficiency. */ -#define TEST_RANGE 30 - size_t nhashentries_min = next_prime (db->nentries < TEST_RANGE - ? db->nentries - : db->nentries * 2 - TEST_RANGE); - size_t nhashentries_max = MAX (nhashentries_min, db->nentries * 4); - size_t nhashentries_best = nhashentries_min; - size_t chainlength_best = db->nentries; - - db->hashtable = xmalloc (2 * nhashentries_max * sizeof (stridx_t) - + db->keystrlen); - db->keyidxtab = db->hashtable + nhashentries_max; - db->keystrtab = (char *) (db->keyidxtab + nhashentries_max); - - static size_t max_chainlength; - static char *wp; - static size_t nhashentries; - static bool copy_string; - - void add_key(const void *nodep, const VISIT which, const int depth) - { - if (which != leaf && which != postorder) - return; - - const struct dbentry *dbe = *(const struct dbentry **) nodep; - - ptrdiff_t stridx; - if (copy_string) - { - stridx = wp - db->keystrtab; - wp = stpcpy (wp, dbe->str) + 1; - } - else - stridx = 0; - - size_t hidx = dbe->hashval % nhashentries; - size_t hval2 = 1 + dbe->hashval % (nhashentries - 2); - size_t chainlength = 0; - - while (db->hashtable[hidx] != ~((stridx_t) 0)) - { - ++chainlength; - if ((hidx += hval2) >= nhashentries) - hidx -= nhashentries; - } - - db->hashtable[hidx] = ((db->extra_string ? valstrlen : 0) - + dbe->validx); - db->keyidxtab[hidx] = stridx; - - max_chainlength = MAX (max_chainlength, chainlength); - } - - copy_string = false; - nhashentries = nhashentries_min; - for (size_t cnt = 0; cnt < TEST_RANGE; ++cnt) - { - memset (db->hashtable, '\xff', nhashentries * sizeof (stridx_t)); - - max_chainlength = 0; - wp = db->keystrtab; - - twalk (db->entries, add_key); - - if (max_chainlength == 0) - { - /* No need to look further, this is as good as it gets. */ - nhashentries_best = nhashentries; - break; - } - - if (max_chainlength < chainlength_best) - { - chainlength_best = max_chainlength; - nhashentries_best = nhashentries; - } - - nhashentries = next_prime (nhashentries + 1); - if (nhashentries > nhashentries_max) - break; - } - - /* Recompute the best table again, this time fill in the strings. */ - nhashentries = nhashentries_best; - memset (db->hashtable, '\xff', - 2 * nhashentries_max * sizeof (stridx_t)); - copy_string = true; - wp = db->keystrtab; - - twalk (db->entries, add_key); - - db->nhashentries = nhashentries_best; - nhashentries_total += nhashentries_best; - } -} - - -static int -write_output (int fd) -{ - struct nss_db_header *header; - uint64_t file_offset = (sizeof (struct nss_db_header) - + (ndatabases * sizeof (header->dbs[0]))); - header = alloca (file_offset); - - header->magic = NSS_DB_MAGIC; - header->ndbs = ndatabases; - header->valstroffset = file_offset; - header->valstrlen = valstrlen; - - size_t filled_dbs = 0; - struct iovec iov[2 + ndatabases * 3]; - iov[0].iov_base = header; - iov[0].iov_len = file_offset; - - iov[1].iov_base = valstrtab; - iov[1].iov_len = valstrlen + extrastrlen; - file_offset += iov[1].iov_len; - - size_t keydataoffset = file_offset + nhashentries_total * sizeof (stridx_t); - for (struct database *db = databases; db != NULL; db = db->next) - if (db->entries != NULL) - { - assert (file_offset % sizeof (stridx_t) == 0); - assert (filled_dbs < ndatabases); - - header->dbs[filled_dbs].id = db->dbid; - memset (header->dbs[filled_dbs].pad, '\0', - sizeof (header->dbs[0].pad)); - header->dbs[filled_dbs].hashsize = db->nhashentries; - - iov[2 + filled_dbs].iov_base = db->hashtable; - iov[2 + filled_dbs].iov_len = db->nhashentries * sizeof (stridx_t); - header->dbs[filled_dbs].hashoffset = file_offset; - file_offset += iov[2 + filled_dbs].iov_len; - - iov[2 + ndatabases + filled_dbs * 2].iov_base = db->keyidxtab; - iov[2 + ndatabases + filled_dbs * 2].iov_len - = db->nhashentries * sizeof (stridx_t); - header->dbs[filled_dbs].keyidxoffset = keydataoffset; - keydataoffset += iov[2 + ndatabases + filled_dbs * 2].iov_len; - - iov[3 + ndatabases + filled_dbs * 2].iov_base = db->keystrtab; - iov[3 + ndatabases + filled_dbs * 2].iov_len = db->keystrlen; - header->dbs[filled_dbs].keystroffset = keydataoffset; - keydataoffset += iov[3 + ndatabases + filled_dbs * 2].iov_len; - - ++filled_dbs; - } - - assert (filled_dbs == ndatabases); - assert (file_offset == (iov[0].iov_len + iov[1].iov_len - + nhashentries_total * sizeof (stridx_t))); - header->allocate = file_offset; - - if (writev (fd, iov, 2 + ndatabases * 3) != keydataoffset) - { - error (0, errno, gettext ("failed to write new database file")); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} - - -static int -print_database (int fd) -{ - struct stat64 st; - if (fstat64 (fd, &st) != 0) - error (EXIT_FAILURE, errno, gettext ("cannot stat database file")); - - const struct nss_db_header *header = mmap (NULL, st.st_size, PROT_READ, - MAP_PRIVATE|MAP_POPULATE, fd, 0); - if (header == MAP_FAILED) - error (EXIT_FAILURE, errno, gettext ("cannot map database file")); - - if (header->magic != NSS_DB_MAGIC) - error (EXIT_FAILURE, 0, gettext ("file not a database file")); - - const char *valstrtab = (const char *) header + header->valstroffset; - - for (unsigned int dbidx = 0; dbidx < header->ndbs; ++dbidx) - { - const stridx_t *stridxtab - = ((const stridx_t *) ((const char *) header - + header->dbs[dbidx].keyidxoffset)); - const char *keystrtab - = (const char *) header + header->dbs[dbidx].keystroffset; - const stridx_t *hashtab - = (const stridx_t *) ((const char *) header - + header->dbs[dbidx].hashoffset); - - for (uint32_t hidx = 0; hidx < header->dbs[dbidx].hashsize; ++hidx) - if (hashtab[hidx] != ~((stridx_t) 0)) - printf ("%c%s %s\n", - header->dbs[dbidx].id, - keystrtab + stridxtab[hidx], - valstrtab + hashtab[hidx]); - } - - return EXIT_SUCCESS; -} - - -#ifdef HAVE_SELINUX -static void -set_file_creation_context (const char *outname, mode_t mode) -{ - static int enabled; - static int enforcing; - security_context_t ctx; - - /* Check if SELinux is enabled, and remember. */ - if (enabled == 0) - enabled = is_selinux_enabled () ? 1 : -1; - if (enabled < 0) - return; - - /* Check if SELinux is enforcing, and remember. */ - if (enforcing == 0) - enforcing = security_getenforce () ? 1 : -1; - - /* Determine the context which the file should have. */ - ctx = NULL; - if (matchpathcon (outname, S_IFREG | mode, &ctx) == 0 && ctx != NULL) - { - if (setfscreatecon (ctx) != 0) - error (enforcing > 0 ? EXIT_FAILURE : 0, 0, - gettext ("cannot set file creation context for `%s'"), - outname); - - freecon (ctx); - } -} - -static void -reset_file_creation_context (void) -{ - setfscreatecon (NULL); -} -#endif diff --git a/nss/netgrp-lookup.c b/nss/netgrp-lookup.c deleted file mode 100644 index d32e8b8e30..0000000000 --- a/nss/netgrp-lookup.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME netgroup - -#include "XXX-lookup.c" diff --git a/nss/network-lookup.c b/nss/network-lookup.c deleted file mode 100644 index a5f5e38d61..0000000000 --- a/nss/network-lookup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME networks -#define DEFAULT_CONFIG "dns [!UNAVAIL=return] files" - -#include "XXX-lookup.c" diff --git a/nss/nss.h b/nss/nss.h deleted file mode 100644 index fefdc4e44b..0000000000 --- a/nss/nss.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -/* Define interface to NSS. This is meant for the interface functions - and for implementors of new services. */ - -#ifndef _NSS_H -#define _NSS_H 1 - -#include <features.h> -#include <stdint.h> - - -__BEGIN_DECLS - -/* Possible results of lookup using a nss_* function. */ -enum nss_status -{ - NSS_STATUS_TRYAGAIN = -2, - NSS_STATUS_UNAVAIL, - NSS_STATUS_NOTFOUND, - NSS_STATUS_SUCCESS, - NSS_STATUS_RETURN -}; - - -/* Data structure used for the 'gethostbyname4_r' function. */ -struct gaih_addrtuple - { - struct gaih_addrtuple *next; - char *name; - int family; - uint32_t addr[4]; - uint32_t scopeid; - }; - - -/* Overwrite service selection for database DBNAME using specification - in STRING. - This function should only be used by system programs which have to - work around non-existing services (e.e., while booting). - Attention: Using this function repeatedly will slowly eat up the - whole memory since previous selection data cannot be freed. */ -extern int __nss_configure_lookup (const char *__dbname, - const char *__string) __THROW; - -__END_DECLS - -#endif /* nss.h */ diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c deleted file mode 100644 index 9849c36223..0000000000 --- a/nss/nss_db/db-XXX.c +++ /dev/null @@ -1,311 +0,0 @@ -/* Common code for DB-based databases in nss_db module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/mman.h> -#include <libc-lock.h> -#include "nsswitch.h" -#include "nss_db.h" - -/* The hashing function we use. */ -#include "../intl/hash-string.h" - -/* These symbols are defined by the including source file: - - ENTNAME -- database name of the structure and functions (hostent, pwent). - STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). - DATABASE -- database file name, ("hosts", "passwd") - - NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. -*/ - -#define ENTNAME_r CONCAT(ENTNAME,_r) - -#include <paths.h> -#define DBFILE _PATH_VARDB DATABASE ".db" - -#ifdef NEED_H_ERRNO -# define H_ERRNO_PROTO , int *herrnop -# define H_ERRNO_ARG , herrnop -# define H_ERRNO_SET(val) (*herrnop = (val)) -#else -# define H_ERRNO_PROTO -# define H_ERRNO_ARG -# define H_ERRNO_SET(val) ((void) 0) -#endif - -/* State for this database. */ -static struct nss_db_map state; -/* Lock to protect the state and global variables. */ -__libc_lock_define (static , lock); - -/* Maintenance of the shared handle open on the database. */ -static int keep_db; -static const char *entidx; - - -/* Open the database. */ -enum nss_status -CONCAT(_nss_db_set,ENTNAME) (int stayopen) -{ - enum nss_status status; - - __libc_lock_lock (lock); - - status = internal_setent (DBFILE, &state); - - if (status == NSS_STATUS_SUCCESS) - { - /* Remember STAYOPEN flag. */ - keep_db |= stayopen; - - /* Reset the sequential index. */ - entidx = NULL; - } - - __libc_lock_unlock (lock); - - return status; -} - - -/* Close it again. */ -enum nss_status -CONCAT(_nss_db_end,ENTNAME) (void) -{ - __libc_lock_lock (lock); - - internal_endent (&state); - - /* Reset STAYOPEN flag. */ - keep_db = 0; - - __libc_lock_unlock (lock); - - return NSS_STATUS_SUCCESS; -} - - -/* Macro for defining lookup functions for this DB-based database. - - NAME is the name of the lookup; e.g. `pwnam'. - - DB_CHAR is index indicator for the database. - - KEYPATTERN gives `printf' args to construct a key string; - e.g. `("%d", id)'. - - KEYSIZE gives the allocation size of a buffer to construct it in; - e.g. `1 + sizeof (id) * 4'. - - PROTO is the potentially empty list of other parameters. - - BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result' - to the lookup key arguments and does `break;' if they match. */ - -#define DB_LOOKUP(name, db_char, keysize, keypattern, break_if_match, proto...)\ -enum nss_status \ - _nss_db_get##name##_r (proto, struct STRUCTURE *result, \ - char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO)\ -{ \ - struct parser_data *data = (void *) buffer; \ - \ - if (buflen < sizeof *data) \ - { \ - *errnop = ERANGE; \ - H_ERRNO_SET (NETDB_INTERNAL); \ - return NSS_STATUS_TRYAGAIN; \ - } \ - \ - struct nss_db_map state = { NULL, 0 }; \ - enum nss_status status = internal_setent (DBFILE, &state); \ - if (status != NSS_STATUS_SUCCESS) \ - { \ - *errnop = errno; \ - H_ERRNO_SET (NETDB_INTERNAL); \ - return status; \ - } \ - \ - const struct nss_db_header *header = state.header; \ - int i; \ - for (i = 0; i < header->ndbs; ++i) \ - if (header->dbs[i].id == db_char) \ - break; \ - if (i == header->ndbs) \ - { \ - status = NSS_STATUS_UNAVAIL; \ - goto out; \ - } \ - \ - char *key; \ - if (db_char == '.') \ - key = (char *) IGNOREPATTERN keypattern; \ - else \ - { \ - const size_t size = (keysize) + 1; \ - key = alloca (size); \ - \ - KEYPRINTF keypattern; \ - } \ - \ - const stridx_t *hashtable \ - = (const stridx_t *) ((const char *) header \ - + header->dbs[i].hashoffset); \ - const char *valstrtab = (const char *) header + header->valstroffset; \ - uint32_t hashval = __hash_string (key); \ - size_t hidx = hashval % header->dbs[i].hashsize; \ - size_t hval2 = 1 + hashval % (header->dbs[i].hashsize - 2); \ - \ - status = NSS_STATUS_NOTFOUND; \ - while (hashtable[hidx] != ~((stridx_t) 0)) \ - { \ - const char *valstr = valstrtab + hashtable[hidx]; \ - size_t len = strlen (valstr) + 1; \ - if (len > buflen) \ - { \ - /* No room to copy the data to. */ \ - *errnop = ERANGE; \ - H_ERRNO_SET (NETDB_INTERNAL); \ - status = NSS_STATUS_TRYAGAIN; \ - break; \ - } \ - \ - /* Copy the string to a place where it can be modified. */ \ - char *p = memcpy (buffer, valstr, len); \ - \ - int err = parse_line (p, result, data, buflen, errnop EXTRA_ARGS); \ - \ - /* Advance before break_if_match, lest it uses continue to skip - to the next entry. */ \ - if ((hidx += hval2) >= header->dbs[i].hashsize) \ - hidx -= header->dbs[i].hashsize; \ - \ - if (err > 0) \ - { \ - status = NSS_STATUS_SUCCESS; \ - break_if_match; \ - status = NSS_STATUS_NOTFOUND; \ - } \ - else if (err == -1) \ - { \ - H_ERRNO_SET (NETDB_INTERNAL); \ - status = NSS_STATUS_TRYAGAIN; \ - break; \ - } \ - } \ - \ - if (status == NSS_STATUS_NOTFOUND) \ - H_ERRNO_SET (HOST_NOT_FOUND); \ - \ - out: \ - internal_endent (&state); \ - \ - return status; \ -} - -#define KEYPRINTF(pattern, args...) snprintf (key, size, pattern ,##args) -#define IGNOREPATTERN(pattern, arg1, args...) (char *) (uintptr_t) arg1 - - - - -/* Return the next entry from the database file, doing locking. */ -enum nss_status -CONCAT(_nss_db_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, - size_t buflen, int *errnop H_ERRNO_PROTO) -{ - /* Return next entry in host file. */ - enum nss_status status; - struct parser_data *data = (void *) buffer; - - if (buflen < sizeof *data) - { - *errnop = ERANGE; - H_ERRNO_SET (NETDB_INTERNAL); - return NSS_STATUS_TRYAGAIN; - } - - __libc_lock_lock (lock); - - if (state.header == NULL) - { - status = internal_setent (DBFILE, &state); - if (status != NSS_STATUS_SUCCESS) - { - *errnop = errno; - H_ERRNO_SET (NETDB_INTERNAL); - goto out; - } - entidx = NULL; - } - - /* Start from the beginning if freshly initialized or reset - requested by set*ent. */ - if (entidx == NULL) - entidx = (const char *) state.header + state.header->valstroffset; - - status = NSS_STATUS_UNAVAIL; - if (state.header != MAP_FAILED) - { - const char *const end = ((const char *) state.header - + state.header->valstroffset - + state.header->valstrlen); - while (entidx < end) - { - const char *next = rawmemchr (entidx, '\0') + 1; - size_t len = next - entidx; - - if (len > buflen) - { - /* No room to copy the data to. */ - *errnop = ERANGE; - H_ERRNO_SET (NETDB_INTERNAL); - status = NSS_STATUS_TRYAGAIN; - break; - } - - /* Copy the string to a place where it can be modified. */ - char *p = memcpy (buffer, entidx, len); - - int err = parse_line (p, result, data, buflen, errnop EXTRA_ARGS); - - if (err > 0) - { - status = NSS_STATUS_SUCCESS; - entidx = next; - break; - } - if (err < 0) - { - H_ERRNO_SET (NETDB_INTERNAL); - status = NSS_STATUS_TRYAGAIN; - break; - } - - /* Continue with the next record, this one is ill-formed. */ - entidx = next; - } - } - - out: - __libc_lock_unlock (lock); - - return status; -} diff --git a/nss/nss_db/db-init.c b/nss/nss_db/db-init.c deleted file mode 100644 index 1a65c59119..0000000000 --- a/nss/nss_db/db-init.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Initialization in nss_db module. - Copyright (C) 2011-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 - <http://www.gnu.org/licenses/>. */ - -#ifdef USE_NSCD - -#include <paths.h> -#include <nscd/nscd.h> -#include <string.h> - -#define PWD_FILENAME (_PATH_VARDB "passwd.db") -define_traced_file (pwd, PWD_FILENAME); - -#define GRP_FILENAME (_PATH_VARDB "group.db") -define_traced_file (grp, GRP_FILENAME); - -#define SERV_FILENAME (_PATH_VARDB "services.db") -define_traced_file (serv, SERV_FILENAME); - -void -_nss_db_init (void (*cb) (size_t, struct traced_file *)) -{ - init_traced_file (&pwd_traced_file.file, PWD_FILENAME, 0); - cb (pwddb, &pwd_traced_file.file); - - init_traced_file (&grp_traced_file.file, GRP_FILENAME, 0); - cb (grpdb, &grp_traced_file.file); - - init_traced_file (&serv_traced_file.file, SERV_FILENAME, 0); - cb (servdb, &serv_traced_file.file); -} - -#endif diff --git a/nss/nss_db/db-initgroups.c b/nss/nss_db/db-initgroups.c deleted file mode 100644 index 11e6052453..0000000000 --- a/nss/nss_db/db-initgroups.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Initgroups handling in nss_db module. - Copyright (C) 2011-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@gmail.com>. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <errno.h> -#include <grp.h> -#include <limits.h> -#include <paths.h> -#include <stdlib.h> -#include <string.h> -#include <stdint.h> -#include <sys/param.h> - -#include "nss_db.h" - -/* The hashing function we use. */ -#include "../intl/hash-string.h" - - -enum nss_status -_nss_db_initgroups_dyn (const char *user, gid_t group, long int *start, - long int *size, gid_t **groupsp, long int limit, - int *errnop) -{ - struct nss_db_map state = { NULL, 0 }; - enum nss_status status = internal_setent (_PATH_VARDB "group.db", &state); - if (status != NSS_STATUS_SUCCESS) - { - *errnop = errno; - return status; - } - - const struct nss_db_header *header = state.header; - int i; - for (i = 0; i < header->ndbs; ++i) - if (header->dbs[i].id == ':') - break; - if (i == header->ndbs) - { - status = NSS_STATUS_UNAVAIL; - goto out; - } - - const stridx_t *hashtable - = (const stridx_t *) ((const char *) header - + header->dbs[i].hashoffset); - const char *valstrtab = (const char *) header + header->valstroffset; - size_t userlen = strlen (user); - uint32_t hashval = __hash_string (user); - size_t hidx = hashval % header->dbs[i].hashsize; - size_t hval2 = 1 + hashval % (header->dbs[i].hashsize - 2); - - gid_t *groups = *groupsp; - - status = NSS_STATUS_NOTFOUND; - while (hashtable[hidx] != ~((stridx_t) 0)) - { - const char *valstr = valstrtab + hashtable[hidx]; - while (isblank (*valstr)) - ++valstr; - - if (strncmp (valstr, user, userlen) == 0 && isblank (valstr[userlen])) - { - valstr += userlen + 1; - while (isblank (*valstr)) - ++valstr; - - while (*valstr != '\0') - { - errno = 0; - char *endp; - unsigned long int n = strtoul (valstr, &endp, 10); - if (*endp != ',' && *endp != '\0') - break; - valstr = *endp == '\0' ? endp : endp + 1; - - if (n != ULONG_MAX || errno != ERANGE) - { - /* Insert the group. */ - if (*start == *size) - { - /* Need a bigger buffer. */ - if (limit > 0 && *size == limit) - { - /* We reached the maximum. */ - status = NSS_STATUS_SUCCESS; - goto out; - } - - long int newsize; - if (limit <= 0) - newsize = 2 * *size; - else - newsize = MIN (limit, 2 * *size); - - gid_t *newgroups = realloc (groups, - newsize * sizeof (*groups)); - if (newgroups == NULL) - { - *errnop = ENOMEM; - status = NSS_STATUS_TRYAGAIN; - goto out; - } - - *groupsp = groups = newgroups; - *size = newsize; - } - - groups[*start] = n; - *start += 1; - } - } - - status = NSS_STATUS_SUCCESS; - break; - } - - if ((hidx += hval2) >= header->dbs[i].hashsize) - hidx -= header->dbs[i].hashsize; - } - - out: - internal_endent (&state); - - return status; -} diff --git a/nss/nss_db/db-netgrp.c b/nss/nss_db/db-netgrp.c deleted file mode 100644 index 25530cc206..0000000000 --- a/nss/nss_db/db-netgrp.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Netgroup file parser in nss_db modules. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <dlfcn.h> -#include <errno.h> -#include <fcntl.h> -#include <netgroup.h> -#include <string.h> -#include <stdint.h> -#include <libc-lock.h> -#include <paths.h> -#include <stdlib.h> - -#include "nsswitch.h" -#include "nss_db.h" - -/* The hashing function we use. */ -#include "../intl/hash-string.h" - - -#define DBFILE _PATH_VARDB "netgroup.db" - -/* Maintenance of the shared handle open on the database. */ -enum nss_status -_nss_db_setnetgrent (const char *group, struct __netgrent *result) -{ - struct nss_db_map state; - enum nss_status status = internal_setent (DBFILE, &state); - - if (status == NSS_STATUS_SUCCESS) - { - const struct nss_db_header *header = state.header; - const stridx_t *hashtable - = (const stridx_t *) ((const char *) header - + header->dbs[0].hashoffset); - const char *valstrtab = (const char *) header + header->valstroffset; - uint32_t hashval = __hash_string (group); - size_t grouplen = strlen (group); - size_t hidx = hashval % header->dbs[0].hashsize; - size_t hval2 = 1 + hashval % (header->dbs[0].hashsize - 2); - - status = NSS_STATUS_NOTFOUND; - while (hashtable[hidx] != ~((stridx_t) 0)) - { - const char *valstr = valstrtab + hashtable[hidx]; - - if (strncmp (valstr, group, grouplen) == 0 - && isblank (valstr[grouplen])) - { - const char *cp = &valstr[grouplen + 1]; - while (isblank (*cp)) - ++cp; - if (*cp != '\0') - { - result->data = strdup (cp); - if (result->data == NULL) - status = NSS_STATUS_TRYAGAIN; - else - { - status = NSS_STATUS_SUCCESS; - result->cursor = result->data; - } - break; - } - } - - if ((hidx += hval2) >= header->dbs[0].hashsize) - hidx -= header->dbs[0].hashsize; - } - - internal_endent (&state); - } - - return status; - -} - - -enum nss_status -_nss_db_endnetgrent (struct __netgrent *result) -{ - free (result->data); - result->data = NULL; - result->data_size = 0; - result->cursor = NULL; - return NSS_STATUS_SUCCESS; -} - - -extern enum nss_status _nss_netgroup_parseline (char **cursor, - struct __netgrent *result, - char *buffer, size_t buflen, - int *errnop); - -enum nss_status -_nss_db_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen, - int *errnop) -{ - enum nss_status status; - - status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen, - errnop); - - return status; -} diff --git a/nss/nss_db/db-open.c b/nss/nss_db/db-open.c deleted file mode 100644 index 1c58bd1c54..0000000000 --- a/nss/nss_db/db-open.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Common database routines for nss_db. - Copyright (C) 2000-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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <dlfcn.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <not-cancel.h> - -#include "nss_db.h" - -/* Open the database stored in FILE. If succesful, store either a - pointer to the mapped file or a file handle for the file in H and - return NSS_STATUS_SUCCESS. On failure, return the appropriate - lookup status. */ -enum nss_status -internal_setent (const char *file, struct nss_db_map *mapping) -{ - enum nss_status status = NSS_STATUS_UNAVAIL; - - int fd = open_not_cancel_2 (file, O_RDONLY | O_LARGEFILE | O_CLOEXEC); - if (fd != -1) - { - struct nss_db_header header; - - if (read (fd, &header, sizeof (header)) == sizeof (header)) - { - mapping->header = mmap (NULL, header.allocate, PROT_READ, - MAP_PRIVATE, fd, 0); - mapping->len = header.allocate; - if (mapping->header != MAP_FAILED) - status = NSS_STATUS_SUCCESS; - else if (errno == ENOMEM) - status = NSS_STATUS_TRYAGAIN; - } - - close_not_cancel_no_status (fd); - } - - return status; -} - - -/* Close the database. */ -void -internal_endent (struct nss_db_map *mapping) -{ - munmap (mapping->header, mapping->len); -} diff --git a/nss/nss_db/nss_db.h b/nss/nss_db/nss_db.h deleted file mode 100644 index 6978cead07..0000000000 --- a/nss/nss_db/nss_db.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Common database open/close routines for nss_db. - Copyright (C) 1999-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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _NSS_DB_H -#define _NSS_DB_H 1 - -#include <nss.h> -#include <stdint.h> -#include <libc-lock.h> - - -/* String table index type. */ -typedef uint32_t stridx_t; - -/* Database file header. */ -struct nss_db_header -{ - uint32_t magic; -#define NSS_DB_MAGIC 0xdd110601 - uint32_t ndbs; - uint64_t valstroffset; - uint64_t valstrlen; - uint64_t allocate; - struct - { - char id; - char pad[sizeof (uint32_t) - 1]; - uint32_t hashsize; - uint64_t hashoffset; - uint64_t keyidxoffset; - uint64_t keystroffset; - } dbs[0]; -}; - - -/* Information about mapped database. */ -struct nss_db_map -{ - struct nss_db_header *header; - size_t len; -}; - - -/* Open the database stored in FILE. If succesful, store the database - handle in *MAPPINGP or a file descriptor for the file in *FDP and - return NSS_STATUS_SUCCESS. On failure, return the appropriate - lookup status. */ -enum nss_status internal_setent (const char *file, - struct nss_db_map *mappingp); - -/* Close the database FD. */ -extern void internal_endent (struct nss_db_map *mapping); - -#endif /* nss_db.h */ diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c deleted file mode 100644 index 265331ef21..0000000000 --- a/nss/nss_files/files-XXX.c +++ /dev/null @@ -1,300 +0,0 @@ -/* Common code for file-based databases in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <libc-lock.h> -#include "nsswitch.h" - -#include <kernel-features.h> - -/* These symbols are defined by the including source file: - - ENTNAME -- database name of the structure and functions (hostent, pwent). - STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). - DATABASE -- string of the database file's name ("hosts", "passwd"). - - NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. - - Also see files-parse.c. -*/ - -#define ENTNAME_r CONCAT(ENTNAME,_r) - -#define DATAFILE "/etc/" DATABASE - -#ifdef NEED_H_ERRNO -# include <netdb.h> -# define H_ERRNO_PROTO , int *herrnop -# define H_ERRNO_ARG , herrnop -# define H_ERRNO_SET(val) (*herrnop = (val)) -#else -# define H_ERRNO_PROTO -# define H_ERRNO_ARG -# define H_ERRNO_SET(val) ((void) 0) -#endif - -#ifndef EXTRA_ARGS -# define EXTRA_ARGS -# define EXTRA_ARGS_DECL -# define EXTRA_ARGS_VALUE -#endif - -/* Locks the static variables in this file. */ -__libc_lock_define_initialized (static, lock) - -/* Maintenance of the stream open on the database file. For getXXent - operations the stream needs to be held open across calls, the other - getXXbyYY operations all use their own stream. */ - -static FILE *stream; - -/* Open database file if not already opened. */ -static enum nss_status -internal_setent (FILE **stream) -{ - enum nss_status status = NSS_STATUS_SUCCESS; - - if (*stream == NULL) - { - *stream = fopen (DATAFILE, "rce"); - - if (*stream == NULL) - status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - } - else - rewind (*stream); - - return status; -} - - -/* Thread-safe, exported version of that. */ -enum nss_status -CONCAT(_nss_files_set,ENTNAME) (int stayopen) -{ - enum nss_status status; - - __libc_lock_lock (lock); - - status = internal_setent (&stream); - - __libc_lock_unlock (lock); - - return status; -} - - -/* Close the database file. */ -static void -internal_endent (FILE **stream) -{ - if (*stream != NULL) - { - fclose (*stream); - *stream = NULL; - } -} - - -/* Thread-safe, exported version of that. */ -enum nss_status -CONCAT(_nss_files_end,ENTNAME) (void) -{ - __libc_lock_lock (lock); - - internal_endent (&stream); - - __libc_lock_unlock (lock); - - return NSS_STATUS_SUCCESS; -} - - -typedef enum -{ - gcr_ok = 0, - gcr_error = -1, - gcr_overflow = -2 -} get_contents_ret; - -/* Hack around the fact that fgets only accepts int sizes. */ -static get_contents_ret -get_contents (char *linebuf, size_t len, FILE *stream) -{ - size_t remaining_len = len; - char *curbuf = linebuf; - - do - { - int curlen = ((remaining_len > (size_t) INT_MAX) ? INT_MAX - : remaining_len); - - /* Terminate the line so that we can test for overflow. */ - ((unsigned char *) curbuf)[curlen - 1] = 0xff; - - char *p = fgets_unlocked (curbuf, curlen, stream); - - /* EOF or read error. */ - if (p == NULL) - return gcr_error; - - /* Done reading in the line. */ - if (((unsigned char *) curbuf)[curlen - 1] == 0xff) - return gcr_ok; - - /* Drop the terminating '\0'. */ - remaining_len -= curlen - 1; - curbuf += curlen - 1; - } - /* fgets copies one less than the input length. Our last iteration is of - REMAINING_LEN and once that is done, REMAINING_LEN is decremented by - REMAINING_LEN - 1, leaving the result as 1. */ - while (remaining_len > 1); - - /* This means that the current buffer was not large enough. */ - return gcr_overflow; -} - -/* Parsing the database file into `struct STRUCTURE' data structures. */ -static enum nss_status -internal_getent (FILE *stream, struct STRUCTURE *result, - char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO - EXTRA_ARGS_DECL) -{ - char *p; - struct parser_data *data = (void *) buffer; - size_t linebuflen = buffer + buflen - data->linebuffer; - int parse_result; - - if (buflen < sizeof *data + 2) - { - *errnop = ERANGE; - H_ERRNO_SET (NETDB_INTERNAL); - return NSS_STATUS_TRYAGAIN; - } - - do - { - get_contents_ret r = get_contents (data->linebuffer, linebuflen, stream); - - if (r == gcr_error) - { - /* End of file or read error. */ - H_ERRNO_SET (HOST_NOT_FOUND); - return NSS_STATUS_NOTFOUND; - } - - if (r == gcr_overflow) - { - /* The line is too long. Give the user the opportunity to - enlarge the buffer. */ - *errnop = ERANGE; - H_ERRNO_SET (NETDB_INTERNAL); - return NSS_STATUS_TRYAGAIN; - } - - /* Everything OK. Now skip leading blanks. */ - p = data->linebuffer; - while (isspace (*p)) - ++p; - } - while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ - /* Parse the line. If it is invalid, loop to get the next - line of the file to parse. */ - || ! (parse_result = parse_line (p, result, data, buflen, errnop - EXTRA_ARGS))); - - if (__glibc_unlikely (parse_result == -1)) - { - H_ERRNO_SET (NETDB_INTERNAL); - return NSS_STATUS_TRYAGAIN; - } - - /* Filled in RESULT with the next entry from the database file. */ - return NSS_STATUS_SUCCESS; -} - - -/* Return the next entry from the database file, doing locking. */ -enum nss_status -CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, - size_t buflen, int *errnop H_ERRNO_PROTO) -{ - /* Return next entry in host file. */ - enum nss_status status = NSS_STATUS_SUCCESS; - - __libc_lock_lock (lock); - - /* Be prepared that the set*ent function was not called before. */ - if (stream == NULL) - { - int save_errno = errno; - - status = internal_setent (&stream); - - __set_errno (save_errno); - } - - if (status == NSS_STATUS_SUCCESS) - status = internal_getent (stream, result, buffer, buflen, errnop - H_ERRNO_ARG EXTRA_ARGS_VALUE); - - __libc_lock_unlock (lock); - - return status; -} - -/* Macro for defining lookup functions for this file-based database. - - NAME is the name of the lookup; e.g. `hostbyname'. - - DB_CHAR, KEYPATTERN, KEYSIZE are ignored here but used by db-XXX.c - e.g. `1 + sizeof (id) * 4'. - - PROTO is the potentially empty list of other parameters. - - BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result' - to the lookup key arguments and does `break;' if they match. */ - -#define DB_LOOKUP(name, db_char, keysize, keypattern, break_if_match, proto...)\ -enum nss_status \ -_nss_files_get##name##_r (proto, \ - struct STRUCTURE *result, char *buffer, \ - size_t buflen, int *errnop H_ERRNO_PROTO) \ -{ \ - enum nss_status status; \ - FILE *stream = NULL; \ - \ - /* Open file. */ \ - status = internal_setent (&stream); \ - \ - if (status == NSS_STATUS_SUCCESS) \ - { \ - while ((status = internal_getent (stream, result, buffer, buflen, errnop \ - H_ERRNO_ARG EXTRA_ARGS_VALUE)) \ - == NSS_STATUS_SUCCESS) \ - { break_if_match } \ - \ - internal_endent (&stream); \ - } \ - \ - return status; \ -} diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c deleted file mode 100644 index cf872bb603..0000000000 --- a/nss/nss_files/files-alias.c +++ /dev/null @@ -1,404 +0,0 @@ -/* Mail alias file parser in nss_files module. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <aliases.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <libc-lock.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <kernel-features.h> - -#include "nsswitch.h" - -/* Locks the static variables in this file. */ -__libc_lock_define_initialized (static, lock) - -/* Maintenance of the stream open on the database file. For getXXent - operations the stream needs to be held open across calls, the other - getXXbyYY operations all use their own stream. */ - -static FILE *stream; - - -static enum nss_status -internal_setent (FILE **stream) -{ - enum nss_status status = NSS_STATUS_SUCCESS; - - if (*stream == NULL) - { - *stream = fopen ("/etc/aliases", "rce"); - - if (*stream == NULL) - status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - } - else - rewind (*stream); - - return status; -} - - -/* Thread-safe, exported version of that. */ -enum nss_status -_nss_files_setaliasent (void) -{ - enum nss_status status; - - __libc_lock_lock (lock); - - status = internal_setent (&stream); - - __libc_lock_unlock (lock); - - return status; -} - - -/* Close the database file. */ -static void -internal_endent (FILE **stream) -{ - if (*stream != NULL) - { - fclose (*stream); - *stream = NULL; - } -} - - -/* Thread-safe, exported version of that. */ -enum nss_status -_nss_files_endaliasent (void) -{ - __libc_lock_lock (lock); - - internal_endent (&stream); - - __libc_lock_unlock (lock); - - return NSS_STATUS_SUCCESS; -} - -/* Parsing the database file into `struct aliasent' data structures. */ -static enum nss_status -get_next_alias (FILE *stream, const char *match, struct aliasent *result, - char *buffer, size_t buflen, int *errnop) -{ - enum nss_status status = NSS_STATUS_NOTFOUND; - int ignore = 0; - - result->alias_members_len = 0; - - while (1) - { - /* Now we are ready to process the input. We have to read a - line and all its continuations and construct the array of - string pointers. This pointers and the names itself have to - be placed in BUFFER. */ - char *first_unused = buffer; - size_t room_left = buflen - (buflen % __alignof__ (char *)); - char *line; - - /* Check whether the buffer is large enough for even trying to - read something. */ - if (room_left < 2) - goto no_more_room; - - /* Read the first line. It must contain the alias name and - possibly some alias names. */ - first_unused[room_left - 1] = '\xff'; - line = fgets_unlocked (first_unused, room_left, stream); - if (line == NULL) - /* Nothing to read. */ - break; - else if (first_unused[room_left - 1] != '\xff') - { - /* The line is too long for our buffer. */ - no_more_room: - *errnop = ERANGE; - status = NSS_STATUS_TRYAGAIN; - break; - } - else - { - char *cp; - - /* If we are in IGNORE mode and the first character in the - line is a white space we ignore the line and start - reading the next. */ - if (ignore && isspace (*first_unused)) - continue; - - /* Terminate the line for any case. */ - cp = strpbrk (first_unused, "#\n"); - if (cp != NULL) - *cp = '\0'; - - /* Skip leading blanks. */ - while (isspace (*line)) - ++line; - - result->alias_name = first_unused; - while (*line != '\0' && *line != ':') - *first_unused++ = *line++; - if (*line == '\0' || result->alias_name == first_unused) - /* No valid name. Ignore the line. */ - continue; - - *first_unused++ = '\0'; - if (room_left < (size_t) (first_unused - result->alias_name)) - goto no_more_room; - room_left -= first_unused - result->alias_name; - ++line; - - /* When we search for a specific alias we can avoid all the - difficult parts and compare now with the name we are - looking for. If it does not match we simply ignore all - lines until the next line containing the start of a new - alias is found. */ - ignore = (match != NULL - && __strcasecmp (result->alias_name, match) != 0); - - while (! ignore) - { - while (isspace (*line)) - ++line; - - cp = first_unused; - while (*line != '\0' && *line != ',') - *first_unused++ = *line++; - - if (first_unused != cp) - { - /* OK, we can have a regular entry or an include - request. */ - if (*line != '\0') - ++line; - *first_unused++ = '\0'; - - if (strncmp (cp, ":include:", 9) != 0) - { - if (room_left < (first_unused - cp) + sizeof (char *)) - goto no_more_room; - room_left -= (first_unused - cp) + sizeof (char *); - - ++result->alias_members_len; - } - else - { - /* Oh well, we have to read the addressed file. */ - FILE *listfile; - char *old_line = NULL; - - first_unused = cp; - - listfile = fopen (&cp[9], "rce"); - /* If the file does not exist we simply ignore - the statement. */ - if (listfile != NULL - && (old_line = strdup (line)) != NULL) - { - while (! feof_unlocked (listfile)) - { - first_unused[room_left - 1] = '\xff'; - line = fgets_unlocked (first_unused, room_left, - listfile); - if (line == NULL) - break; - if (first_unused[room_left - 1] != '\xff') - { - free (old_line); - goto no_more_room; - } - - /* Parse the line. */ - cp = strpbrk (line, "#\n"); - if (cp != NULL) - *cp = '\0'; - - do - { - while (isspace (*line)) - ++line; - - cp = first_unused; - while (*line != '\0' && *line != ',') - *first_unused++ = *line++; - - if (*line != '\0') - ++line; - - if (first_unused != cp) - { - *first_unused++ = '\0'; - if (room_left < ((first_unused - cp) - + __alignof__ (char *))) - { - free (old_line); - goto no_more_room; - } - room_left -= ((first_unused - cp) - + __alignof__ (char *)); - ++result->alias_members_len; - } - } - while (*line != '\0'); - } - fclose (listfile); - - first_unused[room_left - 1] = '\0'; - strncpy (first_unused, old_line, room_left); - - free (old_line); - line = first_unused; - - if (first_unused[room_left - 1] != '\0') - goto no_more_room; - } - } - } - - if (*line == '\0') - { - /* Get the next line. But we must be careful. We - must not read the whole line at once since it - might belong to the current alias. Simply read - the first character. If it is a white space we - have a continuation line. Otherwise it is the - beginning of a new alias and we can push back the - just read character. */ - int ch; - - ch = fgetc_unlocked (stream); - if (ch == EOF || ch == '\n' || !isspace (ch)) - { - size_t cnt; - - /* Now prepare the return. Provide string - pointers for the currently selected aliases. */ - if (ch != EOF) - ungetc (ch, stream); - - /* Adjust the pointer so it is aligned for - storing pointers. */ - first_unused += __alignof__ (char *) - 1; - first_unused -= ((first_unused - (char *) 0) - % __alignof__ (char *)); - result->alias_members = (char **) first_unused; - - /* Compute addresses of alias entry strings. */ - cp = result->alias_name; - for (cnt = 0; cnt < result->alias_members_len; ++cnt) - { - cp = strchr (cp, '\0') + 1; - result->alias_members[cnt] = cp; - } - - status = (result->alias_members_len == 0 - ? NSS_STATUS_RETURN : NSS_STATUS_SUCCESS); - break; - } - - /* The just read character is a white space and so - can be ignored. */ - first_unused[room_left - 1] = '\xff'; - line = fgets_unlocked (first_unused, room_left, stream); - if (first_unused[room_left - 1] != '\xff') - goto no_more_room; - cp = strpbrk (line, "#\n"); - if (cp != NULL) - *cp = '\0'; - } - } - } - - if (status != NSS_STATUS_NOTFOUND) - /* We read something. In any case break here. */ - break; - } - - return status; -} - - -enum nss_status -_nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen, - int *errnop) -{ - /* Return next entry in host file. */ - enum nss_status status = NSS_STATUS_SUCCESS; - - __libc_lock_lock (lock); - - /* Be prepared that the set*ent function was not called before. */ - if (stream == NULL) - status = internal_setent (&stream); - - if (status == NSS_STATUS_SUCCESS) - { - result->alias_local = 1; - - /* Read lines until we get a definite result. */ - do - status = get_next_alias (stream, NULL, result, buffer, buflen, errnop); - while (status == NSS_STATUS_RETURN); - } - - __libc_lock_unlock (lock); - - return status; -} - - -enum nss_status -_nss_files_getaliasbyname_r (const char *name, struct aliasent *result, - char *buffer, size_t buflen, int *errnop) -{ - /* Return next entry in host file. */ - enum nss_status status = NSS_STATUS_SUCCESS; - FILE *stream = NULL; - - if (name == NULL) - { - __set_errno (EINVAL); - return NSS_STATUS_UNAVAIL; - } - - /* Open the stream. */ - status = internal_setent (&stream); - - if (status == NSS_STATUS_SUCCESS) - { - result->alias_local = 1; - - /* Read lines until we get a definite result. */ - do - status = get_next_alias (stream, name, result, buffer, buflen, errnop); - while (status == NSS_STATUS_RETURN); - } - - internal_endent (&stream); - - return status; -} diff --git a/nss/nss_files/files-ethers.c b/nss/nss_files/files-ethers.c deleted file mode 100644 index 6f5c02636f..0000000000 --- a/nss/nss_files/files-ethers.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <netinet/ether.h> -#include <netinet/if_ether.h> - -struct etherent_data {}; - -#define ENTNAME etherent -#define DATABASE "ethers" -#include "files-parse.c" -LINE_PARSER -("#", - /* Read the ethernet address: 6 x 8bit hexadecimal number. */ - { - size_t cnt; - - for (cnt = 0; cnt < 6; ++cnt) - { - unsigned int number; - - if (cnt < 5) - INT_FIELD (number, ISCOLON , 0, 16, (unsigned int)) - else - INT_FIELD (number, isspace, 1, 16, (unsigned int)) - - if (number > 0xff) - return 0; - result->e_addr.ether_addr_octet[cnt] = number; - } - }; - STRING_FIELD (result->e_name, isspace, 1); - ) - - -#include GENERIC - -DB_LOOKUP (hostton, '.', 0, ("%s", name), - { - if (__strcasecmp (result->e_name, name) == 0) - break; - }, const char *name) - -DB_LOOKUP (ntohost, '=', 18, ("%x:%x:%x:%x:%x:%x", - addr->ether_addr_octet[0], addr->ether_addr_octet[1], - addr->ether_addr_octet[2], addr->ether_addr_octet[3], - addr->ether_addr_octet[4], addr->ether_addr_octet[5]), - { - if (memcmp (&result->e_addr, addr, - sizeof (struct ether_addr)) == 0) - break; - }, const struct ether_addr *addr) diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c deleted file mode 100644 index ff8b27f2b3..0000000000 --- a/nss/nss_files/files-grp.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Group file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <grp.h> - -#define STRUCTURE group -#define ENTNAME grent -#define DATABASE "group" -struct grent_data {}; - -/* Our parser function is already defined in fgetgrent.c, so use that. - to parse lines from the database file. */ -#define EXTERN_PARSER -#include "files-parse.c" -#include GENERIC - -DB_LOOKUP (grnam, '.', 0, ("%s", name), - { - if (name[0] != '-' && name[0] != '+' - && ! strcmp (name, result->gr_name)) - break; - }, const char *name) - -DB_LOOKUP (grgid, '=', 20, ("%lu", (unsigned long int) gid), - { - if (result->gr_gid == gid && result->gr_name[0] != '+' - && result->gr_name[0] != '-') - break; - }, gid_t gid) diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c deleted file mode 100644 index bccb6a5780..0000000000 --- a/nss/nss_files/files-hosts.c +++ /dev/null @@ -1,482 +0,0 @@ -/* Hosts file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <netdb.h> -#include <resolv/resolv-internal.h> - - -/* Get implementation for some internal functions. */ -#include "../resolv/mapv4v6addr.h" -#include "../resolv/res_hconf.h" - - -#define ENTNAME hostent -#define DATABASE "hosts" -#define NEED_H_ERRNO - -#define EXTRA_ARGS , af, flags -#define EXTRA_ARGS_DECL , int af, int flags - -#define ENTDATA hostent_data -struct hostent_data - { - unsigned char host_addr[16]; /* IPv4 or IPv6 address. */ - char *h_addr_ptrs[2]; /* Points to that and null terminator. */ - }; - -#define TRAILING_LIST_MEMBER h_aliases -#define TRAILING_LIST_SEPARATOR_P isspace -#include "files-parse.c" -LINE_PARSER -("#", - { - char *addr; - - STRING_FIELD (addr, isspace, 1); - - /* Parse address. */ - if (inet_pton (af == AF_UNSPEC ? AF_INET : af, addr, entdata->host_addr) - > 0) - af = af == AF_UNSPEC ? AF_INET : af; - else - { - if (af == AF_INET6 && (flags & AI_V4MAPPED) != 0 - && inet_pton (AF_INET, addr, entdata->host_addr) > 0) - map_v4v6_address ((char *) entdata->host_addr, - (char *) entdata->host_addr); - else if (af == AF_INET - && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) - { - if (IN6_IS_ADDR_V4MAPPED (entdata->host_addr)) - memcpy (entdata->host_addr, entdata->host_addr + 12, INADDRSZ); - else if (IN6_IS_ADDR_LOOPBACK (entdata->host_addr)) - { - in_addr_t localhost = htonl (INADDR_LOOPBACK); - memcpy (entdata->host_addr, &localhost, sizeof (localhost)); - } - else - /* Illegal address: ignore line. */ - return 0; - } - else if (af == AF_UNSPEC - && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) - af = AF_INET6; - else - /* Illegal address: ignore line. */ - return 0; - } - - /* We always return entries of the requested form. */ - result->h_addrtype = af; - result->h_length = af == AF_INET ? INADDRSZ : IN6ADDRSZ; - - /* Store a pointer to the address in the expected form. */ - entdata->h_addr_ptrs[0] = (char *) entdata->host_addr; - entdata->h_addr_ptrs[1] = NULL; - result->h_addr_list = entdata->h_addr_ptrs; - - STRING_FIELD (result->h_name, isspace, 1); - }) - -#define EXTRA_ARGS_VALUE \ - , (res_use_inet6 () ? AF_INET6 : AF_INET), \ - (res_use_inet6 () ? AI_V4MAPPED : 0) -#include "files-XXX.c" -#undef EXTRA_ARGS_VALUE - -/* We only need to consider IPv4 mapped addresses if the input to the - gethostbyaddr() function is an IPv6 address. */ -#define EXTRA_ARGS_VALUE \ - , af, (len == IN6ADDRSZ ? AI_V4MAPPED : 0) -DB_LOOKUP (hostbyaddr, ,,, - { - if (result->h_length == (int) len - && ! memcmp (addr, result->h_addr_list[0], len)) - break; - }, const void *addr, socklen_t len, int af) -#undef EXTRA_ARGS_VALUE - -enum nss_status -_nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result, - char *buffer, size_t buflen, int *errnop, - int *herrnop, int32_t *ttlp, char **canonp) -{ - FILE *stream = NULL; - uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data); - buffer += pad; - buflen = buflen > pad ? buflen - pad : 0; - - /* Open file. */ - enum nss_status status = internal_setent (&stream); - - if (status == NSS_STATUS_SUCCESS) - { - /* XXX Is using _res to determine whether we want to convert IPv4 - addresses to IPv6 addresses really the right thing to do? */ - int flags = (res_use_inet6 () ? AI_V4MAPPED : 0); - - while ((status = internal_getent (stream, result, buffer, buflen, errnop, - herrnop, af, flags)) - == NSS_STATUS_SUCCESS) - { - LOOKUP_NAME_CASE (h_name, h_aliases) - } - - if (status == NSS_STATUS_SUCCESS - && _res_hconf.flags & HCONF_FLAG_MULTI) - { - /* We have to get all host entries from the file. */ - size_t tmp_buflen = MIN (buflen, 4096); - char tmp_buffer_stack[tmp_buflen] - __attribute__ ((__aligned__ (__alignof__ (struct hostent_data)))); - char *tmp_buffer = tmp_buffer_stack; - struct hostent tmp_result_buf; - int naddrs = 1; - int naliases = 0; - char *bufferend; - bool tmp_buffer_malloced = false; - - while (result->h_aliases[naliases] != NULL) - ++naliases; - - bufferend = (char *) &result->h_aliases[naliases + 1]; - - again: - while ((status = internal_getent (stream, &tmp_result_buf, tmp_buffer, - tmp_buflen, errnop, herrnop, af, - flags)) - == NSS_STATUS_SUCCESS) - { - int matches = 1; - struct hostent *old_result = result; - result = &tmp_result_buf; - /* The following piece is a bit clumsy but we want to use the - `LOOKUP_NAME_CASE' value. The optimizer should do its - job. */ - do - { - LOOKUP_NAME_CASE (h_name, h_aliases) - result = old_result; - } - while ((matches = 0)); - - if (matches) - { - /* We could be very clever and try to recycle a few bytes - in the buffer instead of generating new arrays. But - we are not doing this here since it's more work than - it's worth. Simply let the user provide a bit bigger - buffer. */ - char **new_h_addr_list; - char **new_h_aliases; - int newaliases = 0; - size_t newstrlen = 0; - int cnt; - - /* Count the new aliases and the length of the strings. */ - while (tmp_result_buf.h_aliases[newaliases] != NULL) - { - char *cp = tmp_result_buf.h_aliases[newaliases]; - ++newaliases; - newstrlen += strlen (cp) + 1; - } - /* If the real name is different add it also to the - aliases. This means that there is a duplication - in the alias list but this is really the user's - problem. */ - if (strcmp (old_result->h_name, - tmp_result_buf.h_name) != 0) - { - ++newaliases; - newstrlen += strlen (tmp_result_buf.h_name) + 1; - } - - /* Make sure bufferend is aligned. */ - assert ((bufferend - (char *) 0) % sizeof (char *) == 0); - - /* Now we can check whether the buffer is large enough. - 16 is the maximal size of the IP address. */ - if (bufferend + 16 + (naddrs + 2) * sizeof (char *) - + roundup (newstrlen, sizeof (char *)) - + (naliases + newaliases + 1) * sizeof (char *) - >= buffer + buflen) - { - *errnop = ERANGE; - *herrnop = NETDB_INTERNAL; - status = NSS_STATUS_TRYAGAIN; - goto out; - } - - new_h_addr_list = - (char **) (bufferend - + roundup (newstrlen, sizeof (char *)) - + 16); - new_h_aliases = - (char **) ((char *) new_h_addr_list - + (naddrs + 2) * sizeof (char *)); - - /* Copy the old data in the new arrays. */ - for (cnt = 0; cnt < naddrs; ++cnt) - new_h_addr_list[cnt] = old_result->h_addr_list[cnt]; - - for (cnt = 0; cnt < naliases; ++cnt) - new_h_aliases[cnt] = old_result->h_aliases[cnt]; - - /* Store the new strings. */ - cnt = 0; - while (tmp_result_buf.h_aliases[cnt] != NULL) - { - new_h_aliases[naliases++] = bufferend; - bufferend = (__stpcpy (bufferend, - tmp_result_buf.h_aliases[cnt]) - + 1); - ++cnt; - } - - if (cnt < newaliases) - { - new_h_aliases[naliases++] = bufferend; - bufferend = __stpcpy (bufferend, - tmp_result_buf.h_name) + 1; - } - - /* Final NULL pointer. */ - new_h_aliases[naliases] = NULL; - - /* Round up the buffer end address. */ - bufferend += (sizeof (char *) - - ((bufferend - (char *) 0) - % sizeof (char *))) % sizeof (char *); - - /* Now the new address. */ - new_h_addr_list[naddrs++] = - memcpy (bufferend, tmp_result_buf.h_addr, - tmp_result_buf.h_length); - - /* Also here a final NULL pointer. */ - new_h_addr_list[naddrs] = NULL; - - /* Store the new array pointers. */ - old_result->h_aliases = new_h_aliases; - old_result->h_addr_list = new_h_addr_list; - - /* Compute the new buffer end. */ - bufferend = (char *) &new_h_aliases[naliases + 1]; - assert (bufferend <= buffer + buflen); - - result = old_result; - } - } - - if (status == NSS_STATUS_TRYAGAIN) - { - size_t newsize = 2 * tmp_buflen; - if (tmp_buffer_malloced) - { - char *newp = realloc (tmp_buffer, newsize); - if (newp != NULL) - { - assert ((((uintptr_t) newp) - & (__alignof__ (struct hostent_data) - 1)) - == 0); - tmp_buffer = newp; - tmp_buflen = newsize; - goto again; - } - } - else if (!__libc_use_alloca (buflen + newsize)) - { - tmp_buffer = malloc (newsize); - if (tmp_buffer != NULL) - { - assert ((((uintptr_t) tmp_buffer) - & (__alignof__ (struct hostent_data) - 1)) - == 0); - tmp_buffer_malloced = true; - tmp_buflen = newsize; - goto again; - } - } - else - { - tmp_buffer - = extend_alloca (tmp_buffer, tmp_buflen, - newsize - + __alignof__ (struct hostent_data)); - tmp_buffer = (char *) (((uintptr_t) tmp_buffer - + __alignof__ (struct hostent_data) - - 1) - & ~(__alignof__ (struct hostent_data) - - 1)); - goto again; - } - } - else - status = NSS_STATUS_SUCCESS; - out: - if (tmp_buffer_malloced) - free (tmp_buffer); - } - - internal_endent (&stream); - } - - if (canonp && status == NSS_STATUS_SUCCESS) - *canonp = result->h_name; - - return status; -} - -enum nss_status -_nss_files_gethostbyname_r (const char *name, struct hostent *result, - char *buffer, size_t buflen, int *errnop, - int *herrnop) -{ - int af = (res_use_inet6 () ? AF_INET6 : AF_INET); - - return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen, - errnop, herrnop, NULL, NULL); -} - -enum nss_status -_nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result, - char *buffer, size_t buflen, int *errnop, - int *herrnop) -{ - return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen, - errnop, herrnop, NULL, NULL); -} - -enum nss_status -_nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, - char *buffer, size_t buflen, int *errnop, - int *herrnop, int32_t *ttlp) -{ - FILE *stream = NULL; - - /* Open file. */ - enum nss_status status = internal_setent (&stream); - - if (status == NSS_STATUS_SUCCESS) - { - bool any = false; - bool got_canon = false; - while (1) - { - /* Align the buffer for the next record. */ - uintptr_t pad = (-(uintptr_t) buffer - % __alignof__ (struct hostent_data)); - buffer += pad; - buflen = buflen > pad ? buflen - pad : 0; - - struct hostent result; - status = internal_getent (stream, &result, buffer, buflen, errnop, - herrnop, AF_UNSPEC, 0); - if (status != NSS_STATUS_SUCCESS) - break; - - int naliases = 0; - if (__strcasecmp (name, result.h_name) != 0) - { - for (; result.h_aliases[naliases] != NULL; ++naliases) - if (! __strcasecmp (name, result.h_aliases[naliases])) - break; - if (result.h_aliases[naliases] == NULL) - continue; - - /* We know this alias exist. Count it. */ - ++naliases; - } - - /* Determine how much memory has been used so far. */ - // XXX It is not necessary to preserve the aliases array - while (result.h_aliases[naliases] != NULL) - ++naliases; - char *bufferend = (char *) &result.h_aliases[naliases + 1]; - assert (buflen >= bufferend - buffer); - buflen -= bufferend - buffer; - buffer = bufferend; - - /* We found something. */ - any = true; - - /* Create the record the caller expects. There is only one - address. */ - assert (result.h_addr_list[1] == NULL); - if (*pat == NULL) - { - uintptr_t pad = (-(uintptr_t) buffer - % __alignof__ (struct gaih_addrtuple)); - buffer += pad; - buflen = buflen > pad ? buflen - pad : 0; - - if (__builtin_expect (buflen < sizeof (struct gaih_addrtuple), - 0)) - { - *errnop = ERANGE; - *herrnop = NETDB_INTERNAL; - status = NSS_STATUS_TRYAGAIN; - break; - } - - *pat = (struct gaih_addrtuple *) buffer; - buffer += sizeof (struct gaih_addrtuple); - buflen -= sizeof (struct gaih_addrtuple); - } - - (*pat)->next = NULL; - (*pat)->name = got_canon ? NULL : result.h_name; - got_canon = true; - (*pat)->family = result.h_addrtype; - memcpy ((*pat)->addr, result.h_addr_list[0], result.h_length); - (*pat)->scopeid = 0; - - pat = &((*pat)->next); - - /* If we only look for the first matching entry we are done. */ - if ((_res_hconf.flags & HCONF_FLAG_MULTI) == 0) - break; - } - - /* If we have to look for multiple records and found one, this - is a success. */ - if (status == NSS_STATUS_NOTFOUND && any) - { - assert ((_res_hconf.flags & HCONF_FLAG_MULTI) != 0); - status = NSS_STATUS_SUCCESS; - } - - internal_endent (&stream); - } - else if (status == NSS_STATUS_TRYAGAIN) - { - *errnop = errno; - *herrnop = TRY_AGAIN; - } - else - { - *errnop = errno; - *herrnop = NO_DATA; - } - - return status; -} diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c deleted file mode 100644 index 9243d86cc9..0000000000 --- a/nss/nss_files/files-init.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Initialization in nss_files module. - Copyright (C) 2011-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 - <http://www.gnu.org/licenses/>. */ - -#ifdef USE_NSCD - -#include <string.h> -#include <nscd/nscd.h> - -#define PWD_FILENAME "/etc/passwd" -define_traced_file (pwd, PWD_FILENAME); - -#define GRP_FILENAME "/etc/group" -define_traced_file (grp, GRP_FILENAME); - -#define HST_FILENAME "/etc/hosts" -define_traced_file (hst, HST_FILENAME); - -#define RESOLV_FILENAME "/etc/resolv.conf" -define_traced_file (resolv, RESOLV_FILENAME); - -#define SERV_FILENAME "/etc/services" -define_traced_file (serv, SERV_FILENAME); - -#define NETGR_FILENAME "/etc/netgroup" -define_traced_file (netgr, NETGR_FILENAME); - -void -_nss_files_init (void (*cb) (size_t, struct traced_file *)) -{ - init_traced_file (&pwd_traced_file.file, PWD_FILENAME, 0); - cb (pwddb, &pwd_traced_file.file); - - init_traced_file (&grp_traced_file.file, GRP_FILENAME, 0); - cb (grpdb, &grp_traced_file.file); - - init_traced_file (&hst_traced_file.file, HST_FILENAME, 0); - cb (hstdb, &hst_traced_file.file); - - init_traced_file (&resolv_traced_file.file, RESOLV_FILENAME, 1); - cb (hstdb, &resolv_traced_file.file); - - init_traced_file (&serv_traced_file.file, SERV_FILENAME, 0); - cb (servdb, &serv_traced_file.file); - - init_traced_file (&netgr_traced_file.file, NETGR_FILENAME, 0); - cb (netgrdb, &netgr_traced_file.file); -} - -#endif diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c deleted file mode 100644 index 27cd8ece40..0000000000 --- a/nss/nss_files/files-initgroups.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Initgroups handling in nss_files module. - Copyright (C) 2011-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 - <http://www.gnu.org/licenses/>. */ - -#include <alloca.h> -#include <errno.h> -#include <grp.h> -#include <nss.h> -#include <stdio_ext.h> -#include <string.h> -#include <sys/param.h> -#include <stdbool.h> -#include <stdlib.h> - -enum nss_status -_nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, - long int *size, gid_t **groupsp, long int limit, - int *errnop) -{ - FILE *stream = fopen ("/etc/group", "rce"); - if (stream == NULL) - { - *errnop = errno; - return *errnop == ENOMEM ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - } - - /* No other thread using this stream. */ - __fsetlocking (stream, FSETLOCKING_BYCALLER); - - char *line = NULL; - size_t linelen = 0; - enum nss_status status = NSS_STATUS_SUCCESS; - bool any = false; - - size_t buflen = 1024; - void *buffer = alloca (buflen); - bool buffer_use_malloc = false; - - gid_t *groups = *groupsp; - - /* We have to iterate over the entire file. */ - while (1) - { - fpos_t pos; - fgetpos (stream, &pos); - ssize_t n = getline (&line, &linelen, stream); - if (n < 0) - { - if (! feof_unlocked (stream)) - status = ((*errnop = errno) == ENOMEM - ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL); - break; - } - - struct group grp; - int res = _nss_files_parse_grent (line, &grp, buffer, buflen, errnop); - if (res == -1) - { - size_t newbuflen = 2 * buflen; - if (buffer_use_malloc || ! __libc_use_alloca (buflen + newbuflen)) - { - void *newbuf = realloc (buffer_use_malloc ? buffer : NULL, - newbuflen); - if (newbuf == NULL) - { - *errnop = ENOMEM; - status = NSS_STATUS_TRYAGAIN; - goto out; - } - buffer = newbuf; - buflen = newbuflen; - buffer_use_malloc = true; - } - else - buffer = extend_alloca (buffer, buflen, newbuflen); - /* Reread current line, the parser has clobbered it. */ - fsetpos (stream, &pos); - continue; - } - - if (res > 0 && grp.gr_gid != group) - for (char **m = grp.gr_mem; *m != NULL; ++m) - if (strcmp (*m, user) == 0) - { - /* Matches user. Insert this group. */ - if (*start == *size) - { - /* Need a bigger buffer. */ - if (limit > 0 && *size == limit) - /* We reached the maximum. */ - goto out; - - long int newsize; - if (limit <= 0) - newsize = 2 * *size; - else - newsize = MIN (limit, 2 * *size); - - gid_t *newgroups = realloc (groups, - newsize * sizeof (*groups)); - if (newgroups == NULL) - { - *errnop = ENOMEM; - status = NSS_STATUS_TRYAGAIN; - goto out; - } - *groupsp = groups = newgroups; - *size = newsize; - } - - groups[*start] = grp.gr_gid; - *start += 1; - any = true; - - break; - } - } - - out: - /* Free memory. */ - if (buffer_use_malloc) - free (buffer); - free (line); - - fclose (stream); - - return status == NSS_STATUS_SUCCESS && !any ? NSS_STATUS_NOTFOUND : status; -} diff --git a/nss/nss_files/files-key.c b/nss/nss_files/files-key.c deleted file mode 100644 index 11a574a0b1..0000000000 --- a/nss/nss_files/files-key.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Public key file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <errno.h> -#include <string.h> -#include <netdb.h> -#include <rpc/key_prot.h> -#include <rpc/des_crypt.h> -#include "nsswitch.h" - -#define DATAFILE "/etc/publickey" - - -static enum nss_status -search (const char *netname, char *result, int *errnop, int secret) -{ - FILE *stream = fopen (DATAFILE, "rce"); - if (stream == NULL) - return errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - - for (;;) - { - char buffer[HEXKEYBYTES * 2 + KEYCHECKSUMSIZE + MAXNETNAMELEN + 17]; - char *p; - char *save_ptr; - - buffer[sizeof (buffer) - 1] = '\xff'; - p = fgets_unlocked (buffer, sizeof (buffer), stream); - if (p == NULL) - { - /* End of file or read error. */ - *errnop = errno; - fclose (stream); - return NSS_STATUS_NOTFOUND; - } - else if (buffer[sizeof (buffer) - 1] != '\xff') - { - /* Invalid line in file? Skip remainder of line. */ - if (buffer[sizeof (buffer) - 2] != '\0') - while (getc_unlocked (stream) != '\n') - continue; - continue; - } - - /* Parse line. */ - p = __strtok_r (buffer, "# \t:\n", &save_ptr); - if (p == NULL) /* Skip empty and comment lines. */ - continue; - if (strcmp (p, netname) != 0) - continue; - - /* A hit! Find the field we want and return. */ - p = __strtok_r (NULL, ":\n", &save_ptr); - if (p == NULL) /* malformed line? */ - continue; - if (secret) - p = __strtok_r (NULL, ":\n", &save_ptr); - if (p == NULL) /* malformed line? */ - continue; - fclose (stream); - strcpy (result, p); - return NSS_STATUS_SUCCESS; - } -} - -enum nss_status -_nss_files_getpublickey (const char *netname, char *pkey, int *errnop) -{ - return search (netname, pkey, errnop, 0); -} - -enum nss_status -_nss_files_getsecretkey (const char *netname, char *skey, char *passwd, - int *errnop) -{ - enum nss_status status; - char buf[HEXKEYBYTES + KEYCHECKSUMSIZE + 16]; - - skey[0] = 0; - - status = search (netname, buf, errnop, 1); - if (status != NSS_STATUS_SUCCESS) - return status; - - if (!xdecrypt (buf, passwd)) - return NSS_STATUS_SUCCESS; - - if (memcmp (buf, &(buf[HEXKEYBYTES]), KEYCHECKSUMSIZE) != 0) - return NSS_STATUS_SUCCESS; - - buf[HEXKEYBYTES] = 0; - strcpy (skey, buf); - - return NSS_STATUS_SUCCESS; -} diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c deleted file mode 100644 index 009ce02432..0000000000 --- a/nss/nss_files/files-netgrp.c +++ /dev/null @@ -1,294 +0,0 @@ -/* Netgroup file parser in nss_files modules. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <stdio.h> -#include <stdio_ext.h> -#include <stdlib.h> -#include <string.h> -#include "nsswitch.h" -#include "netgroup.h" - -#define DATAFILE "/etc/netgroup" - -libnss_files_hidden_proto (_nss_files_endnetgrent) - -#define EXPAND(needed) \ - do \ - { \ - size_t old_cursor = result->cursor - result->data; \ - void *old_data = result->data; \ - \ - result->data_size += 512 > 2 * needed ? 512 : 2 * needed; \ - result->data = realloc (result->data, result->data_size); \ - \ - if (result->data == NULL) \ - { \ - free (old_data); \ - status = NSS_STATUS_UNAVAIL; \ - goto the_end; \ - } \ - \ - result->cursor = result->data + old_cursor; \ - } \ - while (0) - - -enum nss_status -_nss_files_setnetgrent (const char *group, struct __netgrent *result) -{ - FILE *fp; - enum nss_status status; - - if (group[0] == '\0') - return NSS_STATUS_UNAVAIL; - - /* Find the netgroups file and open it. */ - fp = fopen (DATAFILE, "rce"); - if (fp == NULL) - status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - else - { - /* Read the file line by line and try to find the description - GROUP. We must take care for long lines. */ - char *line = NULL; - size_t line_len = 0; - const ssize_t group_len = strlen (group); - - status = NSS_STATUS_NOTFOUND; - result->cursor = result->data; - - __fsetlocking (fp, FSETLOCKING_BYCALLER); - - while (!feof_unlocked (fp)) - { - ssize_t curlen = getline (&line, &line_len, fp); - int found; - - if (curlen < 0) - { - status = NSS_STATUS_NOTFOUND; - break; - } - - found = (curlen > group_len && strncmp (line, group, group_len) == 0 - && isspace (line[group_len])); - - /* Read the whole line (including continuation) and store it - if FOUND in nonzero. Otherwise we don't need it. */ - if (found) - { - /* Store the data from the first line. */ - EXPAND (curlen - group_len); - memcpy (result->cursor, &line[group_len + 1], - curlen - group_len); - result->cursor += (curlen - group_len) - 1; - } - - while (curlen > 1 && line[curlen - 1] == '\n' - && line[curlen - 2] == '\\') - { - /* Yes, we have a continuation line. */ - if (found) - /* Remove these characters from the stored line. */ - result->cursor -= 2; - - /* Get next line. */ - curlen = getline (&line, &line_len, fp); - if (curlen <= 0) - break; - - if (found) - { - /* Make sure we have enough room. */ - EXPAND (1 + curlen + 1); - - /* Add separator in case next line starts immediately. */ - *result->cursor++ = ' '; - - /* Copy new line. */ - memcpy (result->cursor, line, curlen + 1); - result->cursor += curlen; - } - } - - if (found) - { - /* Now we have read the line. */ - status = NSS_STATUS_SUCCESS; - result->cursor = result->data; - result->first = 1; - break; - } - } - - the_end: - /* We don't need the file and the line buffer anymore. */ - free (line); - fclose (fp); - - if (status != NSS_STATUS_SUCCESS) - _nss_files_endnetgrent (result); - } - - return status; -} - - -enum nss_status -_nss_files_endnetgrent (struct __netgrent *result) -{ - /* Free allocated memory for data if some is present. */ - free (result->data); - result->data = NULL; - result->data_size = 0; - result->cursor = NULL; - return NSS_STATUS_SUCCESS; -} -libnss_files_hidden_def (_nss_files_endnetgrent) - -static char * -strip_whitespace (char *str) -{ - char *cp = str; - - /* Skip leading spaces. */ - while (isspace (*cp)) - cp++; - - str = cp; - while (*cp != '\0' && ! isspace(*cp)) - cp++; - - /* Null-terminate, stripping off any trailing spaces. */ - *cp = '\0'; - - return *str == '\0' ? NULL : str; -} - -enum nss_status -_nss_netgroup_parseline (char **cursor, struct __netgrent *result, - char *buffer, size_t buflen, int *errnop) -{ - enum nss_status status; - const char *host, *user, *domain; - char *cp = *cursor; - - /* Some sanity checks. */ - if (cp == NULL) - return NSS_STATUS_NOTFOUND; - - /* First skip leading spaces. */ - while (isspace (*cp)) - ++cp; - - if (*cp != '(') - { - /* We have a list of other netgroups. */ - char *name = cp; - - while (*cp != '\0' && ! isspace (*cp)) - ++cp; - - if (name != cp) - { - /* It is another netgroup name. */ - int last = *cp == '\0'; - - result->type = group_val; - result->val.group = name; - *cp = '\0'; - if (! last) - ++cp; - *cursor = cp; - result->first = 0; - - return NSS_STATUS_SUCCESS; - } - - return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; - } - - /* Match host name. */ - host = ++cp; - while (*cp != ',') - if (*cp++ == '\0') - return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; - - /* Match user name. */ - user = ++cp; - while (*cp != ',') - if (*cp++ == '\0') - return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; - - /* Match domain name. */ - domain = ++cp; - while (*cp != ')') - if (*cp++ == '\0') - return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; - ++cp; - - - /* When we got here we have found an entry. Before we can copy it - to the private buffer we have to make sure it is big enough. */ - if (cp - host > buflen) - { - *errnop = ERANGE; - status = NSS_STATUS_TRYAGAIN; - } - else - { - memcpy (buffer, host, cp - host); - result->type = triple_val; - - buffer[(user - host) - 1] = '\0'; /* Replace ',' with '\0'. */ - result->val.triple.host = strip_whitespace (buffer); - - buffer[(domain - host) - 1] = '\0'; /* Replace ',' with '\0'. */ - result->val.triple.user = strip_whitespace (buffer + (user - host)); - - buffer[(cp - host) - 1] = '\0'; /* Replace ')' with '\0'. */ - result->val.triple.domain = strip_whitespace (buffer + (domain - host)); - - status = NSS_STATUS_SUCCESS; - - /* Remember where we stopped reading. */ - *cursor = cp; - - result->first = 0; - } - - return status; -} -libnss_files_hidden_def (_nss_netgroup_parseline) - - -enum nss_status -_nss_files_getnetgrent_r (struct __netgrent *result, char *buffer, - size_t buflen, int *errnop) -{ - enum nss_status status; - - status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen, - errnop); - - return status; -} diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c deleted file mode 100644 index 1fbd60fcf2..0000000000 --- a/nss/nss_files/files-network.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Networks file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <stdint.h> - -#define ENTNAME netent -#define DATABASE "networks" -#define NEED_H_ERRNO - -struct netent_data {}; - -#define TRAILING_LIST_MEMBER n_aliases -#define TRAILING_LIST_SEPARATOR_P isspace -#include "files-parse.c" -LINE_PARSER -("#", - { - char *addr; - char *cp; - int n = 1; - - STRING_FIELD (result->n_name, isspace, 1); - - STRING_FIELD (addr, isspace, 1); - /* 'inet_network' does not add zeroes at the end if the network number - does not four byte values. We add them outselves if necessary. */ - cp = strchr (addr, '.'); - if (cp != NULL) - { - ++n; - cp = strchr (cp + 1, '.'); - if (cp != NULL) - { - ++n; - cp = strchr (cp + 1, '.'); - if (cp != NULL) - ++n; - } - } - if (n < 4) - { - char *newp = (char *) alloca (strlen (addr) + (4 - n) * 2 + 1); - cp = stpcpy (newp, addr); - do - { - *cp++ = '.'; - *cp++ = '0'; - } - while (++n < 4); - *cp = '\0'; - addr = newp; - } - result->n_net = inet_network (addr); - result->n_addrtype = AF_INET; - - }) - -#include "files-XXX.c" - -DB_LOOKUP (netbyname, ,,, - LOOKUP_NAME_CASE (n_name, n_aliases), - const char *name) - -DB_LOOKUP (netbyaddr, ,,, - { - if ((type == AF_UNSPEC || result->n_addrtype == type) - && result->n_net == net) - /* Bingo! */ - break; - }, uint32_t net, int type) diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c deleted file mode 100644 index b31ff9e17b..0000000000 --- a/nss/nss_files/files-parse.c +++ /dev/null @@ -1,335 +0,0 @@ -/* Common code for file-based database parsers in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <stdint.h> - -/* These symbols are defined by the including source file: - - ENTNAME -- database name of the structure and functions (hostent, pwent). - STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). - DATABASE -- string of the database file's name ("hosts", "passwd"). - - ENTDATA -- if defined, `struct ENTDATA' is used by the parser to store - things pointed to by the resultant `struct STRUCTURE'. - - NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. - - EXTRA_ARGS -- defined iff extra parameters must be passed to the parser - EXTRA_ARGS_DECL -- declaration for these extra parameters - EXTRA_ARGS_VALUE -- values to be passed for these parameters - - Also see files-XXX.c. */ - -#ifndef EXTRA_ARGS -# define EXTRA_ARGS -# define EXTRA_ARGS_DECL -# define EXTRA_ARGS_VALUE -#endif - -#define CONCAT(a,b) CONCAT1(a,b) -#define CONCAT1(a,b) a##b - -#ifndef STRUCTURE -# define STRUCTURE ENTNAME -#endif - - -struct parser_data - { -#ifdef ENTDATA - struct ENTDATA entdata; -# define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata; -#else -# define ENTDATA_DECL(data) -#endif - char linebuffer[0]; - }; - -#ifdef ENTDATA -/* The function can't be exported, because the entdata structure - is defined only in files-foo.c. */ -# define parser_stclass static -# define nss_files_parse_hidden_def(name) -#else -/* Export the line parser function so it can be used in nss_db. */ -# define parser_stclass /* Global */ -# define parse_line CONCAT(_nss_files_parse_,ENTNAME) -# if IS_IN (libc) -/* We are defining one of the functions that actually lives in libc - because it is used to implement fget*ent and suchlike. */ -# define nss_files_parse_hidden_def(name) libc_hidden_def (name) -# else -# define nss_files_parse_hidden_def(name) libnss_files_hidden_def (name) -# endif -#endif - - -#ifdef EXTERN_PARSER - -/* The parser is defined in a different module. */ -extern int parse_line (char *line, struct STRUCTURE *result, - struct parser_data *data, size_t datalen, int *errnop - EXTRA_ARGS_DECL); - -# define LINE_PARSER(EOLSET, BODY) /* Do nothing */ - -#else - -/* Define a line parsing function. */ - -# define LINE_PARSER(EOLSET, BODY) \ -parser_stclass int \ -parse_line (char *line, struct STRUCTURE *result, \ - struct parser_data *data, size_t datalen, int *errnop \ - EXTRA_ARGS_DECL) \ -{ \ - ENTDATA_DECL (data) \ - BUFFER_PREPARE \ - char *p = strpbrk (line, EOLSET "\n"); \ - if (p != NULL) \ - *p = '\0'; \ - BODY; \ - TRAILING_LIST_PARSER; \ - return 1; \ -} \ -nss_files_parse_hidden_def (parse_line) - - -# define STRING_FIELD(variable, terminator_p, swallow) \ - { \ - variable = line; \ - while (*line != '\0' && !terminator_p (*line)) \ - ++line; \ - if (*line != '\0') \ - { \ - *line = '\0'; \ - do \ - ++line; \ - while (swallow && terminator_p (*line)); \ - } \ - } - -# define STRING_LIST(variable, terminator_c) \ - { \ - char **list = parse_list (&line, buf_start, buf_end, terminator_c, \ - errnop); \ - if (list) \ - variable = list; \ - else \ - return -1; /* -1 indicates we ran out of space. */ \ - \ - /* Determine the new end of the buffer. */ \ - while (*list != NULL) \ - ++list; \ - buf_start = (char *) (list + 1); \ - } - -/* Helper function. */ -static inline uint32_t -__attribute__ ((always_inline)) -strtou32 (const char *nptr, char **endptr, int base) -{ - unsigned long int val = strtoul (nptr, endptr, base); - - /* Match the 32-bit behavior on 64-bit platforms. */ - if (sizeof (long int) > 4 && val > 0xffffffff) - val = 0xffffffff; - - return val; -} - -# define INT_FIELD(variable, terminator_p, swallow, base, convert) \ - { \ - char *endp; \ - variable = convert (strtou32 (line, &endp, base)); \ - if (endp == line) \ - return 0; \ - else if (terminator_p (*endp)) \ - do \ - ++endp; \ - while (swallow && terminator_p (*endp)); \ - else if (*endp != '\0') \ - return 0; \ - line = endp; \ - } - -# define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default) \ - { \ - char *endp; \ - if (*line == '\0') \ - /* We expect some more input, so don't allow the string to end here. */ \ - return 0; \ - variable = convert (strtou32 (line, &endp, base)); \ - if (endp == line) \ - variable = default; \ - if (terminator_p (*endp)) \ - do \ - ++endp; \ - while (swallow && terminator_p (*endp)); \ - else if (*endp != '\0') \ - return 0; \ - line = endp; \ - } - -# define ISCOLON(c) ((c) == ':') - - -# ifndef TRAILING_LIST_MEMBER -# define BUFFER_PREPARE /* Nothing to do. */ -# define TRAILING_LIST_PARSER /* Nothing to do. */ -# else - -# define BUFFER_PREPARE \ - char *buf_start = NULL; \ - char *buf_end = (char *) data + datalen; \ - if (line >= data->linebuffer && line < buf_end) \ - /* Find the end of the line buffer, we will use the space in \ - DATA after it for storing the vector of pointers. */ \ - buf_start = strchr (line, '\0') + 1; \ - else \ - /* LINE does not point within DATA->linebuffer, so that space is \ - not being used for scratch space right now. We can use all of \ - it for the pointer vector storage. */ \ - buf_start = data->linebuffer; \ - -# define TRAILING_LIST_PARSER \ -{ \ - if (buf_start == NULL) \ - { \ - if (line >= data->linebuffer && line < buf_end) \ - /* Find the end of the line buffer, we will use the space in \ - DATA after it for storing the vector of pointers. */ \ - buf_start = strchr (line, '\0') + 1; \ - else \ - /* LINE does not point within DATA->linebuffer, so that space is \ - not being used for scratch space right now. We can use all of \ - it for the pointer vector storage. */ \ - buf_start = data->linebuffer; \ - } \ - \ - char **list = parse_list (&line, buf_start, buf_end, '\0', errnop); \ - if (list) \ - result->TRAILING_LIST_MEMBER = list; \ - else \ - return -1; /* -1 indicates we ran out of space. */ \ -} - -static inline char ** -__attribute ((always_inline)) -parse_list (char **linep, char *eol, char *buf_end, int terminator_c, - int *errnop) -{ - char *line = *linep; - char **list, **p; - - /* Adjust the pointer so it is aligned for storing pointers. */ - eol += __alignof__ (char *) - 1; - eol -= (eol - (char *) 0) % __alignof__ (char *); - /* We will start the storage here for the vector of pointers. */ - list = (char **) eol; - - p = list; - while (1) - { - if ((char *) (p + 2) > buf_end) - { - /* We cannot fit another pointer in the buffer. */ - *errnop = ERANGE; - return NULL; - } - - if (*line == '\0') - break; - if (*line == terminator_c) - { - ++line; - break; - } - - /* Skip leading white space. This might not be portable but useful. */ - while (isspace (*line)) - ++line; - - char *elt = line; - while (1) - { - if (*line == '\0' || *line == terminator_c - || TRAILING_LIST_SEPARATOR_P (*line)) - { - /* End of the next entry. */ - if (line > elt) - /* We really found some data. */ - *p++ = elt; - - /* Terminate string if necessary. */ - if (*line != '\0') - { - char endc = *line; - *line++ = '\0'; - if (endc == terminator_c) - goto out; - } - break; - } - ++line; - } - } - out: - *p = NULL; - *linep = line; - - return list; -} - -# endif /* TRAILING_LIST_MEMBER */ -#endif /* EXTERN_PARSER */ - - -#define LOOKUP_NAME(nameelt, aliaselt) \ -{ \ - char **ap; \ - if (! strcmp (name, result->nameelt)) \ - break; \ - for (ap = result->aliaselt; *ap; ++ap) \ - if (! strcmp (name, *ap)) \ - break; \ - if (*ap) \ - break; \ -} - -#define LOOKUP_NAME_CASE(nameelt, aliaselt) \ -{ \ - char **ap; \ - if (! __strcasecmp (name, result->nameelt)) \ - break; \ - for (ap = result->aliaselt; *ap; ++ap) \ - if (! __strcasecmp (name, *ap)) \ - break; \ - if (*ap) \ - break; \ -} - - -/* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead. */ -#ifndef GENERIC -# define GENERIC "files-XXX.c" -#endif diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c deleted file mode 100644 index 5402a7a300..0000000000 --- a/nss/nss_files/files-proto.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Protocols file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <netdb.h> - - -#define ENTNAME protoent -#define DATABASE "protocols" - -struct protoent_data {}; - -#define TRAILING_LIST_MEMBER p_aliases -#define TRAILING_LIST_SEPARATOR_P isspace -#include "files-parse.c" -LINE_PARSER -("#", - STRING_FIELD (result->p_name, isspace, 1); - INT_FIELD (result->p_proto, isspace, 1, 10,); - ) - -#include GENERIC - -DB_LOOKUP (protobyname, '.', 0, ("%s", name), - LOOKUP_NAME (p_name, p_aliases), - const char *name) - -DB_LOOKUP (protobynumber, '=', 20, ("%zd", (ssize_t) proto), - { - if (result->p_proto == proto) - break; - }, int proto) diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c deleted file mode 100644 index 62c597703a..0000000000 --- a/nss/nss_files/files-pwd.c +++ /dev/null @@ -1,44 +0,0 @@ -/* User file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <pwd.h> - -#define STRUCTURE passwd -#define ENTNAME pwent -#define DATABASE "passwd" -struct pwent_data {}; - -/* Our parser function is already defined in fgetpwent_r.c, so use that - to parse lines from the database file. */ -#define EXTERN_PARSER -#include "files-parse.c" -#include GENERIC - -DB_LOOKUP (pwnam, '.', 0, ("%s", name), - { - if (name[0] != '+' && name[0] != '-' - && ! strcmp (name, result->pw_name)) - break; - }, const char *name) - -DB_LOOKUP (pwuid, '=', 20, ("%lu", (unsigned long int) uid), - { - if (result->pw_uid == uid && result->pw_name[0] != '+' - && result->pw_name[0] != '-') - break; - }, uid_t uid) diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c deleted file mode 100644 index 8ee0d19f32..0000000000 --- a/nss/nss_files/files-rpc.c +++ /dev/null @@ -1,46 +0,0 @@ -/* SunRPC program number file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <rpc/netdb.h> - - -#define ENTNAME rpcent -#define DATABASE "rpc" - -struct rpcent_data {}; - -#define TRAILING_LIST_MEMBER r_aliases -#define TRAILING_LIST_SEPARATOR_P isspace -#include "files-parse.c" -LINE_PARSER -("#", - STRING_FIELD (result->r_name, isspace, 1); - INT_FIELD (result->r_number, isspace, 1, 10,); - ) - -#include GENERIC - -DB_LOOKUP (rpcbyname, '.', 0, ("%s", name), - LOOKUP_NAME (r_name, r_aliases), - const char *name) - -DB_LOOKUP (rpcbynumber, '=', 20, ("%zd", (ssize_t) number), - { - if (result->r_number == number) - break; - }, int number) diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c deleted file mode 100644 index b6ae51082f..0000000000 --- a/nss/nss_files/files-service.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Services file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <netinet/in.h> -#include <netdb.h> - - -#define ENTNAME servent -#define DATABASE "services" - -struct servent_data {}; - -#define TRAILING_LIST_MEMBER s_aliases -#define TRAILING_LIST_SEPARATOR_P isspace -#include "files-parse.c" -#define ISSLASH(c) ((c) == '/') -LINE_PARSER -("#", - STRING_FIELD (result->s_name, isspace, 1); - INT_FIELD (result->s_port, ISSLASH, 10, 0, htons); - STRING_FIELD (result->s_proto, isspace, 1); - ) - -#include GENERIC - -DB_LOOKUP (servbyname, ':', - strlen (name) + 2 + (proto == NULL ? 0 : strlen (proto)), - ("%s/%s", name, proto ?: ""), - { - /* Must match both protocol (if specified) and name. */ - if (proto != NULL && strcmp (result->s_proto, proto)) - /* A continue statement here breaks nss_db, because it - bypasses advancing to the next db entry, and it - doesn't make nss_files any more efficient. */; - else - LOOKUP_NAME (s_name, s_aliases) - }, - const char *name, const char *proto) - -DB_LOOKUP (servbyport, '=', 21 + (proto ? strlen (proto) : 0), - ("%zd/%s", (ssize_t) ntohs (port), proto ?: ""), - { - /* Must match both port and protocol. */ - if (result->s_port == port - && (proto == NULL - || strcmp (result->s_proto, proto) == 0)) - break; - }, int port, const char *proto) diff --git a/nss/nss_files/files-sgrp.c b/nss/nss_files/files-sgrp.c deleted file mode 100644 index 03b7da5e2f..0000000000 --- a/nss/nss_files/files-sgrp.c +++ /dev/null @@ -1,37 +0,0 @@ -/* User file parser in nss_files module. - Copyright (C) 2009-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 - <http://www.gnu.org/licenses/>. */ - -#include <gshadow.h> - -#define STRUCTURE sgrp -#define ENTNAME sgent -#define DATABASE "gshadow" -struct sgent_data {}; - -/* Our parser function is already defined in sgetspent_r.c, so use that - to parse lines from the database file. */ -#define EXTERN_PARSER -#include "files-parse.c" -#include GENERIC - -DB_LOOKUP (sgnam, '.', 0, ("%s", name), - { - if (name[0] != '+' && name[0] != '-' - && ! strcmp (name, result->sg_namp)) - break; - }, const char *name) diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c deleted file mode 100644 index 7f13562acb..0000000000 --- a/nss/nss_files/files-spwd.c +++ /dev/null @@ -1,37 +0,0 @@ -/* User file parser in nss_files module. - Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#include <shadow.h> - -#define STRUCTURE spwd -#define ENTNAME spent -#define DATABASE "shadow" -struct spent_data {}; - -/* Our parser function is already defined in sgetspent_r.c, so use that - to parse lines from the database file. */ -#define EXTERN_PARSER -#include "files-parse.c" -#include GENERIC - -DB_LOOKUP (spnam, '.', 0, ("%s", name), - { - if (name[0] != '+' && name[0] != '-' - && ! strcmp (name, result->sp_namp)) - break; - }, const char *name) diff --git a/nss/nss_test1.c b/nss/nss_test1.c deleted file mode 100644 index 3beb488fcf..0000000000 --- a/nss/nss_test1.c +++ /dev/null @@ -1,154 +0,0 @@ -#include <errno.h> -#include <nss.h> -#include <pthread.h> -#include <string.h> - - -#define COPY_IF_ROOM(s) \ - ({ size_t len_ = strlen (s) + 1; \ - char *start_ = cp; \ - buflen - (cp - buffer) < len_ \ - ? NULL \ - : (cp = mempcpy (cp, s, len_), start_); }) - - -/* Password handling. */ -#include <pwd.h> - -static struct passwd pwd_data[] = - { -#define PWD(u) \ - { .pw_name = (char *) "name" #u, .pw_passwd = (char *) "*", .pw_uid = u, \ - .pw_gid = 100, .pw_gecos = (char *) "*", .pw_dir = (char *) "*", \ - .pw_shell = (char *) "*" } - PWD (100), - PWD (30), - PWD (200), - PWD (60), - PWD (20000) - }; -#define npwd_data (sizeof (pwd_data) / sizeof (pwd_data[0])) - -static size_t pwd_iter; -#define CURPWD pwd_data[pwd_iter] - -static pthread_mutex_t pwd_lock = PTHREAD_MUTEX_INITIALIZER; - - -enum nss_status -_nss_test1_setpwent (int stayopen) -{ - pwd_iter = 0; - return NSS_STATUS_SUCCESS; -} - - -enum nss_status -_nss_test1_endpwent (void) -{ - return NSS_STATUS_SUCCESS; -} - - -enum nss_status -_nss_test1_getpwent_r (struct passwd *result, char *buffer, size_t buflen, - int *errnop) -{ - char *cp = buffer; - int res = NSS_STATUS_SUCCESS; - - pthread_mutex_lock (&pwd_lock); - - if (pwd_iter >= npwd_data) - res = NSS_STATUS_NOTFOUND; - else - { - result->pw_name = COPY_IF_ROOM (CURPWD.pw_name); - result->pw_passwd = COPY_IF_ROOM (CURPWD.pw_passwd); - result->pw_uid = CURPWD.pw_uid; - result->pw_gid = CURPWD.pw_gid; - result->pw_gecos = COPY_IF_ROOM (CURPWD.pw_gecos); - result->pw_dir = COPY_IF_ROOM (CURPWD.pw_dir); - result->pw_shell = COPY_IF_ROOM (CURPWD.pw_shell); - - if (result->pw_name == NULL || result->pw_passwd == NULL - || result->pw_gecos == NULL || result->pw_dir == NULL - || result->pw_shell == NULL) - { - *errnop = ERANGE; - res = NSS_STATUS_TRYAGAIN; - } - - ++pwd_iter; - } - - pthread_mutex_unlock (&pwd_lock); - - return res; -} - - -enum nss_status -_nss_test1_getpwuid_r (uid_t uid, struct passwd *result, char *buffer, - size_t buflen, int *errnop) -{ - for (size_t idx = 0; idx < npwd_data; ++idx) - if (pwd_data[idx].pw_uid == uid) - { - char *cp = buffer; - int res = NSS_STATUS_SUCCESS; - - result->pw_name = COPY_IF_ROOM (pwd_data[idx].pw_name); - result->pw_passwd = COPY_IF_ROOM (pwd_data[idx].pw_passwd); - result->pw_uid = pwd_data[idx].pw_uid; - result->pw_gid = pwd_data[idx].pw_gid; - result->pw_gecos = COPY_IF_ROOM (pwd_data[idx].pw_gecos); - result->pw_dir = COPY_IF_ROOM (pwd_data[idx].pw_dir); - result->pw_shell = COPY_IF_ROOM (pwd_data[idx].pw_shell); - - if (result->pw_name == NULL || result->pw_passwd == NULL - || result->pw_gecos == NULL || result->pw_dir == NULL - || result->pw_shell == NULL) - { - *errnop = ERANGE; - res = NSS_STATUS_TRYAGAIN; - } - - return res; - } - - return NSS_STATUS_NOTFOUND; -} - - -enum nss_status -_nss_test1_getpwnam_r (const char *name, struct passwd *result, char *buffer, - size_t buflen, int *errnop) -{ - for (size_t idx = 0; idx < npwd_data; ++idx) - if (strcmp (pwd_data[idx].pw_name, name) == 0) - { - char *cp = buffer; - int res = NSS_STATUS_SUCCESS; - - result->pw_name = COPY_IF_ROOM (pwd_data[idx].pw_name); - result->pw_passwd = COPY_IF_ROOM (pwd_data[idx].pw_passwd); - result->pw_uid = pwd_data[idx].pw_uid; - result->pw_gid = pwd_data[idx].pw_gid; - result->pw_gecos = COPY_IF_ROOM (pwd_data[idx].pw_gecos); - result->pw_dir = COPY_IF_ROOM (pwd_data[idx].pw_dir); - result->pw_shell = COPY_IF_ROOM (pwd_data[idx].pw_shell); - - if (result->pw_name == NULL || result->pw_passwd == NULL - || result->pw_gecos == NULL || result->pw_dir == NULL - || result->pw_shell == NULL) - { - *errnop = ERANGE; - res = NSS_STATUS_TRYAGAIN; - } - - return res; - } - - return NSS_STATUS_NOTFOUND; -} diff --git a/nss/nsswitch.c b/nss/nsswitch.c deleted file mode 100644 index 8f31658523..0000000000 --- a/nss/nsswitch.c +++ /dev/null @@ -1,931 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <dlfcn.h> -#include <errno.h> -#include <netdb.h> -#include <libc-lock.h> -#include <search.h> -#include <stdio.h> -#include <stdio_ext.h> -#include <stdlib.h> -#include <string.h> - -#include <aliases.h> -#include <grp.h> -#include <netinet/ether.h> -#include <pwd.h> -#include <shadow.h> - -#if !defined DO_STATIC_NSS || defined SHARED -# include <gnu/lib-names.h> -#endif - -#include "nsswitch.h" -#include "../nscd/nscd_proto.h" -#include <sysdep.h> - -/* Prototypes for the local functions. */ -static name_database *nss_parse_file (const char *fname) internal_function; -static name_database_entry *nss_getline (char *line) internal_function; -static service_user *nss_parse_service_list (const char *line) - internal_function; -#if !defined DO_STATIC_NSS || defined SHARED -static service_library *nss_new_service (name_database *database, - const char *name) internal_function; -#endif - - -/* Declare external database variables. */ -#define DEFINE_DATABASE(name) \ - extern service_user *__nss_##name##_database attribute_hidden; \ - weak_extern (__nss_##name##_database) -#include "databases.def" -#undef DEFINE_DATABASE - -/* Structure to map database name to variable. */ -static const struct -{ - const char name[10]; - service_user **dbp; -} databases[] = -{ -#define DEFINE_DATABASE(name) \ - { #name, &__nss_##name##_database }, -#include "databases.def" -#undef DEFINE_DATABASE -}; -#define ndatabases (sizeof (databases) / sizeof (databases[0])) - -/* Flags whether custom rules for database is set. */ -bool __nss_database_custom[NSS_DBSIDX_max]; - - -__libc_lock_define_initialized (static, lock) - -#if !defined DO_STATIC_NSS || defined SHARED -/* String with revision number of the shared object files. */ -static const char *const __nss_shlib_revision = LIBNSS_FILES_SO + 15; -#endif - -/* The root of the whole data base. */ -static name_database *service_table; - -/* List of default service lists that were generated by glibc because - /etc/nsswitch.conf did not provide a value. - The list is only maintained so we can free such service lists in - __libc_freeres. */ -static name_database_entry *defconfig_entries; - - -#if defined USE_NSCD && (!defined DO_STATIC_NSS || defined SHARED) -/* Nonzero if this is the nscd process. */ -static bool is_nscd; -/* The callback passed to the init functions when nscd is used. */ -static void (*nscd_init_cb) (size_t, struct traced_file *); -#endif - - -/* -1 == database not found - 0 == database entry pointer stored */ -int -__nss_database_lookup (const char *database, const char *alternate_name, - const char *defconfig, service_user **ni) -{ - /* Prevent multiple threads to change the service table. */ - __libc_lock_lock (lock); - - /* Reconsider database variable in case some other thread called - `__nss_configure_lookup' while we waited for the lock. */ - if (*ni != NULL) - { - __libc_lock_unlock (lock); - return 0; - } - - /* Are we initialized yet? */ - if (service_table == NULL) - /* Read config file. */ - service_table = nss_parse_file (_PATH_NSSWITCH_CONF); - - /* Test whether configuration data is available. */ - if (service_table != NULL) - { - /* Return first `service_user' entry for DATABASE. */ - name_database_entry *entry; - - /* XXX Could use some faster mechanism here. But each database is - only requested once and so this might not be critical. */ - for (entry = service_table->entry; entry != NULL; entry = entry->next) - if (strcmp (database, entry->name) == 0) - *ni = entry->service; - - if (*ni == NULL && alternate_name != NULL) - /* We haven't found an entry so far. Try to find it with the - alternative name. */ - for (entry = service_table->entry; entry != NULL; entry = entry->next) - if (strcmp (alternate_name, entry->name) == 0) - *ni = entry->service; - } - - /* No configuration data is available, either because nsswitch.conf - doesn't exist or because it doesn't have a line for this database. - - DEFCONFIG specifies the default service list for this database, - or null to use the most common default. */ - if (*ni == NULL) - { - *ni = nss_parse_service_list (defconfig - ?: "nis [NOTFOUND=return] files"); - if (*ni != NULL) - { - /* Record the memory we've just allocated in defconfig_entries list, - so we can free it later. */ - name_database_entry *entry; - - /* Allocate ENTRY plus size of name (1 here). */ - entry = (name_database_entry *) malloc (sizeof (*entry) + 1); - - if (entry != NULL) - { - entry->next = defconfig_entries; - entry->service = *ni; - entry->name[0] = '\0'; - defconfig_entries = entry; - } - } - } - - __libc_lock_unlock (lock); - - return *ni != NULL ? 0 : -1; -} -libc_hidden_def (__nss_database_lookup) - - -/* -1 == not found - 0 == function found - 1 == finished */ -int -__nss_lookup (service_user **ni, const char *fct_name, const char *fct2_name, - void **fctp) -{ - *fctp = __nss_lookup_function (*ni, fct_name); - if (*fctp == NULL && fct2_name != NULL) - *fctp = __nss_lookup_function (*ni, fct2_name); - - while (*fctp == NULL - && nss_next_action (*ni, NSS_STATUS_UNAVAIL) == NSS_ACTION_CONTINUE - && (*ni)->next != NULL) - { - *ni = (*ni)->next; - - *fctp = __nss_lookup_function (*ni, fct_name); - if (*fctp == NULL && fct2_name != NULL) - *fctp = __nss_lookup_function (*ni, fct2_name); - } - - return *fctp != NULL ? 0 : (*ni)->next == NULL ? 1 : -1; -} -libc_hidden_def (__nss_lookup) - - -/* -1 == not found - 0 == adjusted for next function - 1 == finished */ -int -__nss_next2 (service_user **ni, const char *fct_name, const char *fct2_name, - void **fctp, int status, int all_values) -{ - if (all_values) - { - if (nss_next_action (*ni, NSS_STATUS_TRYAGAIN) == NSS_ACTION_RETURN - && nss_next_action (*ni, NSS_STATUS_UNAVAIL) == NSS_ACTION_RETURN - && nss_next_action (*ni, NSS_STATUS_NOTFOUND) == NSS_ACTION_RETURN - && nss_next_action (*ni, NSS_STATUS_SUCCESS) == NSS_ACTION_RETURN) - return 1; - } - else - { - /* This is really only for debugging. */ - if (__builtin_expect (NSS_STATUS_TRYAGAIN > status - || status > NSS_STATUS_RETURN, 0)) - __libc_fatal ("illegal status in __nss_next"); - - if (nss_next_action (*ni, status) == NSS_ACTION_RETURN) - return 1; - } - - if ((*ni)->next == NULL) - return -1; - - do - { - *ni = (*ni)->next; - - *fctp = __nss_lookup_function (*ni, fct_name); - if (*fctp == NULL && fct2_name != NULL) - *fctp = __nss_lookup_function (*ni, fct2_name); - } - while (*fctp == NULL - && nss_next_action (*ni, NSS_STATUS_UNAVAIL) == NSS_ACTION_CONTINUE - && (*ni)->next != NULL); - - return *fctp != NULL ? 0 : -1; -} -libc_hidden_def (__nss_next2) - - -int -attribute_compat_text_section -__nss_next (service_user **ni, const char *fct_name, void **fctp, int status, - int all_values) -{ - return __nss_next2 (ni, fct_name, NULL, fctp, status, all_values); -} - - -int -__nss_configure_lookup (const char *dbname, const char *service_line) -{ - service_user *new_db; - size_t cnt; - - for (cnt = 0; cnt < ndatabases; ++cnt) - { - int cmp = strcmp (dbname, databases[cnt].name); - if (cmp == 0) - break; - if (cmp < 0) - { - __set_errno (EINVAL); - return -1; - } - } - - if (cnt == ndatabases) - { - __set_errno (EINVAL); - return -1; - } - - /* Test whether it is really used. */ - if (databases[cnt].dbp == NULL) - /* Nothing to do, but we could do. */ - return 0; - - /* Try to generate new data. */ - new_db = nss_parse_service_list (service_line); - if (new_db == NULL) - { - /* Illegal service specification. */ - __set_errno (EINVAL); - return -1; - } - - /* Prevent multiple threads to change the service table. */ - __libc_lock_lock (lock); - - /* Install new rules. */ - *databases[cnt].dbp = new_db; - __nss_database_custom[cnt] = true; - - __libc_lock_unlock (lock); - - return 0; -} - - -/* Comparison function for searching NI->known tree. */ -static int -known_compare (const void *p1, const void *p2) -{ - return p1 == p2 ? 0 : strcmp (*(const char *const *) p1, - *(const char *const *) p2); -} - - -#if !defined DO_STATIC_NSS || defined SHARED -/* Load library. */ -static int -nss_load_library (service_user *ni) -{ - if (ni->library == NULL) - { - /* This service has not yet been used. Fetch the service - library for it, creating a new one if need be. If there - is no service table from the file, this static variable - holds the head of the service_library list made from the - default configuration. */ - static name_database default_table; - ni->library = nss_new_service (service_table ?: &default_table, - ni->name); - if (ni->library == NULL) - return -1; - } - - if (ni->library->lib_handle == NULL) - { - /* Load the shared library. */ - size_t shlen = (7 + strlen (ni->name) + 3 - + strlen (__nss_shlib_revision) + 1); - int saved_errno = errno; - char shlib_name[shlen]; - - /* Construct shared object name. */ - __stpcpy (__stpcpy (__stpcpy (__stpcpy (shlib_name, - "libnss_"), - ni->name), - ".so"), - __nss_shlib_revision); - - ni->library->lib_handle = __libc_dlopen (shlib_name); - if (ni->library->lib_handle == NULL) - { - /* Failed to load the library. */ - ni->library->lib_handle = (void *) -1l; - __set_errno (saved_errno); - } -# ifdef USE_NSCD - else if (is_nscd) - { - /* Call the init function when nscd is used. */ - size_t initlen = (5 + strlen (ni->name) - + strlen ("_init") + 1); - char init_name[initlen]; - - /* Construct the init function name. */ - __stpcpy (__stpcpy (__stpcpy (init_name, - "_nss_"), - ni->name), - "_init"); - - /* Find the optional init function. */ - void (*ifct) (void (*) (size_t, struct traced_file *)) - = __libc_dlsym (ni->library->lib_handle, init_name); - if (ifct != NULL) - { - void (*cb) (size_t, struct traced_file *) = nscd_init_cb; -# ifdef PTR_DEMANGLE - PTR_DEMANGLE (cb); -# endif - ifct (cb); - } - } -# endif - } - - return 0; -} -#endif - - -void * -__nss_lookup_function (service_user *ni, const char *fct_name) -{ - void **found, *result; - - /* We now modify global data. Protect it. */ - __libc_lock_lock (lock); - - /* Search the tree of functions previously requested. Data in the - tree are `known_function' structures, whose first member is a - `const char *', the lookup key. The search returns a pointer to - the tree node structure; the first member of the is a pointer to - our structure (i.e. what will be a `known_function'); since the - first member of that is the lookup key string, &FCT_NAME is close - enough to a pointer to our structure to use as a lookup key that - will be passed to `known_compare' (above). */ - - found = __tsearch (&fct_name, &ni->known, &known_compare); - if (found == NULL) - /* This means out-of-memory. */ - result = NULL; - else if (*found != &fct_name) - { - /* The search found an existing structure in the tree. */ - result = ((known_function *) *found)->fct_ptr; -#ifdef PTR_DEMANGLE - PTR_DEMANGLE (result); -#endif - } - else - { - /* This name was not known before. Now we have a node in the tree - (in the proper sorted position for FCT_NAME) that points to - &FCT_NAME instead of any real `known_function' structure. - Allocate a new structure and fill it in. */ - - known_function *known = malloc (sizeof *known); - if (! known) - { -#if !defined DO_STATIC_NSS || defined SHARED - remove_from_tree: -#endif - /* Oops. We can't instantiate this node properly. - Remove it from the tree. */ - __tdelete (&fct_name, &ni->known, &known_compare); - free (known); - result = NULL; - } - else - { - /* Point the tree node at this new structure. */ - *found = known; - known->fct_name = fct_name; - -#if !defined DO_STATIC_NSS || defined SHARED - /* Load the appropriate library. */ - if (nss_load_library (ni) != 0) - /* This only happens when out of memory. */ - goto remove_from_tree; - - if (ni->library->lib_handle == (void *) -1l) - /* Library not found => function not found. */ - result = NULL; - else - { - /* Get the desired function. */ - size_t namlen = (5 + strlen (ni->name) + 1 - + strlen (fct_name) + 1); - char name[namlen]; - - /* Construct the function name. */ - __stpcpy (__stpcpy (__stpcpy (__stpcpy (name, "_nss_"), - ni->name), - "_"), - fct_name); - - /* Look up the symbol. */ - result = __libc_dlsym (ni->library->lib_handle, name); - } -#else - /* We can't get function address dynamically in static linking. */ - { -# define DEFINE_ENT(h,nm) \ - { #h"_get"#nm"ent_r", _nss_##h##_get##nm##ent_r }, \ - { #h"_end"#nm"ent", _nss_##h##_end##nm##ent }, \ - { #h"_set"#nm"ent", _nss_##h##_set##nm##ent }, -# define DEFINE_GET(h,nm) \ - { #h"_get"#nm"_r", _nss_##h##_get##nm##_r }, -# define DEFINE_GETBY(h,nm,ky) \ - { #h"_get"#nm"by"#ky"_r", _nss_##h##_get##nm##by##ky##_r }, - static struct fct_tbl { const char *fname; void *fp; } *tp, tbl[] = - { -# include "function.def" - { NULL, NULL } - }; - size_t namlen = (5 + strlen (ni->name) + 1 - + strlen (fct_name) + 1); - char name[namlen]; - - /* Construct the function name. */ - __stpcpy (__stpcpy (__stpcpy (name, ni->name), - "_"), - fct_name); - - result = NULL; - for (tp = &tbl[0]; tp->fname; tp++) - if (strcmp (tp->fname, name) == 0) - { - result = tp->fp; - break; - } - } -#endif - - /* Remember function pointer for later calls. Even if null, we - record it so a second try needn't search the library again. */ - known->fct_ptr = result; -#ifdef PTR_MANGLE - PTR_MANGLE (known->fct_ptr); -#endif - } - } - - /* Remove the lock. */ - __libc_lock_unlock (lock); - - return result; -} -libc_hidden_def (__nss_lookup_function) - - -static name_database * -internal_function -nss_parse_file (const char *fname) -{ - FILE *fp; - name_database *result; - name_database_entry *last; - char *line; - size_t len; - - /* Open the configuration file. */ - fp = fopen (fname, "rce"); - if (fp == NULL) - return NULL; - - /* No threads use this stream. */ - __fsetlocking (fp, FSETLOCKING_BYCALLER); - - result = (name_database *) malloc (sizeof (name_database)); - if (result == NULL) - { - fclose (fp); - return NULL; - } - - result->entry = NULL; - result->library = NULL; - last = NULL; - line = NULL; - len = 0; - do - { - name_database_entry *this; - ssize_t n; - - n = __getline (&line, &len, fp); - if (n < 0) - break; - if (line[n - 1] == '\n') - line[n - 1] = '\0'; - - /* Because the file format does not know any form of quoting we - can search forward for the next '#' character and if found - make it terminating the line. */ - *__strchrnul (line, '#') = '\0'; - - /* If the line is blank it is ignored. */ - if (line[0] == '\0') - continue; - - /* Each line completely specifies the actions for a database. */ - this = nss_getline (line); - if (this != NULL) - { - if (last != NULL) - last->next = this; - else - result->entry = this; - - last = this; - } - } - while (!feof_unlocked (fp)); - - /* Free the buffer. */ - free (line); - /* Close configuration file. */ - fclose (fp); - - return result; -} - - -/* Read the source names: - `( <source> ( "[" "!"? (<status> "=" <action> )+ "]" )? )*' - */ -static service_user * -internal_function -nss_parse_service_list (const char *line) -{ - service_user *result = NULL, **nextp = &result; - - while (1) - { - service_user *new_service; - const char *name; - - while (isspace (line[0])) - ++line; - if (line[0] == '\0') - /* No source specified. */ - return result; - - /* Read <source> identifier. */ - name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != '[') - ++line; - if (name == line) - return result; - - - new_service = (service_user *) malloc (sizeof (service_user) - + (line - name + 1)); - if (new_service == NULL) - return result; - - *((char *) __mempcpy (new_service->name, name, line - name)) = '\0'; - - /* Set default actions. */ - new_service->actions[2 + NSS_STATUS_TRYAGAIN] = NSS_ACTION_CONTINUE; - new_service->actions[2 + NSS_STATUS_UNAVAIL] = NSS_ACTION_CONTINUE; - new_service->actions[2 + NSS_STATUS_NOTFOUND] = NSS_ACTION_CONTINUE; - new_service->actions[2 + NSS_STATUS_SUCCESS] = NSS_ACTION_RETURN; - new_service->actions[2 + NSS_STATUS_RETURN] = NSS_ACTION_RETURN; - new_service->library = NULL; - new_service->known = NULL; - new_service->next = NULL; - - while (isspace (line[0])) - ++line; - - if (line[0] == '[') - { - /* Read criterions. */ - do - ++line; - while (line[0] != '\0' && isspace (line[0])); - - do - { - int not; - enum nss_status status; - lookup_actions action; - - /* Grok ! before name to mean all statii but that one. */ - not = line[0] == '!'; - if (not) - ++line; - - /* Read status name. */ - name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != '=' - && line[0] != ']') - ++line; - - /* Compare with known statii. */ - if (line - name == 7) - { - if (__strncasecmp (name, "SUCCESS", 7) == 0) - status = NSS_STATUS_SUCCESS; - else if (__strncasecmp (name, "UNAVAIL", 7) == 0) - status = NSS_STATUS_UNAVAIL; - else - goto finish; - } - else if (line - name == 8) - { - if (__strncasecmp (name, "NOTFOUND", 8) == 0) - status = NSS_STATUS_NOTFOUND; - else if (__strncasecmp (name, "TRYAGAIN", 8) == 0) - status = NSS_STATUS_TRYAGAIN; - else - goto finish; - } - else - goto finish; - - while (isspace (line[0])) - ++line; - if (line[0] != '=') - goto finish; - do - ++line; - while (isspace (line[0])); - - name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != '=' - && line[0] != ']') - ++line; - - if (line - name == 6 && __strncasecmp (name, "RETURN", 6) == 0) - action = NSS_ACTION_RETURN; - else if (line - name == 8 - && __strncasecmp (name, "CONTINUE", 8) == 0) - action = NSS_ACTION_CONTINUE; - else if (line - name == 5 - && __strncasecmp (name, "MERGE", 5) == 0) - action = NSS_ACTION_MERGE; - else - goto finish; - - if (not) - { - /* Save the current action setting for this status, - set them all to the given action, and reset this one. */ - const lookup_actions save = new_service->actions[2 + status]; - new_service->actions[2 + NSS_STATUS_TRYAGAIN] = action; - new_service->actions[2 + NSS_STATUS_UNAVAIL] = action; - new_service->actions[2 + NSS_STATUS_NOTFOUND] = action; - new_service->actions[2 + NSS_STATUS_SUCCESS] = action; - new_service->actions[2 + status] = save; - } - else - new_service->actions[2 + status] = action; - - /* Skip white spaces. */ - while (isspace (line[0])) - ++line; - } - while (line[0] != ']'); - - /* Skip the ']'. */ - ++line; - } - - *nextp = new_service; - nextp = &new_service->next; - continue; - - finish: - free (new_service); - return result; - } -} - -static name_database_entry * -internal_function -nss_getline (char *line) -{ - const char *name; - name_database_entry *result; - size_t len; - - /* Ignore leading white spaces. ATTENTION: this is different from - what is implemented in Solaris. The Solaris man page says a line - beginning with a white space character is ignored. We regard - this as just another misfeature in Solaris. */ - while (isspace (line[0])) - ++line; - - /* Recognize `<database> ":"'. */ - name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != ':') - ++line; - if (line[0] == '\0' || name == line) - /* Syntax error. */ - return NULL; - *line++ = '\0'; - - len = strlen (name) + 1; - - result = (name_database_entry *) malloc (sizeof (name_database_entry) + len); - if (result == NULL) - return NULL; - - /* Save the database name. */ - memcpy (result->name, name, len); - - /* Parse the list of services. */ - result->service = nss_parse_service_list (line); - - result->next = NULL; - return result; -} - - -#if !defined DO_STATIC_NSS || defined SHARED -static service_library * -internal_function -nss_new_service (name_database *database, const char *name) -{ - service_library **currentp = &database->library; - - while (*currentp != NULL) - { - if (strcmp ((*currentp)->name, name) == 0) - return *currentp; - currentp = &(*currentp)->next; - } - - /* We have to add the new service. */ - *currentp = (service_library *) malloc (sizeof (service_library)); - if (*currentp == NULL) - return NULL; - - (*currentp)->name = name; - (*currentp)->lib_handle = NULL; - (*currentp)->next = NULL; - - return *currentp; -} -#endif - - -#if defined SHARED && defined USE_NSCD -/* Load all libraries for the service. */ -static void -nss_load_all_libraries (const char *service, const char *def) -{ - service_user *ni = NULL; - - if (__nss_database_lookup (service, NULL, def, &ni) == 0) - while (ni != NULL) - { - nss_load_library (ni); - ni = ni->next; - } -} - - -/* Called by nscd and nscd alone. */ -void -__nss_disable_nscd (void (*cb) (size_t, struct traced_file *)) -{ -# ifdef PTR_MANGLE - PTR_MANGLE (cb); -# endif - nscd_init_cb = cb; - is_nscd = true; - - /* Find all the relevant modules so that the init functions are called. */ - nss_load_all_libraries ("passwd", "compat [NOTFOUND=return] files"); - nss_load_all_libraries ("group", "compat [NOTFOUND=return] files"); - nss_load_all_libraries ("hosts", "dns [!UNAVAIL=return] files"); - nss_load_all_libraries ("services", NULL); - - /* Disable all uses of NSCD. */ - __nss_not_use_nscd_passwd = -1; - __nss_not_use_nscd_group = -1; - __nss_not_use_nscd_hosts = -1; - __nss_not_use_nscd_services = -1; - __nss_not_use_nscd_netgroup = -1; -} -#endif - -static void -free_database_entries (name_database_entry *entry) -{ - while (entry != NULL) - { - name_database_entry *olde = entry; - service_user *service = entry->service; - - while (service != NULL) - { - service_user *olds = service; - - if (service->known != NULL) - __tdestroy (service->known, free); - - service = service->next; - free (olds); - } - - entry = entry->next; - free (olde); - } -} - -/* Free all resources if necessary. */ -libc_freeres_fn (free_defconfig) -{ - name_database_entry *entry = defconfig_entries; - - if (entry == NULL) - /* defconfig was not used. */ - return; - - /* Don't disturb ongoing other threads (if there are any). */ - defconfig_entries = NULL; - - free_database_entries (entry); -} - -libc_freeres_fn (free_mem) -{ - name_database *top = service_table; - service_library *library; - - if (top == NULL) - /* Maybe we have not read the nsswitch.conf file. */ - return; - - /* Don't disturb ongoing other threads (if there are any). */ - service_table = NULL; - - free_database_entries (top->entry); - - library = top->library; - while (library != NULL) - { - service_library *oldl = library; - - if (library->lib_handle && library->lib_handle != (void *) -1l) - __libc_dlclose (library->lib_handle); - - library = library->next; - free (oldl); - } - - free (top); -} diff --git a/nss/nsswitch.conf b/nss/nsswitch.conf deleted file mode 100644 index 39ca88bf51..0000000000 --- a/nss/nsswitch.conf +++ /dev/null @@ -1,20 +0,0 @@ -# /etc/nsswitch.conf -# -# Example configuration of GNU Name Service Switch functionality. -# - -passwd: db files -group: db files -initgroups: db [SUCCESS=continue] files -shadow: db files -gshadow: files - -hosts: files dns -networks: files dns - -protocols: db files -services: db files -ethers: db files -rpc: db files - -netgroup: db files diff --git a/nss/nsswitch.h b/nss/nsswitch.h deleted file mode 100644 index f3e756b684..0000000000 --- a/nss/nsswitch.h +++ /dev/null @@ -1,213 +0,0 @@ -/* Copyright (C) 1996-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 - <http://www.gnu.org/licenses/>. */ - -#ifndef _NSSWITCH_H -#define _NSSWITCH_H 1 - -/* This is an *internal* header. */ - -#include <arpa/nameser.h> -#include <netinet/in.h> -#include <nss.h> -#include <resolv.h> -#include <search.h> -#include <dlfcn.h> -#include <stdbool.h> - -/* Actions performed after lookup finished. */ -typedef enum -{ - NSS_ACTION_CONTINUE, - NSS_ACTION_RETURN, - NSS_ACTION_MERGE -} lookup_actions; - - -typedef struct service_library -{ - /* Name of service (`files', `dns', `nis', ...). */ - const char *name; - /* Pointer to the loaded shared library. */ - void *lib_handle; - /* And the link to the next entry. */ - struct service_library *next; -} service_library; - - -/* For mapping a function name to a function pointer. It is known in - nsswitch.c:nss_lookup_function that a string pointer for the lookup key - is the first member. */ -typedef struct -{ - const char *fct_name; - void *fct_ptr; -} known_function; - - -typedef struct service_user -{ - /* And the link to the next entry. */ - struct service_user *next; - /* Action according to result. */ - lookup_actions actions[5]; - /* Link to the underlying library object. */ - service_library *library; - /* Collection of known functions. */ - void *known; - /* Name of the service (`files', `dns', `nis', ...). */ - char name[0]; -} service_user; - -/* To access the action based on the status value use this macro. */ -#define nss_next_action(ni, status) ((ni)->actions[2 + status]) - - -typedef struct name_database_entry -{ - /* And the link to the next entry. */ - struct name_database_entry *next; - /* List of service to be used. */ - service_user *service; - /* Name of the database. */ - char name[0]; -} name_database_entry; - - -typedef struct name_database -{ - /* List of all known databases. */ - name_database_entry *entry; - /* List of libraries with service implementation. */ - service_library *library; -} name_database; - - -/* Indices into DATABASES in nsswitch.c and __NSS_DATABASE_CUSTOM. */ -enum - { -#define DEFINE_DATABASE(arg) NSS_DBSIDX_##arg, -#include "databases.def" -#undef DEFINE_DATABASE - NSS_DBSIDX_max - }; - -/* Flags whether custom rules for database is set. */ -extern bool __nss_database_custom[NSS_DBSIDX_max]; - -/* Warning for NSS functions, which don't require dlopen if glibc - was built with --enable-static-nss. */ -#ifdef DO_STATIC_NSS -# define nss_interface_function(name) -#else -# define nss_interface_function(name) static_link_warning (name) -#endif - - -/* Interface functions for NSS. */ - -/* Get the data structure representing the specified database. - If there is no configuration for this database in the file, - parse a service list from DEFCONFIG and use that. More - than one function can use the database. */ -extern int __nss_database_lookup (const char *database, - const char *alternative_name, - const char *defconfig, service_user **ni); -libc_hidden_proto (__nss_database_lookup) - -/* Put first function with name FCT_NAME for SERVICE in FCTP. The - position is remembered in NI. The function returns a value < 0 if - an error occurred or no such function exists. */ -extern int __nss_lookup (service_user **ni, const char *fct_name, - const char *fct2_name, void **fctp); -libc_hidden_proto (__nss_lookup) - -/* Determine the next step in the lookup process according to the - result STATUS of the call to the last function returned by - `__nss_lookup' or `__nss_next'. NI specifies the last function - examined. The function return a value > 0 if the process should - stop with the last result of the last function call to be the - result of the entire lookup. The returned value is 0 if there is - another function to use and < 0 if an error occurred. - - If ALL_VALUES is nonzero, the return value will not be > 0 as long as - there is a possibility the lookup process can ever use following - services. In other words, only if all four lookup results have - the action RETURN associated the lookup process stops before the - natural end. */ -extern int __nss_next2 (service_user **ni, const char *fct_name, - const char *fct2_name, void **fctp, int status, - int all_values) attribute_hidden; -libc_hidden_proto (__nss_next2) -extern int __nss_next (service_user **ni, const char *fct_name, void **fctp, - int status, int all_values); - -/* Search for the service described in NI for a function named FCT_NAME - and return a pointer to this function if successful. */ -extern void *__nss_lookup_function (service_user *ni, const char *fct_name); -libc_hidden_proto (__nss_lookup_function) - - -/* Called by NSCD to disable recursive calls and enable special handling - when used in nscd. */ -struct traced_file; -extern void __nss_disable_nscd (void (*) (size_t, struct traced_file *)); - - -typedef int (*db_lookup_function) (service_user **, const char *, const char *, - void **) - internal_function; -typedef enum nss_status (*setent_function) (int); -typedef enum nss_status (*endent_function) (void); -typedef enum nss_status (*getent_function) (void *, char *, size_t, - int *, int *); -typedef int (*getent_r_function) (void *, char *, size_t, - void **result, int *); - -extern void __nss_setent (const char *func_name, - db_lookup_function lookup_fct, - service_user **nip, service_user **startp, - service_user **last_nip, int stayon, - int *stayon_tmp, int res); -extern void __nss_endent (const char *func_name, - db_lookup_function lookup_fct, - service_user **nip, service_user **startp, - service_user **last_nip, int res); -extern int __nss_getent_r (const char *getent_func_name, - const char *setent_func_name, - db_lookup_function lookup_fct, - service_user **nip, service_user **startp, - service_user **last_nip, int *stayon_tmp, - int res, - void *resbuf, char *buffer, size_t buflen, - void **result, int *h_errnop); -extern void *__nss_getent (getent_r_function func, - void **resbuf, char **buffer, size_t buflen, - size_t *buffer_size, int *h_errnop); -struct hostent; -extern int __nss_hostname_digits_dots (const char *name, - struct hostent *resbuf, char **buffer, - size_t *buffer_size, size_t buflen, - struct hostent **result, - enum nss_status *status, int af, - int *h_errnop); -libc_hidden_proto (__nss_hostname_digits_dots) - -/* Maximum number of aliases we allow. */ -#define MAX_NR_ALIASES 48 -#define MAX_NR_ADDRS 48 - -#endif /* nsswitch.h */ diff --git a/nss/proto-lookup.c b/nss/proto-lookup.c deleted file mode 100644 index bfad4202aa..0000000000 --- a/nss/proto-lookup.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME protocols - -#include "XXX-lookup.c" diff --git a/nss/pwd-lookup.c b/nss/pwd-lookup.c deleted file mode 100644 index 00040d4e30..0000000000 --- a/nss/pwd-lookup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME passwd -#define DEFAULT_CONFIG "compat [NOTFOUND=return] files" - -#include "XXX-lookup.c" diff --git a/nss/rewrite_field.c b/nss/rewrite_field.c deleted file mode 100644 index c0ae3d23f2..0000000000 --- a/nss/rewrite_field.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2015-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 - <http://www.gnu.org/licenses/>. */ - -#include <nss.h> -#include <string.h> - -/* Rewrite VALUE to a valid field value in the NSS database. Invalid - characters are replaced with a single space character ' '. If - VALUE is NULL, the empty string is returned. *TO_BE_FREED is - overwritten with a pointer the caller has to free if the function - returns successfully. On failure, return NULL. */ -const char * -internal_function -__nss_rewrite_field (const char *value, char **to_be_freed) -{ - *to_be_freed = NULL; - if (value == NULL) - return ""; - - /* Search for non-allowed characters. */ - const char *p = strpbrk (value, __nss_invalid_field_characters); - if (p == NULL) - return value; - *to_be_freed = __strdup (value); - if (*to_be_freed == NULL) - return NULL; - - /* Switch pointer to freshly-allocated buffer. */ - char *bad = *to_be_freed + (p - value); - do - { - *bad = ' '; - bad = strpbrk (bad + 1, __nss_invalid_field_characters); - } - while (bad != NULL); - - return *to_be_freed; -} diff --git a/nss/rpc-lookup.c b/nss/rpc-lookup.c deleted file mode 100644 index ea34c24927..0000000000 --- a/nss/rpc-lookup.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME rpc - -#include "XXX-lookup.c" diff --git a/nss/service-lookup.c b/nss/service-lookup.c deleted file mode 100644 index 3f230d606a..0000000000 --- a/nss/service-lookup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME services -#define NO_COMPAT - -#include "XXX-lookup.c" diff --git a/nss/sgrp-lookup.c b/nss/sgrp-lookup.c deleted file mode 100644 index 87c1480690..0000000000 --- a/nss/sgrp-lookup.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2009. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME gshadow -#define ALTERNATE_NAME group -#define DEFAULT_CONFIG "files" - -#include "XXX-lookup.c" diff --git a/nss/spwd-lookup.c b/nss/spwd-lookup.c deleted file mode 100644 index 319a7bb062..0000000000 --- a/nss/spwd-lookup.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - 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 - <http://www.gnu.org/licenses/>. */ - -#define DATABASE_NAME shadow -#define ALTERNATE_NAME passwd -#define DEFAULT_CONFIG "compat [NOTFOUND=return] files" - -#include "XXX-lookup.c" diff --git a/nss/test-digits-dots.c b/nss/test-digits-dots.c deleted file mode 100644 index 2685161e65..0000000000 --- a/nss/test-digits-dots.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2013-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 - <http://www.gnu.org/licenses/>. */ - -/* Testcase for BZ #15014 */ - -#include <stdlib.h> -#include <netdb.h> -#include <errno.h> - -static int -do_test (void) -{ - char buf[32]; - struct hostent *result = NULL; - struct hostent ret; - int h_err = 0; - int err; - - err = gethostbyname_r ("1.2.3.4", &ret, buf, sizeof (buf), &result, &h_err); - return err == ERANGE && h_err == NETDB_INTERNAL ? EXIT_SUCCESS : EXIT_FAILURE; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nss/test-netdb.c b/nss/test-netdb.c deleted file mode 100644 index 319541bc03..0000000000 --- a/nss/test-netdb.c +++ /dev/null @@ -1,340 +0,0 @@ -/* Copyright (C) 1998-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Jaeger <aj@suse.de>, 1998. - - 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 - <http://www.gnu.org/licenses/>. */ - -/* - Testing of some network related lookup functions. - The system databases looked up are: - - /etc/services - - /etc/hosts - - /etc/networks - - /etc/protocols - The tests try to be fairly generic and simple so that they work on - every possible setup (and might therefore not detect some possible - errors). -*/ - -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/param.h> -#include <sys/socket.h> -#include <unistd.h> -#include <errno.h> -#include "nss.h" - -/* - The following define is necessary for glibc 2.0.6 -*/ -#ifndef INET6_ADDRSTRLEN -# define INET6_ADDRSTRLEN 46 -#endif - -int error_count; - -static void -output_servent (const char *call, struct servent *sptr) -{ - char **pptr; - - if (sptr == NULL) - printf ("Call: %s returned NULL\n", call); - else - { - printf ("Call: %s, returned: s_name: %s, s_port: %d, s_proto: %s\n", - call, sptr->s_name, ntohs(sptr->s_port), sptr->s_proto); - for (pptr = sptr->s_aliases; *pptr != NULL; pptr++) - printf (" alias: %s\n", *pptr); - } -} - - -static void -test_services (void) -{ - struct servent *sptr; - - sptr = getservbyname ("domain", "tcp"); - output_servent ("getservbyname (\"domain\", \"tcp\")", sptr); - - sptr = getservbyname ("domain", "udp"); - output_servent ("getservbyname (\"domain\", \"udp\")", sptr); - - sptr = getservbyname ("domain", NULL); - output_servent ("getservbyname (\"domain\", NULL)", sptr); - - sptr = getservbyname ("not-existant", NULL); - output_servent ("getservbyname (\"not-existant\", NULL)", sptr); - - /* This shouldn't return anything. */ - sptr = getservbyname ("", ""); - output_servent ("getservbyname (\"\", \"\")", sptr); - - sptr = getservbyname ("", "tcp"); - output_servent ("getservbyname (\"\", \"tcp\")", sptr); - - sptr = getservbyport (htons(53), "tcp"); - output_servent ("getservbyport (htons(53), \"tcp\")", sptr); - - sptr = getservbyport (htons(53), NULL); - output_servent ("getservbyport (htons(53), NULL)", sptr); - - sptr = getservbyport (htons(1), "udp"); /* shouldn't exist */ - output_servent ("getservbyport (htons(1), \"udp\")", sptr); - - setservent (0); - do - { - sptr = getservent (); - output_servent ("getservent ()", sptr); - } - while (sptr != NULL); - endservent (); -} - - -static void -output_hostent (const char *call, struct hostent *hptr) -{ - char **pptr; - char buf[INET6_ADDRSTRLEN]; - - if (hptr == NULL) - printf ("Call: %s returned NULL\n", call); - else - { - printf ("Call: %s returned: name: %s, addr_type: %d\n", - call, hptr->h_name, hptr->h_addrtype); - if (hptr->h_aliases) - for (pptr = hptr->h_aliases; *pptr != NULL; pptr++) - printf (" alias: %s\n", *pptr); - - for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) - printf (" ip: %s\n", - inet_ntop (hptr->h_addrtype, *pptr, buf, sizeof (buf))); - } -} - -static void -test_hosts (void) -{ - struct hostent *hptr1, *hptr2; - char *name = NULL; - size_t namelen = 0; - struct in_addr ip; - - hptr1 = gethostbyname ("localhost"); - hptr2 = gethostbyname ("LocalHost"); - if (hptr1 != NULL || hptr2 != NULL) - { - if (hptr1 == NULL) - { - printf ("localhost not found - but LocalHost found:-(\n"); - ++error_count; - } - else if (hptr2 == NULL) - { - printf ("LocalHost not found - but localhost found:-(\n"); - ++error_count; - } - else if (strcmp (hptr1->h_name, hptr2->h_name) != 0) - { - printf ("localhost and LocalHost have different canoncial name\n"); - printf ("gethostbyname (\"localhost\")->%s\n", hptr1->h_name); - printf ("gethostbyname (\"LocalHost\")->%s\n", hptr2->h_name); - ++error_count; - } - else - output_hostent ("gethostbyname(\"localhost\")", hptr1); - } - - hptr1 = gethostbyname ("127.0.0.1"); - output_hostent ("gethostbyname (\"127.0.0.1\")", hptr1); - - hptr1 = gethostbyname ("10.1234"); - output_hostent ("gethostbyname (\"10.1234\")", hptr1); - - hptr1 = gethostbyname2 ("localhost", AF_INET); - output_hostent ("gethostbyname2 (\"localhost\", AF_INET)", hptr1); - - while (gethostname (name, namelen) < 0 && errno == ENAMETOOLONG) - { - namelen += 2; /* tiny increments to test a lot */ - name = realloc (name, namelen); - } - if (gethostname (name, namelen) == 0) - { - printf ("Hostname: %s\n", name); - if (name != NULL) - { - hptr1 = gethostbyname (name); - output_hostent ("gethostbyname (gethostname(...))", hptr1); - } - } - - ip.s_addr = htonl (INADDR_LOOPBACK); - hptr1 = gethostbyaddr ((char *) &ip, sizeof(ip), AF_INET); - if (hptr1 != NULL) - { - printf ("official name of 127.0.0.1: %s\n", hptr1->h_name); - } - - sethostent (0); - do - { - hptr1 = gethostent (); - output_hostent ("gethostent ()", hptr1); - } - while (hptr1 != NULL); - endhostent (); - -} - - -static void -output_netent (const char *call, struct netent *nptr) -{ - char **pptr; - - if (nptr == NULL) - printf ("Call: %s returned NULL\n", call); - else - { - struct in_addr ip; - - ip.s_addr = htonl(nptr->n_net); - printf ("Call: %s, returned: n_name: %s, network_number: %s\n", - call, nptr->n_name, inet_ntoa (ip)); - - for (pptr = nptr->n_aliases; *pptr != NULL; pptr++) - printf (" alias: %s\n", *pptr); - } -} - -static void -test_network (void) -{ - struct netent *nptr; - u_int32_t ip; - - /* - This test needs the following line in /etc/networks: - loopback 127.0.0.0 - */ - nptr = getnetbyname ("loopback"); - output_netent ("getnetbyname (\"loopback\")",nptr); - - nptr = getnetbyname ("LoopBACK"); - output_netent ("getnetbyname (\"LoopBACK\")",nptr); - - ip = inet_network ("127.0.0.0"); - nptr = getnetbyaddr (ip, AF_INET); - output_netent ("getnetbyaddr (inet_network (\"127.0.0.0\"), AF_INET)",nptr); - - setnetent (0); - do - { - nptr = getnetent (); - output_netent ("getnetent ()", nptr); - } - while (nptr != NULL); - endnetent (); -} - - -static void -output_protoent (const char *call, struct protoent *prptr) -{ - char **pptr; - - if (prptr == NULL) - printf ("Call: %s returned NULL\n", call); - else - { - printf ("Call: %s, returned: p_name: %s, p_proto: %d\n", - call, prptr->p_name, prptr->p_proto); - for (pptr = prptr->p_aliases; *pptr != NULL; pptr++) - printf (" alias: %s\n", *pptr); - } -} - - -static void -test_protocols (void) -{ - struct protoent *prptr; - - prptr = getprotobyname ("IP"); - output_protoent ("getprotobyname (\"IP\")", prptr); - - prptr = getprotobynumber (1); - output_protoent ("getprotobynumber (1)", prptr); - - setprotoent (0); - do - { - prptr = getprotoent (); - output_protoent ("getprotoent ()", prptr); - } - while (prptr != NULL); - endprotoent (); -} - - -/* Override /etc/nsswitch.conf for this program. This is mainly - useful for developers. */ -static void __attribute__ ((unused)) -setdb (const char *dbname) -{ - if (strcmp ("db", dbname)) - { - /* - db is not implemented for hosts, networks - */ - __nss_configure_lookup ("hosts", dbname); - __nss_configure_lookup ("networks", dbname); - } - __nss_configure_lookup ("protocols", dbname); - __nss_configure_lookup ("services", dbname); -} - - -static int -do_test (void) -{ - /* - setdb ("db"); - */ - - test_hosts (); - test_network (); - test_protocols (); - test_services (); - - if (error_count) - printf ("\n %d errors occurred!\n", error_count); - else - printf ("No visible errors occurred!\n"); - - return (error_count != 0); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nss/tst-cancel-getpwuid_r.c b/nss/tst-cancel-getpwuid_r.c deleted file mode 100644 index 53de82985c..0000000000 --- a/nss/tst-cancel-getpwuid_r.c +++ /dev/null @@ -1,182 +0,0 @@ -/* Test cancellation of getpwuid_r. - Copyright (C) 2016-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 - <http://www.gnu.org/licenses/>. */ - -/* Test if cancellation of getpwuid_r incorrectly leaves internal - function state locked resulting in hang of subsequent calls to - getpwuid_r. The main thread creates a second thread which will do - the calls to getpwuid_r. A semaphore is used by the second thread to - signal to the main thread that it is as close as it can be to the - call site of getpwuid_r. The goal of the semaphore is to avoid any - cancellable function calls between the sem_post and the call to - getpwuid_r. The main thread then attempts to cancel the second - thread. Without the fixes the cancellation happens at any number of - calls to cancellable functions in getpuid_r, but with the fix the - cancellation either does not happen or happens only at expected - points where the internal state is consistent. We use an explicit - pthread_testcancel call to terminate the loop in a timely fashion - if the implementation does not have a cancellation point. */ - -#include <stdio.h> -#include <stdlib.h> -#include <pthread.h> -#include <pwd.h> -#include <nss.h> -#include <sys/types.h> -#include <unistd.h> -#include <semaphore.h> -#include <errno.h> -#include <support/support.h> - -sem_t started; -char *wbuf; -long wbufsz; - -void -worker_free (void *arg) -{ - free (arg); -} - -static void * -worker (void *arg) -{ - int ret; - unsigned int iter = 0; - struct passwd pwbuf, *pw; - uid_t uid; - - uid = geteuid (); - - /* Use a reasonable sized buffer. Note that _SC_GETPW_R_SIZE_MAX is - just a hint and not any kind of maximum value. */ - wbufsz = sysconf (_SC_GETPW_R_SIZE_MAX); - if (wbufsz == -1) - wbufsz = 1024; - wbuf = xmalloc (wbufsz); - - pthread_cleanup_push (worker_free, wbuf); - sem_post (&started); - while (1) - { - iter++; - - ret = getpwuid_r (uid, &pwbuf, wbuf, wbufsz, &pw); - - /* The call to getpwuid_r may not cancel so we need to test - for cancellation after some number of iterations of the - function. Choose an arbitrary 100,000 iterations of running - getpwuid_r in a tight cancellation loop before testing for - cancellation. */ - if (iter > 100000) - pthread_testcancel (); - - if (ret == ERANGE) - { - /* Increase the buffer size. */ - free (wbuf); - wbufsz = wbufsz * 2; - wbuf = xmalloc (wbufsz); - } - - } - pthread_cleanup_pop (1); - - return NULL; -} - -static int -do_test (void) -{ - int ret; - char *buf; - long bufsz; - void *retval; - struct passwd pwbuf, *pw; - pthread_t thread; - - /* Configure the test to only use files. We control the files plugin - as part of glibc so we assert that it should be deferred - cancellation safe. */ - __nss_configure_lookup ("passwd", "files"); - - /* Use a reasonable sized buffer. Note that _SC_GETPW_R_SIZE_MAX is - just a hint and not any kind of maximum value. */ - bufsz = sysconf (_SC_GETPW_R_SIZE_MAX); - if (bufsz == -1) - bufsz = 1024; - buf = xmalloc (bufsz); - - sem_init (&started, 0, 0); - - pthread_create (&thread, NULL, worker, NULL); - - do - { - ret = sem_wait (&started); - if (ret == -1 && errno != EINTR) - { - printf ("FAIL: Failed to wait for second thread to start.\n"); - exit (EXIT_FAILURE); - } - } - while (ret != 0); - - printf ("INFO: Cancelling thread\n"); - if ((ret = pthread_cancel (thread)) != 0) - { - printf ("FAIL: Failed to cancel thread. Returned %d\n", ret); - exit (EXIT_FAILURE); - } - - printf ("INFO: Joining...\n"); - pthread_join (thread, &retval); - if (retval != PTHREAD_CANCELED) - { - printf ("FAIL: Thread was not cancelled.\n"); - exit (EXIT_FAILURE); - } - printf ("INFO: Joined, trying getpwuid_r call\n"); - - /* Before the fix in 312be3f9f5eab1643d7dcc7728c76d413d4f2640 for this - issue the cancellation point could happen in any number of internal - calls, and therefore locks would be left held and the following - call to getpwuid_r would block and the test would time out. */ - do - { - ret = getpwuid_r (geteuid (), &pwbuf, buf, bufsz, &pw); - if (ret == ERANGE) - { - /* Increase the buffer size. */ - free (buf); - bufsz = bufsz * 2; - buf = xmalloc (bufsz); - } - } - while (ret == ERANGE); - - free (buf); - - /* Before the fix we would never get here. */ - printf ("PASS: Canceled getpwuid_r successfully" - " and called it again without blocking.\n"); - - return 0; -} - -#define TIMEOUT 900 -#include <support/test-driver.c> diff --git a/nss/tst-field.c b/nss/tst-field.c deleted file mode 100644 index d80be681c2..0000000000 --- a/nss/tst-field.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Test for invalid field handling in file-style NSS databases. [BZ #18724] - Copyright (C) 2015-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 - <http://www.gnu.org/licenses/>. */ - -/* This test needs to be statically linked because it access hidden - functions. */ - -#include <nss.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static bool errors; - -static void -check (const char *what, bool expr) -{ - if (!expr) - { - printf ("FAIL: %s\n", what); - errors = true; - } -} - -#define CHECK(expr) check (#expr, (expr)) - -static void -check_rewrite (const char *input, const char *expected) -{ - char *to_free; - const char *result = __nss_rewrite_field (input, &to_free); - CHECK (result != NULL); - if (result != NULL && strcmp (result, expected) != 0) - { - printf ("FAIL: rewrite \"%s\" -> \"%s\", expected \"%s\"\n", - input, result, expected); - errors = true; - } - free (to_free); -} - -static int -do_test (void) -{ - CHECK (__nss_valid_field (NULL)); - CHECK (__nss_valid_field ("")); - CHECK (__nss_valid_field ("+")); - CHECK (__nss_valid_field ("-")); - CHECK (__nss_valid_field (" ")); - CHECK (__nss_valid_field ("abcdef")); - CHECK (__nss_valid_field ("abc def")); - CHECK (__nss_valid_field ("abc\tdef")); - CHECK (!__nss_valid_field ("abcdef:")); - CHECK (!__nss_valid_field ("abcde:f")); - CHECK (!__nss_valid_field (":abcdef")); - CHECK (!__nss_valid_field ("abcdef\n")); - CHECK (!__nss_valid_field ("\nabcdef")); - CHECK (!__nss_valid_field (":")); - CHECK (!__nss_valid_field ("\n")); - - CHECK (__nss_valid_list_field (NULL)); - CHECK (__nss_valid_list_field ((char *[]) {(char *) "good", NULL})); - CHECK (!__nss_valid_list_field ((char *[]) {(char *) "g,ood", NULL})); - CHECK (!__nss_valid_list_field ((char *[]) {(char *) "g\nood", NULL})); - CHECK (!__nss_valid_list_field ((char *[]) {(char *) "g:ood", NULL})); - - check_rewrite (NULL, ""); - check_rewrite ("", ""); - check_rewrite ("abc", "abc"); - check_rewrite ("abc\n", "abc "); - check_rewrite ("abc:", "abc "); - check_rewrite ("\nabc", " abc"); - check_rewrite (":abc", " abc"); - check_rewrite (":", " "); - check_rewrite ("\n", " "); - check_rewrite ("a:b:c", "a b c"); - check_rewrite ("a\nb\nc", "a b c"); - check_rewrite ("a\nb:c", "a b c"); - check_rewrite ("aa\nbb\ncc", "aa bb cc"); - check_rewrite ("aa\nbb:cc", "aa bb cc"); - - return errors; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nss/tst-nss-getpwent.c b/nss/tst-nss-getpwent.c deleted file mode 100644 index 7bd69fc378..0000000000 --- a/nss/tst-nss-getpwent.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2015-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 - <http://www.gnu.org/licenses/>. */ - -#include <pwd.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -int -do_test (void) -{ - /* Count the number of entries in the password database, and fetch - data from the first and last entries. */ - size_t count = 0; - struct passwd * pw; - char *first_name = NULL; - uid_t first_uid = 0; - char *last_name = NULL; - uid_t last_uid = 0; - setpwent (); - while ((pw = getpwent ()) != NULL) - { - if (first_name == NULL) - { - first_name = strdup (pw->pw_name); - if (first_name == NULL) - { - printf ("strdup: %m\n"); - return 1; - } - first_uid = pw->pw_uid; - } - - free (last_name); - last_name = strdup (pw->pw_name); - if (last_name == NULL) - { - printf ("strdup: %m\n"); - return 1; - } - last_uid = pw->pw_uid; - ++count; - } - endpwent (); - - if (count == 0) - { - printf ("No entries in the password database.\n"); - return 0; - } - - /* Try again, this time interleaving with name-based and UID-based - lookup operations. The counts do not match if the interleaved - lookups affected the enumeration. */ - size_t new_count = 0; - setpwent (); - while ((pw = getpwent ()) != NULL) - { - if (new_count == count) - { - printf ("Additional entry in the password database.\n"); - return 1; - } - ++new_count; - struct passwd *pw2 = getpwnam (first_name); - if (pw2 == NULL) - { - printf ("getpwnam (%s) failed: %m\n", first_name); - return 1; - } - pw2 = getpwnam (last_name); - if (pw2 == NULL) - { - printf ("getpwnam (%s) failed: %m\n", last_name); - return 1; - } - pw2 = getpwuid (first_uid); - if (pw2 == NULL) - { - printf ("getpwuid (%llu) failed: %m\n", - (unsigned long long) first_uid); - return 1; - } - pw2 = getpwuid (last_uid); - if (pw2 == NULL) - { - printf ("getpwuid (%llu) failed: %m\n", - (unsigned long long) last_uid); - return 1; - } - } - endpwent (); - if (new_count < count) - { - printf ("Missing entry in the password database.\n"); - return 1; - } - - return 0; -} - -#define TIMEOUT 300 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nss/tst-nss-static.c b/nss/tst-nss-static.c deleted file mode 100644 index 98cf073deb..0000000000 --- a/nss/tst-nss-static.c +++ /dev/null @@ -1,15 +0,0 @@ -/* glibc test for static NSS. */ -#include <stdio.h> - -#define TEST_FUNCTION do_test () -static int -do_test (void) -{ - struct passwd *pw; - - pw = getpwuid(0); - return pw == NULL; -} - - -#include "../test-skeleton.c" diff --git a/nss/tst-nss-test1.c b/nss/tst-nss-test1.c deleted file mode 100644 index c5750e0956..0000000000 --- a/nss/tst-nss-test1.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <nss.h> -#include <pwd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static int -do_test (void) -{ - int retval = 0; - - __nss_configure_lookup ("passwd", "test1"); - - static const unsigned int pwdids[] = { 100, 30, 200, 60, 20000 }; -#define npwdids (sizeof (pwdids) / sizeof (pwdids[0])) - setpwent (); - - const unsigned int *np = pwdids; - for (struct passwd *p = getpwent (); p != NULL; ++np, p = getpwent ()) - if (p->pw_uid != *np || strncmp (p->pw_name, "name", 4) != 0 - || atol (p->pw_name + 4) != *np) - { - printf ("passwd entry %td wrong (%s, %u)\n", - np - pwdids, p->pw_name, p->pw_uid); - retval = 1; - break; - } - - endpwent (); - - for (int i = npwdids - 1; i >= 0; --i) - { - char buf[30]; - snprintf (buf, sizeof (buf), "name%u", pwdids[i]); - - struct passwd *p = getpwnam (buf); - if (p == NULL || p->pw_uid != pwdids[i] || strcmp (buf, p->pw_name) != 0) - { - printf ("passwd entry \"%s\" wrong\n", buf); - retval = 1; - } - - p = getpwuid (pwdids[i]); - if (p == NULL || p->pw_uid != pwdids[i] || strcmp (buf, p->pw_name) != 0) - { - printf ("passwd entry %u wrong\n", pwdids[i]); - retval = 1; - } - - snprintf (buf, sizeof (buf), "name%u", pwdids[i] + 1); - - p = getpwnam (buf); - if (p != NULL) - { - printf ("passwd entry \"%s\" wrong\n", buf); - retval = 1; - } - - p = getpwuid (pwdids[i] + 1); - if (p != NULL) - { - printf ("passwd entry %u wrong\n", pwdids[i] + 1); - retval = 1; - } - } - - return retval; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nss/valid_field.c b/nss/valid_field.c deleted file mode 100644 index 88c41a81a0..0000000000 --- a/nss/valid_field.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 2015-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 - <http://www.gnu.org/licenses/>. */ - -#include <nss.h> -#include <string.h> - -const char __nss_invalid_field_characters[] = NSS_INVALID_FIELD_CHARACTERS; - -/* Check that VALUE is either NULL or a NUL-terminated string which - does not contain characters not permitted in NSS database - fields. */ -_Bool -internal_function -__nss_valid_field (const char *value) -{ - return value == NULL - || strpbrk (value, __nss_invalid_field_characters) == NULL; -} diff --git a/nss/valid_list_field.c b/nss/valid_list_field.c deleted file mode 100644 index 9763c89bcd..0000000000 --- a/nss/valid_list_field.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2015-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 - <http://www.gnu.org/licenses/>. */ - -#include <nss.h> -#include <stdbool.h> -#include <string.h> - -static const char invalid_characters[] = NSS_INVALID_FIELD_CHARACTERS ","; - -/* Check that all list members match the field syntax requirements and - do not contain the character ','. */ -_Bool -internal_function -__nss_valid_list_field (char **list) -{ - if (list == NULL) - return true; - for (; *list != NULL; ++list) - if (strpbrk (*list, invalid_characters) != NULL) - return false; - return true; -} |