From 96bda0ea44eb94e0284e91f20ba9733ae63f26a5 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 2 Jul 1996 19:35:40 +0000 Subject: * nss/nss_files/files-network.c: Pass empty for new DB_LOOKUP args. (DATABASE): Define this instead of DATAFILE. * nss/nss_files/files-hosts.c: Likewise. (hostbyname): Use LOOKUP_NAME macro. * nss/nss_db/db-XXX.c: New file. * nss/Makefile (services): Add db. (libnss_db-inhibit-o): New variable. (libnss_db-routines): New variable. (distribute): Append db-XXX.c. (libnss_db.so): Depend on libdb.so and libnss_files.so. ($(libnss_db-routines:%=$(objpfx)%.c)): New static pattern rule. * nss/nss_files/files-XXX.c (DB_LOOKUP): Add KEYSIZE and KEYPATTERN args, ignored. (DATAFILE): New macro. * nss/nss_files/files-parse.c (GENERIC): If undefined, define to "files-XXX.c". * nss/nss_files/files-rpc.c: Include GENERIC instead of "files-XXX.c". Pass db key args to DB_LOOKUP. (DATAFILE): Macro removed. (DATABASE): New macro replaces it, lacks "/etc/" prefix. * nss/nss_files/files-service.c: Likewise. * nss/nss_files/files-pwd.c: Likewise. * nss/nss_files/files-proto.c: Likewise. * nss/nss_files/files-grp.c: Likewise. * nss/nss_files/files-ethers.c: Likewise. * elf/linux-compat.c: File removed. * elf/Makefile (distribute): Remove linux-compat.c. (ld-linux.so.1): Remove target and associated variables. * sunrpc/xdr.c: Remove malloc decl. * sunrpc/portmap.c: Likewise. * sunrpc/svc_tcp.c (abort): Don't declare. Instead define as macro casting abort to fn returning bool_t. * nss/nss_files/files-parse.c [EXTERN_PARSER]: Do an extern decl of the parser function. [EXTERN_PARSER] (LINE_PARSER): Define to empty. * nss/nss_files/files-pwd.c (EXTERN_PARSER): Define it. * nss/nss_files/files-grp.c: Likewise. * Makeconfig (BUILD_CC): If undefined, define to $(CC). * sunrpc/rpc/types.h: Include stdlib.h instead of declaring malloc. * Makeconfig (built-program-cmd): Use $(rtld-installed-name) in place of ld.so so lookups for that soname find it. * nss/Makefile (libnss_dns.so): Depend on libresolv.so. (resobjdir, LDLIBS-nss_dns.so): Variables removed. --- ChangeLog | 54 +++++++++++ Makeconfig | 6 +- elf/Makefile | 20 ++--- elf/linux-compat.c | 41 --------- nss/Makefile | 20 ++++- nss/nss_db/db-XXX.c | 203 ++++++++++++++++++++++++++++++++++++++++++ nss/nss_files/files-XXX.c | 10 ++- nss/nss_files/files-ethers.c | 9 +- nss/nss_files/files-grp.c | 16 ++-- nss/nss_files/files-hosts.c | 18 ++-- nss/nss_files/files-network.c | 6 +- nss/nss_files/files-parse.c | 21 +++++ nss/nss_files/files-proto.c | 8 +- nss/nss_files/files-pwd.c | 16 ++-- nss/nss_files/files-rpc.c | 8 +- nss/nss_files/files-service.c | 8 +- sunrpc/portmap.c | 1 - sunrpc/rpc/types.h | 12 +-- sunrpc/svc_tcp.c | 2 +- sunrpc/xdr.c | 1 - 20 files changed, 357 insertions(+), 123 deletions(-) delete mode 100644 elf/linux-compat.c create mode 100644 nss/nss_db/db-XXX.c diff --git a/ChangeLog b/ChangeLog index 767732782f..0a6586f43c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,59 @@ Tue Jul 2 10:44:37 1996 Roland McGrath + * nss/nss_files/files-network.c: Pass empty for new DB_LOOKUP args. + (DATABASE): Define this instead of DATAFILE. + * nss/nss_files/files-hosts.c: Likewise. + (hostbyname): Use LOOKUP_NAME macro. + + * nss/nss_db/db-XXX.c: New file. + * nss/Makefile (services): Add db. + (libnss_db-inhibit-o): New variable. + (libnss_db-routines): New variable. + (distribute): Append db-XXX.c. + (libnss_db.so): Depend on libdb.so and libnss_files.so. + ($(libnss_db-routines:%=$(objpfx)%.c)): New static pattern rule. + + * nss/nss_files/files-XXX.c (DB_LOOKUP): Add KEYSIZE and KEYPATTERN + args, ignored. + (DATAFILE): New macro. + * nss/nss_files/files-parse.c (GENERIC): If undefined, define to + "files-XXX.c". + * nss/nss_files/files-rpc.c: Include GENERIC instead of "files-XXX.c". + Pass db key args to DB_LOOKUP. + (DATAFILE): Macro removed. + (DATABASE): New macro replaces it, lacks "/etc/" prefix. + * nss/nss_files/files-service.c: Likewise. + * nss/nss_files/files-pwd.c: Likewise. + * nss/nss_files/files-proto.c: Likewise. + * nss/nss_files/files-grp.c: Likewise. + * nss/nss_files/files-ethers.c: Likewise. + + * elf/linux-compat.c: File removed. + * elf/Makefile (distribute): Remove linux-compat.c. + (ld-linux.so.1): Remove target and associated variables. + + * sunrpc/xdr.c: Remove malloc decl. + * sunrpc/portmap.c: Likewise. + + * sunrpc/svc_tcp.c (abort): Don't declare. Instead define as macro + casting abort to fn returning bool_t. + + * nss/nss_files/files-parse.c [EXTERN_PARSER]: Do an extern decl of + the parser function. + [EXTERN_PARSER] (LINE_PARSER): Define to empty. + * nss/nss_files/files-pwd.c (EXTERN_PARSER): Define it. + * nss/nss_files/files-grp.c: Likewise. + + * Makeconfig (BUILD_CC): If undefined, define to $(CC). + + * sunrpc/rpc/types.h: Include stdlib.h instead of declaring malloc. + + * Makeconfig (built-program-cmd): Use $(rtld-installed-name) in place + of ld.so so lookups for that soname find it. + + * nss/Makefile (libnss_dns.so): Depend on libresolv.so. + (resobjdir, LDLIBS-nss_dns.so): Variables removed. + * pwd/fgetpwent.c: Don't include ../nss/nss_files/files-parse.c to define parse_line function. (parse_line): #define to _nss_files_parse_pwent and diff --git a/Makeconfig b/Makeconfig index eeeb9ac53f..f395c18185 100644 --- a/Makeconfig +++ b/Makeconfig @@ -362,7 +362,7 @@ define built-program-cmd LD_LIBRARY_PATH=$(rpath-link)$(patsubst -Wl$(comma)-rpath-link=%,:%,\ $(filter -Wl$(comma)-rpath-link=%,\ $(sysdep-LDFLAGS))) \ -$(elf-objpfx)ld.so $(built-program-file) +$(elf-objpfx)$(rtld-installed-name) $(built-program-file) endef endif @@ -489,6 +489,10 @@ endif +gnu-stabs = $(shell echo>&2 '*** BARF ON ME') +ifndef BUILD_CC +BUILD_CC = $(CC) +endif + ifneq ($(BUILD_CC),$(CC)) cross-compiling := yes else diff --git a/elf/Makefile b/elf/Makefile index 712fd99a57..524765ba30 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -34,7 +34,7 @@ elide-routines.so = $(dl-routines) dl-support # interpreter and operating independent of libc. rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \ - soinit.c sofini.c ldd.sh.in linux-compat.c + soinit.c sofini.c ldd.sh.in extra-libs = libdl libdl-routines := dlopen dlclose dlsym dlerror dladdr @@ -50,13 +50,6 @@ generated = librtld.so dl-allobjs.so install-others = $(slibdir)/$(rtld-installed-name) install-bin = ldd -ifneq (,$(filter linux% linux,$(config-os))) -extra-objs += linux-compat.so -install-others += $(slibdir)/ld-linux.so.1 -lib-noranlib: $(objpfx)ld-linux.so.1 -endif -endif - include ../Rules @@ -83,8 +76,6 @@ $(objpfx)librtld.so: $(objpfx)dl-allobjs.so \ $(objpfx)ld.so: $(objpfx)librtld.so $(rtld-link) -Wl,-soname=$(rtld-installed-name) -$(objpfx)ld-linux.so.1: $(objpfx)librtld.so - $(rtld-link) -Wl,-soname=ld-linux.so.1 define rtld-link $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \ @@ -102,19 +93,18 @@ $(objpfx)$(rtld-installed-name): $(objpfx)ld.so ln -s $( $@.new chmod 555 $@.new mv -f $@.new $@ + +# muwahaha + +$(objpfx)libdl.so: $(objpfx)eval.so diff --git a/elf/linux-compat.c b/elf/linux-compat.c deleted file mode 100644 index b42c78a3f7..0000000000 --- a/elf/linux-compat.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Initializer for Linux-compatible dynamic linker `/lib/ld-linux.so.1'. -Copyright (C) 1995, 1996 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 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, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#include -#include - -/* This function will be the DT_INIT initializer for the ld-linux.so.1 - shared object. This is called from rtld.c before shlib initializers. - - The old Linux ELF startup code expects the dynamic linker to magically - call atexit to arrange for shared object finalizers to run. (The - ABI-compliant startup code does this itself.) We build a compatible - version of the dynamic linker to install as /lib/ld-linux.so.1, the - name old Linux ELF binaries use. */ - -void -_init (void) -{ - const ElfW(Sym) *ref = NULL; - struct link_map *scope[2] = { _dl_loaded, NULL }; - ElfW(Addr) loadbase = _dl_lookup_symbol ("atexit", &ref, scope, - "", - 0, 1); - (*(__typeof (atexit) *) (loadbase + ref->st_value)) (&_dl_fini); -} diff --git a/nss/Makefile b/nss/Makefile index 8e7a242344..4ab774a809 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -31,7 +31,7 @@ routines = nsswitch $(addsuffix -lookup,$(databases)) databases = proto service hosts network grp pwd rpc ethers # Specify rules for the nss_* modules. We have some services. -services := files dns +services := files dns db extra-libs = $(services:%=libnss_%) @@ -45,12 +45,26 @@ distribute += files-XXX.c files-parse.c libnss_dns-routines := dns-host dns-network +libnss_db-routines := $(addprefix db-,$(filter-out hosts network,\ + $(databases))) +distribute += db-XXX.c + libnss_files-inhibit-o = $(filter-out .so,$(object-suffixes)) libnss_dns-inhibit-o = $(filter-out .so,$(object-suffixes)) +libnss_db-inhibit-o = $(filter-out .so,$(object-suffixes)) include ../Rules -resobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)resolv)) -LDLIBS-nss_dns.so = -L$(resobjdir) -Wl,-rpath-link=$(resobjdir) -lresolv +$(objpfx)libnss_dns.so: $(firstword $(objdir) $(..)resolv)/libresolv.so + +$(objpfx)libnss_db.so: $(firstword $(objdir) $(..)db)/libdb.so \ + $(objpfx)libnss_files.so + +$(libnss_db-routines:%=$(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 $@ diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c new file mode 100644 index 0000000000..3f6f35d7ec --- /dev/null +++ b/nss/nss_db/db-XXX.c @@ -0,0 +1,203 @@ +/* Common code for DB-based databases in nss_db module. +Copyright (C) 1996 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 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, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include +#include +#include +#include "nsswitch.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 +#define DBFILE _PATH_VARDB DATABASE + +#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 + +/* Locks the static variables in this file. */ +__libc_lock_define_initialized (static, lock); + +/* Maintenance of the shared handle open on the database. */ + +static DB *db; +static int keep_db; +static unsigned int entidx; /* Index for `getENTNAME'. */ + +/* Open database file if not already opened. */ +static int +internal_setent (int stayopen) +{ + int status = NSS_STATUS_SUCCESS; + + if (db == NULL) + { + db = dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL); + + if (db == NULL) + status = NSS_STATUS_UNAVAIL; + } + + /* Remember STAYOPEN flag. */ + if (db != NULL) + keep_db |= stayopen; + + return status; +} + + +/* Thread-safe, exported version of that. */ +int +CONCAT(_nss_files_set,ENTNAME) (int stayopen) +{ + int status; + + __libc_lock_lock (lock); + + status = internal_setent (stayopen); + + /* Reset the sequential index. */ + entidx = 0; + + __libc_lock_unlock (lock); + + return status; +} + + +/* Close the database file. */ +static void +internal_endent (void) +{ + if (db != NULL) + { + (*db->close) (db); + db = NULL; + } +} + + +/* Thread-safe, exported version of that. */ +int +CONCAT(_nss_files_end,ENTNAME) (void) +{ + __libc_lock_lock (lock); + + internal_endent (); + + /* Reset STAYOPEN flag. */ + keep_db = 0; + + __libc_lock_unlock (lock); + + return NSS_STATUS_SUCCESS; +} + +/* Do a database lookup for KEY. */ +static enum nss_status +lookup (const DBT *key, struct STRUCTURE *result, + void *buffer, int buflen H_ERRNO_PROTO) +{ + enum nss_status status; + DBT value; + + /* Open the database. */ + internal_setent (keep_db); + + /* Succeed iff it matches a value that parses correctly. */ + status = (((*db->get) (db, key, &value, 0) == 0 && + parse_line (value.data, result, buffer, buflen) == 0) + ? NSS_STATUS_SUCCESS : NSS_STATUS_NOTFOUND); + + if (! keep_db) + internal_endent (); + + return status; +} + + +/* Macro for defining lookup functions for this DB-based database. + + NAME is the name of the lookup; e.g. `pwnam'. + + KEYPATTERN gives `printf' args to construct a key string; + e.g. `(".%s", name)'. + + KEYSIZE gives the allocation size of a buffer to construct it in; + e.g. `1 + strlen (name)'. + + PROTO describes the arguments for the lookup key; + e.g. `const char *name'. + + BREAK_IF_MATCH is ignored, but used by ../nss_files/files-XXX.c. */ + +#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \ +enum nss_status \ +_nss_files_get##name##_r (proto, \ + struct STRUCTURE *result, \ + char *buffer, int buflen H_ERRNO_PROTO) \ +{ \ + DBT key; \ + enum nss_status status; \ + const size_t size = (keysize); \ + key.data = __alloca (size); \ + key.size = KEYPRINTF keypattern; \ + __libc_lock_lock (lock); \ + status = lookup (&key, result, buffer, buflen H_ERRNO_ARG); \ + __libc_lock_unlock (lock); \ + return status; \ +} + +#define KEYPRINTF(pattern, args...) snprintf (key.data, size, pattern ,##args) + + + + +/* Return the next entry from the database file, doing locking. */ +enum nss_status +CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, + char *buffer, int buflen H_ERRNO_PROTO) +{ + /* Return next entry in host file. */ + enum nss_status status; + char buf[20]; + DBT key; + + __libc_lock_lock (lock); + key.size = 1 + snprintf (key.data = buf, sizeof buf, "0%u", entidx++); + status = lookup (&key, result, buffer, buflen H_ERRNO_ARG); + __libc_lock_unlock (lock); + + return status; +} diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index b9c3579d5b..7fa87c098a 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -27,13 +27,15 @@ Cambridge, MA 02139, USA. */ ENTNAME -- database name of the structure and functions (hostent, pwent). STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). - DATAFILE -- string of the database file's name. + DATABASE -- string of the database file's name ("hosts", "passwd"). NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. MIDLINE_COMMENTS - defined iff # before \n terminates a database line. */ -#define ENTNAME_r CONCAT(ENTNAME,_r) +#define ENTNAME_r CONCAT(ENTNAME,_r) + +#define DATAFILE "/etc/" DATABASE #ifdef NEED_H_ERRNO #define H_ERRNO_PROTO , int *herrnop @@ -194,13 +196,15 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, NAME is the name of the lookup; e.g. `hostbyname'. + KEYSIZE and KEYPATTERN are ignored here but used by ../nss_db/db-XXX.c. + PROTO describes the arguments for the lookup key; e.g. `const char *hostname'. 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, break_if_match, proto...) \ +#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \ enum nss_status \ _nss_files_get##name##_r (proto, \ struct STRUCTURE *result, \ diff --git a/nss/nss_files/files-ethers.c b/nss/nss_files/files-ethers.c index b66a3c3d04..70f7d07dbd 100644 --- a/nss/nss_files/files-ethers.c +++ b/nss/nss_files/files-ethers.c @@ -30,7 +30,7 @@ struct etherent struct etherent_data {}; #define ENTNAME etherent -#define DATAFILE "/etc/ethers" +#define DATABASE "ethers" #include "files-parse.c" LINE_PARSER ("#", @@ -56,15 +56,16 @@ LINE_PARSER ) -#include "files-XXX.c" +#include GENERIC -DB_LOOKUP (hostton, +DB_LOOKUP (hostton, 1 + strlen (name), (".%s", name), { if (strcmp (result->e_name, name) == 0) break; }, const char *name) -DB_LOOKUP (ntohost, +DB_LOOKUP (ntohost, 7, ("=%c%c%c%c%c%c", + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]), { if (memcmp (&result->e_addr, addr, sizeof (struct ether_addr)) == 0) diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c index 580dfbe3eb..8e047b6475 100644 --- a/nss/nss_files/files-grp.c +++ b/nss/nss_files/files-grp.c @@ -21,26 +21,22 @@ Cambridge, MA 02139, USA. */ #define STRUCTURE group #define ENTNAME grent -#define DATAFILE "/etc/group" +#define DATABASE "group" struct grent_data {}; -#define TRAILING_LIST_MEMBER gr_mem -#define TRAILING_LIST_SEPARATOR_P(c) ((c) == ',') -#include "files-parse.c" /* Our parser function is already defined in fgetgrent.c, so use that. to parse lines from the database file. */ -extern int parse_line (char *line, struct STRUCTURE *result, - void *buffer, int buflen); - -#include "files-XXX.c" +#define EXTERN_PARSER +#include "files-parse.c" +#include GENERIC -DB_LOOKUP (grnam, +DB_LOOKUP (grnam, 1 + strlen (name), (".%s", name), { if (! strcmp (name, result->gr_name)) break; }, const char *name) -DB_LOOKUP (grgid, +DB_LOOKUP (grgid, 20, ("=%lu", (unsigned long int) gid), { if (result->gr_gid == gid) break; diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c index 19a0075ecf..bc9eaa39a5 100644 --- a/nss/nss_files/files-hosts.c +++ b/nss/nss_files/files-hosts.c @@ -30,7 +30,7 @@ Cambridge, MA 02139, USA. */ #define ENTNAME hostent -#define DATAFILE _PATH_HOSTS +#define DATABASE "hosts" #define ENTDATA hostent_data struct hostent_data @@ -93,19 +93,11 @@ LINE_PARSER #include "files-XXX.c" -DB_LOOKUP (hostbyname, - { - char **ap; - if (! strcmp (name, result->h_name)) - break; - for (ap = result->h_aliases; *ap; ++ap) - if (! strcmp (name, *ap)) - break; - if (*ap) - break; - }, const char *name) +DB_LOOKUP (hostbyname, ,, + LOOKUP_NAME (h_name, h_aliases), + const char *name) -DB_LOOKUP (hostbyaddr, +DB_LOOKUP (hostbyaddr, ,, { if (result->h_addrtype == type && result->h_length == len && ! memcmp (addr, result->h_addr_list[0], len)) diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c index c6cd718dd2..acfbc3198c 100644 --- a/nss/nss_files/files-network.c +++ b/nss/nss_files/files-network.c @@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */ #include #define ENTNAME netent -#define DATAFILE _PATH_NETWORKS +#define DATABASE "networks" struct netent_data {}; @@ -43,11 +43,11 @@ LINE_PARSER #include "files-XXX.c" -DB_LOOKUP (netbyname, +DB_LOOKUP (netbyname, ,, LOOKUP_NAME (n_name, n_aliases), const char *name) -DB_LOOKUP (netbyaddr, +DB_LOOKUP (netbyaddr, ,, { if (result->n_addrtype == type && result->n_net == net) /* Bingo! */ diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c index a9c461ef46..8930780f1f 100644 --- a/nss/nss_files/files-parse.c +++ b/nss/nss_files/files-parse.c @@ -52,6 +52,19 @@ struct parser_data #define parse_line CONCAT(_nss_files_parse_,ENTNAME) #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, int datalen); + +#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, \ @@ -167,6 +180,9 @@ parse_list (char *line, struct parser_data *data, int datalen) return list; } +#endif /* EXTERN_PARSER */ + + #define LOOKUP_NAME(nameelt, aliaselt) \ { \ char **ap; \ @@ -180,3 +196,8 @@ parse_list (char *line, struct parser_data *data, int datalen) } #endif + +/* 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 index ef5a7c2560..3cc14e7859 100644 --- a/nss/nss_files/files-proto.c +++ b/nss/nss_files/files-proto.c @@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */ #define ENTNAME protoent -#define DATAFILE _PATH_PROTOCOLS +#define DATABASE "protocols" struct protoent_data {}; @@ -34,13 +34,13 @@ LINE_PARSER INT_FIELD (result->p_proto, isspace, 1, 10,); ) -#include "files-XXX.c" +#include GENERIC -DB_LOOKUP (protobyname, +DB_LOOKUP (protobyname, 1 + strlen (name), (".%s", name), LOOKUP_NAME (p_name, p_aliases), const char *name) -DB_LOOKUP (protobynumber, +DB_LOOKUP (protobynumber, 20, ("=%d", proto), { if (result->p_proto == proto) break; diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c index 6b39116a44..9732bc6f23 100644 --- a/nss/nss_files/files-pwd.c +++ b/nss/nss_files/files-pwd.c @@ -21,24 +21,22 @@ Cambridge, MA 02139, USA. */ #define STRUCTURE passwd #define ENTNAME pwent -#define DATAFILE "/etc/passwd" +#define DATABASE "passwd" struct pwent_data {}; -#include "files-parse.c" -/* Our parser function is already defined in fgetpwent.c, so use that. +/* Our parser function is already defined in fgetpwent.c, so use that to parse lines from the database file. */ -extern int parse_line (char *line, struct STRUCTURE *result, - void *buffer, int buflen); - -#include "files-XXX.c" +#define EXTERN_PARSER +#include "files-parse.c" +#include GENERIC -DB_LOOKUP (pwnam, +DB_LOOKUP (pwnam, 1 + strlen (name), (".%s", name), { if (! strcmp (name, result->pw_name)) break; }, const char *name) -DB_LOOKUP (pwuid, +DB_LOOKUP (pwuid, 20, ("=%lu", (unsigned long int) uid), { if (result->pw_uid == uid) break; diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c index f8bef451fa..0ad1e21848 100644 --- a/nss/nss_files/files-rpc.c +++ b/nss/nss_files/files-rpc.c @@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */ #define ENTNAME rpcent -#define DATAFILE "/etc/rpc" +#define DATABASE "rpc" struct rpcent_data {}; @@ -34,13 +34,13 @@ LINE_PARSER INT_FIELD (result->r_number, isspace, 1, 10,); ) -#include "files-XXX.c" +#include GENERIC -DB_LOOKUP (rpcbyname, +DB_LOOKUP (rpcbyname, 1 + strlen (name), (".%s", name), LOOKUP_NAME (r_name, r_aliases), const char *name) -DB_LOOKUP (rpcbynumber, +DB_LOOKUP (rpcbynumber, 20, ("=%d", number), { if (result->r_number == number) break; diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c index f0dba50fe6..5dea476208 100644 --- a/nss/nss_files/files-service.c +++ b/nss/nss_files/files-service.c @@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */ #define ENTNAME servent -#define DATAFILE _PATH_SERVICES +#define DATABASE "services" struct servent_data {}; @@ -37,13 +37,13 @@ LINE_PARSER STRING_FIELD (result->s_proto, isspace, 1); ) -#include "files-XXX.c" +#include GENERIC -DB_LOOKUP (servbyname, +DB_LOOKUP (servbyname, 1 + strlen (name), (".%s", name), LOOKUP_NAME (s_name, s_aliases), const char *name) -DB_LOOKUP (servbyport, +DB_LOOKUP (servbyport, 20, ("=%d", port), { if (result->s_port == port) break; diff --git a/sunrpc/portmap.c b/sunrpc/portmap.c index a45170bf00..b43c47cf76 100644 --- a/sunrpc/portmap.c +++ b/sunrpc/portmap.c @@ -50,7 +50,6 @@ static char sccsid[] = "@(#)portmap.c 1.32 87/08/06 Copyr 1984 Sun Micro"; #include #include -char *malloc(); int reg_service(); void reap(); struct pmaplist *pmaplist; diff --git a/sunrpc/rpc/types.h b/sunrpc/rpc/types.h index 032543f448..fc3d7d5302 100644 --- a/sunrpc/rpc/types.h +++ b/sunrpc/rpc/types.h @@ -6,23 +6,23 @@ * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. - * + * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * + * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. - * + * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. - * + * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. - * + * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 @@ -44,7 +44,7 @@ # define NULL 0 #endif -extern char *malloc(); +#include /* For malloc decl. */ #define mem_alloc(bsize) malloc(bsize) #define mem_free(ptr, bsize) free(ptr) diff --git a/sunrpc/svc_tcp.c b/sunrpc/svc_tcp.c index 9daa7cb984..8886a9f1fd 100644 --- a/sunrpc/svc_tcp.c +++ b/sunrpc/svc_tcp.c @@ -45,7 +45,7 @@ static char sccsid[] = "@(#)svc_tcp.c 1.21 87/08/11 Copyr 1984 Sun Micro"; #include #include #include -extern bool_t abort(); +#define abort ((bool_t (*) ()) abort) extern errno; /* diff --git a/sunrpc/xdr.c b/sunrpc/xdr.c index a5b5e68d75..56953e07ef 100644 --- a/sunrpc/xdr.c +++ b/sunrpc/xdr.c @@ -43,7 +43,6 @@ static char sccsid[] = "@(#)xdr.c 1.35 87/08/12"; #include #include -char *malloc(); #include #include -- cgit 1.4.1