summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-25 08:56:57 +0000
committerRoland McGrath <roland@gnu.org>1996-06-25 08:56:57 +0000
commit5f0e6fc702296840d2daa39f83f6cb1e40073d58 (patch)
tree6e6c29e50f713eac4c87b54a6e5730fa0dedb65a
parent7f8116797fdb967571c00ec1d5b19d9d06813445 (diff)
downloadglibc-5f0e6fc702296840d2daa39f83f6cb1e40073d58.tar.gz
glibc-5f0e6fc702296840d2daa39f83f6cb1e40073d58.tar.xz
glibc-5f0e6fc702296840d2daa39f83f6cb1e40073d58.zip
Tue Jun 25 02:59:11 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> cvs/libc-960625
	* malloc/malloc.h: Declare malloc_object_allocated_size, malloc_walk.
	* malloc/Makefile (dist-routines): Add malloc-size, malloc-walk.
	* malloc/malloc-size.c: New file.
	* malloc/malloc-walk.c: New file.

	* malloc/malloc-find.c (malloc_find_object_address): Return null if
	PTR is outside the heap.

	* elf/dl-load.c (_dl_map_object): If the requested name matches the
 	soname of a loaded object, use that object.

Mon Jun 24 19:57:01 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* Makefile (subdirs): Add nss.

	* inet/Makefile (routines): Add getrpcent, getrpcbyname,
	getrpcbynumber, getrpcent_r, getrpcbyname_r, getrpcbynumber_r.
	* inet/getrpcbynumber_r.c: New file.
	* inet/getrpcbynumber.c: New file.
	* inet/getrpcbyname.c: New file.
	* inet/getrpcbyname_r.c: New file.
	* inet/getrpcent_r.c: New file.
	* inet/getrpcent.c: New file.
	* nss/rpc-lookup.c: New file.
	* nss/nss_files/files-rpc.c: New file.
	* nss/Makefile (routines): Add rpc-lookup.
	(libnss_files-routines): Add files-rpc.
	* sunrpc/Makefile (routines): Remove getrpcent.
	* sunrpc/getrpcent.c: File removed.

	* nss/getXXent_r.c (REENTRANT_GETNAME): Clear NO_MORE when NIP is
	non-null on entry.

	* Makeconfig (rpath-link): Add $(nssobjdir).
	(nssobjdir): New variable.

	* Makerules: Move shared library building before objects rules, so
	versions are known before extra-lib.mk gets included.
	* extra-lib.mk (lib-noranlib): Depend on the shared object too.

	* pwd/getpwuid.c: Rewritten using nss.
	* pwd/getpwnam.c: Likewise.
	* pwd/getpwent.c: Likewise.
	* grp/getgrnam.c: Likewise.
	* grp/getgrgid.c: Likewise.
	* grp/getgrent.c: Likewise.
	* pwd/Makefile (routines): Add getpwent_r, getpwnam_r, getpwuid_r.
	* pwd/getpwent_r.c: New file.
	* pwd/getpwnam_r.c: New file.
	* pwd/getpwuid_r.c: New file.
	* grp/Makefile (routines): Add getgrent_r, getgrgid_r, getgrnam_r.
	* grp/getgrnam_r.c: New file.
	* grp/getgrgid_r.c: New file.
	* grp/getgrent_r.c: New file.
	* grp/Makefile (routines): Remove grpopen, grpread.
	* pwd/Makefile (routines): Remove pwdopen, pwdread.
	* grp/grpopen.c, grp/grpread.c, pwd/pwdopen.c, pwd/pwdread.c: Removed.

	* pwd/fgetpwent.c: Rewritten using files-parse.c.
	* grp/fgetgrent.c: Likewise.

	* nss/Makefile (routines): Add grp-lookup and pwd-lookup.
	* nss/pwd-lookup.c, nss/grp-lookup.c: New files.
	* nss/nss_files/files-grp.c: New file.
	* nss/nss_files/files-pwd.c: New file.

	* nss/Makefile (subdir-dirs): New variable; use it in vpath.

	* nss/nss_files/files-parse.c: New file.
	* nss/nss_files/files-XXX.c: New file.
	* nss/nss_files/files-hosts.c, nss/nss_files/files-proto.c,
	nss/nss_files/files-service.c, nss/nss_files/files-network.c:
	Rewritten using them.

	* nss/Makefile (libnss_files-routines): Remove files-host.
	Add files-hosts, files-grp, files-pwd.

	* nss/nss_dns/dns-network.c: Don't include <pthread.h>.

Mon Jun 24 22:39:12 1996  Richard Henderson  <rth@tamu.edu>

	* sysdeps/alpha/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE):
	A .plt entry now loads the .rela.plt offset directly rather
	than making us calculate it.

Sun Jun 23 15:24:05 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* time/Makefile ($(installed-localtime-file) rule): Do
	$(make-target-directory) first.

	* resolv.h: Fix wrapper for resolv/resolv.h.

	* configure.in (ld --no-whole-archive check): Use AC_TRY_COMMAND.
	Compile dummy file and pass -nostdlib -nostartfiles so as not to
	require installed libraries.

	* shlib-versions (*-*-*): Set libresolv=2, libnss_files=1,
	libnss_dns=1.

Sun Jun 23 19:42:05 1996  Ulrich Drepper  <drepper@cygnus.com>

	* resolv/netdb.h (_PATH_NSSWITCH_CONF): New macro.

	* inet/herrno.c: New file.

	* resolv/res_init.c: Remove res_hconf calls.

	* nss/Makefile, nss/XXX-lookup.c, nss/file-lookup.c,
	nss/getXXbyYY.c, nss/getXXbyYY_r.c, nss/getXXent.c,
	nss/getXXent_r.c, nss/host-lookup.c, nss/network-lookup.c,
	nss/nsswitch.c, nss/nsswitch.h, nss/proto-lookup.c,
	nss/service-lookup.c: New files.  Implementation of name
	service switch, following the approach in Solaris.
	Interface specification and general structure inspired by Peter
	Eriksson <pen@lysator.liu.se>.
	* nss/nss_files/files-host.c, nss/nss_files/files-network.c,
	nss/nss_files/files-proto.c, nss/nss_files/files-service.c:
	Implementation of libnss_files.so module for file based databases
	in NSS service.
	* nss/nss_dns/dns-host.c, nss/nss_dns/dns-network.c: Implementation
        if libnss_dns.so module for DNS name lookup in NSS service.

	* inet/getproto.c, inet/getprtent.c, inet/getprtname.c,
	inet/getservent.c, inet/getsrvbynm.c, inet/getsrvbypt.c:
	Changed to serve as interface to NSS.
	* inet/gethstbyad.c, inet/gethstbyad_r.c, inet/gethstbynm.c,
	inet/gethstbynm2.c, inet/gethstbynm2_r.c, inet/gethstbynm_r.c,
	inet/gethstent.c, inet/gethstent_r.c, inet/getnetbynm.c,
	inet/getnetbynm_r.c, inet/getnetbypt.c, inet/getnetbypt_r.c,
	inet/getnetent.c, inet/getnetent_r.c, inet/getproto_r.c,
	inet/getprtent_r.c, inet/getprtname_r.c, inet/getservent_r.c,
	inet/getsrvbynm_r.c, inet/getsrvbypt_r.c: New files.  Implement
	interfaces to NSS, including reentrant functions.

	* resolv/getnetbyaddr.c, resolv/getnetbyname.c, resolv/getnetent.c,
	resolv/sethostent.c: Removed:  Obsoleted by NSS.

	* resolv/mapv4v6addr.h, resolv/mapv4v6hostent.h: Extracted from
	gethnamaddr.c.  These private functions are now used in more
	than one file.

	* resolv/inet_pton.c, resolv/gethnamaddr.c: Updated to bind-4.9.4-T5B.

Sat Jun 22 16:49:47 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* rpm/Makefile ($(config)): Make sure the word list in the for
	loop is syntactically non-empty.
-rw-r--r--ChangeLog150
-rw-r--r--Makeconfig3
-rw-r--r--Makefile2
-rw-r--r--Makerules130
-rw-r--r--NEWS11
-rwxr-xr-xconfigure7
-rw-r--r--configure.in7
-rw-r--r--elf/dl-load.c7
-rw-r--r--extra-lib.mk3
-rw-r--r--grp/Makefile7
-rw-r--r--grp/fgetgrent.c50
-rw-r--r--grp/getgrent.c59
-rw-r--r--grp/getgrent_r.c30
-rw-r--r--grp/getgrgid.c30
-rw-r--r--grp/getgrgid_r.c30
-rw-r--r--grp/getgrnam.c30
-rw-r--r--grp/getgrnam_r.c29
-rw-r--r--grp/grpread.c166
-rw-r--r--inet/Makefile15
-rw-r--r--inet/gethstbyad.c31
-rw-r--r--inet/gethstbyad_r.c31
-rw-r--r--inet/gethstbynm.c31
-rw-r--r--inet/gethstbynm2.c31
-rw-r--r--inet/gethstbynm2_r.c30
-rw-r--r--inet/gethstbynm_r.c31
-rw-r--r--inet/gethstent.c (renamed from pwd/pwdopen.c)23
-rw-r--r--inet/gethstent_r.c32
-rw-r--r--inet/getnetbynm.c30
-rw-r--r--inet/getnetbynm_r.c30
-rw-r--r--inet/getnetbypt.c30
-rw-r--r--inet/getnetbypt_r.c30
-rw-r--r--inet/getnetent.c (renamed from grp/grpopen.c)22
-rw-r--r--inet/getnetent_r.c31
-rw-r--r--inet/getproto.c73
-rw-r--r--inet/getproto_r.c29
-rw-r--r--inet/getprtent.c131
-rw-r--r--inet/getprtent_r.c30
-rw-r--r--inet/getprtname.c80
-rw-r--r--inet/getprtname_r.c29
-rw-r--r--inet/getrpcbyname.c30
-rw-r--r--inet/getrpcbyname_r.c29
-rw-r--r--inet/getrpcbynumber.c29
-rw-r--r--inet/getrpcbynumber_r.c29
-rw-r--r--inet/getrpcent.c26
-rw-r--r--inet/getrpcent_r.c26
-rw-r--r--inet/getservent.c133
-rw-r--r--inet/getservent_r.c30
-rw-r--r--inet/getsrvbynm.c83
-rw-r--r--inet/getsrvbynm_r.c29
-rw-r--r--inet/getsrvbypt.c78
-rw-r--r--inet/getsrvbypt_r.c29
-rw-r--r--inet/herrno.c22
-rw-r--r--nss/Makefile57
-rw-r--r--nss/XXX-lookup.c51
-rw-r--r--nss/file-lookup.c22
-rw-r--r--nss/getXXbyYY.c71
-rw-r--r--nss/getXXbyYY_r.c129
-rw-r--r--nss/getXXent.c63
-rw-r--r--nss/getXXent_r.c222
-rw-r--r--nss/grp-lookup.c22
-rw-r--r--nss/host-lookup.c22
-rw-r--r--nss/network-lookup.c22
-rw-r--r--nss/nss_dns/dns-host.c611
-rw-r--r--nss/nss_dns/dns-network.c338
-rw-r--r--nss/nss_files/files-XXX.c221
-rw-r--r--nss/nss_files/files-grp.c49
-rw-r--r--nss/nss_files/files-hosts.c111
-rw-r--r--nss/nss_files/files-network.c54
-rw-r--r--nss/nss_files/files-parse.c171
-rw-r--r--nss/nss_files/files-proto.c48
-rw-r--r--nss/nss_files/files-pwd.c54
-rw-r--r--nss/nss_files/files-rpc.c48
-rw-r--r--nss/nss_files/files-service.c51
-rw-r--r--nss/nsswitch.c588
-rw-r--r--nss/nsswitch.h138
-rw-r--r--nss/proto-lookup.c22
-rw-r--r--nss/pwd-lookup.c22
-rw-r--r--nss/rpc-lookup.c22
-rw-r--r--nss/service-lookup.c22
-rw-r--r--posix/getopt.c2
-rw-r--r--posix/regex.c4
-rw-r--r--pwd/Makefile6
-rw-r--r--pwd/fgetpwent.c53
-rw-r--r--pwd/getpwent.c59
-rw-r--r--pwd/getpwent_r.c30
-rw-r--r--pwd/getpwnam.c30
-rw-r--r--pwd/getpwnam_r.c30
-rw-r--r--pwd/getpwuid.c30
-rw-r--r--pwd/getpwuid_r.c30
-rw-r--r--pwd/pwdread.c147
-rw-r--r--resolv.h2
-rw-r--r--resolv/gethnamaddr.c502
-rw-r--r--resolv/getnetbyaddr.c57
-rw-r--r--resolv/getnetbyname.c64
-rw-r--r--resolv/getnetent.c162
-rw-r--r--resolv/inet_pton.c2
-rw-r--r--resolv/mapv4v6addr.h75
-rw-r--r--resolv/mapv4v6hostent.h90
-rw-r--r--resolv/netdb.h11
-rw-r--r--resolv/res_init.c4
-rw-r--r--resolv/sethostent.c62
-rw-r--r--rpm/Makefile6
-rw-r--r--shlib-versions10
-rw-r--r--sunrpc/Makefile4
-rw-r--r--sunrpc/getrpcent.c217
-rw-r--r--sysdeps/alpha/dl-machine.h6
-rw-r--r--time/Makefile1
107 files changed, 5013 insertions, 2058 deletions
diff --git a/ChangeLog b/ChangeLog
index 2459342127..2721aa9244 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,153 @@
+Tue Jun 25 02:59:11 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* malloc/malloc.h: Declare malloc_object_allocated_size, malloc_walk.
+	* malloc/Makefile (dist-routines): Add malloc-size, malloc-walk.
+	* malloc/malloc-size.c: New file.
+	* malloc/malloc-walk.c: New file.
+
+	* malloc/malloc-find.c (malloc_find_object_address): Return null if
+	PTR is outside the heap.
+
+	* elf/dl-load.c (_dl_map_object): If the requested name matches the
+ 	soname of a loaded object, use that object.
+
+Mon Jun 24 19:57:01 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* Makefile (subdirs): Add nss.
+
+	* inet/Makefile (routines): Add getrpcent, getrpcbyname,
+	getrpcbynumber, getrpcent_r, getrpcbyname_r, getrpcbynumber_r.
+	* inet/getrpcbynumber_r.c: New file.
+	* inet/getrpcbynumber.c: New file.
+	* inet/getrpcbyname.c: New file.
+	* inet/getrpcbyname_r.c: New file.
+	* inet/getrpcent_r.c: New file.
+	* inet/getrpcent.c: New file.
+	* nss/rpc-lookup.c: New file.
+	* nss/nss_files/files-rpc.c: New file.
+	* nss/Makefile (routines): Add rpc-lookup.
+	(libnss_files-routines): Add files-rpc.
+	* sunrpc/Makefile (routines): Remove getrpcent.
+	* sunrpc/getrpcent.c: File removed.
+
+	* nss/getXXent_r.c (REENTRANT_GETNAME): Clear NO_MORE when NIP is
+	non-null on entry.
+
+	* Makeconfig (rpath-link): Add $(nssobjdir).
+	(nssobjdir): New variable.
+
+	* Makerules: Move shared library building before objects rules, so
+	versions are known before extra-lib.mk gets included.
+	* extra-lib.mk (lib-noranlib): Depend on the shared object too.
+
+	* pwd/getpwuid.c: Rewritten using nss.
+	* pwd/getpwnam.c: Likewise.
+	* pwd/getpwent.c: Likewise.
+	* grp/getgrnam.c: Likewise.
+	* grp/getgrgid.c: Likewise.
+	* grp/getgrent.c: Likewise.
+	* pwd/Makefile (routines): Add getpwent_r, getpwnam_r, getpwuid_r.
+	* pwd/getpwent_r.c: New file.
+	* pwd/getpwnam_r.c: New file.
+	* pwd/getpwuid_r.c: New file.
+	* grp/Makefile (routines): Add getgrent_r, getgrgid_r, getgrnam_r.
+	* grp/getgrnam_r.c: New file.
+	* grp/getgrgid_r.c: New file.
+	* grp/getgrent_r.c: New file.
+	* grp/Makefile (routines): Remove grpopen, grpread.
+	* pwd/Makefile (routines): Remove pwdopen, pwdread.
+	* grp/grpopen.c, grp/grpread.c, pwd/pwdopen.c, pwd/pwdread.c: Removed.
+
+	* pwd/fgetpwent.c: Rewritten using files-parse.c.
+	* grp/fgetgrent.c: Likewise.
+
+	* nss/Makefile (routines): Add grp-lookup and pwd-lookup.
+	* nss/pwd-lookup.c, nss/grp-lookup.c: New files.
+	* nss/nss_files/files-grp.c: New file.
+	* nss/nss_files/files-pwd.c: New file.
+
+	* nss/Makefile (subdir-dirs): New variable; use it in vpath.
+
+	* nss/nss_files/files-parse.c: New file.
+	* nss/nss_files/files-XXX.c: New file.
+	* nss/nss_files/files-hosts.c, nss/nss_files/files-proto.c,
+	nss/nss_files/files-service.c, nss/nss_files/files-network.c:
+	Rewritten using them.
+
+	* nss/Makefile (libnss_files-routines): Remove files-host.
+	Add files-hosts, files-grp, files-pwd.
+
+	* nss/nss_dns/dns-network.c: Don't include <pthread.h>.
+
+Mon Jun 24 22:39:12 1996  Richard Henderson  <rth@tamu.edu>
+
+	* sysdeps/alpha/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE):
+	A .plt entry now loads the .rela.plt offset directly rather
+	than making us calculate it.
+
+Sun Jun 23 15:24:05 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* time/Makefile ($(installed-localtime-file) rule): Do
+	$(make-target-directory) first.
+
+	* resolv.h: Fix wrapper for resolv/resolv.h.
+
+	* configure.in (ld --no-whole-archive check): Use AC_TRY_COMMAND.
+	Compile dummy file and pass -nostdlib -nostartfiles so as not to
+	require installed libraries.
+
+	* shlib-versions (*-*-*): Set libresolv=2, libnss_files=1,
+	libnss_dns=1.
+
+Sun Jun 23 19:42:05 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* resolv/netdb.h (_PATH_NSSWITCH_CONF): New macro.
+
+	* inet/herrno.c: New file.
+
+	* resolv/res_init.c: Remove res_hconf calls.
+
+	* nss/Makefile, nss/XXX-lookup.c, nss/file-lookup.c,
+	nss/getXXbyYY.c, nss/getXXbyYY_r.c, nss/getXXent.c,
+	nss/getXXent_r.c, nss/host-lookup.c, nss/network-lookup.c,
+	nss/nsswitch.c, nss/nsswitch.h, nss/proto-lookup.c,
+	nss/service-lookup.c: New files.  Implementation of name
+	service switch, following the approach in Solaris.
+	Interface specification and general structure inspired by Peter
+	Eriksson <pen@lysator.liu.se>.
+	* nss/nss_files/files-host.c, nss/nss_files/files-network.c,
+	nss/nss_files/files-proto.c, nss/nss_files/files-service.c:
+	Implementation of libnss_files.so module for file based databases
+	in NSS service.
+	* nss/nss_dns/dns-host.c, nss/nss_dns/dns-network.c: Implementation
+        if libnss_dns.so module for DNS name lookup in NSS service.
+
+	* inet/getproto.c, inet/getprtent.c, inet/getprtname.c,
+	inet/getservent.c, inet/getsrvbynm.c, inet/getsrvbypt.c:
+	Changed to serve as interface to NSS.
+	* inet/gethstbyad.c, inet/gethstbyad_r.c, inet/gethstbynm.c,
+	inet/gethstbynm2.c, inet/gethstbynm2_r.c, inet/gethstbynm_r.c,
+	inet/gethstent.c, inet/gethstent_r.c, inet/getnetbynm.c,
+	inet/getnetbynm_r.c, inet/getnetbypt.c, inet/getnetbypt_r.c,
+	inet/getnetent.c, inet/getnetent_r.c, inet/getproto_r.c,
+	inet/getprtent_r.c, inet/getprtname_r.c, inet/getservent_r.c,
+	inet/getsrvbynm_r.c, inet/getsrvbypt_r.c: New files.  Implement
+	interfaces to NSS, including reentrant functions.
+
+	* resolv/getnetbyaddr.c, resolv/getnetbyname.c, resolv/getnetent.c,
+	resolv/sethostent.c: Removed:  Obsoleted by NSS.
+
+	* resolv/mapv4v6addr.h, resolv/mapv4v6hostent.h: Extracted from
+	gethnamaddr.c.  These private functions are now used in more
+	than one file.
+
+	* resolv/inet_pton.c, resolv/gethnamaddr.c: Updated to bind-4.9.4-T5B.
+
+Sat Jun 22 16:49:47 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* rpm/Makefile ($(config)): Make sure the word list in the for
+	loop is syntactically non-empty.
+
 Sat Jun 22 21:29:52 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
 	* Version 1.92 test release.
diff --git a/Makeconfig b/Makeconfig
index 3d7989086d..eeeb9ac53f 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -324,7 +324,8 @@ else
 default-rpath = $(libdir)
 endif
 # This is how to find at build-time things that will be installed there.
-rpath-link = $(common-objdir):$(elfobjdir)
+rpath-link = $(common-objdir):$(elfobjdir):$(nssobjdir)
+nssobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)nss))
 else
 link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
 endif
diff --git a/Makefile b/Makefile
index 39c812cc50..13ca36bdb5 100644
--- a/Makefile
+++ b/Makefile
@@ -54,7 +54,7 @@ endif
 subdirs = csu assert ctype db locale intl catgets math setjmp signal stdlib \
 	  stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd\
 	  posix io termios resource misc login socket sysvipc gmon gnulib \
-	  wctype $(wildcard crypt) manual $(sysdep-subdirs) elf po
+	  wctype $(wildcard crypt) manual $(sysdep-subdirs) nss elf po
 export subdirs := $(subdirs)	# Benign, useless in GNU make before 3.63.
 
 # The mach and hurd subdirectories have many generated header files which
diff --git a/Makerules b/Makerules
index 7f4b5fd16e..84afdd53a9 100644
--- a/Makerules
+++ b/Makerules
@@ -286,6 +286,71 @@ define sed-remove-objpfx
 endef
 endif
 
