* 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.
This commit is contained in:
Roland McGrath 1996-07-02 19:35:40 +00:00
parent ffee131630
commit 96bda0ea44
20 changed files with 357 additions and 123 deletions

View File

@ -1,5 +1,59 @@
Tue Jul 2 10:44:37 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> Tue Jul 2 10:44:37 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* 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 * pwd/fgetpwent.c: Don't include ../nss/nss_files/files-parse.c to
define parse_line function. define parse_line function.
(parse_line): #define to _nss_files_parse_pwent and (parse_line): #define to _nss_files_parse_pwent and

View File

@ -362,7 +362,7 @@ define built-program-cmd
LD_LIBRARY_PATH=$(rpath-link)$(patsubst -Wl$(comma)-rpath-link=%,:%,\ LD_LIBRARY_PATH=$(rpath-link)$(patsubst -Wl$(comma)-rpath-link=%,:%,\
$(filter -Wl$(comma)-rpath-link=%,\ $(filter -Wl$(comma)-rpath-link=%,\
$(sysdep-LDFLAGS))) \ $(sysdep-LDFLAGS))) \
$(elf-objpfx)ld.so $(built-program-file) $(elf-objpfx)$(rtld-installed-name) $(built-program-file)
endef endef
endif endif
@ -489,6 +489,10 @@ endif
+gnu-stabs = $(shell echo>&2 '*** BARF ON ME') +gnu-stabs = $(shell echo>&2 '*** BARF ON ME')
ifndef BUILD_CC
BUILD_CC = $(CC)
endif
ifneq ($(BUILD_CC),$(CC)) ifneq ($(BUILD_CC),$(CC))
cross-compiling := yes cross-compiling := yes
else else

View File