+# Shared library building.
+
+ifeq (yes,$(build-shared))
+
+# Process the shlib-versions file, which tells us what shared library
+# version numbers to use when we install shared objects on this system.
+-include $(common-objpfx)soversions.mk
+$(common-objpfx)soversions.mk: $(..)shlib-versions $(..)Makerules \
+			       $(common-objpfx)config.make
+	sed 's/#.*$$//' $< | while read conf versions; do \
+	  test -n "$$versions" || continue; \
+	  case '$(config-machine)-$(config-vendor)-$(config-os)' in $$conf)\
+	    for v in $$versions; do \
+	      lib="$${v%%=*}"; if eval "test -z \"\$$vers_lib$$lib\""; then \
+		eval vers_lib$${lib}=yes; \
+		echo $$lib.so-version=.$${v##$$lib=}; fi; \
+	  done ;; esac; done > $@T
+	mv -f $@T $@
+
+# Get $(version) defined with the release version number.
+-include $(common-objpfx)version.mk
+
+
+# Pattern rule to build a shared object from an archive of PIC objects.
+# This must come after the installation rules so Make doesn't try to
+# build shared libraries in place from the installed *_pic.a files.
+# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
+# on other shared objects.
+lib%.so: lib%_pic.a; $(build-shlib)
+
+ifeq ($(have-no-whole-archive),yes)
+no-whole-archive = -Wl,--no-whole-archive
+else
+no-whole-archive =
+endif
+
+define build-shlib
+$(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
+	  -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
+	  $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
+	  -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
+	  -Wl,--whole-archive $^ $(no-whole-archive) \
+	  $(LDLIBS-$(@F:lib%.so=%).so)
+endef
+
+# Don't try to use -lc when making libc.so itself.
+# Also omits crti.o and crtn.o, which we do not want
+# since we define our own `.init' section specially.
+LDFLAGS-c.so = -nostdlib -nostartfiles
+# Give libc.so an entry point and make it directly runnable itself.
+LDFLAGS-c.so += -e __libc_main
+# Use our own special initializer and finalizer files for libc.so.
+elfobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)elf))
+$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
+			 $(common-objpfx)libc_pic.a \
+			 $(elfobjdir)/sofini.so $(elfobjdir)/ld.so
+	$(build-shlib)
+
+ifdef libc.so-version
+$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
+	rm -f $@
+	ln -s $(<F) $@ || ln $< $@
+endif
+endif
+
 # Figure out the source filenames in this directory.
 
 override sources	:= $(addsuffix .c,$(filter-out $(elided-routines),\
@@ -452,71 +517,6 @@ $(AR) cru$(verbose) $(@:$(objpfx)%=%) \
 $(RANLIB) $@
 endef
 
-# Shared library building.
-
-ifeq (yes,$(build-shared))
-
-# Process the shlib-versions file, which tells us what shared library
-# version numbers to use when we install shared objects on this system.
--include $(common-objpfx)soversions.mk
-$(common-objpfx)soversions.mk: $(..)shlib-versions $(..)Makerules \
-			       $(common-objpfx)config.make
-	sed 's/#.*$$//' $< | while read conf versions; do \
-	  test -n "$$versions" || continue; \
-	  case '$(config-machine)-$(config-vendor)-$(config-os)' in $$conf)\
-	    for v in $$versions; do \
-	      lib="$${v%%=*}"; if eval "test -z \"\$$vers_lib$$lib\""; then \
-		eval vers_lib$${lib}=yes; \
-		echo $$lib.so-version=.$${v##$$lib=}; fi; \
-	  done ;; esac; done > $@T
-	mv -f $@T $@
-
-# Get $(version) defined with the release version number.
--include $(common-objpfx)version.mk
-
-
-# Pattern rule to build a shared object from an archive of PIC objects.
-# This must come after the installation rules so Make doesn't try to
-# build shared libraries in place from the installed *_pic.a files.
-# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
-# on other shared objects.
-lib%.so: lib%_pic.a; $(build-shlib)
-
-ifeq ($(have-no-whole-archive),yes)
-no-whole-archive = -Wl,--no-whole-archive
-else
-no-whole-archive =
-endif
-
-define build-shlib
-$(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
-	  -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
-	  $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
-	  -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
-	  -Wl,--whole-archive $^ $(no-whole-archive) \
-	  $(LDLIBS-$(@F:lib%.so=%).so)
-endef
-
-# Don't try to use -lc when making libc.so itself.
-# Also omits crti.o and crtn.o, which we do not want
-# since we define our own `.init' section specially.
-LDFLAGS-c.so = -nostdlib -nostartfiles
-# Give libc.so an entry point and make it directly runnable itself.
-LDFLAGS-c.so += -e __libc_main
-# Use our own special initializer and finalizer files for libc.so.
-elfobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)elf))
-$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
-			 $(common-objpfx)libc_pic.a \
-			 $(elfobjdir)/sofini.so $(elfobjdir)/ld.so
-	$(build-shlib)
-
-ifdef libc.so-version
-$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
-	rm -f $@
-	ln -s $(<F) $@ || ln $< $@
-endif
-endif
-
 # Installation.
 
 # $(install-lib) are installed from the object directory into $(libdir);
diff --git a/NEWS b/NEWS
index 1522d60c64..b82baa683d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  22 June 1996
+GNU C Library NEWS -- history of user-visible changes.  24 June 1996
 
 Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
 See the end for copying conditions.
@@ -47,6 +47,15 @@ Version 2.0
   `float' functions.  The math functions now reside in a separate library,
   so programs using them will need to use `-lm' their linking commands.
 
+* Ulrich Drepper has contributed support for an `/etc/nsswitch.conf'
+  mechanism similar to that found in Solaris 2.  This is now used for the
+  group, passwd, hosts, networks, services, protocols, and rpc databases.
+  The `nsswitch.conf' file controls what services are used for each
+  individual database.  This works by loading shared libraries with names
+  specified in `nsswitch.conf', so service modules can be changed or added at
+  any time without even relinking any program.  A future release of the
+  separate NYS package will provide NIS/YP and NIS+ modules for this interface.
+
 * The new functions `strtoq' and `strtouq' parse integer values from
   strings, like `strtol' and `strtoul', but they return `long long int' and
   `unsigned long long int' values, respectively (64-bit quantities).
diff --git a/configure b/configure
index 25586ff080..aef8058fe1 100755
--- a/configure
+++ b/configure
@@ -1541,10 +1541,11 @@ if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.c <<\EOF
-main () { exit (0); }
+_start () {}
 EOF
-if ${CC-cc} $CFLAGS -Wl,--no-whole-archive \
-	    -o conftest conftest.c 2>/dev/null; then
+if { ac_try='${CC-cc} $CFLAGS \
+			    -nostdlib -nostartfiles -Wl,--no-whole-archive \
+			    -o conftest conftest.c'; { (eval echo configure:1549: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
   libc_cv_ld_no_whole_archive=yes
 else
   libc_cv_ld_no_whole_archive=no
diff --git a/configure.in b/configure.in
index 610d5e84fb..46d7317d4f 100644
--- a/configure.in
+++ b/configure.in
@@ -475,10 +475,11 @@ fi
 
 AC_CACHE_CHECK(for ld --no-whole-archive, libc_cv_ld_no_whole_archive, [dnl
 cat > conftest.c <<\EOF
-main () { exit (0); }
+_start () {}
 EOF
-if ${CC-cc} $CFLAGS -Wl,--no-whole-archive \
-	    -o conftest conftest.c 2>/dev/null; then
+if AC_TRY_COMMAND([${CC-cc} $CFLAGS \
+			    -nostdlib -nostartfiles -Wl,--no-whole-archive \
+			    -o conftest conftest.c]); then
   libc_cv_ld_no_whole_archive=yes
 else
   libc_cv_ld_no_whole_archive=no
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 1e0db77c55..7c2f2e3985 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -459,7 +459,12 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
 
   /* Look for this name among those already loaded.  */
   for (l = _dl_loaded; l; l = l->l_next)
-    if (! strcmp (name, l->l_libname))
+    if (! strcmp (name, l->l_libname) || /* NAME was requested before.  */
+	/* If the requested name matches the soname of a loaded object,
+	   use that object.  */
+	(l->l_info[DT_SONAME] &&
+	 ! strcmp (name, (const char *) (l->addr +
+					 l->l_info[DT_SONAME]->d_un.d_ptr))))
       {
 	/* The object is already loaded.
 	   Just bump its reference count and return it.  */
diff --git a/extra-lib.mk b/extra-lib.mk
index 283da06b93..5368a03481 100644
--- a/extra-lib.mk
+++ b/extra-lib.mk
@@ -27,6 +27,9 @@ alltypes-$(lib) := $(foreach o,$(object-suffixes-$(lib)),\
 
 ifeq (,$($(lib)-no-lib-dep))
 lib-noranlib: $(alltypes-$(lib))
+ifeq (yes,$(build-shared))
+lib-noranlib: $(objpfx)$(lib).so$($(lib).so-version)
+endif
 else
 others: $(alltypes-$(lib))
 endif
diff --git a/grp/Makefile b/grp/Makefile
index 6444aab5ff..273b7d17ea 100644
--- a/grp/Makefile
+++ b/grp/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+# Copyright (C) 1991, 1992, 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
@@ -21,8 +21,9 @@
 #
 subdir	:= grp
 
-routines := grpopen grpread fgetgrent getgrent getgrgid getgrnam \
-	    initgroups setgroups
+routines := fgetgrent initgroups setgroups \
+	    getgrent getgrgid getgrnam \
+	    getgrent_r getgrgid_r getgrnam_r
 
 tests := testgrp
 
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c
index bef3e3f745..031ccb9c92 100644
--- a/grp/fgetgrent.c
+++ b/grp/fgetgrent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 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
@@ -16,26 +16,48 @@ 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 <ansidecl.h>
-#include <errno.h>
-#include <stddef.h>
 #include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 #include <grp.h>
 
+/* Define a line parsing function using the common code
+   used in the nss_files module.  */
 
-/* Read a group entry from STREAM.  */
+#define STRUCTURE	group
+#define ENTNAME		grent
+struct grent_data {};
+
+#define TRAILING_LIST_MEMBER		gr_mem
+#define TRAILING_LIST_SEPARATOR_P(c)	((c) == ',')
+#include "../nss/nss_files/files-parse.c"
+LINE_PARSER
+(
+ STRING_FIELD (result->gr_name, ISCOLON);
+ STRING_FIELD (result->gr_passwd, ISCOLON);
+ INT_FIELD (result->gr_gid, ISCOLON, 10,);
+)
+
+
+/* Read one entry from the given stream.  */
 struct group *
-DEFUN(fgetgrent, (stream), FILE *stream)
+fgetgrent (FILE *stream)
 {
-  static PTR info = NULL;
-  if (info == NULL)
+  static char buffer[BUFSIZ];
+  static struct group result;
+  char *p;
+
+  do
     {
-      info = __grpalloc();
-      if (info == NULL)
+      p = fgets (buffer, sizeof buffer, stream);
+      if (p == NULL)
 	return NULL;
-    }
 
-  return __grpread(stream, info);
+      /* Skip leading blanks.  */
+      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_line (p, &result, (void *) buffer, sizeof buffer));
+
+  return &result;
 }
diff --git a/grp/getgrent.c b/grp/getgrent.c
index 105572f9a0..4e14bbcf17 100644
--- a/grp/getgrent.c
+++ b/grp/getgrent.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1996 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 Library General Public License as
@@ -13,55 +14,17 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stddef.h>
-#include <stdio.h>
 #include <grp.h>
 
-static FILE *stream = NULL;
 
-/* Rewind the stream.  */
-void
-DEFUN_VOID(setgrent)
-{
-  if (stream != NULL)
-    rewind(stream);
-}
+#define LOOKUP_TYPE	struct group
+#define SETFUNC_NAME	setgrent
+#define	GETFUNC_NAME	getgrent
+#define	ENDFUNC_NAME	endgrent
+#define DATABASE_NAME	group
+#define BUFLEN		1024
 
-
-/* Close the stream.  */
-void
-DEFUN_VOID(endgrent)
-{
-  if (stream != NULL)
-    {
-      (void) fclose(stream);
-      stream = NULL;
-    }
-}
-
-
-/* Read an entry from the stream.  */
-struct group *
-DEFUN_VOID(getgrent)
-{
-  static PTR info = NULL;
-  if (info == NULL)
-    {
-      info = __grpalloc();
-      if (info == NULL)
-	return(NULL);
-    }
-
-  if (stream == NULL)
-    {
-      stream = __grpopen();
-      if (stream == NULL)
-	return(NULL);
-    }
-
-  return(__grpread(stream, info));
-}
+#include "../nss/getXXent.c"
diff --git a/grp/getgrent_r.c b/grp/getgrent_r.c
new file mode 100644
index 0000000000..db692b20d6
--- /dev/null
+++ b/grp/getgrent_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <grp.h>
+
+
+#define LOOKUP_TYPE	struct group
+#define SETFUNC_NAME	setgrent
+#define	GETFUNC_NAME	getgrent
+#define	ENDFUNC_NAME	endgrent
+#define DATABASE_NAME	group
+#define BUFLEN		1024
+
+#include "../nss/getXXent_r.c"
diff --git a/grp/getgrgid.c b/grp/getgrgid.c
index ef3860fe40..855d31cbe9 100644
--- a/grp/getgrgid.c
+++ b/grp/getgrgid.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1996 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 Library General Public License as
@@ -13,24 +14,17 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <sys/types.h>
 #include <grp.h>
 
-/* Search for an entry with a matching group ID.  */
-struct group *
-DEFUN(getgrgid, (gid), gid_t gid)
-{
-  int match (struct group *p)
-    {
-      return p->gr_gid == gid;
-    }
-  static void *info;
 
-  return __grpscan (&info, &match);
-}
+#define LOOKUP_TYPE	struct group
+#define FUNCTION_NAME	getgrgid
+#define DATABASE_NAME	group
+#define ADD_PARAMS	gid_t gid
+#define ADD_VARIABLES	gid
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/grp/getgrgid_r.c b/grp/getgrgid_r.c
new file mode 100644
index 0000000000..1d5f1a4313
--- /dev/null
+++ b/grp/getgrgid_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <grp.h>
+
+
+#define LOOKUP_TYPE	struct passwd
+#define FUNCTION_NAME	getgrgid
+#define DATABASE_NAME	group
+#define ADD_PARAMS	gid_t gid
+#define ADD_VARIABLES	gid
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/grp/getgrnam.c b/grp/getgrnam.c
index 841677070d..2104d87459 100644
--- a/grp/getgrnam.c
+++ b/grp/getgrnam.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1996 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 Library General Public License as
@@ -13,24 +14,17 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
 #include <grp.h>
 
-/* Search for an entry with a matching name.  */
-struct group *
-DEFUN(getgrnam, (name), const char *name)
-{
-  int match (struct group *p)
-    {
-      return ! strcmp (name, p->gr_name);
-    }
-  static void *info;
 
-  return __grpscan (&info, &match);
-}
+#define LOOKUP_TYPE	struct group
+#define FUNCTION_NAME	getgrnam
+#define DATABASE_NAME	group
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/grp/getgrnam_r.c b/grp/getgrnam_r.c
new file mode 100644
index 0000000000..c1292bb581
--- /dev/null
+++ b/grp/getgrnam_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <grp.h>
+
+
+#define LOOKUP_TYPE	struct group
+#define FUNCTION_NAME	getgrnam
+#define DATABASE_NAME	group
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/grp/grpread.c b/grp/grpread.c
deleted file mode 100644
index 1fed32f2e3..0000000000
--- a/grp/grpread.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Copyright (C) 1991, 1992, 1995 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 <ansidecl.h>
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <grp.h>
-
-/* This is the function that all the others are based on.
-   The format of the group file is known only here.  */
-
-/* Structure containing info kept by each __grpread caller.  */
-typedef struct
-  {
-    char *buf;
-    size_t buflen;
-    size_t max_members;
-    char **members;
-    struct group g;
-  } grpread_info;
-
-
-/* Return a chunk of memory containing a pre-initialized `grpread_info'.  */
-PTR
-DEFUN_VOID(__grpalloc)
-{
-  grpread_info *info = (PTR) malloc (sizeof(grpread_info));
-  if (info == NULL)
-    return NULL;
-
-  info->buf = NULL;
-  info->buflen = 0;
-
-  info->max_members = 5;
-  info->members = (char **) malloc (5 * sizeof(char *));
-  if (info->members == NULL)
-    {
-      free ((PTR) info);
-      return NULL;
-    }
-
-  return info;
-}
-
-/* Read a group entry from STREAM, filling in G.  */
-struct group *
-DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g)
-{
-  register grpread_info *CONST info = (grpread_info *) g;
-  char *start, *end;
-  register size_t i;
-
-  /* Idiocy checks.  */
-  if (stream == NULL)
-    {
-      errno = EINVAL;
-      return NULL;
-    }
-
-  do
-    if (__getline (&info->buf, &info->buflen, stream) == -1)
-      return NULL;
-  while (info->buf[0] == '#');
-
-  start = info->buf;
-  end = strchr (start, ':');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->g.gr_name = start;
-
-  start = end + 1;
-  end = strchr (start, ':');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->g.gr_passwd = start;
-
-  info->g.gr_gid = (gid_t) strtol (end + 1, &end, 10);
-  if (*end != ':')
-    return NULL;
-
-  i = 0;
-  do
-    {
-      start = end + 1;
-      end = strchr (start, ',');
-      if (end == NULL)
-	{
-	  end = strchr (start, '\n');
-	  if (end == start)
-	    break;
-	  if (end == NULL)
-	    return NULL;
-	  *end = '\0';
-	  end = NULL;
-	}
-      else
-	*end = '\0';
-
-      if (i == info->max_members - 2)
-	{
-	  info->max_members += 5;
-	  info->members = (char **)
-	    realloc ((PTR) info->members, info->max_members * sizeof (char *));
-	  if (info->members == NULL)
-	    return NULL;
-	}
-
-      info->members[i++] = start;
-    } while (end != NULL);
-  info->members[i] = NULL;
-  info->g.gr_mem = info->members;
-
-  return &info->g;
-}
-
-
-struct group *
-__grpscan (void **info, int (*selector) (struct group *))
-{
-  FILE *stream;
-  struct group *p;
-
-  if (*info == NULL)
-    {
-      *info = __grpalloc ();
-      if (info == NULL)
-	return NULL;
-    }
-
-  stream = __grpopen ();
-  if (stream == NULL)
-    return NULL;
-
-  p = NULL;
-  while (! feof (stream))
-    {
-      p = __grpread (stream, *info);
-      if (p && (*selector) (p))
-	break;
-      p = NULL;
-    }
-
-  (void) fclose (stream);
-  return p;
-}
diff --git a/inet/Makefile b/inet/Makefile
index 9389a22338..da300c7376 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96 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
@@ -25,9 +25,16 @@ headers	:= netinet/in.h $(wildcard arpa/*.h protocols/*.h)
 
 routines := ntohl ntohs htonl htons		\
 	    inet_lnaof inet_mkadr	\
-	    inet_netof inet_ntoa inet_net	\
-	    getproto getprtent getprtname	\
-	    getsrvbynm getsrvbypt getservent	\
+	    inet_netof inet_ntoa inet_net herrno \
+	    gethstbyad gethstbyad_r gethstbynm gethstbynm2 gethstbynm2_r \
+	    gethstbynm_r gethstent gethstent_r \
+	    getnetbypt getnetbypt_r getnetbynm getnetent getnetent_r \
+	    getnetbynm_r \
+	    getproto getproto_r getprtent getprtent_r getprtname getprtname_r \
+	    getsrvbynm getsrvbynm_r getsrvbypt getsrvbypt_r getservent \
+	    getservent_r	\
+	    getrpcent getrpcbyname getrpcbynumber \
+	    getrpcent_r getrpcbyname_r getrpcbynumber_r \
 	    rcmd rexec ruserpass
 
 # No warnings about losing BSD code.
diff --git a/inet/gethstbyad.c b/inet/gethstbyad.c
new file mode 100644
index 0000000000..abc2eab06d
--- /dev/null
+++ b/inet/gethstbyad.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define FUNCTION_NAME	gethostbyaddr
+#define DATABASE_NAME	hosts
+#define ADD_PARAMS	const char *addr, int len, int type
+#define ADD_VARIABLES	addr, len, type
+#define BUFLEN		1024
+#define NEED_H_ERRNO	1
+
+#include "../nss/getXXbyYY.c"
diff --git a/inet/gethstbyad_r.c b/inet/gethstbyad_r.c
new file mode 100644
index 0000000000..7dce4403d7
--- /dev/null
+++ b/inet/gethstbyad_r.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define FUNCTION_NAME	gethostbyaddr
+#define DATABASE_NAME	hosts
+#define ADD_PARAMS	const char *addr, int len, int type
+#define ADD_VARIABLES	addr, len, type
+#define NEED_H_ERRNO	1
+#define NEED__RES	1
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/gethstbynm.c b/inet/gethstbynm.c
new file mode 100644
index 0000000000..07178108cf
--- /dev/null
+++ b/inet/gethstbynm.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define FUNCTION_NAME	gethostbyname
+#define DATABASE_NAME	hosts
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+#define NEED_H_ERRNO	1
+
+#include "../nss/getXXbyYY.c"
diff --git a/inet/gethstbynm2.c b/inet/gethstbynm2.c
new file mode 100644
index 0000000000..42a01d4141
--- /dev/null
+++ b/inet/gethstbynm2.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define FUNCTION_NAME	gethostbyname2
+#define DATABASE_NAME	hosts
+#define ADD_PARAMS	const char *name, int af
+#define ADD_VARIABLES	name, af
+#define BUFLEN		1024
+#define NEED_H_ERRNO	1
+
+#include "../nss/getXXbyYY.c"
diff --git a/inet/gethstbynm2_r.c b/inet/gethstbynm2_r.c
new file mode 100644
index 0000000000..a2aee54559
--- /dev/null
+++ b/inet/gethstbynm2_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define FUNCTION_NAME	gethostbyname2
+#define DATABASE_NAME	hosts
+#define ADD_PARAMS	const char *name, int af
+#define ADD_VARIABLES	name, af
+#define NEED_H_ERRNO	1
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/gethstbynm_r.c b/inet/gethstbynm_r.c
new file mode 100644
index 0000000000..6bd2920e74
--- /dev/null
+++ b/inet/gethstbynm_r.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define FUNCTION_NAME	gethostbyname
+#define DATABASE_NAME	hosts
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define NEED_H_ERRNO	1
+#define NEED__RES	1
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/pwd/pwdopen.c b/inet/gethstent.c
index 6d35ab9441..5c7293683f 100644
--- a/pwd/pwdopen.c
+++ b/inet/gethstent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* 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
@@ -13,16 +13,15 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stdio.h>
-#include <pwd.h>
+#include <netdb.h>
 
-/* Return a new stream open on the password file.  */
-FILE *
-DEFUN_VOID(__pwdopen)
-{
-  return(fopen("/etc/passwd", "r"));
-}
+
+#define LOOKUP_TYPE	struct hostent
+#define	GETFUNC_NAME	gethostent
+#define BUFLEN		1024
+#define NEED_H_ERRNO	1
+
+#include "../nss/getXXent.c"
diff --git a/inet/gethstent_r.c b/inet/gethstent_r.c
new file mode 100644
index 0000000000..f07601dfad
--- /dev/null
+++ b/inet/gethstent_r.c
@@ -0,0 +1,32 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct hostent
+#define SETFUNC_NAME	sethostent
+#define	GETFUNC_NAME	gethostent
+#define	ENDFUNC_NAME	endhostent
+#define DATABASE_NAME	hosts
+#define STAYOPEN	int stayopen
+#define STAYOPEN_VAR	stayopen
+#define NEED_H_ERRNO	1
+#define NEED__RES	1
+
+#include "../nss/getXXent_r.c"
diff --git a/inet/getnetbynm.c b/inet/getnetbynm.c
new file mode 100644
index 0000000000..db1c7b0cf6
--- /dev/null
+++ b/inet/getnetbynm.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct netent
+#define FUNCTION_NAME	getnetbyname
+#define DATABASE_NAME	networks
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getnetbynm_r.c b/inet/getnetbynm_r.c
new file mode 100644
index 0000000000..ba395d63ac
--- /dev/null
+++ b/inet/getnetbynm_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct netent
+#define FUNCTION_NAME	getnetbyname
+#define DATABASE_NAME	networks
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define NEED__RES	1
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getnetbypt.c b/inet/getnetbypt.c
new file mode 100644
index 0000000000..960ac0a064
--- /dev/null
+++ b/inet/getnetbypt.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct netent
+#define FUNCTION_NAME	getnetbyport
+#define DATABASE_NAME	networks
+#define ADD_PARAMS	unsigned long int net, int type
+#define ADD_VARIABLES	net, type
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getnetbypt_r.c b/inet/getnetbypt_r.c
new file mode 100644
index 0000000000..a39f26f797
--- /dev/null
+++ b/inet/getnetbypt_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct netent
+#define FUNCTION_NAME	getnetbyport
+#define DATABASE_NAME	networks
+#define ADD_PARAMS	unsigned long int net, int type
+#define ADD_VARIABLES	net, type
+#define NEED__RES	1
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/grp/grpopen.c b/inet/getnetent.c
index 77d15979f1..207a70ea5e 100644
--- a/grp/grpopen.c
+++ b/inet/getnetent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* 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
@@ -13,16 +13,14 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stdio.h>
-#include <grp.h>
+#include <netdb.h>
 
-/* Return a new stream open on the group file.  */
-FILE *
-DEFUN_VOID(__grpopen)
-{
-  return fopen("/etc/group", "r");
-}
+
+#define LOOKUP_TYPE	struct netent
+#define	GETFUNC_NAME	getnetent
+#define BUFLEN		1024
+
+#include "../nss/getXXent.c"
diff --git a/inet/getnetent_r.c b/inet/getnetent_r.c
new file mode 100644
index 0000000000..333bb4b529
--- /dev/null
+++ b/inet/getnetent_r.c
@@ -0,0 +1,31 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct netent
+#define SETFUNC_NAME	setnetent
+#define	GETFUNC_NAME	getnetent
+#define	ENDFUNC_NAME	endnetent
+#define DATABASE_NAME	networks
+#define STAYOPEN	int stayopen
+#define STAYOPEN_VAR	stayopen
+#define NEED__RES	1
+
+#include "../nss/getXXent_r.c"
diff --git a/inet/getproto.c b/inet/getproto.c
index 92f562bebf..11452c1ddf 100644
--- a/inet/getproto.c
+++ b/inet/getproto.c
@@ -1,55 +1,30 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getproto.c	8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #include <netdb.h>
 
-extern int _proto_stayopen;
 
-struct protoent *
-getprotobynumber(proto)
-	register int proto;
-{
-	register struct protoent *p;
+#define LOOKUP_TYPE	struct protoent
+#define FUNCTION_NAME	getprotobynumber
+#define DATABASE_NAME	protocols
+#define ADD_PARAMS	int proto
+#define ADD_VARIABLES	proto
+#define BUFLEN		1024
 
-	setprotoent(_proto_stayopen);
-	while (p = getprotoent())
-		if (p->p_proto == proto)
-			break;
-	if (!_proto_stayopen)
-		endprotoent();
-	return (p);
-}
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getproto_r.c b/inet/getproto_r.c
new file mode 100644
index 0000000000..c915280896
--- /dev/null
+++ b/inet/getproto_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct protoent
+#define FUNCTION_NAME	getprotobynumber
+#define DATABASE_NAME	protocols
+#define ADD_PARAMS	int proto
+#define ADD_VARIABLES	proto
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getprtent.c b/inet/getprtent.c
index c10ae330e4..8b55a4ddef 100644
--- a/inet/getprtent.c
+++ b/inet/getprtent.c
@@ -1,119 +1,26 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getprotoent.c	8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
+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.
 
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define	MAXALIASES	35
+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.
 
-static FILE *protof = NULL;
-static char line[BUFSIZ+1];
-static struct protoent proto;
-static char *proto_aliases[MAXALIASES];
-int _proto_stayopen;
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-void
-setprotoent(f)
-	int f;
-{
-	if (protof == NULL)
-		protof = fopen(_PATH_PROTOCOLS, "r" );
-	else
-		rewind(protof);
-	_proto_stayopen |= f;
-}
+#include <netdb.h>
 
-void
-endprotoent()
-{
-	if (protof) {
-		fclose(protof);
-		protof = NULL;
-	}
-	_proto_stayopen = 0;
-}
 
-struct protoent *
-getprotoent()
-{
-	char *p;
-	register char *cp, **q;
+#define LOOKUP_TYPE	struct protoent
+#define	GETFUNC_NAME	getprotoent
+#define BUFLEN		1024
 
-	if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL)
-		return (NULL);
-again:
-	if ((p = fgets(line, BUFSIZ, protof)) == NULL)
-		return (NULL);
-	if (*p == '#')
-		goto again;
-	cp = strpbrk(p, "#\n");
-	if (cp == NULL)
-		goto again;
-	*cp = '\0';
-	proto.p_name = p;
-	cp = strpbrk(p, " \t");
-	if (cp == NULL)
-		goto again;
-	*cp++ = '\0';
-	while (*cp == ' ' || *cp == '\t')
-		cp++;
-	p = strpbrk(cp, " \t");
-	if (p != NULL)
-		*p++ = '\0';
-	proto.p_proto = atoi(cp);
-	q = proto.p_aliases = proto_aliases;
-	if (p != NULL) {
-		cp = p;
-		while (cp && *cp) {
-			if (*cp == ' ' || *cp == '\t') {
-				cp++;
-				continue;
-			}
-			if (q < &proto_aliases[MAXALIASES - 1])
-				*q++ = cp;
-			cp = strpbrk(cp, " \t");
-			if (cp != NULL)
-				*cp++ = '\0';
-		}
-	}
-	*q = NULL;
-	return (&proto);
-}
+#include "../nss/getXXent.c"
diff --git a/inet/getprtent_r.c b/inet/getprtent_r.c
new file mode 100644
index 0000000000..47a2f9ec2b
--- /dev/null
+++ b/inet/getprtent_r.c
@@ -0,0 +1,30 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct protoent
+#define SETFUNC_NAME	setprotoent
+#define	GETFUNC_NAME	getprotoent
+#define	ENDFUNC_NAME	endprotoent
+#define DATABASE_NAME	protocols
+#define STAYOPEN	int stayopen
+#define STAYOPEN_VAR	stayopen
+
+#include "../nss/getXXent_r.c"
diff --git a/inet/getprtname.c b/inet/getprtname.c
index 3ee6754bb3..f291513378 100644
--- a/inet/getprtname.c
+++ b/inet/getprtname.c
@@ -1,62 +1,30 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getprotoname.c	8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #include <netdb.h>
-#include <string.h>
 
-extern int _proto_stayopen;
 
-struct protoent *
-getprotobyname(name)
-	register const char *name;
-{
-	register struct protoent *p;
-	register char **cp;
+#define LOOKUP_TYPE	struct protoent
+#define FUNCTION_NAME	getprotobyname
+#define DATABASE_NAME	protocols
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
 
-	setprotoent(_proto_stayopen);
-	while (p = getprotoent()) {
-		if (strcmp(p->p_name, name) == 0)
-			break;
-		for (cp = p->p_aliases; *cp != 0; cp++)
-			if (strcmp(*cp, name) == 0)
-				goto found;
-	}
-found:
-	if (!_proto_stayopen)
-		endprotoent();
-	return (p);
-}
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getprtname_r.c b/inet/getprtname_r.c
new file mode 100644
index 0000000000..8de7410171
--- /dev/null
+++ b/inet/getprtname_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct protoent
+#define FUNCTION_NAME	getprotobyname
+#define DATABASE_NAME	protocols
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getrpcbyname.c b/inet/getrpcbyname.c
new file mode 100644
index 0000000000..be14f71fed
--- /dev/null
+++ b/inet/getrpcbyname.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <rpc/netdb.h>
+
+
+#define LOOKUP_TYPE	struct rpcent
+#define FUNCTION_NAME	getrpcbyname
+#define DATABASE_NAME	rpc
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getrpcbyname_r.c b/inet/getrpcbyname_r.c
new file mode 100644
index 0000000000..c8b5eba23a
--- /dev/null
+++ b/inet/getrpcbyname_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <rpc/netdb.h>
+
+
+#define LOOKUP_TYPE	struct rpcent
+#define FUNCTION_NAME	getrpcbyname
+#define DATABASE_NAME	rpc
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getrpcbynumber.c b/inet/getrpcbynumber.c
new file mode 100644
index 0000000000..4b0215610f
--- /dev/null
+++ b/inet/getrpcbynumber.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <rpc/netdb.h>
+
+
+#define LOOKUP_TYPE	struct rpcent
+#define FUNCTION_NAME	getrpcbynumber
+#define DATABASE_NAME	rpc
+#define ADD_PARAMS	int number
+#define ADD_VARIABLES	number
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getrpcbynumber_r.c b/inet/getrpcbynumber_r.c
new file mode 100644
index 0000000000..4b0215610f
--- /dev/null
+++ b/inet/getrpcbynumber_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <rpc/netdb.h>
+
+
+#define LOOKUP_TYPE	struct rpcent
+#define FUNCTION_NAME	getrpcbynumber
+#define DATABASE_NAME	rpc
+#define ADD_PARAMS	int number
+#define ADD_VARIABLES	number
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getrpcent.c b/inet/getrpcent.c
new file mode 100644
index 0000000000..5b2274af45
--- /dev/null
+++ b/inet/getrpcent.c
@@ -0,0 +1,26 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <rpc/netdb.h>
+
+
+#define LOOKUP_TYPE	struct rpcent
+#define	GETFUNC_NAME	rpcent
+#define BUFLEN		1024
+
+#include "../nss/getXXent.c"
diff --git a/inet/getrpcent_r.c b/inet/getrpcent_r.c
new file mode 100644
index 0000000000..4c9639f3a1
--- /dev/null
+++ b/inet/getrpcent_r.c
@@ -0,0 +1,26 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <rpc/netdb.h>
+
+
+#define LOOKUP_TYPE	struct rpcent
+#define	GETFUNC_NAME	rpcent
+#define BUFLEN		1024
+
+#include "../nss/getXXent_r.c"
diff --git a/inet/getservent.c b/inet/getservent.c
index 6bee5d3a8b..bb51a6848c 100644
--- a/inet/getservent.c
+++ b/inet/getservent.c
@@ -1,121 +1,26 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getservent.c	8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
+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.
 
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#define	MAXALIASES	35
+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.
 
-static FILE *servf = NULL;
-static char line[BUFSIZ+1];
-static struct servent serv;
-static char *serv_aliases[MAXALIASES];
-int _serv_stayopen;
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-void
-setservent(f)
-	int f;
-{
-	if (servf == NULL)
-		servf = fopen(_PATH_SERVICES, "r" );
-	else
-		rewind(servf);
-	_serv_stayopen |= f;
-}
+#include <netdb.h>
 
-void
-endservent()
-{
-	if (servf) {
-		fclose(servf);
-		servf = NULL;
-	}
-	_serv_stayopen = 0;
-}
 
-struct servent *
-getservent()
-{
-	char *p;
-	register char *cp, **q;
+#define LOOKUP_TYPE	struct servent
+#define	GETFUNC_NAME	getservent
+#define BUFLEN		1024
 
-	if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL)
-		return (NULL);
-again:
-	if ((p = fgets(line, BUFSIZ, servf)) == NULL)
-		return (NULL);
-	if (*p == '#')
-		goto again;
-	cp = strpbrk(p, "#\n");
-	if (cp == NULL)
-		goto again;
-	*cp = '\0';
-	serv.s_name = p;
-	p = strpbrk(p, " \t");
-	if (p == NULL)
-		goto again;
-	*p++ = '\0';
-	while (*p == ' ' || *p == '\t')
-		p++;
-	cp = strpbrk(p, ",/");
-	if (cp == NULL)
-		goto again;
-	*cp++ = '\0';
-	serv.s_port = htons((u_short)atoi(p));
-	serv.s_proto = cp;
-	q = serv.s_aliases = serv_aliases;
-	cp = strpbrk(cp, " \t");
-	if (cp != NULL)
-		*cp++ = '\0';
-	while (cp && *cp) {
-		if (*cp == ' ' || *cp == '\t') {
-			cp++;
-			continue;
-		}
-		if (q < &serv_aliases[MAXALIASES - 1])
-			*q++ = cp;
-		cp = strpbrk(cp, " \t");
-		if (cp != NULL)
-			*cp++ = '\0';
-	}
-	*q = NULL;
-	return (&serv);
-}
+#include "../nss/getXXent.c"
diff --git a/inet/getservent_r.c b/inet/getservent_r.c
new file mode 100644
index 0000000000..676e3c91ac
--- /dev/null
+++ b/inet/getservent_r.c
@@ -0,0 +1,30 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct servent
+#define SETFUNC_NAME	setservent
+#define	GETFUNC_NAME	getservent
+#define	ENDFUNC_NAME	endservent
+#define DATABASE_NAME	services
+#define STAYOPEN	int stayopen
+#define STAYOPEN_VAR	stayopen
+
+#include "../nss/getXXent_r.c"
diff --git a/inet/getsrvbynm.c b/inet/getsrvbynm.c
index 77bf813777..863d2923b8 100644
--- a/inet/getsrvbynm.c
+++ b/inet/getsrvbynm.c
@@ -1,65 +1,30 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getservbyname.c	8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #include <netdb.h>
-#include <string.h>
 
-extern int _serv_stayopen;
 
-struct servent *
-getservbyname(name, proto)
-	const char *name, *proto;
-{
-	register struct servent *p;
-	register char **cp;
+#define LOOKUP_TYPE	struct servent
+#define FUNCTION_NAME	getservbyname
+#define DATABASE_NAME	services
+#define ADD_PARAMS	const char *name, const char *proto
+#define ADD_VARIABLES	name, proto
+#define BUFLEN		1024
 
-	setservent(_serv_stayopen);
-	while (p = getservent()) {
-		if (strcmp(name, p->s_name) == 0)
-			goto gotname;
-		for (cp = p->s_aliases; *cp; cp++)
-			if (strcmp(name, *cp) == 0)
-				goto gotname;
-		continue;
-gotname:
-		if (proto == 0 || strcmp(p->s_proto, proto) == 0)
-			break;
-	}
-	if (!_serv_stayopen)
-		endservent();
-	return (p);
-}
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getsrvbynm_r.c b/inet/getsrvbynm_r.c
new file mode 100644
index 0000000000..352c646bae
--- /dev/null
+++ b/inet/getsrvbynm_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct servent
+#define FUNCTION_NAME	getservbyname
+#define DATABASE_NAME	services
+#define ADD_PARAMS	const char *name, const char *proto
+#define ADD_VARIABLES	name, proto
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/getsrvbypt.c b/inet/getsrvbypt.c
index 0acb31bb08..c7f3508cfd 100644
--- a/inet/getsrvbypt.c
+++ b/inet/getsrvbypt.c
@@ -1,60 +1,30 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getservbyport.c	8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #include <netdb.h>
-#include <string.h>
 
-extern int _serv_stayopen;
 