@ -34,7 +34,7 @@ elide-routines.so = $(dl-routines) dl-support
# interpreter and operating independent of libc. # interpreter and operating independent of libc.
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \ 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 extra-libs = libdl
libdl-routines := dlopen dlclose dlsym dlerror dladdr libdl-routines := dlopen dlclose dlsym dlerror dladdr
@ -50,13 +50,6 @@ generated = librtld.so dl-allobjs.so
install-others = $(slibdir)/$(rtld-installed-name) install-others = $(slibdir)/$(rtld-installed-name)
install-bin = ldd 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 include ../Rules
@ -83,8 +76,6 @@ $(objpfx)librtld.so: $(objpfx)dl-allobjs.so \
$(objpfx)ld.so: $(objpfx)librtld.so $(objpfx)ld.so: $(objpfx)librtld.so
$(rtld-link) -Wl,-soname=$(rtld-installed-name) $(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 define rtld-link
$(LINK.o) -nostdlib -nostartfiles -shared -o $@ \ $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
@ -102,19 +93,18 @@ $(objpfx)$(rtld-installed-name): $(objpfx)ld.so
ln -s $(<F) $@ ln -s $(<F) $@
endif endif
# The Linux-compatible dynamic linker shared object is just the same
# with one object file of compatibility initialization code added.
$(objpfx)ld-linux.so.1: $(objpfx)linux-compat.so
# Specify the dependencies of libdl.so; its commands come from the generic # Specify the dependencies of libdl.so; its commands come from the generic
# rule to build a shared library. # rule to build a shared library.
$(objpfx)libdl.so: $(objpfx)libdl_pic.a $(common-objpfx)libc.so $(objpfx)ld.so $(objpfx)libdl.so: $(objpfx)libdl_pic.a $(common-objpfx)libc.so $(objpfx)ld.so
$(slibdir)/$(rtld-installed-name): $(objpfx)ld.so; $(do-install-program) $(slibdir)/$(rtld-installed-name): $(objpfx)ld.so; $(do-install-program)
$(slibdir)/ld-linux.so.1: $(objpfx)ld-linux.so.1; $(do-install-program)
$(objpfx)ldd: ldd.sh.in Makefile $(objpfx)ldd: ldd.sh.in Makefile
sed 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' < $< > $@.new sed 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' < $< > $@.new
chmod 555 $@.new chmod 555 $@.new
mv -f $@.new $@ mv -f $@.new $@
# muwahaha
$(objpfx)libdl.so: $(objpfx)eval.so

View File

@ -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 <link.h>
#include <stdlib.h>
/* 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,
"<ld-linux.so.1 initialization>",
0, 1);
(*(__typeof (atexit) *) (loadbase + ref->st_value)) (&_dl_fini);
}

View File

@ -31,7 +31,7 @@ routines = nsswitch $(addsuffix -lookup,$(databases))
databases = proto service hosts network grp pwd rpc ethers databases = proto service hosts network grp pwd rpc ethers
# Specify rules for the nss_* modules. We have some services. # Specify rules for the nss_* modules. We have some services.
services := files dns services := files dns db
extra-libs = $(services:%=libnss_%) extra-libs = $(services:%=libnss_%)
@ -45,12 +45,26 @@ distribute += files-XXX.c files-parse.c
libnss_dns-routines := dns-host dns-network 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_files-inhibit-o = $(filter-out .so,$(object-suffixes))
libnss_dns-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 include ../Rules
resobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)resolv)) $(objpfx)libnss_dns.so: $(firstword $(objdir) $(..)resolv)/libresolv.so
LDLIBS-nss_dns.so = -L$(resobjdir) -Wl,-rpath-link=$(resobjdir) -lresolv
$(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 $@

203
nss/nss_db/db-XXX.c Normal file
View File

@ -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 <db.h>
#include <fcntl.h>
#include <libc-lock.h>
#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 <paths.h>
#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;
}

View File

@ -27,7 +27,7 @@ Cambridge, MA 02139, USA. */
ENTNAME -- database name of the structure and functions (hostent, pwent). ENTNAME -- database name of the structure and functions (hostent, pwent).
STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). 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. NEED_H_ERRNO - defined iff an arg `int *herrnop' is used.
MIDLINE_COMMENTS - defined iff # before \n terminates a database line. MIDLINE_COMMENTS - defined iff # before \n terminates a database line.
@ -35,6 +35,8 @@ Cambridge, MA 02139, USA. */
#define ENTNAME_r CONCAT(ENTNAME,_r) #define ENTNAME_r CONCAT(ENTNAME,_r)
#define DATAFILE "/etc/" DATABASE
#ifdef NEED_H_ERRNO #ifdef NEED_H_ERRNO
#define H_ERRNO_PROTO , int *herrnop #define H_ERRNO_PROTO , int *herrnop
#define H_ERRNO_ARG , herrnop #define H_ERRNO_ARG , herrnop
@ -194,13 +196,15 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
NAME is the name of the lookup; e.g. `hostbyname'. 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; PROTO describes the arguments for the lookup key;
e.g. `const char *hostname'. e.g. `const char *hostname'.
BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result' BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result'
to the lookup key arguments and does `break;' if they match. */ 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 \ enum nss_status \
_nss_files_get##name##_r (proto, \ _nss_files_get##name##_r (proto, \
struct STRUCTURE *result, \ struct STRUCTURE *result, \

View File

@ -30,7 +30,7 @@ struct etherent
struct etherent_data {}; struct etherent_data {};
#define ENTNAME etherent #define ENTNAME etherent
#define DATAFILE "/etc/ethers" #define DATABASE "ethers"
#include "files-parse.c" #include "files-parse.c"
LINE_PARSER 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) if (strcmp (result->e_name, name) == 0)
break; break;
}, const char *name) }, 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, if (memcmp (&result->e_addr, addr,
sizeof (struct ether_addr)) == 0) sizeof (struct ether_addr)) == 0)

View File

@ -21,26 +21,22 @@ Cambridge, MA 02139, USA. */
#define STRUCTURE group #define STRUCTURE group
#define ENTNAME grent #define ENTNAME grent
#define DATAFILE "/etc/group" #define DATABASE "group"
struct grent_data {}; 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. /* Our parser function is already defined in fgetgrent.c, so use that.
to parse lines from the database file. */ to parse lines from the database file. */
extern int parse_line (char *line, struct STRUCTURE *result, #define EXTERN_PARSER
void *buffer, int buflen); #include "files-parse.c"
#include GENERIC
#include "files-XXX.c" DB_LOOKUP (grnam, 1 + strlen (name), (".%s", name),
DB_LOOKUP (grnam,
{ {
if (! strcmp (name, result->gr_name)) if (! strcmp (name, result->gr_name))
break; break;
}, const char *name) }, const char *name)
DB_LOOKUP (grgid, DB_LOOKUP (grgid, 20, ("=%lu", (unsigned long int) gid),
{ {
if (result->gr_gid == gid) if (result->gr_gid == gid)
break; break;

View File

@ -30,7 +30,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME hostent #define ENTNAME hostent
#define DATAFILE _PATH_HOSTS #define DATABASE "hosts"
#define ENTDATA hostent_data #define ENTDATA hostent_data
struct hostent_data struct hostent_data
@ -93,19 +93,11 @@ LINE_PARSER
#include "files-XXX.c" #include "files-XXX.c"
DB_LOOKUP (hostbyname, DB_LOOKUP (hostbyname, ,,
{ LOOKUP_NAME (h_name, h_aliases),
char **ap; const char *name)
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 (hostbyaddr, DB_LOOKUP (hostbyaddr, ,,
{ {
if (result->h_addrtype == type && result->h_length == len && if (result->h_addrtype == type && result->h_length == len &&
! memcmp (addr, result->h_addr_list[0], len)) ! memcmp (addr, result->h_addr_list[0], len))

View File

@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */
#include <netdb.h> #include <netdb.h>
#define ENTNAME netent #define ENTNAME netent
#define DATAFILE _PATH_NETWORKS #define DATABASE "networks"
struct netent_data {}; struct netent_data {};
@ -43,11 +43,11 @@ LINE_PARSER
#include "files-XXX.c" #include "files-XXX.c"
DB_LOOKUP (netbyname, DB_LOOKUP (netbyname, ,,
LOOKUP_NAME (n_name, n_aliases), LOOKUP_NAME (n_name, n_aliases),
const char *name) const char *name)
DB_LOOKUP (netbyaddr, DB_LOOKUP (netbyaddr, ,,
{ {
if (result->n_addrtype == type && result->n_net == net) if (result->n_addrtype == type && result->n_net == net)
/* Bingo! */ /* Bingo! */

View File

@ -52,6 +52,19 @@ struct parser_data
#define parse_line CONCAT(_nss_files_parse_,ENTNAME) #define parse_line CONCAT(_nss_files_parse_,ENTNAME)
#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, int datalen);
#define LINE_PARSER(EOLSET, BODY) /* Do nothing */
#else
/* Define a line parsing function. */
#define LINE_PARSER(EOLSET, BODY) \ #define LINE_PARSER(EOLSET, BODY) \
parser_stclass int \ parser_stclass int \
parse_line (char *line, struct STRUCTURE *result, \ parse_line (char *line, struct STRUCTURE *result, \
@ -167,6 +180,9 @@ parse_list (char *line, struct parser_data *data, int datalen)
return list; return list;
} }
#endif /* EXTERN_PARSER */
#define LOOKUP_NAME(nameelt, aliaselt) \ #define LOOKUP_NAME(nameelt, aliaselt) \
{ \ { \
char **ap; \ char **ap; \
@ -180,3 +196,8 @@ parse_list (char *line, struct parser_data *data, int datalen)
} }
#endif #endif
/* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead. */
#ifndef GENERIC
#define GENERIC "files-XXX.c"
#endif

View File

@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME protoent #define ENTNAME protoent
#define DATAFILE _PATH_PROTOCOLS #define DATABASE "protocols"
struct protoent_data {}; struct protoent_data {};
@ -34,13 +34,13 @@ LINE_PARSER
INT_FIELD (result->p_proto, isspace, 1, 10,); 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), LOOKUP_NAME (p_name, p_aliases),
const char *name) const char *name)
DB_LOOKUP (protobynumber, DB_LOOKUP (protobynumber, 20, ("=%d", proto),
{ {
if (result->p_proto == proto) if (result->p_proto == proto)
break; break;

View File

@ -21,24 +21,22 @@ Cambridge, MA 02139, USA. */
#define STRUCTURE passwd #define STRUCTURE passwd
#define ENTNAME pwent #define ENTNAME pwent
#define DATAFILE "/etc/passwd" #define DATABASE "passwd"
struct pwent_data {}; 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. */ to parse lines from the database file. */
extern int parse_line (char *line, struct STRUCTURE *result, #define EXTERN_PARSER
void *buffer, int buflen); #include "files-parse.c"
#include GENERIC
#include "files-XXX.c" DB_LOOKUP (pwnam, 1 + strlen (name), (".%s", name),
DB_LOOKUP (pwnam,
{ {
if (! strcmp (name, result->pw_name)) if (! strcmp (name, result->pw_name))
break; break;
}, const char *name) }, const char *name)
DB_LOOKUP (pwuid, DB_LOOKUP (pwuid, 20, ("=%lu", (unsigned long int) uid),
{ {
if (result->pw_uid == uid) if (result->pw_uid == uid)
break; break;

View File

@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME rpcent #define ENTNAME rpcent
#define DATAFILE "/etc/rpc" #define DATABASE "rpc"
struct rpcent_data {}; struct rpcent_data {};
@ -34,13 +34,13 @@ LINE_PARSER
INT_FIELD (result->r_number, isspace, 1, 10,); 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), LOOKUP_NAME (r_name, r_aliases),
const char *name) const char *name)
DB_LOOKUP (rpcbynumber, DB_LOOKUP (rpcbynumber, 20, ("=%d", number),
{ {
if (result->r_number == number) if (result->r_number == number)
break; break;

View File

@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME servent #define ENTNAME servent
#define DATAFILE _PATH_SERVICES #define DATABASE "services"
struct servent_data {}; struct servent_data {};
@ -37,13 +37,13 @@ LINE_PARSER
STRING_FIELD (result->s_proto, isspace, 1); 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), LOOKUP_NAME (s_name, s_aliases),
const char *name) const char *name)
DB_LOOKUP (servbyport, DB_LOOKUP (servbyport, 20, ("=%d", port),
{ {
if (result->s_port == port) if (result->s_port == port)
break; break;

View File

@ -50,7 +50,6 @@ static char sccsid[] = "@(#)portmap.c 1.32 87/08/06 Copyr 1984 Sun Micro";
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/signal.h> #include <sys/signal.h>
char *malloc();
int reg_service(); int reg_service();
void reap(); void reap();
struct pmaplist *pmaplist; struct pmaplist *pmaplist;

View File

@ -44,7 +44,7 @@
# define NULL 0 # define NULL 0
#endif #endif
extern char *malloc(); #include <stdlib.h> /* For malloc decl. */
#define mem_alloc(bsize) malloc(bsize) #define mem_alloc(bsize) malloc(bsize)
#define mem_free(ptr, bsize) free(ptr) #define mem_free(ptr, bsize) free(ptr)

View File

@ -45,7 +45,7 @@ static char sccsid[] = "@(#)svc_tcp.c 1.21 87/08/11 Copyr 1984 Sun Micro";
#include <rpc/rpc.h> #include <rpc/rpc.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <errno.h> #include <errno.h>
extern bool_t abort(); #define abort ((bool_t (*) ()) abort)
extern errno; extern errno;
/* /*

View File

@ -43,7 +43,6 @@ static char sccsid[] = "@(#)xdr.c 1.35 87/08/12";
#include <stdio.h> #include <stdio.h>
#include <limits.h> #include <limits.h>
char *malloc();
#include <rpc/types.h> #include <rpc/types.h>
#include <rpc/xdr.h> #include <rpc/xdr.h>