-struct servent *
-getservbyport(port, proto)
-	int port;
-	const char *proto;
-{
-	register struct servent *p;
+#define LOOKUP_TYPE	struct servent
+#define FUNCTION_NAME	getservbyport
+#define DATABASE_NAME	services
+#define ADD_PARAMS	int port, const char *proto
+#define ADD_VARIABLES	port, proto
+#define BUFLEN		1024
 
-	setservent(_serv_stayopen);
-	while (p = getservent()) {
-		if (p->s_port != port)
-			continue;
-		if (proto == 0 || strcmp(p->s_proto, proto) == 0)
-			break;
-	}
-	if (!_serv_stayopen)
-		endservent();
-	return (p);
-}
+#include "../nss/getXXbyYY.c"
diff --git a/inet/getsrvbypt_r.c b/inet/getsrvbypt_r.c
new file mode 100644
index 0000000000..58851ef08b
--- /dev/null
+++ b/inet/getsrvbypt_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE	struct servent
+#define FUNCTION_NAME	getservbyport
+#define DATABASE_NAME	services
+#define ADD_PARAMS	int port, const char *proto
+#define ADD_VARIABLES	port, proto
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/inet/herrno.c b/inet/herrno.c
new file mode 100644
index 0000000000..7e413adf7a
--- /dev/null
+++ b/inet/herrno.c
@@ -0,0 +1,22 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* We need to have the error status variable of the resolver
+   accessible in the libc.  */
+int h_errno;
+
diff --git a/nss/Makefile b/nss/Makefile
new file mode 100644
index 0000000000..91c4ef7380
--- /dev/null
+++ b/nss/Makefile
@@ -0,0 +1,57 @@
+# 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.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#
+#	Makefile for name service switch.
+#
+subdir	:= nss
+
+distribute		:= nsswitch.h XXX-lookup.c getXXbyYY.c getXXbyYY_r.c \
+			   getXXent.c getXXent_r.c
+
+# This is the trivial part which goes into libc itself.
+routines		:= nsswitch \
+			   $(addsuffix -lookup,proto service host network \
+					       grp pwd rpc)
+
+
+# Specify rules for the nss_* modules.  We have some services.
+services		:= files dns
+
+extra-libs		= $(services:%=libnss_%)
+
+# The sources are found in the appropriate subdir.
+subdir-dirs = nss_files nss_dns
+vpath %.c $(subdir-dirs)
+
+
+libnss_files-routines	:= files-proto files-service files-network \
+			   files-hosts files-grp files-pwd files-rpc
+distribute		+= files-XXX.c files-parse.c
+
+libnss_dns-routines	:= dns-host dns-network
+
+libnss_files-inhibit-o	= $(filter-out .so,$(object-suffixes))
+libnss_dns-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
diff --git a/nss/XXX-lookup.c b/nss/XXX-lookup.c
new file mode 100644
index 0000000000..1f8cbbf015
--- /dev/null
+++ b/nss/XXX-lookup.c
@@ -0,0 +1,51 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include "nsswitch.h"
+
+/*******************************************************************\
+|* Here we assume one symbol to be defined:			   *|
+|* 								   *|
+|* DATABASE_NAME - name of the database the function accesses	   *|
+|*		   (e.g., hosts, servicess, ...)		   *|
+|* 								   *|
+\*******************************************************************/
+
+#define DB_LOOKUP_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_STRING STRINGIFY1 (DATABASE_NAME)
+#define STRINGIFY1(Name) STRINGIFY2 (Name)
+#define STRINGIFY2(Name) #Name
+
+
+static service_user *database = NULL;
+
+int
+DB_LOOKUP_FCT (service_user **ni, const char *fct_name, void **fctp)
+{
+  if (database == NULL
+      && __nss_database_lookup (DATABASE_NAME_STRING, &database) < 0)
+    return -1;
+
+  *ni = database;
+
+  return __nss_lookup (ni, fct_name, fctp);
+}
diff --git a/nss/file-lookup.c b/nss/file-lookup.c
new file mode 100644
index 0000000000..d9f7c67320
--- /dev/null
+++ b/nss/file-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME hosts
+
+#include "XXX-lookup.c"
diff --git a/nss/getXXbyYY.c b/nss/getXXbyYY.c
new file mode 100644
index 0000000000..5eb9ee9c87
--- /dev/null
+++ b/nss/getXXbyYY.c
@@ -0,0 +1,71 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include "../nss/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
+
+/* 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
+#endif
+
+
+/* Prototype for reentrant version we use here.  */
+extern LOOKUP_TYPE *REENTRANT_NAME (ADD_PARAMS, LOOKUP_TYPE *result,
+				    char *buffer, int buflen H_ERRNO_PARM);
+
+LOOKUP_TYPE *
+FUNCTION_NAME (ADD_PARAMS)
+{
+  static LOOKUP_TYPE result;
+  static char buffer[BUFLEN];
+
+  return REENTRANT_NAME (ADD_VARIABLES, &result, buffer, BUFLEN H_ERRNO_VAR);
+}
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
new file mode 100644
index 0000000000..42092361be
--- /dev/null
+++ b/nss/getXXbyYY_r.c
@@ -0,0 +1,129 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#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		   *|
+|* 								   *|
+|* Optionally the following vars can be defined:		   *|
+|* 								   *|
+|* 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	   *|
+|* 								   *|
+\*******************************************************************/
+
+/* 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 FUNCTION_NAME_STRING STRINGIZE (FUNCTION_NAME)
+#define REENTRANT_NAME_STRING STRINGIZE (REENTRANT_NAME)
+#define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME)
+#define STRINGIZE(name) STRINGIZE1 (name)
+#define STRINGIZE1(name) #name
+
+#define DB_LOOKUP_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
+
+/* 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
+#else
+# define H_ERRNO_PARM
+# define H_ERRNO_VAR
+#endif
+
+
+/* Type of the lookup function we need here.  */
+typedef int (*lookup_function) (ADD_PARAMS, LOOKUP_TYPE *, char *, int
+				H_ERRNO_PARM);
+
+/* Some usages of this file might use this variable.  */
+extern struct __res_state _res;
+
+/* The lookup function for the first entry of this service.  */
+extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp);
+
+
+
+LOOKUP_TYPE *
+REENTRANT_NAME (ADD_PARAMS, LOOKUP_TYPE *result, char *buffer, int buflen
+		H_ERRNO_PARM)
+{
+  static service_user *startp = NULL;
+  static lookup_function start_fct;
+  service_user *nip;
+  lookup_function fct;
+  int no_more;
+  enum nss_status status = NSS_STATUS_UNAVAIL;
+
+  if (startp == NULL)
+    {
+      no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, (void **) &fct);
+      if (no_more)
+	startp = (service_user *) -1;
+      else
+	{
+	  startp = nip;
+	  start_fct = fct;
+
+#ifdef NEED__RES
+	  /* The resolver code will really be used so we have to
+	     initialize it.  */
+	  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
+	    {
+	      h_errno = NETDB_INTERNAL;
+	      return NULL;
+	    }
+#endif /* need _res */
+	}
+    }
+  else
+    {
+      fct = start_fct;
+      no_more = (nip = startp) == (service_user *) -1;
+    }
+
+  while (no_more == 0)
+    {
+      status = (*fct) (ADD_VARIABLES, result, buffer, buflen H_ERRNO_VAR);
+
+      no_more = __nss_next (&nip, REENTRANT_NAME_STRING, &fct, status, 0);
+    }
+
+  return status == NSS_STATUS_SUCCESS ? result : NULL;
+}
diff --git a/nss/getXXent.c b/nss/getXXent.c
new file mode 100644
index 0000000000..da3712c70f
--- /dev/null
+++ b/nss/getXXent.c
@@ -0,0 +1,63 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#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
+
+/* 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
+#endif
+
+/* Prototype of the reentrant version.  */
+LOOKUP_TYPE *REENTRANT_GETNAME (LOOKUP_TYPE *result, char *buffer,
+				int buflen H_ERRNO_PARM);
+
+
+LOOKUP_TYPE *
+GETFUNC_NAME (void)
+{
+  static char buffer[BUFLEN];
+  LOOKUP_TYPE result;
+
+  return REENTRANT_GETNAME (&result, buffer, BUFLEN H_ERRNO_VAR);
+}
diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c
new file mode 100644
index 0000000000..3d1e9593e6
--- /dev/null
+++ b/nss/getXXent_r.c
@@ -0,0 +1,222 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#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) APPEND_R1 (name)
+#define APPEND_R1(name) name##_r
+
+#define SETFUNC_NAME_STRING STRINGIZE (SETFUNC_NAME)
+#define GETFUNC_NAME_STRING STRINGIZE (GETFUNC_NAME)
+#define ENDFUNC_NAME_STRING STRINGIZE (ENDFUNC_NAME)
+#define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME)
+#define STRINGIZE(name) STRINGIZE1 (name)
+#define STRINGIZE1(name) #name
+
+#define DB_LOOKUP_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
+
+/* 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
+#endif
+
+/* Some databases take the `stayopen' flag.  */
+#ifndef STAYOPEN
+#define STAYOPEN void
+#define STAYOPEN_VAR
+#endif
+
+/* Prototype for the setXXXent functions we use here.  */
+typedef int (*set_function) (STAYOPEN);
+
+/* Prototype for the endXXXent functions we use here.  */
+typedef int (*end_function) (void);
+
+/* Prototype for the setXXXent functions we use here.  */
+typedef int (*get_function) (LOOKUP_TYPE *, char *, int H_ERRNO_PARM);
+
+
+/* This handle for the NSS data base is shared between all
+   set/get/endXXXent functions.  */
+static service_user *nip;
+/* Remember the first service_entry, it's always the same.  */
+static service_user *startp;
+
+/* 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, void **fctp);
+
+
+void
+APPEND_R (SETFUNC_NAME) (STAYOPEN)
+{
+  set_function fct;
+  int no_more;
+
+#ifdef NEED__RES
+  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
+    {
+      h_errno = NETDB_INTERNAL;
+      return NULL;
+    }
+#endif /* need _res */
+
+  __libc_lock_lock (lock);
+
+  if (startp == NULL)
+    {
+      no_more = DB_LOOKUP_FCT (&nip, SETFUNC_NAME_STRING, (void **) &fct);
+      startp = no_more == 0 ? (service_user *) -1 : nip;
+    }
+  else
+    no_more = (nip = startp) != (service_user *) -1;
+
+  /* Cycle through all the services and run their setXXent functions.  */
+  while (! no_more)
+    {
+      /* Ignore status, we force check in __NSS_NEXT.  */
+      (void) (*fct) (STAYOPEN_VAR);
+
+      no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct, 0, 1);
+    }
+
+  __libc_lock_unlock (lock);
+}
+
+
+void
+APPEND_R (ENDFUNC_NAME) (void)
+{
+  end_function fct;
+  int no_more;
+
+#ifdef NEED__RES
+  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
+    {
+      h_errno = NETDB_INTERNAL;
+      return NULL;
+    }
+#endif /* need _res */
+
+  __libc_lock_lock (lock);
+
+  if (startp == NULL)
+    {
+      no_more = DB_LOOKUP_FCT (&nip, SETFUNC_NAME_STRING, (void **) &fct);
+      startp = no_more == 0 ? (service_user *) -1 : nip;
+    }
+  else
+    no_more = (nip = startp) != (service_user *) -1;
+
+  /* Cycle through all the services and run their endXXent functions.  */
+  while (no_more == 0)
+    {
+      /* Ignore status, we force check in __NSS_NEXT.  */
+      (void) (*fct) ();
+
+      no_more = __nss_next (&nip, ENDFUNC_NAME_STRING, (void **) &fct, 0, 1);
+    }
+
+  __libc_lock_unlock (lock);
+}
+
+
+LOOKUP_TYPE *
+REENTRANT_GETNAME (LOOKUP_TYPE *result, char *buffer, int buflen H_ERRNO_PARM)
+{
+  get_function fct;
+  int no_more;
+  enum nss_status status = NSS_STATUS_NOTFOUND;
+
+#ifdef NEED__RES
+  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
+    {
+      h_errno = NETDB_INTERNAL;
+      return NULL;
+    }
+#endif /* need _res */
+
+  __libc_lock_lock (lock);
+
+  if (nip)
+    /* Continuing a walk-through started before.  */
+    no_more = 0;
+  else
+    {
+      if (startp == NULL)
+	{
+	  no_more = DB_LOOKUP_FCT (&nip, SETFUNC_NAME_STRING, (void **) &fct);
+	  startp = no_more == 0 ? (service_user *) -1 : nip;
+	}
+      else
+	no_more = (nip = startp) != (service_user *) -1;
+
+      if (no_more != 0)
+	status = NSS_STATUS_UNAVAIL;
+    }
+
+  while (no_more == 0)
+    {
+      status = (*fct) (result, buffer, buflen H_ERRNO_VAR);
+
+      no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct,
+			    status, 0);
+    }
+
+  __libc_lock_unlock (lock);
+
+  return status == NSS_STATUS_SUCCESS ? result : NULL;
+}
diff --git a/nss/grp-lookup.c b/nss/grp-lookup.c
new file mode 100644
index 0000000000..ce3753c665
--- /dev/null
+++ b/nss/grp-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME group
+
+#include "XXX-lookup.c"
diff --git a/nss/host-lookup.c b/nss/host-lookup.c
new file mode 100644
index 0000000000..d9f7c67320
--- /dev/null
+++ b/nss/host-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME hosts
+
+#include "XXX-lookup.c"
diff --git a/nss/network-lookup.c b/nss/network-lookup.c
new file mode 100644
index 0000000000..ab6e51f5c4
--- /dev/null
+++ b/nss/network-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME networks
+
+#include "XXX-lookup.c"
diff --git a/nss/nss_dns/dns-host.c b/nss/nss_dns/dns-host.c
new file mode 100644
index 0000000000..eaa9e81218
--- /dev/null
+++ b/nss/nss_dns/dns-host.c
@@ -0,0 +1,611 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Extended from original form 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Parts of this file are plain copies of the file `getnetnamadr.c' from
+   the bind package and it has the following copyright.  */
+
+/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
+ *      Dep. Matematica Universidade de Coimbra, Portugal, Europe
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <sys/syslog.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+
+#include "nsswitch.h"
+
+/* Get implementation for some internal functions.  */
+#include "../resolv/mapv4v6addr.h"
+#include "../resolv/mapv4v6hostent.h"
+
+/* Maximum number of aliases we allow.  */
+#define MAX_NR_ALIASES	48
+#define MAX_NR_ADDRS	48
+
+#if PACKETSZ > 1024
+# define MAXPACKET	PACKETSZ
+#else
+# define MAXPACKET	1024
+#endif
+
+static const char AskedForGot[] = "\
+gethostby*.getanswer: asked for \"%s\", got \"%s\"";
+
+
+/* We need this time later.  */
+typedef union querybuf
+{
+  HEADER hdr;
+  u_char buf[MAXPACKET];
+} querybuf;
+
+
+static enum nss_status getanswer_r (const querybuf *answer, int anslen,
+				    const char *qname, int qtype,
+				    struct hostent *result,
+				    char *buffer, int buflen, int *h_errnop);
+
+enum nss_status
+_nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
+			   char *buffer, int buflen, int *h_errnop)
+{
+  struct host_data
+  {
+    char *aliases[MAX_NR_ALIASES];
+    unsigned char host_addr[16];	/* IPv4 or IPv6 */
+    char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+    char linebuffer[0];
+  } *host_data = (struct host_data *) buffer;
+  int linebuflen = buflen - offsetof (struct host_data, linebuffer);
+  querybuf host_buffer;
+  int size, type, n;
+  const char *cp;
+
+  switch (af) {
+  case AF_INET:
+    size = INADDRSZ;
+    type = T_A;
+    break;
+  case AF_INET6:
+    size = IN6ADDRSZ;
+    type = T_AAAA;
+    break;
+  default:
+    *h_errnop = NETDB_INTERNAL;
+    errno = EAFNOSUPPORT;
+    return NSS_STATUS_UNAVAIL;
+  }
+
+  result->h_addrtype = af;
+  result->h_length = size;
+
+  /*
+   * if there aren't any dots, it could be a user-level alias.
+   * this is also done in res_query() since we are not the only
+   * function that looks up host names.
+   */
+  if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
+    name = cp;
+
+  /*
+   * disallow names consisting only of digits/dots, unless
+   * they end in a dot.
+   */
+  if (isdigit (name[0]))
+    for (cp = name;; ++cp)
+      {
+	if (*cp == '\0')
+	  {
+	    char *bp;
+
+	    if (*--cp == '.')
+	      break;
+	    /*
+	     * All-numeric, no dot at the end.  Fake up a hostent
+	     * as if we'd actually done a lookup.
+	     */
+	    if (inet_pton (af, name, host_data->host_addr) <= 0)
+	      {
+		*h_errnop = HOST_NOT_FOUND;
+		return NSS_STATUS_NOTFOUND;
+	      }
+
+	    bp = __stpncpy (host_data->linebuffer, name, linebuflen);
+	    host_data->linebuffer[linebuflen - 1] = '\0';
+	    linebuflen -= bp - host_data->linebuffer;
+
+	    result->h_name = host_data->linebuffer;
+	    result->h_aliases = host_data->aliases;
+	    host_data->aliases[0] = NULL;
+	    host_data->h_addr_ptrs[0] = (char *) host_data->host_addr;
+	    host_data->h_addr_ptrs[1] = NULL;
+	    result->h_addr_list = host_data->h_addr_ptrs;
+
+	    if (_res.options & RES_USE_INET6)
+	      map_v4v6_hostent (result, &bp, &linebuflen);
+	    *h_errnop = NETDB_SUCCESS;
+	    return NSS_STATUS_SUCCESS;
+	  }
+	if (!isdigit (*cp) && *cp != '.')
+	  break;
+      }
+
+  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer));
+  if (n < 0)
+    return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+
+  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
+		      h_errnop);
+}
+
+
+enum nss_status
+_nss_dns_gethostbyname_r (const char *name, struct hostent *result,
+			  char *buffer, int buflen, int *h_errnop)
+{
+  enum nss_status status = NSS_STATUS_NOTFOUND;
+
+  if (_res.options & RES_USE_INET6)
+    status = _nss_dns_gethostbyname2_r (name, AF_INET6, result, buffer,
+					buflen, h_errnop);
+  if (status == NSS_STATUS_NOTFOUND)
+    status = _nss_dns_gethostbyname2_r (name, AF_INET, result, buffer,
+					buflen, h_errnop);
+
+  return status;
+}
+
+
+enum nss_status
+_nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
+			  struct hostent *result, char *buffer, int buflen,
+			  int *h_errnop)
+{
+  static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
+  static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
+  const u_char *uaddr = (const u_char *)addr;
+  struct host_data
+  {
+    char *aliases[MAX_NR_ALIASES];
+    unsigned char host_addr[16];	/* IPv4 or IPv6 */
+    char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+    char linebuffer[0];
+  } *host_data = (struct host_data *) buffer;
+  querybuf host_buffer;
+  char qbuf[MAXDNAME+1], *qp;
+  int size, n, status;
+
+  if (af == AF_INET6 && len == IN6ADDRSZ &&
+      (bcmp (uaddr, mapped, sizeof mapped) == 0
+       || bcmp (uaddr, tunnelled, sizeof tunnelled) == 0))
+    {
+      /* Unmap. */
+      addr += sizeof mapped;
+      uaddr += sizeof mapped;
+      af = AF_INET;
+      len = INADDRSZ;
+    }
+
+  switch (af)
+    {
+    case AF_INET:
+      size = INADDRSZ;
+      break;
+    case AF_INET6:
+      size = IN6ADDRSZ;
+      break;
+    default:
+      errno = EAFNOSUPPORT;
+      *h_errnop = NETDB_INTERNAL;
+      return NSS_STATUS_UNAVAIL;
+    }
+  if (size != len)
+    {
+      errno = EAFNOSUPPORT;
+      *h_errnop = NETDB_INTERNAL;
+      return NSS_STATUS_UNAVAIL;
+    }
+
+  switch (af)
+    {
+    case AF_INET:
+      sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", (uaddr[3] & 0xff),
+	       (uaddr[2] & 0xff), (uaddr[1] & 0xff), (uaddr[0] & 0xff));
+      break;
+    case AF_INET6:
+      qp = qbuf;
+      for (n = IN6ADDRSZ - 1; n >= 0; n--)
+	qp += sprintf (qp, "%x.%x.", uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf);
+      strcpy(qp, "ip6.int");
+      break;
+    default:
+      /* Cannot happen.  */
+    }
+
+  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
+		 sizeof host_buffer);
+  if (n < 0)
+    return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+
+  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+			h_errnop);
+  if (status != NSS_STATUS_SUCCESS)
+    return status;
+
+#ifdef SUNSECURITY
+  This is not implemented because it is not possible to use the current
+  source from bind in a multi-threaded program.
+#endif
+
+  result->h_addrtype = af;
+  result->h_length = len;
+  bcopy (addr, host_data->host_addr, len);
+  host_data->h_addr_ptrs[0] = (char *) host_data->host_addr;
+  host_data->h_addr_ptrs[1] = NULL;
+  if (af == AF_INET && (_res.options & RES_USE_INET6))
+    {
+      map_v4v6_address ((char *) host_data->host_addr,
+			(char *) host_data->host_addr);
+      result->h_addrtype = AF_INET6;
+      result->h_length = IN6ADDRSZ;
+    }
+  *h_errnop = NETDB_SUCCESS;
+  return NSS_STATUS_SUCCESS;
+}
+
+
+static enum nss_status
+getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
+	     struct hostent *result, char *buffer, int buflen, int *h_errnop)
+{
+  struct host_data
+  {
+    char *aliases[MAX_NR_ALIASES];
+    unsigned char host_addr[16];	/* IPv4 or IPv6 */
+    char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+    char linebuffer[0];
+  } *host_data = (struct host_data *) buffer;
+  int linebuflen = buflen - offsetof (struct host_data, linebuffer);
+  register const HEADER *hp;
+  const u_char *end_of_message, *cp;
+  int n, ancount, qdcount;
+  int haveanswer, had_error;
+  char *bp, **ap, **hap;
+  char tbuf[MAXDNAME+1];
+  const char *tname;
+  int (*name_ok) __P ((const char *));
+
+  tname = qname;
+  result->h_name = NULL;
+  end_of_message = answer->buf + anslen;
+  switch (qtype)
+    {
+    case T_A:
+    case T_AAAA:
+      name_ok = res_hnok;
+      break;
+    case T_PTR:
+      name_ok = res_dnok;
+      break;
+    default:
+      return NSS_STATUS_UNAVAIL;  /* XXX should be abort(); */
+    }
+
+  /*
+   * find first satisfactory answer
+   */
+  hp = &answer->hdr;
+  bp = host_data->linebuffer;
+  ancount = ntohs (hp->ancount);
+  qdcount = ntohs (hp->qdcount);
+  cp = answer->buf + HFIXEDSZ;
+  if (qdcount != 1)
+    {
+      *h_errnop = NO_RECOVERY;
+      return NSS_STATUS_UNAVAIL;
+    }
+
+  n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
+  if (n < 0 || (*name_ok) (bp) == 0)
+    {
+      *h_errnop = NO_RECOVERY;
+      return NSS_STATUS_UNAVAIL;
+    }
+  cp += n + QFIXEDSZ;
+
+  if (qtype == T_A || qtype == T_AAAA)
+    {
+      /* res_send() has already verified that the query name is the
+       * same as the one we sent; this just gets the expanded name
+       * (i.e., with the succeeding search-domain tacked on).
+       */
+      n = strlen (bp) + 1;             /* for the \0 */
+      result->h_name = bp;
+      bp += n;
+      linebuflen -= n;
+      /* The qname can be abbreviated, but h_name is now absolute. */
+      qname = result->h_name;
+    }
+
+  ap = host_data->aliases;
+  *ap = NULL;
+  result->h_aliases = host_data->aliases;
+  hap = host_data->h_addr_ptrs;
+  *hap = NULL;
+  result->h_addr_list = host_data->h_addr_ptrs;
+  haveanswer = 0;
+  had_error = 0;
+
+  while (ancount-- > 0 && cp < end_of_message && had_error == 0)
+    {
+      int type, class;
+
+      n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
+      if (n < 0 || (*name_ok) (bp) == 0)
+	{
+	  ++had_error;
+	  continue;
+	}
+      cp += n;				/* name */
+      type = _getshort (cp);
+      cp += INT16SZ;			/* type */
+      class = _getshort(cp);
+      cp += INT16SZ + INT32SZ;		/* class, TTL */
+      n = _getshort(cp);
+      cp += INT16SZ;			/* len */
+      if (class != C_IN)
+	{
+	  /* XXX - debug? syslog? */
+	  cp += n;
+	  continue;			/* XXX - had_error++ ? */
+	}
+
+      if ((qtype ==T_A || qtype == T_AAAA) && type == T_CNAME)
+	{
+	  if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1])
+	    continue;
+	  n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
+	  if (n < 0 || (*name_ok) (tbuf) == 0)
+	    {
+	      ++had_error;
+	      continue;
+	    }
+	  cp += n;
+	  /* Store alias.  */
+	  *ap++ = bp;
+	  n = strlen (bp) + 1;		/* For the \0.  */
+	  bp += n;
+	  linebuflen -= n;
+	  /* Get canonical name.  */
+	  n = strlen (tbuf) + 1;	/* For the \0.  */
+	  if (n > buflen)
+	    {
+	      ++had_error;
+	      continue;
+	    }
+	  strcpy (bp, tbuf);
+	  result->h_name = bp;
+	  bp += n;
+	  linebuflen -= n;
+	  continue;
+	}
+
+      if (qtype == T_PTR && type == T_CNAME)
+	{
+	  n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
+	  if (n < 0 || res_hnok (tbuf) == 0)
+	    {
+	      ++had_error;
+	      continue;
+	    }
+	  cp += n;
+	  /* Get canonical name. */
+	  n = strlen (tbuf) + 1;   /* For the \0.  */
+	  if (n > buflen)
+	    {
+	      ++had_error;
+	      continue;
+	    }
+	  strcpy (bp, tbuf);
+	  tname = bp;
+	  bp += n;
+	  linebuflen -= n;
+	  continue;
+	}
+      if (type != qtype)
+	{
+	  syslog (LOG_NOTICE | LOG_AUTH,
+	       "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"",
+		  qname, p_class (C_IN), p_type (qtype), p_type (type));
+	  cp += n;
+	  continue;			/* XXX - had_error++ ? */
+	}
+
+      switch (type)
+	{
+	case T_PTR:
+	  if (strcasecmp (tname, bp) != 0)
+	    {
+	      syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, qname, bp);
+	      cp += n;
+	      continue;			/* XXX - had_error++ ? */
+	    }
+	  n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
+	  if (n < 0 || res_hnok (bp) == 0)
+	    {
+	      ++had_error;
+	      break;
+	    }
+#if MULTI_PTRS_ARE_ALIASES
+	  cp += n;
+	  if (haveanswer == 0)
+	    result->h_name = bp;
+	  else if (ap < &host_data->aliases[MAXALIASES-1])
+	    *ap++ = bp;
+	  else
+	    n = -1;
+	  if (n != -1)
+	    {
+	      n = strlen (bp) + 1;	/* for the \0 */
+	      bp += n;
+	      linebuflen -= n;
+	    }
+	  break;
+#else
+	  result->h_name = bp;
+	  if (_res.options & RES_USE_INET6)
+	    {
+	      n = strlen (bp) + 1;	/* for the \0 */
+	      bp += n;
+	      linebuflen -= n;
+	      map_v4v6_hostent (result, &bp, &linebuflen);
+	    }
+	  *h_errnop = NETDB_SUCCESS;
+	  return NSS_STATUS_SUCCESS;
+#endif
+	case T_A:
+	case T_AAAA:
+	  if (strcasecmp (result->h_name, bp) != 0)
+	    {
+	      syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, result->h_name, bp);
+	      cp += n;
+	      continue;			/* XXX - had_error++ ? */
+	    }
+	  if (haveanswer)
+	    {
+	      if (n != result->h_length)
+		{
+		  cp += n;
+		  continue;
+		}
+	    }
+	  else
+	    {
+	      register int nn;
+
+	      result->h_name = bp;
+	      nn = strlen (bp) + 1;	/* for the \0 */
+	      bp += nn;
+	      linebuflen -= nn;
+	    }
+
+	  bp += sizeof (align) - ((u_long) bp % sizeof (align));
+
+	  if (n >= linebuflen)
+	    {
+	      ++had_error;
+	      continue;
+	    }
+	  if (hap >= &host_data->h_addr_ptrs[MAX_NR_ADDRS-1])
+	    {
+	      cp += n;
+	      continue;
+	    }
+	  bcopy (cp, *hap++ = bp, n);
+	  bp += n;
+	  cp += n;
+	  linebuflen -= n;
+	  break;
+	default:
+	  abort ();
+	}
+      if (had_error == 0)
+	++haveanswer;
+    }
+
+  if (haveanswer > 0)
+    {
+      *ap = NULL;
+      *hap = NULL;
+#if defined(RESOLVSORT)
+      /*
+       * Note: we sort even if host can take only one address
+       * in its return structures - should give it the "best"
+       * address in that case, not some random one
+       */
+      if (_res.nsort && haveanswer > 1 && qtype == T_A)
+	addrsort (host_data->h_addr_ptrs, haveanswer);
+#endif /*RESOLVSORT*/
+
+      if (result->h_name == NULL)
+	{
+	  n = strlen (qname) + 1;	/* For the \0.  */
+	  if (n > linebuflen)
+	    goto try_again;
+	  strcpy (bp, qname);
+	  result->h_name = bp;
+	  bp += n;
+	  linebuflen -= n;
+	}
+
+      if (_res.options & RES_USE_INET6)
+	map_v4v6_hostent (result, &bp, &linebuflen);
+      *h_errnop = NETDB_SUCCESS;
+      return NSS_STATUS_SUCCESS;
+    }
+try_again:
+  *h_errnop = TRY_AGAIN;
+  return NSS_STATUS_TRYAGAIN;
+}
diff --git a/nss/nss_dns/dns-network.c b/nss/nss_dns/dns-network.c
new file mode 100644
index 0000000000..b714128f1d
--- /dev/null
+++ b/nss/nss_dns/dns-network.c
@@ -0,0 +1,338 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Extended from original form 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Parts of this file are plain copies of the file `getnetnamadr.c' from
+   the bind package and it has the following copyright.  */
+
+/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
+ *      Dep. Matematica Universidade de Coimbra, Portugal, Europe
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "nsswitch.h"
+#include <arpa/inet.h>
+
+/* Maximum number of aliases we allow.  */
+#define MAX_NR_ALIASES	48
+
+
+#if PACKETSZ > 1024
+#define MAXPACKET       PACKETSZ
+#else
+#define MAXPACKET       1024
+#endif
+
+
+typedef enum
+{
+  BYADDR,
+  BYNAME
+} lookup_method;
+
+
+/* We need this time later.  */
+typedef union querybuf
+{
+  HEADER hdr;
+  u_char buf[MAXPACKET];
+} querybuf;
+
+
+/* Protortypes for local functions.  */
+static int getanswer_r (const querybuf *answer, int anslen,
+			struct netent *result, char *buffer, int buflen,
+			lookup_method net_i);
+
+
+int
+_nss_dns_getnetbyname_r (const char *name, struct netent *result,
+			 char *buffer, int buflen)
+{
+  /* Return entry for network with NAME.  */
+  querybuf net_buffer;
+  int anslen;
+  char *qbuf;
+
+  qbuf = strdupa (name);
+  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+		       sizeof (querybuf));
+  if (anslen < 0)
+    /* Nothing found.  */
+    return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+
+  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
+}
+
+
+int
+_nss_dns_getnetbyaddr_r (long net, int type, struct netent *result,
+			 char *buffer, int buflen)
+{
+  /* Return entry for network with NAME.  */
+  int status;
+  querybuf net_buffer;
+  unsigned int net_bytes[4];
+  char qbuf[MAXDNAME];
+  int cnt, anslen;
+  u_int32_t net2;
+
+  /* No net address lookup for IPv6 yet.  */
+  if (type != AF_INET)
+    return NSS_STATUS_UNAVAIL;
+
+  net2 = (u_int32_t) net;
+  for (cnt = 4; net2 != 0; net2 >>= 8)
+    net_bytes[--cnt] = net2 & 0xff;
+
+  switch (cnt)
+    {
+    case 3:
+      /* Class A network.  */
+      sprintf (qbuf, "0.0.0.%u.in-addr.arpa", net_bytes[3]);
+      break;
+    case 2:
+      /* Class B network.  */
+      sprintf (qbuf, "0.0.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2]);
+      break;
+    case 1:
+      /* Class C network.  */
+      sprintf (qbuf, "0.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2],
+	       net_bytes[1]);
+      break;
+    case 0:
+      /* Class D - E network.  */
+      sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2],
+	       net_bytes[1], net_bytes[0]);
+      break;
+    }
+
+  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+		      sizeof (querybuf));
+  if (anslen < 0)
+    /* Nothing found.  */
+    return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+
+  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
+  if (status == NSS_STATUS_SUCCESS)
+    {
+      /* Strip trailing zeros.  */
+      unsigned int u_net = net;	/* Maybe net should be unsigned?  */
+
+      while ((u_net & 0xff) == 0 && u_net != 0)
+	u_net >>= 8;
+      result->n_net = u_net;
+    }
+
+  return status;
+}
+
+
+#undef offsetof
+#define offsetof(Type, Member) ((size_t) &((Type *) NULL)->Member)
+
+static int
+getanswer_r (const querybuf *answer, int anslen, struct netent *result,
+	     char *buffer, int buflen, lookup_method net_i)
+{
+  /*
+   * Find first satisfactory answer
+   *
+   *      answer --> +------------+  ( MESSAGE )
+   *                 |   Header   |
+   *                 +------------+
+   *                 |  Question  | the question for the name server
+   *                 +------------+
+   *                 |   Answer   | RRs answering the question
+   *                 +------------+
+   *                 | Authority  | RRs pointing toward an authority
+   *                 | Additional | RRs holding additional information
+   *                 +------------+
+   */
+  struct net_data
+  {
+    char *aliases[MAX_NR_ALIASES];
+    char linebuffer[0];
+  } *net_data = (struct net_data *) buffer;
+  int linebuflen = buflen - offsetof (struct net_data, linebuffer);
+  const char *end_of_message = &answer->buf[anslen];
+  const HEADER *header_pointer = &answer->hdr;
+  /* #/records in the answer section.  */
+  int answer_count =  ntohs (header_pointer->ancount);
+  /* #/entries in the question section.  */
+  int question_count = ntohs (header_pointer->qdcount);
+  char *bp = net_data->linebuffer;
+  const char *cp = &answer->buf[HFIXEDSZ];
+  char **alias_pointer;
+  int have_answer;
+  char *ans;
+
+  if (question_count == 0)
+    /* FIXME: the Sun version uses for host name lookup an additional
+       parameter for pointing to h_errno.  this is missing here.
+       OSF/1 has a per-thread h_errno variable.  */
+    if (header_pointer->aa != 0)
+      {
+	h_errno = HOST_NOT_FOUND;
+	return NSS_STATUS_NOTFOUND;
+      }
+    else
+      {
+	h_errno = TRY_AGAIN;
+	return NSS_STATUS_TRYAGAIN;
+      }
+
+  /* Skip the question part.  */
+  while (question_count-- > 0)
+    cp += __dn_skipname (cp, end_of_message) + QFIXEDSZ;
+
+  alias_pointer = result->n_aliases = &net_data->aliases[0];
+  *alias_pointer = NULL;
+  have_answer = 0;
+  ans = NULL;
+
+  while (--answer_count >= 0 && cp < end_of_message)
+    {
+      int n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
+      int type, class;
+
+      if (n < 0 || res_dnok (bp) == 0)
+	break;
+      cp += n;
+      ans = strdupa (bp);
+      GETSHORT (type, cp);
+      GETSHORT (class, cp);
+      cp += INT32SZ;		/* TTL */
+      GETSHORT (n, cp);
+
+      if (class == C_IN && type == T_PTR)
+	{
+	  n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
+	  if (n < 0 || !res_hnok (bp))
+	    {
+	      /* XXX What does this mean?  The original form from bind
+		 returns NULL. Incrementing cp has no effect in any case.
+		 What should I return here. ??? */
+	      cp += n;
+	      return NSS_STATUS_UNAVAIL;
+	    }
+	  cp += n;
+	  *alias_pointer++ = bp;
+	  bp += strlen (bp) + 1;
+	  result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
+	  ++have_answer;
+	}
+    }
+
+  if (have_answer)
+    {
+      char *tmp;
+      int len;
+      char *in, *cp, *rp, *wp;
+      int cnt, first_flag;
+
+      *alias_pointer = NULL;
+      switch (net_i)
+	{
+	case BYADDR:
+	  result->n_name = result->n_aliases[0];
+	  result->n_net = 0L;
+	  break;
+	case BYNAME:
+	  len = strlen (result->n_aliases[0]);
+	  tmp = (char *) alloca (len + 1);
+	  tmp[len] = 0;
+	  wp = &tmp[len - 1];
+
+	  rp = in = result->n_aliases[0];
+	  result->n_name = ans;
+
+	  first_flag = 1;
+	  for (cnt = 0; cnt < 4; ++cnt)
+	    {
+	      char *startp;
+
+	      startp = rp;
+	      while (*rp != '.')
+		++rp;
+	      if (rp - startp > 1 || *startp != '0' || !first_flag)
+		{
+		  first_flag = 0;
+		  if (cnt > 0)
+		    *wp-- = '.';
+		  cp = rp;
+		  while (cp > startp)
+		    *wp-- = *--cp;
+		}
+	      in = rp + 1;
+	    }
+
+	  result->n_net = inet_network (wp);
+	  break;
+	}
+
+      ++result->n_aliases;
+      return NSS_STATUS_SUCCESS;
+    }
+
+  /* XXX Really use global variable??? */
+  h_errno = TRY_AGAIN;
+  return NSS_STATUS_TRYAGAIN;
+}
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
new file mode 100644
index 0000000000..40bb7df81e
--- /dev/null
+++ b/nss/nss_files/files-XXX.c
@@ -0,0 +1,221 @@
+/* Common code for file-based databases in nss_files 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 <stdio.h>
+#include <ctype.h>
+#include <assert.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).
+   DATAFILE -- string of the database file's name.
+
+   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)
+
+#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 stream open on the database file.  */
+
+static FILE *stream;
+static int keep_stream;
+
+/* Open database file if not already opened.  */
+static int
+internal_setent (int stayopen)
+{
+  int status = NSS_STATUS_SUCCESS;
+
+  if (stream == NULL)
+    {
+      stream = fopen (DATAFILE, "r");
+
+      if (stream == NULL)
+	status = NSS_STATUS_UNAVAIL;
+    }
+  else
+    rewind (stream);
+
+  /* Remember STAYOPEN flag.  */
+  if (stream != NULL)
+    keep_stream |= 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);
+
+  __libc_lock_unlock (lock);
+
+  return status;
+}
+
+
+/* Close the database file.  */
+static void
+internal_endent (void)
+{
+  if (stream != NULL)
+    {
+      fclose (stream);
+      stream = NULL;
+    }
+
+  /* Reset STAYOPEN flag.  */
+  keep_stream = 0;
+}
+
+
+/* Thread-safe, exported version of that.  */
+int
+CONCAT(_nss_files_end,ENTNAME) (void)
+{
+  __libc_lock_lock (lock);
+
+  internal_endent ();
+
+  __libc_lock_unlock (lock);
+
+  return NSS_STATUS_SUCCESS;
+}
+
+/* Parsing the database file into `struct STRUCTURE' data structures.  */
+
+static enum nss_status
+internal_getent (struct STRUCTURE *result,
+		 char *buffer, int buflen H_ERRNO_PROTO)
+{
+  char *p;
+  struct parser_data *data = (void *) buffer;
+  int linebuflen = buffer + buflen - data->linebuffer;
+
+  /* Someone called internal_setent before calling us, so if the
+     stream is not open now the file could not be opened.  */
+  if (stream == NULL)
+    {
+      H_ERRNO_SET (NETDB_INTERNAL);
+      return NSS_STATUS_UNAVAIL;
+    }
+
+  if (buflen < sizeof *data + 1)
+    {
+      errno = ERANGE;
+      return NSS_STATUS_NOTFOUND;
+    }
+
+  do
+    {
+      p = fgets (data->linebuffer, linebuflen, stream);
+      if (p == NULL)
+	{
+	  /* End of file or read error.  */
+	  H_ERRNO_SET (HOST_NOT_FOUND);
+	  return NSS_STATUS_NOTFOUND;
+	}
+
+      /* Skip leading blanks.  */
+      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_line (p, result, data, buflen));
+
+  /* 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.  */
+int
+CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
+				  char *buffer, int buflen H_ERRNO_PROTO)
+{
+  /* Return next entry in host file.  */
+  int status;
+
+  __libc_lock_lock (lock);
+
+  status = internal_getent (result, buffer, buflen H_ERRNO_ARG);
+
+  __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'.
+
+   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...)			      \
+enum nss_status								      \
+_nss_files_get##name##_r (proto,					      \
+			  struct STRUCTURE *result,			      \
+			  char *buffer, int buflen H_ERRNO_PROTO)	      \
+{									      \
+  enum nss_status status;						      \
+									      \
+  __libc_lock_lock (lock);						      \
+									      \
+  /* Reset file pointer to beginning or open file.  */			      \
+  internal_setent (keep_stream);					      \
+									      \
+  while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG))      \
+	 == NSS_STATUS_SUCCESS)						      \
+    { break_if_match }							      \
+									      \
+  if (! keep_stream)							      \
+    internal_endent ();							      \
+									      \
+  __libc_lock_unlock (lock);						      \
+									      \
+  return status;							      \
+}
diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c
new file mode 100644
index 0000000000..6d528a6df2
--- /dev/null
+++ b/nss/nss_files/files-grp.c
@@ -0,0 +1,49 @@
+/* Group file parser in nss_files 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 <grp.h>
+
+#define STRUCTURE	group
+#define ENTNAME		grent
+#define DATAFILE	"/etc/group"
+struct grent_data {};
+
+#define TRAILING_LIST_MEMBER		gr_mem
+#define TRAILING_LIST_SEPARATOR_P(c)	((c) == ',')
+#include "files-parse.c"
+LINE_PARSER
+(
+ STRING_FIELD (result->gr_name, ISCOLON, 0);
+ STRING_FIELD (result->gr_passwd, ISCOLON, 0);
+ INT_FIELD (result->gr_gid, ISCOLON, 0, 10,);
+)
+
+#include "files-XXX.c"
+
+DB_LOOKUP (grnam,
+	   {
+	     if (! strcmp (name, result->gr_name))
+	       break;
+	   }, const char *name)
+
+DB_LOOKUP (grgid,
+	   {
+	     if (result->gr_gid == gid)
+	       break;
+	   }, gid_t gid)
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
new file mode 100644
index 0000000000..dad818c941
--- /dev/null
+++ b/nss/nss_files/files-hosts.c
@@ -0,0 +1,111 @@
+/* Hosts file parser in nss_files 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 <netinet/in.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <netdb.h>
+#include <resolv.h>
+
+
+/* Get implementation for some internal functions.  */
+#include "../resolv/mapv4v6addr.h"
+#include "../resolv/mapv4v6hostent.h"
+
+
+#define ENTNAME		hostent
+#define DATAFILE	_PATH_HOSTS
+
+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 ((_res.options & RES_USE_INET6)
+      && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
+    {
+      result->h_addrtype = AF_INET6;
+      result->h_length = IN6ADDRSZ;
+    }
+  else if (inet_pton (AF_INET, addr, entdata->host_addr) > 0)
+    {
+      if (_res.options & RES_USE_INET6)
+	{
+	  map_v4v6_address ((char *) entdata->host_addr,
+			    (char *) entdata->host_addr);
+	  result->h_addrtype = AF_INET6;
+	  result->h_length = IN6ADDRSZ;
+	}
+      else
+	{
+	  result->h_addrtype = AF_INET;
+	  result->h_length = INADDRSZ;
+	}
+    }
+  else
+    /* Illegal address: ignore line.  */
+    return 0;
+
+  /* Store a pointer to the addressin the expected form.  */
+  entdata->h_addr_ptrs[0] = entdata->host_addr;
+  entdata->h_addr_ptrs[1] = NULL;
+  result->h_addr_list = entdata->h_addr_ptrs;
+
+  /* If we need the host entry in IPv6 form change it now.  */
+  if (_res.options & RES_USE_INET6)
+    {
+      char *bufptr = data->linebuffer;
+      int buflen = (char *) data + datalen - bufptr;
+      map_v4v6_hostent (result, &bufptr, &buflen);
+    }
+
+  STRING_FIELD (result->h_name, isspace, 1);
+})
+
+#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 (hostbyaddr,
+	   {
+	     if (result->h_addrtype == type && result->h_length == len &&
+		 ! memcmp (addr, result->h_addr_list[0], len))
+	       break;
+	   }, const char *addr, int len, int type)
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
new file mode 100644
index 0000000000..504c420b04
--- /dev/null
+++ b/nss/nss_files/files-network.c
@@ -0,0 +1,54 @@
+/* Networks file parser in nss_files 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 <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#define ENTNAME		netent
+#define DATAFILE	_PATH_NETWORKS
+
+struct netent_data {};
+
+#define TRAILING_LIST_MEMBER		n_aliases
+#define TRAILING_LIST_SEPARATOR_P	isspace
+#include "files-parse.c"
+LINE_PARSER
+({
+  char *addr;
+
+  STRING_FIELD (result->n_name, isspace, 1);
+
+  STRING_FIELD (addr, isspace, 1);
+  result->n_net = inet_network (addr);
+
+})
+
+#include "files-XXX.c"
+
+DB_LOOKUP (netbyname,
+	   LOOKUP_NAME (n_name, n_aliases),
+	   const char *name)
+
+DB_LOOKUP (netbyaddr,
+	   {
+	     if (result->n_addrtype == type && result->n_net == net)
+	       /* Bingo!  */
+	       break;
+	   }, int type, unsigned long int net)
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
new file mode 100644
index 0000000000..a93bee1ab3
--- /dev/null
+++ b/nss/nss_files/files-parse.c
@@ -0,0 +1,171 @@
+/* Common code for file-based database parsers in nss_files 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 <ctype.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+
+#ifndef STRUCTURE
+#define STRUCTURE ENTNAME
+#endif
+
+
+struct parser_data
+  {
+    struct CONCAT(ENTNAME,_data) entdata;
+    char linebuffer[0];
+  };
+
+#define LINE_PARSER(BODY)						      \
+static inline int							      \
+parse_line (char *line, struct STRUCTURE *result,			      \
+	    struct parser_data *data, int datalen)			      \
+{									      \
+  struct CONCAT(ENTNAME,_data) *const entdata __attribute__ ((unused))	      \
+    = &data->entdata;		      					      \
+  BODY;									      \
+  TRAILING_LIST_PARSER;							      \
+  return 1;								      \
+}
+
+
+/* Comments can come mid-line; trim the line at the first # seen.  */
+#define MIDLINE_COMMENTS						      \
+  {									      \
+    char *p = strchr (line, '#');					      \
+    if (p)								      \
+      *p = '\0';							      \
+  }
+
+#define STRING_FIELD(variable, terminator_p, swallow)			      \
+  {									      \
+    variable = line;							      \
+    while (!terminator_p (*line))					      \
+      if (*++line == '\0')						      \
+	return 0;							      \
+    *line = '\0';							      \
+    do									      \
+      ++line;								      \
+    while (swallow && terminator_p (*line));				      \
+  }
+
+#define INT_FIELD(variable, terminator_p, swallow, base, convert)	      \
+  {									      \
+    char *endp;								      \
+    variable = convert (strtol (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 ISCOLON(c) ((c) == ':')
+
+
+#ifndef TRAILING_LIST_MEMBER
+#define TRAILING_LIST_PARSER /* Nothing to do.  */
+#else
+
+#define TRAILING_LIST_PARSER						      \
+{									      \
+  char **list = parse_list (line, data, datalen);			      \
+  if (list)								      \
+    result->TRAILING_LIST_MEMBER = list;				      \
+  else 									      \
+    return 0;								      \
+}
+
+static inline char **
+parse_list (char *line, struct parser_data *data, int datalen)
+{
+  char *eol, **list, **p;
+
+  /* Find the end of the line buffer.  */
+  eol = strchr (line, '\0');
+  /* Adjust the pointer so it is aligned for storing pointers.  */
+  eol += (eol - (char *) 0) % __alignof__ (char *);
+  /* We will start the storage here for the vector of pointers.  */
+  list = (char **) eol;
+
+  p = list;
+  while (1)
+    {
+      char *elt;
+
+      if ((char *) &p[1] - (char *) data > datalen)
+	{
+	  /* We cannot fit another pointer in the buffer.  */
+	  errno = ERANGE;
+	  return NULL;
+	}
+      if (*line == '\0')
+	break;
+
+      elt = line;
+      while (1)
+	{
+	  if (TRAILING_LIST_SEPARATOR_P (*line))
+	    {
+	      *p++ = elt;
+	      *line = '\0';
+	      do
+		++line;
+	      while (TRAILING_LIST_SEPARATOR_P (*line));
+	    }
+	  else if (*line == '\0' || *line == '\n')
+	    {
+	      /* End of the line.  */
+	      if (line > elt)
+		/* Last element.  */
+		*p++ = elt;
+	      *line = '\0';
+	      break;
+	    }
+	  else
+	    ++line;
+	}
+    }
+  *p = NULL;
+
+  return list;
+}
+
+#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;								      \
+}
+
+#endif
diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c
new file mode 100644
index 0000000000..d67f8db8f6
--- /dev/null
+++ b/nss/nss_files/files-proto.c
@@ -0,0 +1,48 @@
+/* Protocols file parser in nss_files 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 <netdb.h>
+
+
+#define ENTNAME		protoent
+#define DATAFILE	_PATH_PROTOCOLS
+
+struct protoent_data {};
+
+#define TRAILING_LIST_MEMBER		p_aliases
+#define TRAILING_LIST_SEPARATOR_P	isspace
+#include "files-parse.c"
+LINE_PARSER
+(
+ MIDLINE_COMMENTS;
+ STRING_FIELD (result->p_name, isspace, 1);
+ INT_FIELD (result->p_proto, isspace, 1, 10,);
+ )
+
+#include "files-XXX.c"
+
+DB_LOOKUP (protobyname,
+	   LOOKUP_NAME (p_name, p_aliases),
+	   const char *name)
+
+DB_LOOKUP (protobynumber,
+	   {
+	     if (result->p_proto == proto)
+	       break;
+	   }, int proto)
diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c
new file mode 100644
index 0000000000..4b6a4b737f
--- /dev/null
+++ b/nss/nss_files/files-pwd.c
@@ -0,0 +1,54 @@
+/* User file parser in nss_files 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 <pwd.h>
+
+#define STRUCTURE	passwd
+#define ENTNAME		pwent
+#define DATAFILE	"/etc/passwd"
+struct pwent_data {};
+
+#include "files-parse.c"
+LINE_PARSER
+({
+  STRING_FIELD (result->pw_name, ISCOLON, 0);
+  STRING_FIELD (result->pw_passwd, ISCOLON, 0);
+  INT_FIELD (result->pw_uid, ISCOLON, 0, 10,);
+  INT_FIELD (result->pw_gid, ISCOLON, 0, 10,);
+  STRING_FIELD (result->pw_gecos, ISCOLON, 0);
+  STRING_FIELD (result->pw_dir, ISCOLON, 0);
+  result->pw_shell = line;
+  line = strchr (line, '\n');
+  if (line)
+    *line = '\0';
+})
+
+#include "files-XXX.c"
+
+DB_LOOKUP (pwnam,
+	   {
+	     if (! strcmp (name, result->pw_name))
+	       break;
+	   }, const char *name)
+
+DB_LOOKUP (pwuid,
+	   {
+	     if (result->pw_uid == uid)
+	       break;
+	   }, uid_t uid)
diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c
new file mode 100644
index 0000000000..fef0ff88b1
--- /dev/null
+++ b/nss/nss_files/files-rpc.c
@@ -0,0 +1,48 @@
+/* SunRPC program number file parser in nss_files 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 <rpc/netdb.h>
+
+
+#define ENTNAME		rpcent
+#define DATAFILE	"/etc/rpc"
+
+struct rpcent_data {};
+
+#define TRAILING_LIST_MEMBER		r_aliases
+#define TRAILING_LIST_SEPARATOR_P	isspace
+#include "files-parse.c"
+LINE_PARSER
+(
+ MIDLINE_COMMENTS;
+ STRING_FIELD (result->r_name, isspace, 1);
+ INT_FIELD (result->r_number, isspace, 1, 10,);
+ )
+
+#include "files-XXX.c"
+
+DB_LOOKUP (rpcbyname,
+	   LOOKUP_NAME (r_name, r_aliases),
+	   const char *name)
+
+DB_LOOKUP (rpcbynumber,
+	   {
+	     if (result->r_number == number)
+	       break;
+	   }, int number)
diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c
new file mode 100644
index 0000000000..3bcb48787a
--- /dev/null
+++ b/nss/nss_files/files-service.c
@@ -0,0 +1,51 @@
+/* Services file parser in nss_files 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 <netinet/in.h>
+#include <netdb.h>
+
+
+#define ENTNAME		servent
+#define DATAFILE	_PATH_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
+(
+ MIDLINE_COMMENTS;
+ STRING_FIELD (result->s_name, isspace, 1);
+ INT_FIELD (result->s_port, ISSLASH, 10, 0, htons);
+ STRING_FIELD (result->s_proto, isspace, 1);
+ )
+
+#include "files-XXX.c"
+
+DB_LOOKUP (servbyname,
+	   LOOKUP_NAME (s_name, s_aliases),
+	   const char *name)
+
+DB_LOOKUP (servbyport,
+	   {
+	     if (result->s_port == port)
+	       break;
+	   }, int port)
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
new file mode 100644
index 0000000000..4c2ccf692f
--- /dev/null
+++ b/nss/nsswitch.c
@@ -0,0 +1,588 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <ctype.h>
+#include <dlfcn.h>
+#include <netdb.h>
+#include <libc-lock.h>
+#include <search.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "nsswitch.h"
+#include "../elf/link.h"	/* We need some help from ld.so.  */
+
+/* Prototypes for the local functions.  */
+static void nss_init (void);
+static void *nss_lookup_function (service_user *ni, const char *fct_name);
+static int nss_find_entry (struct entry **knownp, const char *key,
+			   void **valp);
+static void nss_insert_entry (struct entry **knownp, const char *key,
+			      void *val);
+static name_database *nss_parse_file (const char *fname);
+static name_database_entry *nss_getline (char *line);
+static service_library *nss_new_service (name_database *database,
+					 const char *name);
+
+
+__libc_lock_define_initialized (static, lock);
+
+
+/* Global variable.  */
+struct __res_state _res;
+
+
+/* Known aliases for service names.  */
+static struct {
+  const char *alias;
+  const char *value;
+} service_alias[] =
+{
+  { "nis+", "nisplus" },
+  { "yp", "nis" }
+};
+
+
+/* Nonzero if the sevices are already initialized.  */
+static int nss_initialized;
+
+
+/* The root of the whole data base.  */
+static name_database *service_table;
+
+
+static void
+nss_init (void)
+{
+  /* Prevent multiple threads to change the service table.  */
+  __libc_lock_lock (lock);
+
+  if (service_table == NULL)
+    service_table = nss_parse_file (_PATH_NSSWITCH_CONF);
+
+  __libc_lock_unlock (lock);
+}
+
+
+/* -1 == database not found
+    0 == database entry pointer stored */
+int
+__nss_database_lookup (const char *database, service_user **ni)
+{
+  /* Return first `service_user' entry for DATABASE.
+     XXX Will use perfect hashing function for known databases.  */
+  name_database_entry *entry;
+
+  /* Test whether configuration data is available.  */
+  if (service_table == NULL)
+    {
+      if (nss_initialized == 0)
+	nss_init ();
+
+      if (service_table == NULL)
+	return -1;
+    }
+
+  /* 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)
+      break;
+
+  if (entry == NULL || (*ni = entry->service) == NULL)
+    return -1;
+
+  return 0;
+}
+
+
+/* -1 == not found
+    0 == adjusted for next function */
+int
+__nss_lookup (service_user **ni, const char *fct_name, void **fctp)
+{
+  *fctp = nss_lookup_function (*ni, fct_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);
+    }
+
+  return *fctp != NULL ? 0 : -1;
+}
+
+
+/* -1 == not found
+    0 == adjusted for next function
+    1 == finished */
+int
+__nss_next (service_user **ni, const char *fct_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 (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_SUCCESS)
+	 __libc_fatal ("illegal status in " __FUNCTION__);
+
+       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);
+    }
+  while (*fctp == NULL
+	 && nss_next_action (*ni, NSS_STATUS_UNAVAIL) == NSS_ACTION_CONTINUE
+	 && (*ni)->next != NULL);
+
+  return *fctp != NULL ? 0 : -1;
+}
+
+
+static int
+nss_dlerror_run (void (*operate) (void))
+{
+  const char *last_errstring = NULL;
+  const char *last_object_name = NULL;
+
+  (void) _dl_catch_error (&last_errstring, &last_object_name, operate);
+
+  return last_errstring != NULL;
+}
+
+
+static void *
+nss_lookup_function (service_user *ni, const char *fct_name)
+{
+  void *result;
+
+  /* Determine whether current function is loaded.  */
+  if (nss_find_entry (&ni->known, fct_name, &result) >= 0)
+    return result;
+
+  /* If we failed to allocate the needed data structures for the
+     service return an error.  This should only happen when we are out
+     of memory.  */
+  if (ni->library == NULL)
+    return NULL;
+
+  /* We now modify global data.  Protect it.  */
+  __libc_lock_lock (lock);
+
+  if (ni->library->lib_handle == NULL)
+    {
+      /* Load the shared library.  */
+      size_t shlen = (7 + strlen (ni->library->name) + 3
+		      + sizeof (NSS_SHLIB_REVISION));
+      char shlib_name[shlen];
+
+      void do_open (void)
+	{
+	  /* The used function is found in GNU ld.so.  XXX The first
+	     argument to _dl_open used to be `_dl_loaded'.  But this
+	     does (currently) not work.  */
+	  ni->library->lib_handle = _dl_open (shlib_name, RTLD_LAZY);
+	}
+
+      /* Construct name.  */
+      __stpcpy (__stpcpy (__stpcpy (shlib_name, "libnss_"), ni->library->name),
+		".so" NSS_SHLIB_REVISION);
+
+      if (nss_dlerror_run (do_open) != 0)
+	/* Failed to load the library.  */
+	ni->library->lib_handle = (void *) -1;
+    }
+
+  if (ni->library->lib_handle == (void *) -1)
+    /* Library not found => function not found.  */
+    result = NULL;
+  else
+    {
+      /* Get the desired function.  Again,  GNU ld.so magic ahead.  */
+      size_t namlen = (5 + strlen (ni->library->name) + 1
+		       + strlen (fct_name) + 1);
+      char name[namlen];
+      struct link_map *map = ni->library->lib_handle;
+      Elf32_Addr loadbase;
+      const Elf32_Sym *ref = NULL;
+      void get_sym (void)
+	{
+	  struct link_map *scope[2] = { map, NULL };
+	  loadbase = _dl_lookup_symbol (name, &ref, scope, map->l_name, 0, 0);
+	}
+
+      __stpcpy (__stpcpy (__stpcpy (__stpcpy (name, "_nss_"),
+				    ni->library->name),
+			  "_"),
+		fct_name);
+
+      result = (nss_dlerror_run (get_sym)
+		? NULL : (void *) (loadbase + ref->st_value));
+    }
+
+  /* Remember function pointer for the usage.  */
+  nss_insert_entry (&ni->known, fct_name, result);
+
+  /* Remove the lock.  */
+  __libc_lock_unlock (lock);
+
+  return result;
+}
+
+
+static int
+known_compare (const void *p1, const void *p2)
+{
+  known_function *v1 = (known_function *) p1;
+  known_function *v2 = (known_function *) p2;
+
+  return strcmp (v1->fct_name, v2->fct_name);
+}
+
+
+static int
+nss_find_entry (struct entry **knownp, const char *key, void **valp)
+{
+  known_function looking_for = { fct_name: key };
+  struct entry **found;
+
+  found = __tfind (&looking_for, (const void **) knownp, known_compare);
+
+  if (found == NULL)
+    return -1;
+
+  *valp = ((known_function *) (*found)->key)->fct_ptr;
+
+  return 0;
+}
+
+
+static void
+nss_insert_entry (struct entry **knownp, const char *key, void *val)
+{
+  known_function *to_insert;
+
+  to_insert = (known_function *) malloc (sizeof (known_function));
+  if (to_insert == NULL)
+    return;
+
+  to_insert->fct_name = key;
+  to_insert->fct_ptr = val;
+
+  __tsearch (to_insert, (void **) knownp, known_compare);
+}
+
+
+static name_database *
+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, "r");
+  if (fp == NULL)
+    return NULL;
+
+  result = (name_database *) malloc (sizeof (name_database));
+  if (result == NULL)
+    return NULL;
+
+  result->entry = NULL;
+  result->library = NULL;
+  last = NULL;
+  line = NULL;
+  len = 0;
+  do
+    {
+      name_database_entry *this;
+      ssize_t n;
+      char *cp;
+
+      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.  */
+      cp = strchr (line, '#');
+      if (cp != NULL)
+	*cp = '\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 (fp));
+
+  /* Free the buffer.  */
+  free (line);
+  /* Close configuration file.  */
+  fclose (fp);
+
+  /* Now create for each service we could use an entry in LIBRARY list.  */
+  for (last = result->entry; last != NULL; last = last->next)
+    {
+      service_user *runp;
+
+      for (runp = last->service; runp != NULL; runp = runp->next)
+	runp->library = nss_new_service (result, runp->name);
+    }
+
+  return result;
+}
+
+
+static name_database_entry *
+nss_getline (char *line)
+{
+  const char *name;
+  name_database_entry *result;
+  service_user *last;
+
+  /* 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';
+
+  result = (name_database_entry *) malloc (sizeof (name_database_entry));
+  if (result == NULL)
+    return NULL;
+
+  result->name = strdup (name);
+  if (result->name == NULL)
+    {
+      free (result);
+      return NULL;
+    }
+  result->service = NULL;
+  result->next = NULL;
+  last = NULL;
+
+  /* Read the source names: `<source> ( "[" <status> "=" <action> "]" )*'.  */
+  while (1)
+    {
+      service_user *new_service;
+      size_t n;
+
+      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));
+      if (new_service == NULL)
+	return result;
+
+      /* Test whether the source name is one of the aliases.  */
+      for (n = 0; n < sizeof (service_alias) / sizeof (service_alias[0]); ++n)
+	if (strncmp (service_alias[n].alias, name, line - name) == 0
+	    && service_alias[n].alias[line - name] == '\0')
+	  break;
+
+      if (n < sizeof (service_alias) / sizeof (service_alias[0]))
+	new_service->name = service_alias[n].value;
+      else
+	{
+	  char *source = (char *) malloc (line - name + 1);
+	  if (source == NULL)
+	    {
+	      free (new_service);
+	      return result;
+	    }
+	  memcpy (source, name, line - name);
+	  source[line - name] = '\0';
+
+	  new_service->name = source;
+	}
+
+      /* 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->library = NULL;
+      new_service->known = NULL;
+      new_service->next = NULL;
+
+      while (isspace (line[0]))
+	++line;
+
+      if (line[0] == '[')
+	{
+	  int status;
+
+	  /* Read criterions.  */
+	  do
+	    ++line;
+	  while (line[0] != '\0' && isspace (line[0]));
+
+	  do
+	    {
+	      /* 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
+		    return result;
+		}
+	      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
+		    return result;
+		}
+	      else
+		return result;
+
+	      while (isspace (line[0]))
+		++line;
+	      if (line[0] != '=')
+		return result;
+	      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)
+		new_service->actions[2 + status] = NSS_ACTION_RETURN;
+	      else if (line - name == 8
+		       && strncasecmp (name, "CONTINUE", 8) == 0)
+		new_service->actions[2 + status] = NSS_ACTION_CONTINUE;
+	      else
+		return result;
+
+	      /* Match white spaces.  */
+	      while (isspace (line[0]))
+		++line;
+	    }
+	  while (line[0] != ']');
+
+	  /* Skip the ']'.  */
+	  ++line;
+	}
+
+      if (last == NULL)
+	result->service = new_service;
+      else
+	last->next = new_service;
+      last = new_service;
+    }
+  /* NOTREACHED */
+  return NULL;
+}
+
+
+static service_library *
+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;
+}
diff --git a/nss/nsswitch.h b/nss/nsswitch.h
new file mode 100644
index 0000000000..f597a58860
--- /dev/null
+++ b/nss/nsswitch.h
@@ -0,0 +1,138 @@
+/* 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#ifndef _NSSWITCH_H
+#define _NSSWITCH_H	1
+
+/* This is an *internal* header.  */
+
+#include <arpa/nameser.h>
+#include <netinet/in.h>
+#include <resolv.h>
+#include <search.h>
+
+
+/* Revision number of NSS interface (must be a string).  */
+#define NSS_SHLIB_REVISION ".1"
+
+
+/* Possible results of lookup using a nss_* function.  */
+enum nss_status
+{
+  NSS_STATUS_TRYAGAIN = -2,
+  NSS_STATUS_UNAVAIL,
+  NSS_STATUS_NOTFOUND,
+  NSS_STATUS_SUCCESS,
+};
+
+
+/* Actions performed after lookup finished.  */
+typedef enum
+{
+  NSS_ACTION_CONTINUE,
+  NSS_ACTION_RETURN
+} 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 mappng a function name to a function pointer.  */
+typedef struct
+{
+  const char *fct_name;
+  void *fct_ptr;
+} known_function;
+
+
+typedef struct service_user
+{
+  /* Name of the service (`files', `dns', `nis', ...).  */
+  const char *name;
+  /* Action according to result.  */
+  lookup_actions actions[4];
+  /* Link to the underlying library object.  */
+  service_library *library;
+  /* Collection of known functions.  */
+  struct entry *known;
+  /* And the link to the next entry.  */
+  struct service_user *next;
+} 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
+{
+  /* Name of the database.  */
+  const char *name;
+  /* List of service to be used.  */
+  service_user *service;
+  /* And the link to the next entry.  */
+  struct name_database_entry *next;
+} 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;
+
+
+/* Interface functions for NSS.  */
+
+/* Get the data structure representing the specified database.  More
+   than one function can use the database.  */
+int __nss_database_lookup (const char *database, service_user **ni);
+
+
+/* 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 occured or no such function exists.  */
+int __nss_lookup (service_user **ni, const char *fct_name, void **fctp);
+
+/* 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 valie is 0 if there is
+   another function to use and < 0 if an error occured.
+
+   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.  */
+int __nss_next (service_user **ni, const char *fct_name, void **fctp,
+		int status, int all_values);
+
+
+#endif	/* nsswitch.h */
diff --git a/nss/proto-lookup.c b/nss/proto-lookup.c
new file mode 100644
index 0000000000..f27ff591d9
--- /dev/null
+++ b/nss/proto-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME protocols
+
+#include "XXX-lookup.c"
diff --git a/nss/pwd-lookup.c b/nss/pwd-lookup.c
new file mode 100644
index 0000000000..e792560bad
--- /dev/null
+++ b/nss/pwd-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME passwd
+
+#include "XXX-lookup.c"
diff --git a/nss/rpc-lookup.c b/nss/rpc-lookup.c
new file mode 100644
index 0000000000..f49359ad2b
--- /dev/null
+++ b/nss/rpc-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME rpc
+
+#include "XXX-lookup.c"
diff --git a/nss/service-lookup.c b/nss/service-lookup.c
new file mode 100644
index 0000000000..c1a3256add
--- /dev/null
+++ b/nss/service-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME services
+
+#include "XXX-lookup.c"
diff --git a/posix/getopt.c b/posix/getopt.c
index e4ae3340e8..4f2d068271 100644
--- a/posix/getopt.c
+++ b/posix/getopt.c
@@ -71,7 +71,7 @@ Cambridge, MA 02139, USA.  */
 #endif
 #endif
 
-#ifdef WIN32
+#if defined (WIN32) && !defined (__CYGWIN32__)
 /* It's not Unix, really.  See?  Capital letters.  */
 #include <windows.h>
 #define getpid() GetCurrentProcessId()
diff --git a/posix/regex.c b/posix/regex.c
index 85c297b295..3dd03b26c3 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -1011,9 +1011,9 @@ static const char *re_error_msgid[] =
    This is a variable only so users of regex can assign to it; we never
    change it ourselves.  */
 #if defined (MATCH_MAY_ALLOCATE)
-/* 8600 was enough to cause a crash on Ultrix,
+/* 4400 was enough to cause a crash on Alpha OSF/1,
    whose default stack limit is 2mb.  */
-int re_max_failures = 8000;
+int re_max_failures = 4000;
 #else
 int re_max_failures = 2000;
 #endif
diff --git a/pwd/Makefile b/pwd/Makefile
index b33700a95f..ce67d49ea9 100644
--- a/pwd/Makefile
+++ b/pwd/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991 Free Software Foundation, Inc.
+# Copyright (C) 1991, 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
@@ -21,6 +21,8 @@
 #
 subdir	:= pwd
 
-routines := pwdopen pwdread fgetpwent getpw getpwent getpwnam getpwuid putpwent
+routines := fgetpwent getpw putpwent \
+	    getpwent getpwnam getpwuid \
+	    getpwent_r getpwnam_r getpwuid_r
 
 include ../Rules
diff --git a/pwd/fgetpwent.c b/pwd/fgetpwent.c
index 4a21cbb59a..ba9f834905 100644
--- a/pwd/fgetpwent.c
+++ b/pwd/fgetpwent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 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
@@ -16,25 +16,50 @@ 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 <ansidecl.h>
-#include <errno.h>
-#include <limits.h>
-#include <stddef.h>
 #include <stdio.h>
-#include <string.h>
 #include <pwd.h>
 
+/* Define a line parsing function using the common code
+   used in the nss_files module.  */
+
+#define STRUCTURE	passwd
+#define ENTNAME		pwent
+struct pwent_data {};
+
+#include "../nss/nss_files/files-parse.c"
+LINE_PARSER
+(
+ STRING_FIELD (result->pw_name, ISCOLON);
+ STRING_FIELD (result->pw_passwd, ISCOLON);
+ INT_FIELD (result->pw_uid, ISCOLON, 10,);
+ INT_FIELD (result->pw_gid, ISCOLON, 10,);
+ STRING_FIELD (result->pw_gecos, ISCOLON);
+ STRING_FIELD (result->pw_dir, ISCOLON);
+ result->pw_shell = line;
+)
+
+
 /* Read one entry from the given stream.  */
 struct passwd *
-DEFUN(fgetpwent, (stream), FILE *stream)
+fgetpwent (FILE *stream)
 {
-  static PTR info = NULL;
-  if (info == NULL)
+  static char buffer[BUFSIZ];
+  static struct passwd result;
+  char *p;
+
+  do
     {
-      info = __pwdalloc();
-      if (info == NULL)
-	return(NULL);
-    }
+      p = fgets (buffer, sizeof buffer, stream);
+      if (p == NULL)
+	return NULL;
+
+      /* Skip leading blanks.  */
+      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_line (p, &result, (void *) buffer, sizeof buffer));
 
-  return(__pwdread(stream, info));
+  return &result;
 }
diff --git a/pwd/getpwent.c b/pwd/getpwent.c
index 1c88950f11..79edbd5db0 100644
--- a/pwd/getpwent.c
+++ b/pwd/getpwent.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1996 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 Library General Public License as
@@ -13,55 +14,17 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stddef.h>
-#include <stdio.h>
 #include <pwd.h>
 
-static FILE *stream = NULL;
 
-/* Rewind the stream.  */
-void
-DEFUN_VOID(setpwent)
-{
-  if (stream != NULL)
-    rewind(stream);
-}
+#define LOOKUP_TYPE	struct passwd
+#define SETFUNC_NAME	setpwent
+#define	GETFUNC_NAME	getpwent
+#define	ENDFUNC_NAME	endpwent
+#define DATABASE_NAME	passwd
+#define BUFLEN		1024
 
-
-/* Close the stream.  */
-void
-DEFUN_VOID(endpwent)
-{
-  if (stream != NULL)
-    {
-      (void) fclose(stream);
-      stream = NULL;
-    }
-}
-
-
-/* Return one entry from the password file.  */
-struct passwd *
-DEFUN_VOID(getpwent)
-{
-  static PTR info = NULL;
-  if (info == NULL)
-    {
-      info = __pwdalloc();
-      if (info == NULL)
-	return(NULL);
-    }
-
-  if (stream == NULL)
-    {
-      stream = __pwdopen();
-      if (stream == NULL)
-	return(NULL);
-    }
-
-  return(__pwdread(stream, info));
-}
+#include "../nss/getXXent.c"
diff --git a/pwd/getpwent_r.c b/pwd/getpwent_r.c
new file mode 100644
index 0000000000..ced7f8a639
--- /dev/null
+++ b/pwd/getpwent_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <pwd.h>
+
+
+#define LOOKUP_TYPE	struct passwd
+#define SETFUNC_NAME	setpwent
+#define	GETFUNC_NAME	getpwent
+#define	ENDFUNC_NAME	endpwent
+#define DATABASE_NAME	passwd
+#define BUFLEN		1024
+
+#include "../nss/getXXent_r.c"
diff --git a/pwd/getpwnam.c b/pwd/getpwnam.c
index bac8b6b4da..597b8d1205 100644
--- a/pwd/getpwnam.c
+++ b/pwd/getpwnam.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1996 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 Library General Public License as
@@ -13,24 +14,17 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
 #include <pwd.h>
 
-/* Search for an entry with a matching name.  */
-struct passwd *
-DEFUN(getpwnam, (name), const char *name)
-{
-  int match (struct passwd *p)
-    {
-      return ! strcmp (name, p->pw_name);
-    }
-  static void *info;
 
-  return __pwdscan (&info, &match);
-}
+#define LOOKUP_TYPE	struct passwd
+#define FUNCTION_NAME	getpwnam
+#define DATABASE_NAME	passwd
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/pwd/getpwnam_r.c b/pwd/getpwnam_r.c
new file mode 100644
index 0000000000..c2d1f84d81
--- /dev/null
+++ b/pwd/getpwnam_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <pwd.h>
+
+
+#define LOOKUP_TYPE	struct passwd
+#define FUNCTION_NAME	getpwnam
+#define DATABASE_NAME	passwd
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/pwd/getpwuid.c b/pwd/getpwuid.c
index 5093488557..130c251f89 100644
--- a/pwd/getpwuid.c
+++ b/pwd/getpwuid.c
@@ -1,5 +1,6 @@
-/* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1996 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 Library General Public License as
@@ -13,24 +14,17 @@ 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.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
-#include <ansidecl.h>
-#include <stddef.h>
-#include <stdio.h>
 #include <pwd.h>
-#include <sys/types.h>
 
-/* Search for an entry with a matching uid.  */
-struct passwd *
-DEFUN(getpwuid, (uid), uid_t uid)
-{
-  int match (struct passwd *p)
-    {
-      return p->pw_uid == uid;
-    }
-  static void *info;
 
-  return __pwdscan (&info, &match);
-}
+#define LOOKUP_TYPE	struct passwd
+#define FUNCTION_NAME	getpwuid
+#define DATABASE_NAME	passwd
+#define ADD_PARAMS	uid_t uid
+#define ADD_VARIABLES	uid
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/pwd/getpwuid_r.c b/pwd/getpwuid_r.c
new file mode 100644
index 0000000000..e3bf7578ae
--- /dev/null
+++ b/pwd/getpwuid_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 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 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <pwd.h>
+
+
+#define LOOKUP_TYPE	struct passwd
+#define FUNCTION_NAME	getpwuid
+#define DATABASE_NAME	passwd
+#define ADD_PARAMS	uid_t uid
+#define ADD_VARIABLES	uid
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/pwd/pwdread.c b/pwd/pwdread.c
deleted file mode 100644
index 12032367fa..0000000000
--- a/pwd/pwdread.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* Copyright (C) 1991, 1992, 1995 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 <ansidecl.h>
-#include <errno.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pwd.h>
-#include <sys/types.h>
-
-
-/* This is the function that all the others are based on.
-   The format of the password file is known only here.  */
-
-/* Structure containing info kept by each __pwdread caller.  */
-typedef struct
-  {
-    char *buf;
-    size_t buflen;
-    struct passwd p;
-  } pwdread_info;
-
-
-/* Return a chunk of memory containing a pre-initialized `pwdread_info'.  */
-PTR
-DEFUN_VOID(__pwdalloc)
-{
-  pwdread_info *info = (PTR) malloc (sizeof(pwdread_info));
-  if (info == NULL)
-    return NULL;
-  info->buf = NULL;
-  info->buflen = 0;
-  return info;
-}
-
-/* Read a password entry from STREAM, filling in P.  */
-struct passwd *
-DEFUN(__pwdread, (stream, p), FILE *stream AND PTR CONST p)
-{
-  register pwdread_info *CONST info = (pwdread_info *) p;
-  char *start, *end;
-
-  /* Idiocy checks.  */
-  if (stream == NULL)
-    {
-      errno = EINVAL;
-      return NULL;
-    }
-
-  do
-    if (__getline (&info->buf, &info->buflen, stream) == -1)
-      return NULL;
-  while (info->buf[0] == '#');
-
-  start = info->buf;
-  end = strchr (start, ':');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->p.pw_name = start;
-
-  start = end + 1;
-  end = strchr (start, ':');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->p.pw_passwd = start;
-
-  info->p.pw_uid = (uid_t) strtol (end + 1, &end, 10);
-  if (*end != ':')
-    return NULL;
-  info->p.pw_gid = (gid_t) strtol (end + 1, &end, 10);
-  if (*end != ':')
-    return NULL;
-
-  start = end + 1;
-  end = strchr (start, ':');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->p.pw_gecos = start;
-
-  start = end + 1;
-  end = strchr (start, ':');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->p.pw_dir = start;
-
-  start = end + 1;
-  end = strchr (start, '\n');
-  if (end == NULL)
-    return NULL;
-  *end = '\0';
-  info->p.pw_shell = start;
-
-  return &info->p;
-}
-
-
-struct passwd *
-__pwdscan (void **info, int (*selector) (struct passwd *))
-{
-  FILE *stream;
-  struct passwd *p;
-
-  if (*info == NULL)
-    {
-      *info = __pwdalloc ();
-      if (info == NULL)
-	return NULL;
-    }
-
-  stream = __pwdopen ();
-  if (stream == NULL)
-    return NULL;
-
-  p = NULL;
-  while (! feof (stream))
-    {
-      p = __pwdread (stream, *info);
-      if (p && (*selector) (p))
-	break;
-      p = NULL;
-    }
-
-  (void) fclose (stream);
-  return p;
-}
diff --git a/resolv.h b/resolv.h
index fc5650d602..95b9eebef8 100644
--- a/resolv.h
+++ b/resolv.h
@@ -1 +1 @@
-#include <inet/resolv.h>
+#include <resolv/resolv.h>
diff --git a/resolv/gethnamaddr.c b/resolv/gethnamaddr.c
index 161060ebd6..d3c45d0446 100644
--- a/resolv/gethnamaddr.c
+++ b/resolv/gethnamaddr.c
@@ -65,16 +65,12 @@ static char rcsid[] = "$Id$";
 #include <arpa/nameser.h>
 
 #include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <netdb.h>
 #include <resolv.h>
 #include <ctype.h>
 #include <errno.h>
 #include <syslog.h>
 
-#include "res_hconf.h"
-
 #ifndef LOG_AUTH
 # define LOG_AUTH 0
 #endif
@@ -98,7 +94,6 @@ static char rcsid[] = "$Id$";
 
 #define	MAXALIASES	35
 #define	MAXADDRS	35
-#define	MAXADDRBUFSIZE	8192
 
 static const char AskedForGot[] =
 			  "gethostby*.getanswer: asked for \"%s\", got \"%s\"";
@@ -108,7 +103,7 @@ static struct hostent *gethostbyname_ipv4 __P((const char *));
 
 static struct hostent host;
 static char *host_aliases[MAXALIASES];
-static char hostbuf[MAXADDRBUFSIZE];
+static char hostbuf[8*1024];
 static u_char host_addr[16];	/* IPv4 or IPv6 */
 static FILE *hostf = NULL;
 static int stayopen = 0;
@@ -435,7 +430,7 @@ gethostbyname2(name, af)
 	querybuf buf;
 	register const char *cp;
 	char *bp;
-	int i, n, size, type, len;
+	int n, size, type, len;
 	extern struct hostent *_gethtbyname2();
 
 	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
@@ -506,55 +501,13 @@ gethostbyname2(name, af)
 				break;
 		}
 
-	h_errno = HOST_NOT_FOUND;
-	for (i = 0; i < _res_hconf.num_services; ++i) {
-		struct hostent * hp;
-		char * cp = (char *) name;
-
-		if (_res_hconf.num_trimdomains > 0) {
-			size_t name_len = strlen(name);
-
-			cp = malloc(name_len + 1);
-			memcpy(cp, name, name_len + 1);
-			_res_hconf_trim_domain(cp);
-		}
-
-		hp = NULL;
-		switch (_res_hconf.service[i]) {
-		      case SERVICE_BIND:
-			if ((n = res_search(cp, C_IN, type,
-					    buf.buf, sizeof(buf))) < 0)
-			{
-				dprintf("res_search failed (%d)\n", n);
-				break;
-			}
-			hp = getanswer(&buf, n, cp, type);
-			break;
-
-		      case SERVICE_HOSTS:
-			hp = _gethtbyname2(cp, af);
-			break;
-#ifdef HAVE_NYS
-		      case SERVICE_NIS:
-			hp = _getnishost(cp, "hosts.byname");
-			break;
-#endif
-		      default:
-			break;
-		}
-		if (cp != name)
-			free(cp);
-		if (hp) {
-			if ((_res_hconf.flags & HCONF_FLAG_REORDER)
-			    && hp->h_addr_list[0] && hp->h_addr_list[1])
-				_res_hconf_reorder_addrs(hp);
-			_res_hconf_trim_domains(hp);
-			return hp;
-		}
+	if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf))) < 0) {
+		dprintf("res_search failed (%d)\n", n);
+		if (errno == ECONNREFUSED)
+			return (_gethtbyname2(name, af));
+		return (NULL);
 	}
-	if (h_errno == NETDB_SUCCESS)
-		h_errno = HOST_NOT_FOUND;
-	return NULL;
+	return (getanswer(&buf, n, name, type));
 }
 
 struct hostent *
@@ -569,11 +522,12 @@ gethostbyaddr(addr, len, af)
 	querybuf buf;
 	register struct hostent *hp;
 	char qbuf[MAXDNAME+1], *qp;
+#ifdef SUNSECURITY
 	register struct hostent *rhp;
 	char **haddr;
 	u_long old_options;
 	char hname2[MAXDNAME+1];
-	int i, old_num_trimdomains;
+#endif /*SUNSECURITY*/
 	extern struct hostent *_gethtbyaddr();
 
 	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
@@ -606,130 +560,79 @@ gethostbyaddr(addr, len, af)
 		h_errno = NETDB_INTERNAL;
 		return (NULL);
 	}
-
-	h_errno = NETDB_SUCCESS;
-	for (i = 0; i < _res_hconf.num_services; ++i) {
-		hp = NULL;
-		switch (_res_hconf.service[i]) {
-		case SERVICE_BIND:
-			switch (af) {
-			case AF_INET:
-				(void) sprintf(qbuf,
-					       "%u.%u.%u.%u.in-addr.arpa",
-					       (uaddr[3] & 0xff),
-					       (uaddr[2] & 0xff),
-					       (uaddr[1] & 0xff),
-					       (uaddr[0] & 0xff));
-				break;
-			case AF_INET6:
-				qp = qbuf;
-				for (n = IN6ADDRSZ - 1; n >= 0; n--) {
-					qp += SPRINTF((qp, "%x.%x.",
-						       uaddr[n] & 0xf,
-						       (uaddr[n] >> 4) & 0xf));
-				}
-				strcpy(qp, "ip6.int");
-				break;
-			default:
-				abort();
-			}
-			n = res_query(qbuf, C_IN, T_PTR,
-				      (u_char *)buf.buf, sizeof buf.buf);
-			if (n < 0) {
-				dprintf("res_query failed (%d)\n", n);
-				break;
-			}
-			hp = getanswer(&buf, n, qbuf, T_PTR);
-			if (!hp)
-				break;	/* h_errno was set by getanswer() */
-			if (af == AF_INET
-			    && (_res_hconf.flags & HCONF_FLAG_SPOOF)) {
-				/*
-				 * Turn off search as the name should
-				 * be absolute, 'localhost' should be
-				 * matched by defnames
-				 */
-				strncpy(hname2, hp->h_name, MAXDNAME);
-				hname2[MAXDNAME] = '\0';
-				old_options = _res.options;
-				/*
-				 * Also turn off domain trimming to prevent it
-				 * from causing the name comparison to fail.
-				 */
-				old_num_trimdomains =
-					_res_hconf.num_trimdomains;
-				_res.options &= ~RES_DNSRCH;
-				_res.options |= RES_DEFNAMES;
-				rhp = gethostbyname(hname2);
-				_res.options = old_options;
-				/* There must be an A record and
-				   the names must match.  */
-				if (!rhp || strcmp(hname2, rhp->h_name)) {
-					syslog(LOG_NOTICE|LOG_AUTH,
-					       "gethostbyaddr: No A record for"
-					       " %s (verifying [%s])",
-					       hname2,
-					       inet_ntoa(*((struct in_addr *)
-							   addr)));
-					h_errno = HOST_NOT_FOUND;
-					break;
-				}
-				for (haddr = rhp->h_addr_list; *haddr; haddr++)
-					if (!memcmp(*haddr, addr, INADDRSZ))
-						break;
-				if (!*haddr) {
-					syslog(LOG_NOTICE|LOG_AUTH,
-					       "gethostbyaddr: A record of %s"
-					       " != PTR record [%s]",
-					       hname2,
-					       inet_ntoa(*((struct in_addr *)
-							   addr)));
-					h_errno = HOST_NOT_FOUND;
-					break;
-				}
-			}
-			hp->h_addrtype = af;
-			hp->h_length = len;
-			bcopy(addr, host_addr, len);
-			h_addr_ptrs[0] = (char *)host_addr;
-			h_addr_ptrs[1] = NULL;
-			if (af == AF_INET && (_res.options & RES_USE_INET6)) {
-				map_v4v6_address((char*)host_addr,
-						 (char*)host_addr);
-				hp->h_addrtype = AF_INET6;
-				hp->h_length = IN6ADDRSZ;
-			}
-			h_errno = NETDB_SUCCESS;
-			break;
-
-		case SERVICE_HOSTS:
-			hp = _gethtbyaddr(addr, len, af);
-			break;
-
-#ifdef HAVE_NYS
-		case SERVICE_NIS:
-			if (af == AF_INET) {
-				sprintf(qbuf, "%u.%u.%u.%u",
-					(unsigned)addr[0] & 0xff,
-					(unsigned)addr[1] & 0xff,
-					(unsigned)addr[2] & 0xff,
-					(unsigned)addr[3] & 0xff);
-				hp = _getnishost(qbuf, "hosts.byaddr");
-			}
-			break;
-#endif
-
-		default:
-			break;
-		}
-		if (hp) {
-			_res_hconf_trim_domains(hp);
-			return hp;
+	switch (af) {
+	case AF_INET:
+		(void) sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa",
+			       (uaddr[3] & 0xff),
+			       (uaddr[2] & 0xff),
+			       (uaddr[1] & 0xff),
+			       (uaddr[0] & 0xff));
+		break;
+	case AF_INET6:
+		qp = qbuf;
+		for (n = IN6ADDRSZ - 1; n >= 0; n--) {
+			qp += SPRINTF((qp, "%x.%x.",
+				       uaddr[n] & 0xf,
+				       (uaddr[n] >> 4) & 0xf));
 		}
+		strcpy(qp, "ip6.int");
+		break;
+	default:
+		abort();
+	}
+	n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
+	if (n < 0) {
+		dprintf("res_query failed (%d)\n", n);
+		if (errno == ECONNREFUSED)
+			return (_gethtbyaddr(addr, len, af));
+		return (NULL);
 	}
-	if (h_errno == NETDB_SUCCESS)
+	if (!(hp = getanswer(&buf, n, qbuf, T_PTR)))
+		return (NULL);	/* h_errno was set by getanswer() */
+#ifdef SUNSECURITY
+	if (af == AF_INET) {
+	    /*
+	     * turn off search as the name should be absolute,
+	     * 'localhost' should be matched by defnames
+	     */
+	    strncpy(hname2, hp->h_name, MAXDNAME);
+	    hname2[MAXDNAME] = '\0';
+	    old_options = _res.options;
+	    _res.options &= ~RES_DNSRCH;
+	    _res.options |= RES_DEFNAMES;
+	    if (!(rhp = gethostbyname(hname2))) {
+		syslog(LOG_NOTICE|LOG_AUTH,
+		       "gethostbyaddr: No A record for %s (verifying [%s])",
+		       hname2, inet_ntoa(*((struct in_addr *)addr)));
+		_res.options = old_options;
+		h_errno = HOST_NOT_FOUND;
+		return (NULL);
+	    }
+	    _res.options = old_options;
+	    for (haddr = rhp->h_addr_list; *haddr; haddr++)
+		if (!memcmp(*haddr, addr, INADDRSZ))
+			break;
+	    if (!*haddr) {
+		syslog(LOG_NOTICE|LOG_AUTH,
+		       "gethostbyaddr: A record of %s != PTR record [%s]",
+		       hname2, inet_ntoa(*((struct in_addr *)addr)));
 		h_errno = HOST_NOT_FOUND;
-	return NULL;
+		return (NULL);
+	    }
+	}
+#endif /*SUNSECURITY*/
+	hp->h_addrtype = af;
+	hp->h_length = len;
+	bcopy(addr, host_addr, len);
+	h_addr_ptrs[0] = (char *)host_addr;
+	h_addr_ptrs[1] = NULL;
+	if (af == AF_INET && (_res.options & RES_USE_INET6)) {
+		map_v4v6_address((char*)host_addr, (char*)host_addr);
+		hp->h_addrtype = AF_INET6;
+		hp->h_length = IN6ADDRSZ;
+	}
+	h_errno = NETDB_SUCCESS;
+	return (hp);
 }
 
 void
@@ -824,44 +727,6 @@ _gethtent()
 	return (&host);
 }
 
-struct hstorage {
-	char	*name;				/* canonical name */
-	char **	alp;				/* address list pointer */
-	char *	abp;				/* address buffer pointer */
-	char *	addr_list[MAXADDRS + 1];	/* address list storage */
-	char	addr_buf[MAXADDRBUFSIZE];	/* addresses storage */
-};
-
-static void
-append_addr (struct hstorage * hs, struct hostent *p)
-{
-	if (hs->alp < hs->addr_list + MAXADDRS
-	    && hs->abp + p->h_length < hs->addr_buf + MAXADDRBUFSIZE)
-	{
-		hs->alp[0] = hs->abp;
-		hs->alp[1] = 0;
-		memcpy(hs->abp, p->h_addr_list[0], p->h_length);
-		hs->abp += p->h_length;
-		++hs->alp;
-	}
-}
-
-/*
- * Lookup IP address and aliases for host NAME.  If multiaddress mode
- * is enabled, the entire /etc/hosts file is searched and the union of
- * all addresses found for NAME is returned (this may be slow with
- * large /etc/hosts files, but is convenient for smallish sites that
- * don't want to go through the complexity of running named locally).
- * If multiaddress mode is enabled, the address returned in
- * h_addr_list[0] is one that is on the same net as one of the host's
- * local addresses (if such an address exists).  For compatibility
- * with the BIND version of gethostbyname(), the alias field is empty
- * unless the name being looked up is an alias itself.  In the latter
- * case, the name field contains the canonical name and the alias
- * field the name that is being looked up.  A difference from the BIND
- * version is that this is true even if the alias applies only to one
- * of the interfaces on the target host.o
- */
 struct hostent *
 _gethtbyname(name)
 	const char *name;
@@ -886,163 +751,14 @@ _gethtbyname2(name, af)
 	register char **cp;
 
 	_sethtent(0);
-
-	if (_res_hconf.flags & HCONF_FLAG_MULTI) {
-		/*
-		 * More statics; not pretty, but it would require
-		 * interface changes to make these functions
-		 * reentrant.
-		 */
-		static char *aliases[2] = {0};
-		static struct hstorage self = {0}, target = {0};
-		static size_t self_name_size = 0; /* Allocated in self.name. */
-		static struct hostent ht;
-		int found;
-
-		if (aliases[0])
-			free (aliases[0]);	/* Malloced in a prev call.  */
-		aliases[0] = aliases[1] = 0;
-
-		/* Get current host name in a large enough buffer.  */
-		do {
-			   errno = 0;
-
-			   if (self.name)
-			   {
-				   self_name_size += self_name_size;
-				   self.name =
-					   realloc (self.name, self_name_size);
-			   } else {
-				   self_name_size = 128; /* Initial guess */
-				   self.name = malloc (self_name_size);
-			   }
-
-			   if (! self.name)
-			   {
-				   errno = ENOMEM;
-				   return 0;
-			   }
-		   } while ((gethostname(self.name, self_name_size) == 0
-			     && !memchr (self.name, '\0', self_name_size))
-			    || errno == ENAMETOOLONG);
-		
-		if (errno)
-			/* gethostname failed, abort.  */
-		{
-			free (self.name);
-			self.name = 0;
-		}
-
-		self.alp = self.addr_list;
-		self.abp = self.addr_buf;
-
-		if (target.name)
-			free (target.name);
-		target.name = strdup (name);
-
-		target.alp = target.addr_list;
-		target.abp = target.addr_buf;
-
-		_sethtent(0);
-		while ((p = _gethtent()) != 0) {
-			found = 1;
-
-			if (p->h_addrtype != af)
-				continue;
-			if (strcasecmp(p->h_name, name) != 0) {
-				found = 0;
-				for (cp = p->h_aliases; *cp; ++cp)
-					if (strcasecmp(*cp, name) == 0) {
-						found = 1;
-						if (!aliases[0]) {
-							aliases[0] =
-							  target.name;
-							target.name =
-							  strdup (p->h_name);
-						}
-						break;
-					}
-			}
-			if (found) {
-				/* they better be all the same type and length! */
-				ht.h_addrtype = p->h_addrtype;
-				ht.h_length = p->h_length;
-				append_addr(&target, p);
-				/*
-				 * If the current hostentry is for the target host, we don't
-				 * check for the local host name.  This nicely optimizes the
-				 * case where NAME is a local name since address ordering
-				 * doesn't matter in that case.
-				 */
-				continue;
-			}
-			found = 1;
-			if (strcasecmp(p->h_name, self.name) != 0) {
-				found = 0;
-				for (cp = p->h_aliases; *cp; ++cp)
-					if (strcasecmp(*cp, self.name) == 0) {
-						found = 1;
-						break;
-					}
-			}
-			if (found) {
-				append_addr(&self, p);
-			}
-		}
-		_endhtent();
-
-		if (target.alp == target.addr_list)
-			return NULL;		/* found nothing */
-
-		ht.h_aliases   = aliases;
-		ht.h_name      = target.name;
-		ht.h_addr_list = target.addr_list;
-		/*
-		 * XXX (davidm) Isn't this subsumed by REORDER???
-		 *
-		 * Finding the `best' address is necessarily address
-		 * specific.  For now, we do IPv4 addresses only.
-		 */
-		if (af == AF_INET) {
-			u_int32_t a1, a2, diff, mindiff = ~0;
-			int i, j, bestaddr = 0;
-
-			for (i = 0; self.addr_list[i]; ++i) {
-				for (j = 0; target.addr_list[j]; ++j) {
-					memcpy(&a1, self.addr_list[i], 4);
-					memcpy(&a2, target.addr_list[j], 4);
-					a1 = ntohl(a1);
-					a2 = ntohl(a2);
-					diff = a1 ^ a2;
-					if (diff < mindiff) {
-						bestaddr = j;
-						mindiff = diff;
-					}
-				}
-			}
-			if (bestaddr > 0) {
-				char * tmp;
-
-				tmp = target.addr_list[0];
-				target.addr_list[0] = target.addr_list[bestaddr];
-				target.addr_list[bestaddr] = tmp;
-			}
-		} else if (af == AF_INET6) {
-			/* XXX To do!!! */
-		}
-		ht.h_addr_list = target.addr_list;
-		return &ht;
-	} else {
-		_sethtent(0);
-		while (p = _gethtent()) {
-			if (p->h_addrtype != af)
-				continue;
-			if (strcasecmp(p->h_name, name) == 0)
-				break;
-			for (cp = p->h_aliases; *cp != 0; cp++)
-				if (strcasecmp(*cp, name) == 0)
-					goto found;
-		}
+	while (p = _gethtent()) {
+		if (p->h_addrtype != af)
+			continue;
+		if (strcasecmp(p->h_name, name) == 0)
+			break;
+		for (cp = p->h_aliases; *cp != 0; cp++)
+			if (strcasecmp(*cp, name) == 0)
+				goto found;
 	}
  found:
 	_endhtent();
@@ -1191,47 +907,7 @@ ht_gethostbyaddr(addr, len, af)
 struct hostent *
 gethostent()
 {
-	struct hostent * hp;
-	int i;
-
-	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
-		h_errno = NETDB_INTERNAL;
-		return (NULL);
-	}
-
-	/*
-	 * This doesn't look quite right.  Shouldn't we read one
-	 * service until it returns 0, then move on to the next
-	 * service?  If so, it requires adding some state and
-	 * initializing that state in sethostent().
-	 * (davidm@azstarnet.com)
-	 */
-	for (i = 0; i < _res_hconf.num_services; ++i) {
-		hp = NULL;
-		switch (_res_hconf.service[i]) {
-		      case SERVICE_HOSTS:
-			hp = _gethtent ();
-			break;
-
-#ifdef HAVE_NYS
-		      case SERVICE_NIS:
-			hp = _getnishost (NULL, "hosts.byname");
-			break;
-#endif
-
-		      case SERVICE_BIND:
-		      default:
-			break;
-		}
-		if (hp) {
-			if ((_res_hconf.flags & HCONF_FLAG_REORDER)
-			    && hp->h_addr_list[0] && hp->h_addr_list[1])
-				_res_hconf_reorder_addrs (hp);
-			return hp;
-		}
-	}
-	h_errno = HOST_NOT_FOUND;
-	return NULL;
+	return (_gethtent());
 }
 
 void
diff --git a/resolv/getnetbyaddr.c b/resolv/getnetbyaddr.c
deleted file mode 100644
index 32513cc387..0000000000
--- a/resolv/getnetbyaddr.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 1983 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getnetbyaddr.c	1.1 (Coimbra) 93/06/02";
-static char rcsid[] = "$Id$";
-#endif /* LIBC_SCCS and not lint */
-
-#include <netdb.h>
-
-extern int _net_stayopen;
-
-struct netent *
-_getnetbyaddr(net, type)
-	register unsigned long net;
-	register int type;
-{
-	register struct netent *p;
-
-	setnetent(_net_stayopen);
-	while (p = getnetent())
-		if (p->n_addrtype == type && p->n_net == net)
-			break;
-	if (!_net_stayopen)
-		endnetent();
-	return (p);
-}
diff --git a/resolv/getnetbyname.c b/resolv/getnetbyname.c
deleted file mode 100644
index cc3f281c5d..0000000000
--- a/resolv/getnetbyname.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getnetbyname.c	8.1 (Berkeley) 6/4/93";
-static char sccsid_[] = "from getnetbyname.c	1.1 (Coimbra) 93/06/02";
-static char rcsid[] = "$Id$";
-#endif /* LIBC_SCCS and not lint */
-
-#include <netdb.h>
-#include <string.h>
-
-extern int _net_stayopen;
-
-struct netent *
-_getnetbyname(name)
-	register const char *name;
-{
-	register struct netent *p;
-	register char **cp;
-
-	setnetent(_net_stayopen);
-	while (p = getnetent()) {
-		if (strcasecmp(p->n_name, name) == 0)
-			break;
-		for (cp = p->n_aliases; *cp != 0; cp++)
-			if (strcasecmp(*cp, name) == 0)
-				goto found;
-	}
-found:
-	if (!_net_stayopen)
-		endnetent();
-	return (p);
-}
diff --git a/resolv/getnetent.c b/resolv/getnetent.c
deleted file mode 100644
index 7ec5607781..0000000000
--- a/resolv/getnetent.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 1983 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
- *	Dep. Matematica Universidade de Coimbra, Portugal, Europe
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * from getnetent.c	1.1 (Coimbra) 93/06/02
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getnetent.c	8.1 (Berkeley) 6/4/93";
-static char rcsid[] = "$Id$";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-
-#include <stdio.h>
-#include <resolv.h>
-#include <netdb.h>
-#include <string.h>
-
-#ifndef _PATH_NETWORKS 
-#define _PATH_NETWORKS  "/etc/networks"
-#endif
-
-#define	MAXALIASES	35
-
-static FILE *netf;
-static char line[BUFSIZ+1];
-static struct netent net;
-static char *net_aliases[MAXALIASES];
-int _net_stayopen;
-
-void _setnetent __P((int));
-void _endnetent __P((void));
-
-void
-setnetent(stayopen)
-	int stayopen;
-{
-
-	sethostent(stayopen);
-	_setnetent(stayopen);
-}
-
-void
-endnetent()
-{
-
-	endhostent();
-	_endnetent();
-}
-
-void
-_setnetent(f)
-	int f;
-{
-
-	if (netf == NULL)
-		netf = fopen(_PATH_NETWORKS, "r" );
-	else
-		rewind(netf);
-	_net_stayopen |= f;
-}
-
-void
-_endnetent()
-{
-
-	if (netf) {
-		fclose(netf);
-		netf = NULL;
-	}
-	_net_stayopen = 0;
-}
-
-struct netent *
-getnetent()
-{
-	char *p;
-	register char *cp, **q;
-
-	if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL)
-		return (NULL);
-again:
-	p = fgets(line, BUFSIZ, netf);
-	if (p == NULL)
-		return (NULL);
-	if (*p == '#')
-		goto again;
-	cp = strpbrk(p, "#\n");
-	if (cp == NULL)
-		goto again;
-	*cp = '\0';
-	net.n_name = p;
-	cp = strpbrk(p, " \t");
-	if (cp == NULL)
-		goto again;
-	*cp++ = '\0';
-	while (*cp == ' ' || *cp == '\t')
-		cp++;
-	p = strpbrk(cp, " \t");
-	if (p != NULL)
-		*p++ = '\0';
-	net.n_net = inet_network(cp);
-	net.n_addrtype = AF_INET;
-	q = net.n_aliases = net_aliases;
-	if (p != NULL) {
-		cp = p;
-		while (cp && *cp) {
-			if (*cp == ' ' || *cp == '\t') {
-				cp++;
-				continue;
-			}
-			if (q < &net_aliases[MAXALIASES - 1])
-				*q++ = cp;
-			cp = strpbrk(cp, " \t");
-			if (cp != NULL)
-				*cp++ = '\0';
-		}
-	}
-	*q = NULL;
-	return (&net);
-}
diff --git a/resolv/inet_pton.c b/resolv/inet_pton.c
index cfc069d891..d0d45ae3da 100644
--- a/resolv/inet_pton.c
+++ b/resolv/inet_pton.c
@@ -59,7 +59,7 @@ inet_pton(af, src, dst)
 	case AF_INET6:
 		return (inet_pton6(src, dst));
 	default:
-		errno = EINVAL;
+		errno = EAFNOSUPPORT;
 		return (-1);
 	}
 	/* NOTREACHED */
diff --git a/resolv/mapv4v6addr.h b/resolv/mapv4v6addr.h
new file mode 100644
index 0000000000..4295398f45
--- /dev/null
+++ b/resolv/mapv4v6addr.h
@@ -0,0 +1,75 @@
+/*
+ * ++Copyright++ 1985, 1988, 1993
+ * -
+ * Copyright (c) 1985, 1988, 1993
+ *    The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * -
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * -
+ * --Copyright--
+ */
+
+#include <string.h>
+#include <arpa/nameser.h>
+
+static void
+map_v4v6_address (const char *src, char *dst)
+{
+  u_char *p = (u_char *) dst;
+  char tmp[INADDRSZ];
+  int i;
+
+  /* Stash a temporary copy so our caller can update in place. */
+  bcopy (src, tmp, INADDRSZ);
+  /* Mark this ipv6 addr as a mapped ipv4. */
+  for (i = 0; i < 10; i++)
+    *p++ = 0x00;
+  *p++ = 0xff;
+  *p++ = 0xff;
+  /* Retrieve the saved copy and we're done. */
+  bcopy (tmp, (void *) p, INADDRSZ);
+}
diff --git a/resolv/mapv4v6hostent.h b/resolv/mapv4v6hostent.h
new file mode 100644
index 0000000000..c3fb8b5c11
--- /dev/null
+++ b/resolv/mapv4v6hostent.h
@@ -0,0 +1,90 @@
+/*
+ * ++Copyright++ 1985, 1988, 1993
+ * -
+ * Copyright (c) 1985, 1988, 1993
+ *    The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * -
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * -
+ * --Copyright--
+ */
+
+#include <arpa/nameser.h>
+#include <sys/socket.h>
+
+typedef union {
+    int32_t al;
+    char ac;
+} align;
+
+static void
+map_v4v6_hostent (struct hostent *hp, char **bpp, int *lenp)
+{
+  char **ap;
+
+  if (hp->h_addrtype != AF_INET || hp->h_length != INADDRSZ)
+    return;
+  hp->h_addrtype = AF_INET6;
+  hp->h_length = IN6ADDRSZ;
+  for (ap = hp->h_addr_list; *ap; ap++)
+    {
+      int i = sizeof (align) - ((u_long) *bpp % sizeof (align));
+
+      if (*lenp < (i + IN6ADDRSZ))
+	{
+	  /* Out of memory.  Truncate address list here.  XXX */
+	  *ap = NULL;
+	  return;
+	}
+      *bpp += i;
+      *lenp -= i;
+      map_v4v6_address (*ap, *bpp);
+      *ap = *bpp;
+      *bpp += IN6ADDRSZ;
+      *lenp -= IN6ADDRSZ;
+    }
+}
diff --git a/resolv/netdb.h b/resolv/netdb.h
index fd06e17bb4..38367e324f 100644
--- a/resolv/netdb.h
+++ b/resolv/netdb.h
@@ -67,11 +67,12 @@
 #endif
 #include <sys/cdefs.h>
 
-#define	_PATH_HEQUIV	"/etc/hosts.equiv"
-#define	_PATH_HOSTS	"/etc/hosts"
-#define	_PATH_NETWORKS	"/etc/networks"
-#define	_PATH_PROTOCOLS	"/etc/protocols"
-#define	_PATH_SERVICES	"/etc/services"
+#define	_PATH_HEQUIV		"/etc/hosts.equiv"
+#define	_PATH_HOSTS		"/etc/hosts"
+#define	_PATH_NETWORKS		"/etc/networks"
+#define	_PATH_NSSWITCH_CONF	"/etc/nsswitch.conf"
+#define	_PATH_PROTOCOLS		"/etc/protocols"
+#define	_PATH_SERVICES		"/etc/services"
 
 extern int h_errno;
 
diff --git a/resolv/res_init.c b/resolv/res_init.c
index 4e8af680c1..305dabfcaf 100644
--- a/resolv/res_init.c
+++ b/resolv/res_init.c
@@ -76,8 +76,6 @@ static char rcsid[] = "$Id$";
 # include "../conf/portability.h"
 #endif
 
-#include "res_hconf.h"
-
 /*-------------------------------------- info about "sortlist" --------------
  * Marc Majka		1994/04/16
  * Allan Nathanson	1994/10/29 (BIND 4.9.3.x)
@@ -421,8 +419,6 @@ res_init()
 	if ((cp = getenv("RES_OPTIONS")) != NULL)
 		res_setoptions(cp, "env");
 	_res.options |= RES_INIT;
-
-	_res_hconf_init ();
 	return (0);
 }
 
diff --git a/resolv/sethostent.c b/resolv/sethostent.c
deleted file mode 100644
index e7a59dd75a..0000000000
--- a/resolv/sethostent.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1985, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)sethostent.c	8.1 (Berkeley) 6/4/93";
-static char rcsid[] = "$Id$";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <netdb.h>
-#include <resolv.h>
-
-void _res_close __P((void));
-
-void
-sethostent(stayopen)
-	int stayopen;
-{
-	if ((_res.options & RES_INIT) == 0 && res_init() == -1)
-		return;
-	if (stayopen)
-		_res.options |= RES_STAYOPEN | RES_USEVC;
-}
-
-void
-endhostent()
-{
-	_res.options &= ~(RES_STAYOPEN | RES_USEVC);
-	_res_close();
-}
diff --git a/rpm/Makefile b/rpm/Makefile
index 535e14e56f..36e91b9add 100644
--- a/rpm/Makefile
+++ b/rpm/Makefile
@@ -64,11 +64,13 @@ $(config): template $(distinfo) Makefile
 	rm -f $@.new
 	(sed -e 's%@VERSION@%$(version)%g' $<; \
 	 ($(foreach var,$(instvars),\
-	  for f in $(install-$(var)); do \
+	  list='$(install-$(var))'; \
+	  for f in $$list; do \
 	    echo $(filter-out /,$($(var)dir)/)$$f; \
 	  done;\
 	 )) | sort; \
-	 (for f in $(install-sysconf); do \
+	 (list='$(install-sysconf)'; \
+	  for f in $$list; do \
 	    echo %config $$f; \
 	  done) | sort) > $@.new
 	mv -f $@.new $@
diff --git a/shlib-versions b/shlib-versions
index 2b92f95f1e..1bf19da1ec 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -30,3 +30,13 @@ alpha-*-linux*		libc=6
 # So far the -lutil interface is the same on all platforms, except for the
 # `struct utmp' format, which depends on libc.
 *-*-*			libutil=1
+
+# Version number 2 is used on other systems for the BIND 4.9.4 resolver
+# interface.
+*-*-*			libresolv=2
+
+# Interface revision of nss_* modules.  This must match NSS_SHLIB_REVISION
+# in nss/nsswitch.h, which determines the library names used for service
+# names given in /etc/nsswitch.conf.
+*-*-*			libnss_files=1
+*-*-*			libnss_dns=1
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index 27c85cfe4c..d7101fe666 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+# Copyright (C) 1994, 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
@@ -57,7 +57,7 @@ generated = $(rpcsvc:%.x=rpcsvc/%.h) $(rpcsvc:%.x=x%.c)
 
 routines := auth_none auth_unix authuxprot bindrsvprt \
 	    clnt_gen clnt_perr clnt_raw clnt_simp clnt_tcp \
-	    clnt_udp rpc_dtable get_myaddr getrpcent getrpcport \
+	    clnt_udp rpc_dtable get_myaddr getrpcport \
 	    pmap_clnt pm_getmaps pm_getport pmap_prot \
 	    pmap_prot2 pmap_rmt rpc_prot rpc_common rpc_cmsg \
 	    svc svc_auth svc_authux svc_raw svc_run svc_simple \
diff --git a/sunrpc/getrpcent.c b/sunrpc/getrpcent.c
deleted file mode 100644
index 0fc7affdf9..0000000000
--- a/sunrpc/getrpcent.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/* @(#)getrpcent.c	2.2 88/07/29 4.0 RPCSRC */
-#if !defined(lint) && defined(SCCSIDS)
-static  char sccsid[] = "@(#)getrpcent.c 1.9 87/08/11  Copyr 1984 Sun Micro";
-#endif
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part.  Users
- * 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
- */
-
-/*
- * Copyright (c) 1985 by Sun Microsystems, Inc.
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <rpc/rpc.h>
-#include <netdb.h>
-#include <sys/socket.h>
-
-/*
- * Internet version.
- */
-struct rpcdata {
-	FILE	*rpcf;
-	char	*current;
-	int	currentlen;
-	int	stayopen;
-#define	MAXALIASES	35
-	char	*rpc_aliases[MAXALIASES];
-	struct	rpcent rpc;
-	char	line[BUFSIZ+1];
-	char	*domain;
-} *rpcdata, *_rpcdata();
-
-static	struct rpcent *interpret();
-struct	hostent *gethostent();
-char	*inet_ntoa();
-extern	char *index();		/* Changed from static by roland@gnu */
-
-static char RPCDB[] = _PATH_RPC; /* Changed from "/etc/rpc" by roland@gnu */
-
-static struct rpcdata *
-_rpcdata()
-{
-	register struct rpcdata *d = rpcdata;
-
-	if (d == 0) {
-		d = (struct rpcdata *)calloc(1, sizeof (struct rpcdata));
-		rpcdata = d;
-	}
-	return (d);
-}
-
-struct rpcent *
-getrpcbynumber(number)
-	register int number;
-{
-	register struct rpcdata *d = _rpcdata();
-	register struct rpcent *p;
-	int reason;
-	char adrstr[16], *val = NULL;
-	int vallen;
-
-	if (d == 0)
-		return (0);
-	setrpcent(0);
-	while (p = getrpcent()) {
-		if (p->r_number == number)
-			break;
-	}
-	endrpcent();
-	return (p);
-}
-
-struct rpcent *
-getrpcbyname(name)
-     const char *name;		/* const added by roland@gnu */
-{
-	struct rpcent *rpc;
-	char **rp;
-
-	setrpcent(0);
-	while(rpc = getrpcent()) {
-		if (strcmp(rpc->r_name, name) == 0)
-			return (rpc);
-		for (rp = rpc->r_aliases; *rp != NULL; rp++) {
-			if (strcmp(*rp, name) == 0)
-				return (rpc);
-		}
-	}
-	endrpcent();
-	return (NULL);
-}
-
-setrpcent(f)
-	int f;
-{
-	register struct rpcdata *d = _rpcdata();
-
-	if (d == 0)
-		return;
-	if (d->rpcf == NULL)
-		d->rpcf = fopen(RPCDB, "r");
-	else
-		rewind(d->rpcf);
-	if (d->current)
-		free(d->current);
-	d->current = NULL;
-	d->stayopen |= f;
-}
-
-endrpcent()
-{
-	register struct rpcdata *d = _rpcdata();
-
-	if (d == 0)
-		return;
-	if (d->current && !d->stayopen) {
-		free(d->current);
-		d->current = NULL;
-	}
-	if (d->rpcf && !d->stayopen) {
-		fclose(d->rpcf);
-		d->rpcf = NULL;
-	}
-}
-
-struct rpcent *
-getrpcent()
-{
-	struct rpcent *hp;
-	int reason;
-	char *key = NULL, *val = NULL;
-	int keylen, vallen;
-	register struct rpcdata *d = _rpcdata();
-
-	if (d == 0)
-		return(NULL);
-	if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL)
-		return (NULL);
-	if (fgets(d->line, BUFSIZ, d->rpcf) == NULL)
-		return (NULL);
-	return interpret(d->line, strlen(d->line));
-}
-
-static struct rpcent *
-interpret(val, len)
-	char * val;
-	size_t len;
-{
-	register struct rpcdata *d = _rpcdata();
-	char *p;
-	register char *cp, **q;
-
-	if (d == 0)
-		return;
-	strncpy(d->line, val, len);
-	p = d->line;
-	d->line[len] = '\n';
-	if (*p == '#')
-		return (getrpcent());
-	cp = strpbrk(p, "#\n");
-	if (cp == NULL)
-		return (getrpcent());
-	*cp = '\0';
-	cp = strpbrk(p, " \t");
-	if (cp == NULL)
-		return (getrpcent());
-	*cp++ = '\0';
-	/* THIS STUFF IS INTERNET SPECIFIC */
-	d->rpc.r_name = d->line;
-	while (*cp == ' ' || *cp == '\t')
-		cp++;
-	d->rpc.r_number = atoi(cp);
-	q = d->rpc.r_aliases = d->rpc_aliases;
-	cp = strpbrk(p, " \t");
-	if (cp != NULL)
-		*cp++ = '\0';
-	while (cp && *cp) {
-		if (*cp == ' ' || *cp == '\t') {
-			cp++;
-			continue;
-		}
-		if (q < &(d->rpc_aliases[MAXALIASES - 1]))
-			*q++ = cp;
-		cp = strpbrk(p, " \t");
-		if (cp != NULL)
-			*cp++ = '\0';
-	}
-	*q = NULL;
-	return (&d->rpc);
-}
diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h
index 29c9a1dd12..f23efe7fcb 100644
--- a/sysdeps/alpha/dl-machine.h
+++ b/sysdeps/alpha/dl-machine.h
@@ -307,10 +307,8 @@ _dl_runtime_resolve:
 	/* Set up the arguments for _dl_runtime_resolve. */
 	/* $16 = link_map out of plt0 */
 	ldq	$16, 8($27)
-	/* $17 = (($28 - 4) - ($27 + 16)) / 12 * sizeof(Elf_Rela) */
-	subq	$28, $27, $28
-	subq	$28, 20, $28
-	addq	$28, $28, $17
+	/* $17 = offset of reloc entry */
+	mov	$28, $17
 	/* Do the fixup */
 	bsr	$26, fixup..ng
 	/* Move the destination address to a safe place.  */
diff --git a/time/Makefile b/time/Makefile
index f1bf761b40..d77c6c5f2d 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -119,6 +119,7 @@ target-zone-flavor = $(filter /posix /right, \
 
 ifdef localtime
 $(installed-localtime-file): $(zonedir)/$(localtime) $(objpfx)zic
+	$(make-target-directory)
 	if test -r $@; then echo Site timezone NOT reset to Factory.; else \
 	ln -s -f $< $@; fi
 endif