summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog256
-rw-r--r--Makefile8
-rw-r--r--Makerules14
-rw-r--r--PROJECTS4
-rw-r--r--README15
-rw-r--r--argp/argp-help.c13
-rwxr-xr-xconfig.guess71
-rwxr-xr-xconfig.sub8
-rw-r--r--db/Makefile1
-rw-r--r--db/libdb.map12
-rw-r--r--elf/Makefile1
-rw-r--r--elf/dl-lookup.c48
-rw-r--r--elf/dl-reloc.c2
-rw-r--r--elf/dl-version.c23
-rw-r--r--elf/libdl.map7
-rw-r--r--elf/link.h2
-rw-r--r--inet/arpa/tftp.h20
-rw-r--r--libc.map53
-rw-r--r--locale/Makefile1
-rw-r--r--locale/libBrokenLocale.map7
-rw-r--r--locale/setlocale.c9
-rw-r--r--login/Makefile3
-rw-r--r--login/getutent_r.c8
-rw-r--r--login/libutil.map7
-rw-r--r--login/login.c3
-rw-r--r--login/programs/database.c28
-rw-r--r--login/programs/request.c7
-rw-r--r--login/programs/utmpd-private.h3
-rw-r--r--login/programs/utmpd.c15
-rw-r--r--login/utmp_daemon.c4
-rw-r--r--login/utmp_file.c9
-rw-r--r--login/utmpname.c8
-rw-r--r--manual/.cvsignore2
-rw-r--r--manual/Makefile21
-rw-r--r--manual/arith.texi2
-rw-r--r--manual/examples/argp-ex1.c9
-rw-r--r--manual/examples/argp-ex2.c25
-rw-r--r--manual/examples/argp-ex3.c100
-rw-r--r--manual/examples/argp-ex4.c144
-rw-r--r--manual/intro.texi2
-rw-r--r--manual/libc.texinfo6
-rw-r--r--manual/pattern.texi157
-rw-r--r--manual/texinfo.tex26
-rw-r--r--math/Makefile2
-rw-r--r--math/libm.map9
-rw-r--r--math/math.h9
-rw-r--r--md5-crypt/Makefile3
-rw-r--r--md5-crypt/libcrypt.map7
-rw-r--r--md5-crypt/md5-crypt.c1
-rw-r--r--misc/regexp.h8
-rw-r--r--nis/Makefile4
-rw-r--r--nis/libnsl.map14
-rw-r--r--nis/libnss_compat.map11
-rw-r--r--nis/libnss_nis.map25
-rw-r--r--nis/libnss_nisplus.map32
-rw-r--r--nis/nis_add.c2
-rw-r--r--nis/nis_addmember.c15
-rw-r--r--nis/nis_call.c18
-rw-r--r--nis/nis_clone.c48
-rw-r--r--nis/nis_creategroup.c4
-rw-r--r--nis/nis_defaults.c10
-rw-r--r--nis/nis_destroygroup.c4
-rw-r--r--nis/nis_getservlist.c11
-rw-r--r--nis/nis_ismember.c17
-rw-r--r--nis/nis_local_names.c73
-rw-r--r--nis/nis_modify.c2
-rw-r--r--nis/nis_ping.c4
-rw-r--r--nis/nis_print_group_entry.c4
-rw-r--r--nis/nis_remove.c2
-rw-r--r--nis/nis_removemember.c29
-rw-r--r--nis/nis_server.c4
-rw-r--r--nis/nis_table.c6
-rw-r--r--nis/nis_verifygroup.c4
-rw-r--r--nis/nss_nis/nis-hosts.c2
-rw-r--r--nis/nss_nis/nis-netgrp.c4
-rw-r--r--nis/nss_nisplus/nisplus-hosts.c2
-rw-r--r--nis/nss_nisplus/nisplus-spwd.c98
-rw-r--r--nss/Makefile2
-rw-r--r--nss/getXXbyYY_r.c2
-rw-r--r--nss/libnss_db.map20
-rw-r--r--nss/libnss_files.map28
-rw-r--r--posix/glob.c6
-rw-r--r--posix/glob.h8
-rw-r--r--posix/unistd.h2
-rw-r--r--resolv/Makefile2
-rw-r--r--resolv/libnss_dns.map9
-rw-r--r--resolv/libresolv.map11
-rw-r--r--shlib-versions10
-rw-r--r--stdlib/Makefile2
-rw-r--r--stdlib/testsort.c2
-rw-r--r--string/argz-addsep.c4
-rw-r--r--sunrpc/Makefile13
-rw-r--r--sysdeps/i386/add_n.S3
-rw-r--r--sysdeps/i386/addmul_1.S3
-rw-r--r--sysdeps/i386/dl-machine.h4
-rw-r--r--sysdeps/i386/fpu/__math.h6
-rw-r--r--sysdeps/i386/lshift.S3
-rw-r--r--sysdeps/i386/rshift.S3
-rw-r--r--sysdeps/i386/sub_n.S3
-rw-r--r--sysdeps/i386/submul_1.S3
-rw-r--r--sysdeps/libm-ieee754/s_fmin.c2
-rw-r--r--sysdeps/powerpc/fenvbits.h2
-rw-r--r--sysdeps/powerpc/fraiseexcpt.c4
-rw-r--r--sysdeps/powerpc/strlen.s10
-rw-r--r--sysdeps/unix/arm/brk.S43
-rw-r--r--sysdeps/unix/arm/sysdep.S49
-rw-r--r--sysdeps/unix/sysv/linux/Dist3
-rw-r--r--sysdeps/unix/sysv/linux/Makefile3
-rw-r--r--sysdeps/unix/sysv/linux/arm/sysdep.S51
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.h8
-rw-r--r--sysdeps/unix/sysv/linux/net/if_arp.h2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c35
-rw-r--r--sysdeps/unix/sysv/linux/sparc/Dist1
-rw-r--r--sysdeps/wordsize-32/Dist1
-rw-r--r--sysdeps/wordsize-32/Makefile3
-rw-r--r--sysdeps/wordsize-64/Dist1
-rw-r--r--sysdeps/wordsize-64/Makefile3
118 files changed, 1590 insertions, 433 deletions
diff --git a/ChangeLog b/ChangeLog
index 6d0fd8d049..847c417cf1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,255 @@
+<1997-06-12 21:22  Ulrich Drepper  <drepper@cygnus.com>
+
+	* Makefile (libc-map): Define before including Makerules.
+	* Makerules (lib%.so): Depend on $(lib%-map).
+	(build-shlib): Adapt rule for above change.
+	(libc.so): Depend on $(libc-map).
+	* db/Makefile (libcdb-map): New definition.
+	* elf/Makefile (libdl-map): New definition.
+	* elf/dl-lookup.c: Don't use relative include path.
+	(undefined_msg): New variable.  Use single string in all functions.
+	(do_lookup): Correctly recognize default version.
+	Return -2 if no version information is available.
+	Stop processing hash entries when string was found.
+	Don't bark about missing versioned symbol in file with original
+	reference if it is a weak symbol.
+	(_dl_lookup_symbol): Use undefined_msg.
+	(_dl_lookup_versioned_symbol): Likewise.
+	Give extra information if no verdef info is available.
+	* elf/dl-version.c (file_needed): Remove first argument.  We must
+	seek in the whole search list.
+	(match_symbol): Correct check for available verdef info.
+	(_dl_check_map_versions): Correct call of find_needed.
+	* locale/Makefile (libBrokenLocale-map): New definition.
+	* login/Makefile (libutil-map): New definition.
+	* math/Makefile (libm-map): New definition.
+	* md5-crypt/Makefile (libcrypt-map): New definition.
+	* nis/Makefile (libnsl-map, libnss_compat-map, libnss_nis-map,
+	libnss_nisplus-map): New definition.
+	* nss/Makefile (libnss_files-map, libnss_db-map): New definitions.
+	* resolv/Makefile (libresolv-map, libnss_dns-map): New definitions.
+	* libc.map: New file.
+	* db/libdb.map: New file.
+	* elf/libdl.map: New file.
+	* locale/libBrokenLocale.map: New file.
+	* login/libutil.map: New file.
+	* math/libm.map: New file.
+	* md5-crypt/libcrypt.map: New file.
+	* nis/libnss_compat.map: New file.
+	* nis/libnsl.map: New file.
+	* nis/libnss_nis.map: New file.
+	* nis/libnss_nisplus.map: New file.
+	* nss/libnss_files.map: New file.
+	* nss/libnss_db.map: New file.
+	* resolv/libnss_dns.map: New file.
+	* resolv/libresolv.map: New file.
+
+	* sysdeps/i386/dl-machine.h (elf_machine_rel): Don't do anything
+	for R_386_NONE entries.
+
+	* Makefile (manual/dir-add.info): New rule.
+
+	* Makerules: Add vpath definition for .x files.
+
+	* Makerules (distinfo): Make sure target directory exists.
+
+	* argp/argp-help.c (argp_args_usage): Don't modify `fdoc' value
+	since it is used to distinguish filtered strings from unmodifed
+	strings.
+
+	* elf/dl-lookup.c (do_lookup): Optimize STT_* recognition.
+	* elf/dl-reloc.c: Fix typo.
+
+	* inet/arpa/tftp.h (struct tftphdr): Change type of tu_block to
+	`unsigned short'.
+
+	* manual/Makefile (dir-add.texi): Also emit wrapper text for
+	info/install-info.
+	(distribute): Add dir-add.texi and dir-add.info.
+	(mostlyclean): Add dir-add.info.
+	(realclean): Add dir-add.texi.
+	(install): Add entries in `dir' file using install-info.
+
+	* manual/libc.texinfo: Add @dircategory and @direntry text.
+	Reported by Miles Bader <miles@gnu.ai.mit.edu>.
+
+	* manual/pattern.texi: Correct description of GLOB_MAGCHAR and
+	GLOB_NOMAGIC.  Changes by Roland McGrath <roland@gnu.ai.mit.edu>.
+
+	* nis/nis_addmember.c: Little optimizations.
+	* nis/nis_call.c: Likewise.
+	* nis/nis_creategroup.c: Likewise.
+	* nis/nis_defaults.c: Likewise.
+	* nis/nis_destroygroup.c: Likewise.
+	* nis/nis_ismember.c: Likewise.
+	* nis/nis_local_names.c: Likewise.
+	* nis/nis_print_group_entry.c: Likewise.
+	* nis/nis_verifygroup.c: Likewise.
+
+	* posix/unistd.h: Fix comment for getcwd.
+
+	* stdlib/Makefile (headers): Remove inttypes.h.  It's a system
+	dependent header.
+	* sysdeps/wordsize-32/Dist: New file.
+	* sysdeps/wordsize-32/Makefile: New file.
+	* sysdeps/wordsize-64/Dist: New file.
+	* sysdeps/wordsize-64/Makefile: New file.
+
+	* sunrpc/Makefile: Adopt comment for real situation.
+
+	* sysdeps/i386/add_n.S: Add ASM_TYPE_DIRECTIVE and AS_SIZE_DIRECTIVE.
+	* sysdeps/i386/addmul_1.s: Likewise.
+	* sysdeps/i386/lshist.s: Likewise.
+	* sysdeps/i386/rshift.s: Likewise.
+	* sysdeps/i386/sub_n.s: Likewise.
+	* sysdeps/i386/submul_1.s: Likewise.
+
+	* sysdeps/unix/sysv/linux/i386/sysdep.h (SYSCALL_ERROR_HANDLER):
+	Add .type and .size.
+
+1997-06-12 13:32  Philip Blundell  <Philip.Blundell@pobox.com>
+
+	* libc/sysdeps/unix/arm/brk.S: New file.
+	* libc/sysdeps/unix/arm/sysdep.S: Likewise.
+	* libc/sysdeps/unix/sysv/linux/arm/sysdep.S: Likewise.
+
+1997-06-11 11:51  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
+
+	* nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent):
+	Check if we have shadow information.
+
+1997-06-08 19:33  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
+
+	* nis/nis_getservlist.c (nis_getservlist): Use calloc instead of
+	malloc, alloc memory for nis_server struct.
+	* nis/nis_getservlist.c (nis_freeservlist): Give the memory for
+	the nis_server struct free, too.
+
+	* nis/nis_removemember (nis_removemember): Fix for loop.
+
+1997-06-12 12:45  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/i386/fpu/__math.h (__M_SQRT2): Define here since we
+	cannot rely on M_SQRT2 being defined.  (log1p): Use __M_SQRT2 not
+	M_SQRT2.
+	* math/math.h (_Mldbl): Define even if M_* constants are not
+	defined.
+	Reported by corsepiu@faw.uni-ulm.de.
+
+1997-06-12 03:08  Philip Blundell  <Philip.Blundell@pobox.com>
+
+	* nss/getXXbyYY_r.c (do_weak_alias): Remove extra parentheses.
+
+1997-06-11 13:22  Ulrich Drepper  <drepper@cygnus.com>
+
+	* misc/regexp.h (compile): Allow use of macro INIT for variable
+	declaration.  Add documentation for INIT.
+	Reported by Robert Bihlmeyer <robbe@orcus.priv.at>.
+
+1997-06-11 10:47  Philip Blundell  <Philip.Blundell@pobox.com>
+
+	* sysdeps/unix/sysv/linux/net/if_arp.h: Add two new hardware types.
+
+1997-06-10 11:31  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+	* sysdeps/powerpc/strlen.s: Use -0x101 instead of 0xfffffeff
+	for a signed 16-bit value.
+
+1997-06-07 07:54  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+	* sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
+	(_dl_sysdep_read_whole_file): Deleted.
+
+	* sysdeps/powerpc/fenvbits.h (__FE_ALL_INVALID): Changed
+	to FE_ALL_INVALID.
+
+	* sysdeps/powerpc/fraiseexcpt.c (__FE_INVALID_SOFTWARE):
+	Changed to FE_INVALID_SOFTWARE.
+	(__FPSCR_STICKY_BITS): Changed to FPSCR_STICKY_BITS.
+
+	* sysdeps/libm-ieee754/s_fmin.c: Fix a typo.
+
+1997-06-07 18:48  H.J. Lu  <hjl@gnu.ai.mit.edu>
+
+	* shlib-versions (.*-.*-linux.*): Set libc to 6.
+
+1997-06-08 15:35  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
+
+	* nis/nis_add.c (nis_add): Use nis_leaf_of_r instead of nis_name_of_r.
+
+	* nis/nis_addmember.c (nis_addmember): Fix a lot of pointer errors.
+	* nis/nis_clone.c: Likewise.
+	* nis/nis_removemember.c (nis_removemember): Likewise.
+	* nis/nis_table.c: Likewise.
+
+	* nis/nss_nis/nis-hosts.c: Use addr, not p for inet_pton call.
+	* nis/nss_nisplus/nisplus-hosts.c: Likewise.
+
+	* nis/nss_nis/nis-netgrp.c (_nss_nis_setnetgrent): Check for
+	group == NULL.
+
+1997-06-08 21:21  Mark Kettenis  <kettenis@phys.uva.nl>
+
+	* login/login.c, login/utmp_daemon.c, login/utmp_file.c,
+	login/getutent_r.c, login/utmpname.c: Cleanup `#if _LIBC' and
+	`#ifndef _LIBC' fragments.
+
+	* login/programs/utmpd.c: Define DEFAULT_USER.
+	(drop_priviliges): Use it.
+	(main): Set locale and text domain.
+
+	* login/programs/utmpd-private.h: Declare proc_utmp_eq.
+	* login/programs/database.c (proc_utmp_eq): Removed.
+	* login/programs/request.c (proc_utmp_eq): Made global.  Only use
+	ut_id field if valid.
+
+	* login/utmp_file.c (proc_utmp_eq): Restore patch made by Miles
+	Bader that was lost when adding the daemon backend; Only use ut_id
+	field if valid.
+
+1997-06-05 23:10  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/unix/sysv/linux/Dist: Remove netatalk/atalk.h and
+	netinet/icmp.h, add netatalk/at.h.
+	* sysdeps/unix/sysv/linux/powerpc/Dist: Remove termios.h.
+	* sysdeps/unix/sysv/linux/sparc/Dist: Remove start.c.
+
+1997-06-04 19:22  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* stdlib/testsort.c (compare): Fix parameter types.
+
+1997-06-04 19:05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* md5-crypt/Makefile (distribute): Fix name of file.
+
+1997-06-04 19:02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* login/Makefile (utmpd-routines): Remove utmpd again, which is
+	already added implicitly through $(others).
+
+1997-06-05 13:43  Fila Kolodny  <fila@filapc.ibi.com>
+
+	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add netipx/ipx.h.
+
+1997-06-05 13:25  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+	* md5-crypt/md5-crypt.c: Add prototype for __md5_crypt.
+
+1997-06-05 17:08  Ulrich Drepper  <drepper@cygnus.com>
+
+	* string/argz-addsep.c: Correct weak alias.
+	Reported by Ben Pfaff <pfaffben@pilot.msu.edu>.
+
+	* locale/setlocale.c (setlocale): Free variable with locale path
+	before returning.
+	(setname): Don't test for _nl_current[category] being NULL before
+	freeing.
+	Reported by Ben Pfaff <pfaffben@pilot.msu.edu>.
+
+1997-06-04 12:41  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+	* manual/intro.texi (XPG): Correct some typos.
+
 1997-06-04 05:09  Miles Bader  <miles@gnu.ai.mit.edu>
 
 	* argp/argp-help.c (_help): Use uparams.usage_indent instead of
@@ -36,7 +288,7 @@
 	(Parsing Program Arguments): New node.
 	(Parsing Options, Example of Getopt, Long Options, Long Option
 	Example): Nodes removed.
-	* manual/libc.texinfo: (Program Arguments): Menu updated.
+	* manual/libc.texinfo (Program Arguments): Menu updated.
 	(Parsing Program Arguments): New menu.
 
 1997-06-04 20:57  Ulrich Drepper  <drepper@cygnus.com>
@@ -3097,7 +3349,7 @@
 	* nis/nis_call.c (__do_niscall): Print message if cold start file
 	does not exist.
 	* nis/nis_file.c: Don't print error messages.
-	* nis/nis_local_name.c (nis_local_host): Fix pointer errors.
+	* nis/nis_local_names.c (nis_local_host): Fix pointer errors.
 	* nis/rpcsvc/ypclnt.h: Fix copyright and prototypes.
 	* nis/rpcsvc/nis.h: Likewise.
 	* nis/ypclnt.c: Fix prototypes.
diff --git a/Makefile b/Makefile
index a91999bb42..2d9b3b86d6 100644
--- a/Makefile
+++ b/Makefile
@@ -107,6 +107,9 @@ $(objpfx)munch-init.c: munch.awk munch-tmpl.c $(+subdir_inits)
 generated := $(generated) munch-init.c
 endif
 
+# We have a versioning file for libc.so.
+libc-map = libc.map
+
 
 include Makerules
 
@@ -131,9 +134,6 @@ ifeq (yes,$(build-shared))
 lib: $(common-objpfx)libc.so
 endif
 
-# We have a versioning file for libc.so.
-#libc-map = libc.map
-
 all-Subdirs-files = $(wildcard $(addsuffix /Subdirs, $(config-sysdirs)))
 $(objpfx)sysd-dirs: $(+sysdir_pfx)config.make $(all-Subdirs-files)
 	(echo define sysdep-subdirs;				\
@@ -315,7 +315,7 @@ makeinfo --no-validate --no-warn --no-headers $< -o $@
 endef
 INSTALL: manual/maint.texi; $(format-me)
 NOTES: manual/creature.texi; $(format-me)
-manual/dir-add.texi: FORCE
+manual/dir-add.texi manual/dir-add.info: FORCE
 	$(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F)
 FORCE:
 
diff --git a/Makerules b/Makerules
index dc3f652113..18a17587fa 100644
--- a/Makerules
+++ b/Makerules
@@ -95,6 +95,10 @@ o-iterator = $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
 vpath %.h $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
 				      $(+sysdep_dirs) $(..)))
 
+# The same is true for RPC source files.
+vpath %.x $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
+				      $(+sysdep_dirs) $(..)))
+
 # Some sysdep makefiles use this to distinguish being included here from
 # being included individually by a subdir makefile (hurd/Makefile needs this).
 in-Makerules := yes
@@ -332,7 +336,7 @@ ifeq (yes,$(build-shared))
 # 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)
+lib%.so: lib%_pic.a $(lib%-map); $(build-shlib)
 
 ifeq ($(have-no-whole-archive),yes)
 no-whole-archive = -Wl,--no-whole-archive
@@ -361,8 +365,8 @@ $(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)
+	  -Wl,--whole-archive $(filter-out $($(@F:%.so=%-map)),$^) \
+	  $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
 	  test -z "$($(@F)-version)" || \
 	    (rm -f $@$($(@F)-version); $(LN_S) $(@F) $@$($(@F)-version))
 endef
@@ -378,7 +382,8 @@ LDFLAGS-c.so += -e __libc_main
 # Use our own special initializer and finalizer files for libc.so.
 $(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
 			 $(common-objpfx)libc_pic.a \
-			 $(elfobjdir)/sofini.so $(elfobjdir)/ld.so
+			 $(elfobjdir)/sofini.so $(elfobjdir)/ld.so \
+			 $(libc-map)
 	$(build-shlib)
 endif
 
@@ -910,6 +915,7 @@ dist: $(filter-out %.c %.S %.s,$(distribute))
 # the sub-make that makes the distribution (above).
 $(objpfx)distinfo: Makefile $(..)Makerules \
 		   $(wildcard $(foreach dir,$(sysdirs),$(dir)/Makefile))
+	$(make-target-directory)
 	$(distinfo-vars)
 	mv -f $@.new $@
 .PHONY: subdir_distinfo
diff --git a/PROJECTS b/PROJECTS
index 59b3d8a0f5..f4cadfdeb4 100644
--- a/PROJECTS
+++ b/PROJECTS
@@ -96,10 +96,8 @@ contact <bug-glibc@prep.ai.mit.edu>
 
      + tcgetid() and waitid()			from XPG4.2
      + grantpt(), ptsname(), unlockpt()		from XPG4.2
-     + getdate()				from XPG4.2
-	*** Probably underway
 
-     More information are available on request.
+     More information is available on request.
 
 
 [14] We need to write a library for on-the-fly transformation of streams
diff --git a/README b/README
index 83cf531d28..d3439ed84b 100644
--- a/README
+++ b/README
@@ -1,11 +1,11 @@
-This directory contains the version 2.0.1 test release of the GNU C Library.
+This directory contains the version 2.0.90 test release of the GNU C Library.
 Many bugs have been fixed since the last release.
 Some bugs surely remain.
 
 As of this release, the GNU C library is known to run on the following
 configurations:
 
-		*-*-gnu			GNU Hurd
+		i[3456]86-*-gnu		GNU Hurd
 		i[3456]86-*-linux-gnu	Linux-2.0 on Intel
 		m68k-*-linux-gnu	Linux-2.0 on Motorola 680x0
 		alpha-*-linux-gnu	Linux-2.0 on DEC Alpha
@@ -36,17 +36,18 @@ versions) used to run on the following configurations:
 		sparc-sun-solaris2
 		sparc-sun-sunos4
 
-Whether this is still true for this release is unknown.  Porting the
-library is not hard.  If you are interested in doing a port, please
-get on the mailing list by sending electronic mail to
-<bug-glibc-request@prep.ai.mit.edu>.
+Since no one has volunteered to test and fix the above configurations,
+these are not supported at the moment.  It's expected that these don't
+work anymore.  Porting the library is not hard.  If you are interested
+in doing a port, please contact the glibc maintainers by sending
+electronic mail to <bug-glibc@prep.ai.mit.edu>.
 
 The GNU C library now includes Michael Glad's Ultra Fast Crypt, which
 provides the Unix `crypt' function, plus some other entry points.
 Because of the United States export restriction on DES implementations,
 we are distributing this code separately from the rest of the C
 library.  There is an extra distribution tar file just for crypt; it is
-called `glibc-crypt-2.0.1.tar.gz'.  You can just unpack the crypt
+called `glibc-crypt-2.0.90.tar.gz'.  You can just unpack the crypt
 distribution along with the rest of the C library and build; you can
 also build the library without getting crypt.  Users outside the USA
 can get the crypt distribution via anonymous FTP from ftp.ifi.uio.no
diff --git a/argp/argp-help.c b/argp/argp-help.c
index 0d944414cb..f0e86d9ca2 100644
--- a/argp/argp-help.c
+++ b/argp/argp-help.c
@@ -922,7 +922,7 @@ filter_doc (const char *doc, int key, const struct argp *argp,
     }
   else
     /* No filter.  */
-    return (char *)doc;
+    return doc;
 }
 
 /* Prints STR as a header line, with the margin lines set appropiately, and
@@ -1319,7 +1319,8 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
 
   if (fdoc)
     {
-      nl = strchr (fdoc, '\n');
+      const char *cp = fdoc;
+      nl = strchr (cp, '\n');
       if (nl)
 	/* This is a `multi-level' args doc; advance to the correct position
 	   as determined by our state in LEVELS, and update LEVELS.  */
@@ -1327,17 +1328,17 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
 	  int i;
 	  multiple = 1;
 	  for (i = 0; i < *our_level; i++)
-	    fdoc = nl + 1, nl = strchr (fdoc, '\n');
+	    cp = nl + 1, nl = strchr (cp, '\n');
 	  (*levels)++;
 	}
       if (! nl)
-	nl = fdoc + strlen (fdoc);
+	nl = cp + strlen (cp);
 
       /* Manually do line wrapping so that it (probably) won't get wrapped at
 	 any embedded spaces.  */
-      space (stream, 1 + nl - fdoc);
+      space (stream, 1 + nl - cp);
 
-      __argp_fmtstream_write (stream, fdoc, nl - fdoc);
+      __argp_fmtstream_write (stream, cp, nl - cp);
     }
   if (fdoc && fdoc != tdoc)
     free ((char *)fdoc);	/* Free user's modified doc string.  */
diff --git a/config.guess b/config.guess
index ea44a2a9ca..c4bca5f251 100755
--- a/config.guess
+++ b/config.guess
@@ -436,27 +436,27 @@ EOF
 	# The BFD linker knows what the default object file format is, so
 	# first see if it will tell us.
 	ld_help_string=`ld --help 2>&1`
-	if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
-	  echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0
-	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
-	  echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0
-	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
-	  echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0
-	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
-	  echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0
-	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
-	  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0
-	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
-	  echo "powerpc-unknown-linux-gnu" ; exit 0
-	elif test "${UNAME_MACHINE}" = "alpha" ; then
+	ld_supported_emulations=`echo $ld_help_string \
+			 | sed -ne '/supported emulations:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported emulations: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_emulations" in
+	  i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
+	  i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
+	  sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+	  m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+	  elf32ppc)   echo "powerpc-unknown-linux-gnu"              ; exit 0 ;;
+	esac
+
+	if test "${UNAME_MACHINE}" = "alpha" ; then
 	  echo alpha-unknown-linux-gnu ; exit 0
-	elif test "${UNAME_MACHINE}" = "sparc" ; then
-	  echo sparc-unknown-linux-gnu ; exit 0
 	elif test "${UNAME_MACHINE}" = "mips" ; then
 	  cat >dummy.c <<EOF
 main(argc, argv)
-int argc;
-char *argv[];
+     int argc;
+     char *argv[];
 {
 #ifdef __MIPSEB__
   printf ("%s-unknown-linux-gnu\n", argv[1]);
@@ -470,20 +470,41 @@ EOF
 	  ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
 	  rm -f dummy.c dummy
 	else
-	  # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us
-	  # useful --help.  Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout.
-	  test ! -d /usr/lib/ldscripts/. \
-	    && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+	  # Either a pre-BFD a.out linker (linux-gnuoldld)
+	  # or one that does not give us useful --help.
+	  # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+	  # If ld does not provide *any* "supported emulations:"
+	  # that means it is gnuoldld.
+	  echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+	  test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+	  case "${UNAME_MACHINE}" in
+	  i?86)
+	    VENDOR=pc;
+	    ;;
+	  *)
+	    VENDOR=unknown;
+	    ;;
+	  esac
 	  # Determine whether the default compiler is a.out or elf
 	  cat >dummy.c <<EOF
+#include <features.h>
 main(argc, argv)
-int argc;
-char *argv[];
+     int argc;
+     char *argv[];
 {
 #ifdef __ELF__
-  printf ("%s-pc-linux-gnu\n", argv[1]);
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
 #else
-  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
 #endif
   return 0;
 }
diff --git a/config.sub b/config.sub
index cd34253540..5b75f25cdf 100755
--- a/config.sub
+++ b/config.sub
@@ -391,11 +391,11 @@ case $basic_machine in
 		;;
 	mipsel*-linux*)
 		basic_machine=mipsel-unknown
-		os=-linux
+		os=-linux-gnu
 		;;
 	mips*-linux*)
 		basic_machine=mips-unknown
-		os=-linux
+		os=-linux-gnu
 		;;
 	mips3*-*)
 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
@@ -585,7 +585,7 @@ case $basic_machine in
 		basic_machine=vax-dec
 		os=-vms
 		;;
-       vpp*|vx|vx-*)
+	vpp*|vx|vx-*)
                basic_machine=f301-fujitsu
                ;;
 	vxworks960)
@@ -615,7 +615,7 @@ case $basic_machine in
 # Here we handle the default manufacturer of certain CPU types.  It is in
 # some cases the only manufacturer, in others, it is the most popular.
 	mips)
-		if [ x$os = x-linux ]; then
+		if [ x$os = x-linux-gnu ]; then
 			basic_machine=mips-unknown
 		else
 			basic_machine=mips-mips
diff --git a/db/Makefile b/db/Makefile
index 331c8b1d74..9f45e9fea2 100644
--- a/db/Makefile
+++ b/db/Makefile
@@ -19,6 +19,7 @@ libdb-routines := bt_close bt_conv bt_debug bt_delete bt_get \
 		  mpool \
 		  rec_close rec_delete rec_get rec_open rec_put rec_search \
 		  rec_seq rec_utils
+libdb-map	:= libdb.map
 
 headers		:= db.h mpool.h ndbm.h
 distribute	:= compat.h					\
diff --git a/db/libdb.map b/db/libdb.map
new file mode 100644
index 0000000000..5be731cdea
--- /dev/null
+++ b/db/libdb.map
@@ -0,0 +1,12 @@
+GLIBC_2.0 {
+  global:
+    # the real DB entry point.
+    dbopen;
+
+    # The compatibility functions.
+    dbm_clearerr; dbm_close; dbm_delete; dbm_dirfno; dbm_error;
+    dbm_fetch; dbm_firstkey; dbm_nextkey; dbm_open; dbm_store;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/elf/Makefile b/elf/Makefile
index ae7dda9638..33d57ed70f 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -40,6 +40,7 @@ distribute	= $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
 extra-libs	 = libdl
 extra-libs-others = $(extra-libs)
 libdl-routines	:= dlopen dlclose dlsym dlvsym dlerror dladdr
+libdl-map	:= libdl.map
 
 before-compile = $(objpfx)trusted-dirs.h
 
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 294dfb951f..f2ce4c9c3c 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -25,10 +25,14 @@
 
 #include "dl-hash.h"
 #include <dl-machine.h>
-#include "../stdio-common/_itoa.h"
+#include <stdio-common/_itoa.h>
 
 #define VERSTAG(tag)	(DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (tag))
 
+/* We need this string more than once.  */
+static const char undefined_msg[] = "undefined symbol: ";
+
+
 struct sym_val
   {
     ElfW(Addr) a;
@@ -105,16 +109,10 @@ do_lookup (const char *undef_name, unsigned long int hash,
 	       && sym->st_shndx == SHN_UNDEF))
 	    continue;
 
-	  switch (ELFW(ST_TYPE) (sym->st_info))
-	    {
-	    case STT_NOTYPE:
-	    case STT_FUNC:
-	    case STT_OBJECT:
-	      break;
-	    default:
-	      /* Not a code/data definition.  */
-	      continue;
-	    }
+	  if (ELFW(ST_TYPE) (sym->st_info) > STT_FUNC)
+	    /* Ignore all but STT_NOTYPE, STT_OBJECT and STT_FUNC entries
+	       since these are no code/data definitions.  */
+	    continue;
 
 	  if (sym != ref && strcmp (strtab + sym->st_name, undef_name))
 	    /* Not the symbol we are looking for.  */
@@ -129,7 +127,7 @@ do_lookup (const char *undef_name, unsigned long int hash,
 	      if (verstab != NULL)
 		{
 		  ElfW(Half) ndx = verstab[symidx] & 0x7fff;
-		  if (map->l_versions[ndx].hash != 0)
+		  if (ndx > 2) /* map->l_versions[ndx].hash != 0) */
 		    continue;
 		}
 	    }
@@ -143,7 +141,7 @@ do_lookup (const char *undef_name, unsigned long int hash,
 		     symbol must not simply disappear.  */
 		  if (version->filename != NULL
 		      && _dl_name_match_p (version->filename, map))
-		    return -1;
+		    return -2;
 		  /* Otherwise we accept the symbol.  */
 		}
 	      else
@@ -177,11 +175,14 @@ do_lookup (const char *undef_name, unsigned long int hash,
 	      /* Local symbols are ignored.  */
 	      break;
 	    }
+
+	  /* There cannot be another entry for this symbol so stop here.  */
+	  break;
 	}
 
-      /* If this current is the one mentioned in the verneed entry it
-	 is a bug.  */
-      if (version != NULL && version->filename != NULL
+      /* If this current map is the one mentioned in the verneed entry
+	 and we have not found a weak entry, it is a bug.  */
+      if (symidx == STN_UNDEF && version != NULL && version->filename != NULL
 	  && _dl_name_match_p (version->filename, map))
 	return -1;
     }
@@ -214,7 +215,7 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
       (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
     /* We could find no value for a strong reference.  */
     _dl_signal_error (0, reference_name,
-		      make_string ("undefined symbol: ", undef_name));
+		      make_string (undefined_msg, undef_name));
 
   *ref = current_value.s;
   return current_value.a;
@@ -289,14 +290,16 @@ _dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref,
 				       version->name,
 				       " not defined in file ",
 				       version->filename,
-				       " with link time reference"));
+				       " with link time reference",
+				       res == -2
+				       ? " (no version symbols)" : ""));
     }
 
   if (current_value.s == NULL &&
       (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
     /* We could find no value for a strong reference.  */
     _dl_signal_error (0, reference_name,
-		      make_string ("undefined symbol: ", undef_name,
+		      make_string (undefined_msg, undef_name,
 				   ", version ", version->name ?: NULL));
 
   *ref = current_value.s;
@@ -337,11 +340,10 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
       (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
     {
       /* We could find no value for a strong reference.  */
-      static const char msg[] = "undefined symbol: ";
       const size_t len = strlen (undef_name);
-      char buf[sizeof msg + len];
-      memcpy (buf, msg, sizeof msg - 1);
-      memcpy (&buf[sizeof msg - 1], undef_name, len + 1);
+      char buf[sizeof undefined_msg + len];
+      memcpy (buf, undefined_msg, sizeof undefined_msg - 1);
+      memcpy (&buf[sizeof undefined_msg - 1], undef_name, len + 1);
       _dl_signal_error (0, reference_name, buf);
     }
 
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index bec5881d0e..5b22a506da 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -68,7 +68,7 @@ _dl_relocate_object (struct link_map *l, struct link_map *scope[], int lazy)
     ELF_DYNAMIC_RELOCATE (l, lazy);
   }
 
-  /* Mark the object so we know ths work has been done.  */
+  /* Mark the object so we know this work has been done.  */
   l->l_relocated = 1;
 
   if (l->l_info[DT_TEXTREL])
diff --git a/elf/dl-version.c b/elf/dl-version.c
index 71eff0d962..f7df9805b3 100644
--- a/elf/dl-version.c
+++ b/elf/dl-version.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include <assert.h>
 
-#include "../stdio-common/_itoa.h"
+#include <stdio-common/_itoa.h>
 
 
 /* Set in rtld.c at startup.  */
@@ -53,13 +53,13 @@ extern char **_dl_argv;
 
 
 static inline struct link_map *
-find_needed (struct link_map *map, const char *name)
+find_needed (const char *name)
 {
   unsigned int n;
 
-  for (n = 0; n < map->l_nsearchlist; ++n)
-    if (_dl_name_match_p (name, map->l_searchlist[n]))
-      return map->l_searchlist[n];
+  for (n = 0; n < _dl_loaded->l_nsearchlist; ++n)
+    if (_dl_name_match_p (name, _dl_loaded->l_searchlist[n]))
+      return _dl_loaded->l_searchlist[n];
 
   /* Should never happen.  */
   return NULL;
@@ -72,10 +72,10 @@ match_symbol (const char *name, ElfW(Word) hash, const char *string,
 {
   const char *strtab = (const char *) (map->l_addr
 				       + map->l_info[DT_STRTAB]->d_un.d_ptr);
-  ElfW(Addr) def_offset = map->l_info[VERSTAG (DT_VERDEF)]->d_un.d_ptr;
+  ElfW(Addr) def_offset;
   ElfW(Verdef) *def;
 
-  if (def_offset == 0)
+  if (map->l_info[VERSTAG (DT_VERDEF)] == NULL)
     {
       /* The file has no symbol versioning.  I.e., the dependent
 	 object was linked against another version of this file.  We
@@ -87,7 +87,10 @@ no version information available (required by ",
       return 0;
     }
 
-  def = (ElfW(Verdef) *) (map->l_addr + def_offset);
+  def_offset = map->l_info[VERSTAG (DT_VERDEF)]->d_un.d_ptr;
+  assert (def_offset != 0);
+
+  def = (ElfW(Verdef) *) ((char *) map->l_addr + def_offset);
   while (1)
     {
       /* Currently the version number of the definition entry is 1.
@@ -179,7 +182,7 @@ _dl_check_map_versions (struct link_map *map, int verbose)
       while (1)
 	{
 	  ElfW(Vernaux) *aux;
-	  struct link_map *needed = find_needed (map, strtab + ent->vn_file);
+	  struct link_map *needed = find_needed (strtab + ent->vn_file);
 
 	  /* If NEEDED is NULL this means a dependency was not found
 	     and no stub entry was created.  This should never happen.  */
@@ -227,7 +230,7 @@ _dl_check_map_versions (struct link_map *map, int verbose)
   if (def != NULL)
     {
       ElfW(Verdef) *ent;
-      ent = (ElfW(Verdef)  *) (map->l_addr + def->d_un.d_ptr);
+      ent = (ElfW(Verdef) *) (map->l_addr + def->d_un.d_ptr);
       while (1)
 	{
 	  if ((unsigned int) (ent->vd_ndx & 0x7fff) > ndx_high)
diff --git a/elf/libdl.map b/elf/libdl.map
new file mode 100644
index 0000000000..d950382346
--- /dev/null
+++ b/elf/libdl.map
@@ -0,0 +1,7 @@
+GLIBC_2.0 {
+  global:
+    dladdr; dlclose; dlerror; dlopen; dlsym; dlvsym;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/elf/link.h b/elf/link.h
index 0e58996b04..c894540e5e 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -255,7 +255,7 @@ extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
 
 /* Helper function for <dlfcn.h> functions.  Runs the OPERATE function via
    _dl_catch_error.  Returns zero for success, nonzero for failure; and
-   arranges for `dlerror' to return the error details.  
+   arranges for `dlerror' to return the error details.
    ARGS is passed as argument to OPERATE.  */
 extern int _dlerror_run (void (*operate) (void *), void *args);
 
diff --git a/inet/arpa/tftp.h b/inet/arpa/tftp.h
index 036720011f..e2651a5019 100644
--- a/inet/arpa/tftp.h
+++ b/inet/arpa/tftp.h
@@ -44,20 +44,20 @@
 /*
  * Packet types.
  */
-#define	RRQ	01			/* read request */
-#define	WRQ	02			/* write request */
-#define	DATA	03			/* data packet */
-#define	ACK	04			/* acknowledgement */
-#define	ERROR	05			/* error code */
+#define	RRQ	01				/* read request */
+#define	WRQ	02				/* write request */
+#define	DATA	03				/* data packet */
+#define	ACK	04				/* acknowledgement */
+#define	ERROR	05				/* error code */
 
 struct	tftphdr {
-	short	th_opcode;		/* packet type */
+	short	th_opcode;			/* packet type */
 	union {
-		short	tu_block;	/* block # */
-		short	tu_code;	/* error code */
-		char	tu_stuff[1];	/* request packet stuff */
+		unsigned short	tu_block;	/* block # */
+		short	tu_code;		/* error code */
+		char	tu_stuff[1];		/* request packet stuff */
 	} th_u;
-	char	th_data[1];		/* data or error string */
+	char	th_data[1];			/* data or error string */
 };
 
 #define	th_block	th_u.tu_block
diff --git a/libc.map b/libc.map
new file mode 100644
index 0000000000..0817685c7b
--- /dev/null
+++ b/libc.map
@@ -0,0 +1,53 @@
+GLIBC_2.0 {
+  global:
+    # global variables
+    _errno; _itoa_lower_digits; _itoa_upper_digits;
+    __ctype_b; __ctype_tolower; __ctype_toupper;
+    _IO_stderr_; _IO_stdin_; _IO_stdout_;
+    _nl_msg_cat_cntr; __environ; _environ;
+
+#  __libc_multiple_libcs; __libc_argc; __libc_argv; _dl_starting_up; __exit_funcs;
+
+    # helper functions
+    __errno_location; __libc_init_first;
+
+    # functions with special/multiple interfaces
+    __sigsetjmp; _setjmp; __sigaddset; __sigdelset; __sigismember;
+    __sysv_signal; __bsd_getpgrp;
+
+    # functions which have an additional interface since they are
+    # are cancelable.
+    __libc_wait; __libc_waitpid; __libc_pause; __libc_nanosleep;
+    __libc_open; __libc_close; __libc_read; __libc_write;
+    __libc_lseek; __libc_fcntl; __libc_tcdrain; __libc_fsync;
+    __libc_msync; __libc_system;
+
+    # interface of malloc functions
+    __libc_calloc; __libc_free; __libc_mallinfo; __libc_malloc;
+    __libc_mallopt; __libc_memalign; __libc_pvalloc; __libc_realloc;
+    __libc_valloc;
+
+    # functions with required interface outside normal name space
+    _exit; __ivaliduser;
+
+    # functions from the experimental locale implementation
+    __*_l; __newlocale; __duplocale; __freelocale;
+
+    # functions used in inline functions or macros
+    __strto*_internal; __wcsto*_internal; __getdelim;
+    __isnan; __isnanf; __isnanl; __finite; __finitef; __finitel;
+    __signbit; __signbitf; __signbitl; __cmsg_nxthdr;
+    _obstack_allocated_p; _obstack_begin; _obstack_begin_1;
+    _obstack_free; _obstack_memory_used; _obstack_newchunk;
+    __assert_fail; __assert_perror_fail;
+
+    # functions used in other libraries
+    __printf_fp;
+
+    # all functions and variables in the normal name space
+    a*; b*; c*; d*; e*; f*; g*; h*; i*; j*; k*; l*; m*;
+    n*; o*; p*; q*; r*; s*; t*; u*; v*; w*; x*; y*; z*;
+
+  local:
+    *;
+};
diff --git a/locale/Makefile b/locale/Makefile
index 7acef573d6..90b218130d 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -45,6 +45,7 @@ extra-libs	= libBrokenLocale
 extra-libs-others = $(extra-libs)
 
 libBrokenLocale-routines = broken_cur_max
+libBrokenLocale-map = libBrokenLocale.map
 
 subdir-dirs	= programs
 vpath %.c programs
diff --git a/locale/libBrokenLocale.map b/locale/libBrokenLocale.map
new file mode 100644
index 0000000000..09752759f7
--- /dev/null
+++ b/locale/libBrokenLocale.map
@@ -0,0 +1,7 @@
+GLIBC_2.0 {
+  global:
+    __ctype_get_mb_cur_max;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/locale/setlocale.c b/locale/setlocale.c
index ff7192f45d..3e63b25ac2 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -204,8 +204,7 @@ new_composite_name (int category, const char *newnames[LC_ALL])
 static inline void
 setname (int category, const char *name)
 {
-  if (_nl_current[category] == NULL
-      && _nl_current_names[category] != _nl_C_name)
+  if (_nl_current_names[category] != _nl_C_name)
     free ((void *) _nl_current_names[category]);
 
   _nl_current_names[category] = name;
@@ -351,6 +350,9 @@ setlocale (int category, const char *locale)
       /* Critical section left.  */
       __libc_lock_unlock (__libc_setlocale_lock);
 
+      /* Free the resources (the locale path variable.  */
+      free (locale_path);
+
       return composite;
     }
   else
@@ -395,6 +397,9 @@ setlocale (int category, const char *locale)
       /* Critical section left.  */
       __libc_lock_unlock (__libc_setlocale_lock);
 
+      /* Free the resources (the locale path variable.  */
+      free (locale_path);
+
       return (char *) newname;
     }
 }
diff --git a/login/Makefile b/login/Makefile
index a94c5cb14d..f75632a023 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -29,7 +29,7 @@ routines := getutent getutent_r getutid getutline getutid_r getutline_r \
 
 others = utmpd
 install-sbin = utmpd
-utmpd-routines := utmpd connection database error request xtmp
+utmpd-routines := connection database error request xtmp
 extra-objs := $(utmpd-routines:=.o)
 
 distribute := utmp-private.h programs/xtmp.h programs/utmpd.h \
@@ -43,6 +43,7 @@ extra-libs      := libutil
 extra-libs-others := $(extra-libs)
 
 libutil-routines:= login login_tty logout logwtmp pty updwtmp
+libutil-map	:= libutil.map
 
 include ../Rules
 
diff --git a/login/getutent_r.c b/login/getutent_r.c
index 3cc46da96c..9e1d4e8768 100644
--- a/login/getutent_r.c
+++ b/login/getutent_r.c
@@ -19,15 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <assert.h>
-#if _LIBC
 #include <libc-lock.h>
-#else
-#define __libc_lock_lock(lock)		((void) 0)
-#define __libc_lock_unlock(lock)	((void) 0)
-#define __libc_lock_define_initialized(CLASS,NAME)
-#define weak_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))); 
-#endif
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
diff --git a/login/libutil.map b/login/libutil.map
new file mode 100644
index 0000000000..46064a63a3
--- /dev/null
+++ b/login/libutil.map
@@ -0,0 +1,7 @@
+GLIBC_2.0 {
+  global:
+    forkpty; login; login_tty; logout; logwtmp; openpty; updwtmp;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/login/login.c b/login/login.c
index 6bd0e6eaef..c148893c88 100644
--- a/login/login.c
+++ b/login/login.c
@@ -24,9 +24,6 @@
 #include <stdlib.h>
 #include <utmp.h>
 
-#ifndef _LIBC
-#define __set_errno(val) errno = (val)
-#endif
 
 /* Return the result of ttyname in the buffer pointed to by TTY, which should
    be of length BUF_LEN.  If it is too long to fit in this buffer, a
diff --git a/login/programs/database.c b/login/programs/database.c
index e31e0d9dae..3138ae605c 100644
--- a/login/programs/database.c
+++ b/login/programs/database.c
@@ -42,7 +42,6 @@ static int replace_entry (utmp_database *database, int old_position,
 			  int new_position, const struct utmp *entry);
 static int store_entry (utmp_database *database, int position,
 			const struct utmp *entry);
-static int proc_utmp_eq (const struct utmp *entry, const struct utmp *match);
 static int get_mtime (const char *file, time_t *timer);
 
 
@@ -473,33 +472,6 @@ store_entry (utmp_database *database, int position,
 }
 
 
-/* This function is identical to the one in login/utmp_file.c.  */
-static int
-proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
-{
-  return
-    (
-#if _HAVE_UT_TYPE - 0
-     (entry->ut_type == INIT_PROCESS
-      || entry->ut_type == LOGIN_PROCESS
-      || entry->ut_type == USER_PROCESS
-      || entry->ut_type == DEAD_PROCESS)
-     &&
-     (match->ut_type == INIT_PROCESS
-      || match->ut_type == LOGIN_PROCESS
-      || match->ut_type == USER_PROCESS
-      || match->ut_type == DEAD_PROCESS)
-     &&
-#endif
-#if _HAVE_UT_ID - 0
-     strncmp (entry->ut_id, match->ut_id, sizeof match->ut_id) == 0
-#else
-     strncmp (entry->ut_line, match->ut_line, sizeof match->ut_line) == 0
-#endif
-     );
-}
-
-
 /* Get modification time of FILE and put it in TIMER.  returns 0 if
    successful, -1 if not.  */
 static int
diff --git a/login/programs/request.c b/login/programs/request.c
index 0f68b8ae79..d2c12e68cf 100644
--- a/login/programs/request.c
+++ b/login/programs/request.c
@@ -39,7 +39,6 @@ static int do_getutid (client_connection *connection);
 static int do_pututline (client_connection *connection);
 static int do_updwtmp (client_connection *connection);
 
-static int proc_utmp_eq (const struct utmp *entry, const struct utmp *match);
 static int internal_getut_r (client_connection *connection,
 			     const struct utmp *id, struct utmp *buffer);
 
@@ -571,7 +570,7 @@ return_error:
 
 
 /* This function is identical to the one in login/utmp_file.c.  */
-static int
+int
 proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
 {
   return
@@ -589,7 +588,9 @@ proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
      &&
 #endif
 #if _HAVE_UT_ID - 0
-     strncmp (entry->ut_id, match->ut_id, sizeof match->ut_id) == 0
+     (entry->ut_id[0] && match->ut_id[0]
+      ? strncmp (entry->ut_id, match->ut_id, sizeof match->ut_id) == 0
+      : strncmp (entry->ut_line, match->ut_line, sizeof match->ut_line) == 0)
 #else
      strncmp (entry->ut_line, match->ut_line, sizeof match->ut_line) == 0
 #endif
diff --git a/login/programs/utmpd-private.h b/login/programs/utmpd-private.h
index 4a9cdb921e..b22e58f700 100644
--- a/login/programs/utmpd-private.h
+++ b/login/programs/utmpd-private.h
@@ -100,8 +100,11 @@ void close_connection (client_connection *connection);
 int read_data (client_connection *connection);
 int write_data (client_connection *connection);
 
+int proc_utmp_eq (const struct utmp *entry, const struct utmp *match);
+
 void error (int status, int errnum, const char *message, ...);
 void warning (int errnum, const char *message, ...);
 
+
 #endif /* utmpd-private.h  */
 
diff --git a/login/programs/utmpd.c b/login/programs/utmpd.c
index e11218151c..ca310a21de 100644
--- a/login/programs/utmpd.c
+++ b/login/programs/utmpd.c
@@ -21,6 +21,7 @@
 #include <fcntl.h>
 #include <getopt.h>
 #include <libintl.h>
+#include <locale.h>
 #include <pwd.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -38,10 +39,14 @@
 #include "utmpd.h"
 #include "utmpd-private.h"
 
+#ifndef DEFAULT_USER
+#define DEFAULT_USER	"daemon"
+#endif
+
 /* Get libc version number.  */
 #include "../../version.h"
 
-#define PACKAGE "libc"
+#define PACKAGE _libc_intl_domainname
 
 /* Long options.  */
 static const struct option long_options[] =
@@ -81,6 +86,12 @@ main (int argc, char *argv[])
   int do_version;
   int opt;
 
+  /* Set locale via LC_ALL.  */
+  setlocale (LC_ALL, "");
+
+  /* Set the text message domain.  */
+  textdomain (PACKAGE);
+  
   /* Initialize local variables.  */
   debug = 0;
   do_help = 0;
@@ -197,7 +208,7 @@ drop_priviliges (void)
 {
   struct passwd *pw;
 
-  pw = getpwnam ("daemon");
+  pw = getpwnam (DEFAULT_USER);
   if (pw)
     {
       seteuid (pw->pw_uid);
diff --git a/login/utmp_daemon.c b/login/utmp_daemon.c
index 9e02f24524..705c8b3de9 100644
--- a/login/utmp_daemon.c
+++ b/login/utmp_daemon.c
@@ -29,10 +29,6 @@
 #include "utmp-private.h"
 #include "programs/utmpd.h"
 
-#ifndef _LIBC
-#define __set_errno(val) errno = (val)
-#endif
-
 
 /* Descriptor for the socket.  */
 static int daemon_sock = INT_MIN;
diff --git a/login/utmp_file.c b/login/utmp_file.c
index 1366f38d75..2026070f14 100644
--- a/login/utmp_file.c
+++ b/login/utmp_file.c
@@ -31,11 +31,6 @@
 
 #include "utmp-private.h"
 
-#ifndef _LIBC
-#define _(msg) (msg)
-#define __set_errno(val) errno = (val)
-#endif
-
 
 /* Descriptor for the file and position.  */
 static int file_fd = INT_MIN;
@@ -230,7 +225,9 @@ proc_utmp_eq (const struct utmp *entry, const struct utmp *match)
      &&
 #endif
 #if _HAVE_UT_ID - 0
-     strncmp (entry->ut_id, match->ut_id, sizeof match->ut_id) == 0
+     (entry->ut_id[0] && match->ut_id[0]
+      ? strncmp (entry->ut_id, match->ut_id, sizeof match->ut_id) == 0
+      : strncmp (entry->ut_line, match->ut_line, sizeof match->ut_line) == 0)
 #else
      strncmp (entry->ut_line, match->ut_line, sizeof match->ut_line) == 0
 #endif
diff --git a/login/utmpname.c b/login/utmpname.c
index 81e857a2bc..2692b71ff9 100644
--- a/login/utmpname.c
+++ b/login/utmpname.c
@@ -17,15 +17,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#if _LIBC
 #include <libc-lock.h>
-#else
-#define __libc_lock_lock(NAME)		((void) 0)
-#define __libc_lock_unlock(NAME)	((void) 0)
-#define __libc_lock_define(CLASS,NAME)
-#define weak_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))); 
-#endif
 #include <stdlib.h>
 #include <string.h>
 #include <utmp.h>
diff --git a/manual/.cvsignore b/manual/.cvsignore
index 51a9a04ef2..7c305176da 100644
--- a/manual/.cvsignore
+++ b/manual/.cvsignore
@@ -9,4 +9,4 @@ glibc-*
 *.cp *.cps *.fn *.fns *.vr *.vrs *.tp *.tps *.ky *.kys *.pg *.pgs
 
 chapters chapters-incl1 chapters-incl2 summary.texi stamp-*
-distinfo
+distinfo dir-add.texi
diff --git a/manual/Makefile b/manual/Makefile
index 5f05524049..80ab3dc30a 100644
--- a/manual/Makefile
+++ b/manual/Makefile
@@ -34,7 +34,7 @@ ifneq (,$(wildcard ../Makeconfig))
 include ../Makeconfig
 endif
 
-# Set chapters and chapters-incl.
+# Set chapters and chapters-incl[12].
 -include chapters
 chapters: libc.texinfo
 	$(find-includes)
@@ -76,7 +76,10 @@ stamp-summary: summary.awk $(chapters) $(chapters-incl)
 # access to the documentation of the function, variables, and other
 # definitions.
 dir-add.texi: xtract-typefun.awk $(chapters)
-	$(GAWK) -f $^ | sort > $@.new;
+	(echo "@dircategory GNU C library functions";			\
+	 echo "@direntry";						\
+	 $(GAWK) -f $^ | sort;						\
+	 echo "@end direntry";) > $@.new
 	mv -f $@.new $@
 
 # Generate Texinfo files from the C source for the example programs.
@@ -97,8 +100,8 @@ distribute = $(minimal-dist)	       					\
 	     $(patsubst examples/%.c,%.c.texi,$(filter examples/%.c,	\
 			$(minimal-dist)))				\
 	     libc.info* libc.?? libc.??s texinfo.tex summary.texi	\
-	     stamp-summary chapters chapters-incl			\
-	     xtract-typefun.awk
+	     stamp-summary chapters chapters-incl1 chapters-incl2	\
+	     xtract-typefun.awk dir-add.texi dir-add.info
 export distribute := $(distribute)
 
 tar-it = tar chovf $@ $^
@@ -127,18 +130,22 @@ glibc-doc-$(edition).tar: $(doc-only-dist) $(distribute)
 
 .PHONY: mostlyclean distclean realclean clean
 mostlyclean:
-	-rm -f libc.dvi libc.info*
+	-rm -f libc.dvi libc.info* dir-add.info
 clean: mostlyclean
 distclean: clean
 indices = cp fn pg tp vr ky
 realclean: distclean
 	-rm -f chapters chapters-incl summary.texi stamp-summary *.c.texi
 	-rm -f $(foreach index,$(indices),libc.$(index) libc.$(index)s)
-	-rm -f libc.log libc.aux libc.toc
+	-rm -f libc.log libc.aux libc.toc dir-add.texi
 
 .PHONY: install subdir_install installdirs install-data
 install-data subdir_install: install
-install: $(inst_infodir)/libc.info
+install: $(inst_infodir)/libc.info dir-add.info
+	@if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+	  install-info --info-dir=$(inst_infodir) $(inst_infodir)/libc.info;\
+	  install-info --info-dir=$(inst_infodir) dir-add.info;\
+	else : ; fi
 # Catchall implicit rule for other installation targets from the parent.
 install-%: ;
 
diff --git a/manual/arith.texi b/manual/arith.texi
index efe0489e40..1268e37e31 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -196,7 +196,7 @@ extensions.
 @section Floating-Point Number Classification Functions
 
 Instead of using the BSD specific functions from the last section it is
-better to use those in this section will are introduced in the @w{ISO C
+better to use those in this section which are introduced in the @w{ISO C
 9X} standard and are therefore widely available.
 
 @comment math.h
diff --git a/manual/examples/argp-ex1.c b/manual/examples/argp-ex1.c
new file mode 100644
index 0000000000..c87ebbb532
--- /dev/null
+++ b/manual/examples/argp-ex1.c
@@ -0,0 +1,9 @@
+/* Argp example #1 -- a minimal program using argp */
+
+#include <argp.h>
+
+int main (int argc, char **argv)
+{
+  argp_parse (0, argc, argv, 0, 0, 0);
+  exit (0);
+}
diff --git a/manual/examples/argp-ex2.c b/manual/examples/argp-ex2.c
new file mode 100644
index 0000000000..d1b149b494
--- /dev/null
+++ b/manual/examples/argp-ex2.c
@@ -0,0 +1,25 @@
+/* Argp example #2 -- a pretty minimal program using argp */
+
+#include <argp.h>
+
+const char *argp_program_version =
+  "argp-ex2 1.0";
+const char *argp_program_bug_address =
+  "<bug-gnu-utils@@prep.ai.mit.edu>";
+
+/* Program documentation.  */
+static char doc[] =
+  "Argp example #2 -- a pretty minimal program using argp";
+
+/* Our argpument parser.  The @code{options}, @code{parser}, and
+   @code{args_doc} fields are zero because we have neither options or
+   arguments; @code{doc} and @code{argp_program_bug_address} will be
+   used in the output for @samp{--help}, and the @samp{--version}
+   option will print out @code{argp_program_version}.  */
+static struct argp argp = { 0, 0, 0, doc };
+
+int main (int argc, char **argv)
+{
+  argp_parse (&argp, argc, argv, 0, 0, 0);
+  exit (0);
+}
diff --git a/manual/examples/argp-ex3.c b/manual/examples/argp-ex3.c
new file mode 100644
index 0000000000..363ee59e11
--- /dev/null
+++ b/manual/examples/argp-ex3.c
@@ -0,0 +1,100 @@
+/* Argp example #3 -- a program with options and arguments using argp */
+
+#include <argp.h>
+
+const char *argp_program_version =
+  "argp-ex3 1.0";
+const char *argp_program_bug_address =
+  "<bug-gnu-utils@@prep.ai.mit.edu>";
+
+/* Program documentation.  */
+static char doc[] =
+  "Argp example #3 -- a program with options and arguments using argp";
+
+/* A description of the arguments we accept.  */
+static char args_doc[] = "ARG1 ARG2";
+
+/* The options we understand.  */
+static struct argp_option options[] = {
+  {"verbose",  'v', 0,      0,  "Produce verbose output" },
+  {"quiet",    'q', 0,      0,  "Don't produce any output" },
+  {"silent",   's', 0,      OPTION_ALIAS },
+  {"output",   'o', "FILE", 0,
+   "Output to FILE instead of standard output" },
+  { 0 }
+};
+
+/* Used by @code{main} to communicate with @code{parse_opt}.  */
+struct arguments
+{
+  char *args[2];		/* @var{arg1} & @var{arg2} */
+  int silent, verbose;
+  char *output_file;
+};
+
+/* Parse a single option.  */
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+  /* Get the @var{input} argument from @code{argp_parse}, which we
+     know is a pointer to our arguments structure.  */
+  struct arguments *arguments = state->input;
+
+  switch (key)
+    {
+    case 'q': case 's':
+      arguments->silent = 1;
+      break;
+    case 'v':
+      arguments->verbose = 1;
+      break;
+    case 'o':
+      arguments->output_file = arg;
+      break;
+
+    case ARGP_KEY_ARG:
+      if (state->arg_num >= 2)
+	/* Too many arguments.  */
+	argp_usage (state);
+
+      arguments->args[state->arg_num] = arg;
+
+      break;
+
+    case ARGP_KEY_END:
+      if (state->arg_num < 2)
+	/* Not enough arguments.  */
+	argp_usage (state);
+      break;
+
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+/* Our argp parser.  */
+static struct argp argp = { options, parse_opt, args_doc, doc };
+
+int main (int argc, char **argv)
+{
+  struct arguments arguments;
+
+  /* Default values.  */
+  arguments.silent = 0;
+  arguments.verbose = 0;
+  arguments.output_file = "-";
+
+  /* Parse our arguments; every option seen by @code{parse_opt} will
+     be reflected in @code{arguments}.  */
+  argp_parse (&argp, argc, argv, 0, 0, &arguments);
+
+  printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n"
+	  "VERBOSE = %s\nSILENT = %s\n",
+	  arguments.args[0], arguments.args[1],
+	  arguments.output_file,
+	  arguments.verbose ? "yes" : "no",
+	  arguments.silent ? "yes" : "no");
+
+  exit (0);
+}
diff --git a/manual/examples/argp-ex4.c b/manual/examples/argp-ex4.c
new file mode 100644
index 0000000000..24dd417a81
--- /dev/null
+++ b/manual/examples/argp-ex4.c
@@ -0,0 +1,144 @@
+/* Argp example #4 -- a program with somewhat more complicated options */
+
+#include <stdlib.h>
+#include <error.h>
+#include <argp.h>
+
+const char *argp_program_version =
+  "argp-ex4 1.0";
+const char *argp_program_bug_address =
+  "<bug-gnu-utils@@prep.ai.mit.edu>";
+
+/* Program documentation.  */
+static char doc[] =
+  "Argp example #4 -- a program with somewhat more complicated\
+options\
+\vThis part of the documentation comes *after* the options;\
+ note that the text is automatically filled, but it's possible\
+ to force a line-break, e.g.\n<-- here.";
+
+/* A description of the arguments we accept.  */
+static char args_doc[] = "ARG1 [STRING...]";
+
+/* Keys for options without short-options.  */
+#define OPT_ABORT  1		/* --abort */
+
+/* The options we understand.  */
+static struct argp_option options[] = {
+  {"verbose",  'v', 0,       0, "Produce verbose output" },
+  {"quiet",    'q', 0,       0, "Don't produce any output" },
+  {"silent",   's', 0,       OPTION_ALIAS },
+  {"output",   'o', "FILE",  0,
+   "Output to FILE instead of standard output" },
+
+  {0,0,0,0, "The following options should be grouped together:" },
+  {"repeat",   'r', "COUNT", OPTION_ARG_OPTIONAL,
+   "Repeat the output COUNT (default 10) times"},
+  {"abort",    OPT_ABORT, 0, 0, "Abort before showing any output"},
+
+  { 0 }
+};
+
+/* Used by @code{main} to communicate with @code{parse_opt}.  */
+struct arguments
+{
+  char *arg1;			/* @var{arg1} */
+  char **strings;		/* [@var{string}@dots{}] */
+  int silent, verbose, abort;	/* @samp{-s}, @samp{-v}, @samp{--abort} */
+  char *output_file;		/* @var{file} arg to @samp{--output} */
+  int repeat_count;		/* @var{count} arg to @samp{--repeat} */
+};
+
+/* Parse a single option.  */
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+  /* Get the @code{input} argument from @code{argp_parse}, which we
+     know is a pointer to our arguments structure.  */
+  struct arguments *arguments = state->input;
+
+  switch (key)
+    {
+    case 'q': case 's':
+      arguments->silent = 1;
+      break;
+    case 'v':
+      arguments->verbose = 1;
+      break;
+    case 'o':
+      arguments->output_file = arg;
+      break;
+    case 'r':
+      arguments->repeat_count = arg ? atoi (arg) : 10;
+      break;
+    case OPT_ABORT:
+      arguments->abort = 1;
+      break;
+
+    case ARGP_KEY_NO_ARGS:
+      argp_usage (state);
+
+    case ARGP_KEY_ARG:
+      /* Here we know that @code{state->arg_num == 0}, since we
+	 force argument parsing to end before any more arguments can
+	 get here.  */
+      arguments->arg1 = arg;
+
+      /* Now we consume all the rest of the arguments.
+	 @code{state->next} is the index in @code{state->argv} of the
+	 next argument to be parsed, which is the first @var{string}
+	 we're interested in, so we can just use
+	 @code{&state->argv[state->next]} as the value for
+	 arguments->strings.
+
+	 @emph{In addition}, by setting @code{state->next} to the end
+	 of the arguments, we can force argp to stop parsing here and
+	 return.  */
+      arguments->strings = &state->argv[state->next];
+      state->next = state->argc;
+
+      break;
+
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+/* Our argp parser.  */
+static struct argp argp = { options, parse_opt, args_doc, doc };
+
+int main (int argc, char **argv)
+{
+  int i, j;
+  struct arguments arguments;
+
+  /* Default values.  */
+  arguments.silent = 0;
+  arguments.verbose = 0;
+  arguments.output_file = "-";
+  arguments.repeat_count = 1;
+  arguments.abort = 0;
+
+  /* Parse our arguments; every option seen by @code{parse_opt} will be
+     reflected in @code{arguments}.  */
+  argp_parse (&argp, argc, argv, 0, 0, &arguments);
+
+  if (arguments.abort)
+    error (10, 0, "ABORTED");
+
+  for (i = 0; i < arguments.repeat_count; i++)
+    {
+      printf ("ARG1 = %s\n", arguments.arg1);
+      printf ("STRINGS = ");
+      for (j = 0; arguments.strings[j]; j++)
+	printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
+      printf ("\n");
+      printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
+	      arguments.output_file,
+	      arguments.verbose ? "yes" : "no",
+	      arguments.silent ? "yes" : "no");
+    }
+
+  exit (0);
+}
diff --git a/manual/intro.texi b/manual/intro.texi
index b8f4c8c6ba..7597807274 100644
--- a/manual/intro.texi
+++ b/manual/intro.texi
@@ -222,7 +222,7 @@ the XPG specifies the requirements for systems which are intended to be
 a Unix system.
 
 The GNU C library complies to the X/Open Portability Guide, Issue 4.2,
-with the with all extensions common to XSI (X/Open System Interface)
+with all extensions common to XSI (X/Open System Interface)
 compliant systems and also all X/Open UNIX extensions.
 
 The additions on top of POSIX are mainly derived from functionality
diff --git a/manual/libc.texinfo b/manual/libc.texinfo
index e821807a17..2951f66fcc 100644
--- a/manual/libc.texinfo
+++ b/manual/libc.texinfo
@@ -4,6 +4,12 @@
 @settitle The GNU C Library
 @setchapternewpage odd
 
+@comment Tell install-info what to do.
+@dircategory GNU libraries
+@direntry
+* Libc: (libc).                 C library.
+@end direntry
+
 @c This tells texinfo.tex to use the real section titles in xrefs in
 @c place of the node name, when no section title is explicitly given.
 @set xref-automatic-section-title
diff --git a/manual/pattern.texi b/manual/pattern.texi
index 6ac481ab6e..020a40e7da 100644
--- a/manual/pattern.texi
+++ b/manual/pattern.texi
@@ -118,8 +118,9 @@ of wildcards convenient.  @code{glob} and the other symbols in this
 section are declared in @file{glob.h}.
 
 @menu
-* Calling Glob::        Basic use of @code{glob}.
-* Flags for Globbing::  Flags that enable various options in @code{glob}.
+* Calling Glob::             Basic use of @code{glob}.
+* Flags for Globbing::       Flags that enable various options in @code{glob}.
+* More Flags for Globbing::  GNU specific extensions to @code{glob}.
 @end menu
 
 @node Calling Glob
@@ -134,7 +135,9 @@ it fills in the structure's fields to tell you about the results.
 @comment POSIX.2
 @deftp {Data Type} glob_t
 This data type holds a pointer to a word vector.  More precisely, it
-records both the address of the word vector and its size.
+records both the address of the word vector and its size.  The GNU
+implementation contains some more fields which are non-standard
+extensions.
 
 @table @code
 @item gl_pathc
@@ -156,6 +159,47 @@ The @code{gl_offs} field is meaningful only if you use the
 @code{GLOB_DOOFFS} flag.  Otherwise, the offset is always zero
 regardless of what is in this field, and the first real element comes at
 the beginning of the vector.
+
+@item gl_closedir
+The address of an alternative implementation of the @code{closedir}
+function.  It is used if the @code{GLOB_ALTDIRFUNC} bit is set in
+the flag parameter.  The type of this field is
+@w{@code{void (*) (void *)}}.
+
+This is a GNU extension.
+
+@item gl_readdir
+The address of an alternative implementation of the @code{readdir}
+function used to read the contents of a directory.  It is used if the
+@code{GLOB_ALTDIRFUNC} bit is set in the flag parameter.  The type of
+this field is @w{@code{struct dirent *(*) (void *)}}.
+
+This is a GNU extension.
+
+@item gl_opendir
+The address of an alternative implementation of the @code{opendir}
+function.  It is used if the @code{GLOB_ALTDIRFUNC} bit is set in
+the flag parameter.  The type of this field is
+@w{@code{void *(*) (const char *)}}.
+
+This is a GNU extension.
+
+@item gl_stat
+The address of an alternative implementation of the @code{stat} function
+to get information about an object in the filesystem.  It is used if the
+@code{GLOB_ALTDIRFUNC} bit is set in the flag parameter.  The type of
+this field is @w{@code{int (*) (const char *, struct stat *)}}.
+
+This is a GNU extension.
+
+@item gl_lstat
+The address of an alternative implementation of the @code{lstat}
+function to get information about an object in the filesystems, not
+following symbolic links.  It is used if the @code{GLOB_ALTDIRFUNC} bit
+is set in the flag parameter.  The type of this field is @w{@code{int
+(*) (const char *, struct stat *)}}.
+
+This is a GNU extension.
 @end table
 @end deftp
 
@@ -318,6 +362,113 @@ repeatedly.  It handles the flag @code{GLOB_NOESCAPE} by turning on the
 @code{FNM_NOESCAPE} flag in calls to @code{fnmatch}.
 @end table
 
+@node More Flags for Globbing
+@subsection More Flags for Globbing
+
+Beside the flags descibed in the last section, the GNU implementation of
+@code{glob} allows a few more flags which are also defined in the
+@file{glob.h} file.  Some of the extensions implement functionality
+which is available in modern shell implementations.
+
+@table @code
+@comment glob.h
+@comment GNU
+@item GLOB_PERIOD
+The @code{.} character (period) is treated special.  It cannot be
+matched by wildcards.  @xref{Wildcard Matching}, @code{FNM_PERIOD}.
+
+@comment glob.h
+@comment GNU
+@item GLOB_MAGCHAR
+The @code{GLOB_MAGCHAR} value is not to be given to @code{glob} in the
+@var{flags} parameter.  Instead, @code{glob} sets this bit in the
+@var{gl_flags} element of the @var{glob_t} structure provided as the
+result if the pattern used for matching contains any wildcard character.
+
+@comment glob.h
+@comment GNU
+@item GLOB_ALTDIRFUNC
+Instead of the using the using the normal functions for accessing the
+filesystem the @code{glob} implementation uses the user-supplied
+functions specified in the structure pointed to by @var{pglob}
+parameter.  For more information about the functions refer to the
+sections about directory handling @ref{Accessing Directories} and
+@ref{Reading Attributes}.
+
+@comment glob.h
+@comment GNU
+@item GLOB_BRACE
+If this flag is given the handling of braces in the pattern is changed.
+It is now required that braces appear correctly grouped.  I.e., for each
+opening brace there must be a closing one.  Braces can be used
+recursively.  So it is possible to define one brace expression in
+another one.  It is important to note that the range of each brace
+expression is completely contained in the outer brace expression (if
+there is one).
+
+The string between the mathing braces is separated into single
+expressions by splitting at @code{,} (comma) characters.  The commas
+themself are discarded.  Please note what we said above about recursive
+brace expressions.  The commas used to separate the subexpressions must
+be at the same level.  Commas in brace subexpressions are not matched.
+They are used during expansion of the brace expression of the deeper
+level.  The example below shows this
+
+@smallexample
+glob ("@{foo/@{,bar,biz@},baz@}", GLOB_BRACE, NULL, &result)
+@end smallexample
+
+@noindent
+is equivalent to the sequence
+
+@smallexample
+glob ("foo/", GLOB_BRACE, NULL, &result)
+glob ("foo/bar", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+glob ("foo/biz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+glob ("baz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+@end smallexample
+
+@noindent
+if we leave aside error handling.
+
+@comment glob.h
+@comment GNU
+@item GLOB_NOMAGIC
+If the pattern contains no wildcard constructs (it is a literal file name),
+return it as the sole ``matching'' word, even if no file exists by that name.
+
+@comment glob.h
+@comment GNU
+@item GLOB_TILDE
+If this flag is used the character @code{~} (tilde) is handled special
+if it appears at the beginning of the pattern.  Instead of being taken
+verbatim it is used to represent the home directory of a known user.
+
+If @code{~} is the only character in pattern or it is followed by a
+@code{/} (slash), the home directory of the process owner is
+substituted.  Using @code{getlogin} and @code{getpwnam} the information
+is read from the system databases.  As an example take user @code{bart}
+with his home directory at @file{/home/bart}.  For him a call like
+
+@smallexample
+glob ("~/bin/*", GLOB_TILDE, NULL, &result)
+@end smallexample
+
+@noindent
+would return the contents of the directory @file{/home/bart/bin}.
+Instead of referring to the own home directory it is also possible to
+name the home directory of other users.  To do so one has to append the
+user name after the tilde character.  So the contents of user
+@code{homer}'s @file{bin} directory can be retrieved by
+
+@smallexample
+glob ("~homer/bin/*", GLOB_TILDE, NULL, &result)
+@end smallexample
+
+This functionality is equivalent to what is available in C-shells.
+@end table
+
+
 @node Regular Expressions
 @section Regular Expression Matching
 
diff --git a/manual/texinfo.tex b/manual/texinfo.tex
index 95c825389d..e1dfbcbd53 100644
--- a/manual/texinfo.tex
+++ b/manual/texinfo.tex
@@ -1,5 +1,5 @@
 %% TeX macros to handle Texinfo files.
-%% $Id: texinfo.tex,v 2.201 1997/06/05 11:28:54 drepper Exp $
+%% $Id: texinfo.tex,v 2.202 1997/06/12 20:07:10 drepper Exp $
 
 %  Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
 %                94, 95, 96, 97 Free Software Foundation, Inc.
@@ -36,7 +36,7 @@
 
 % This automatically updates the version number based on RCS.
 \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 2.201 $
+\deftexinfoversion$Revision: 2.202 $
 \message{Loading texinfo package [Version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
@@ -120,7 +120,7 @@
 
 % For @cropmarks command.
 % Do @cropmarks to get crop marks.
-%
+% 
 \newif\ifcropmarks
 \let\cropmarks = \cropmarkstrue
 %
@@ -1338,13 +1338,25 @@ where each line of input produces a line of output.}
 \else{\tclose{\ttsl\look}}\fi
 \else{\tclose{\ttsl\look}}\fi}
 
-% @url, @uref, @email.  Quotes do not seem necessary.
+% @url, @email.  Quotes do not seem necessary.
 \let\url=\code % perhaps include a hypertex \special eventually
-\let\uref=\code
 % rms does not like the angle brackets --karl, 17may97.
 %\def\email#1{$\langle${\tt #1}$\rangle$}
 \let\email=\code
 
+% @uref (abbreviation for `urlref') takes an optional second argument
+% specifying the text to display.  First (mandatory) arg is the url.
+% 
+\def\uref#1{\urefxxx #1,,\finish}
+\def\urefxxx#1,#2,#3\finish{%
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \unhbox0\ (\code{#1})%
+  \else
+    \code{#1}%
+  \fi
+}
+
 % Check if we are currently using a typewriter font.  Since all the
 % Computer Modern typewriter fonts have zero interword stretch (and
 % shrink), and it is reasonable to expect all typewriter fonts to have
@@ -2089,7 +2101,7 @@ July\or August\or September\or October\or November\or December\fi
 \global\colcount=0\relax}}
 }
 
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+\def\setultitablespacing{% test to see if user has set \multitablelinespace.
 % If so, do nothing. If not, give it an appropriate dimension based on
 % current baselineskip.
 \ifdim\multitablelinespace=0pt
@@ -2557,7 +2569,7 @@ width0pt\relax} \fi
 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   % Grab any single-column material above us.
   \output = {\global\setbox\partialpage = \vbox{%
-    %
+    % 
     % Here is a possibility not foreseen in manmac: if we accumulate a
     % whole lot of material, we might end up calling this \output
     % routine twice in a row (see the doublecol-lose test, which is
diff --git a/math/Makefile b/math/Makefile
index e0c295b123..fbbcad6ea9 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -36,6 +36,8 @@ aux		:= fpu_control setfpucw
 extra-libs	:= libm
 extra-libs-others = $(extra-libs)
 
+libm-map	:= libm.map
+
 libm-support = k_standard s_lib_version s_matherr s_signgam		\
 	       s_rinttol s_rinttoll s_roundtol s_roundtoll		\
 	       fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg		\
diff --git a/math/libm.map b/math/libm.map
new file mode 100644
index 0000000000..205578d2c2
--- /dev/null
+++ b/math/libm.map
@@ -0,0 +1,9 @@
+GLIBC_2.0 {
+  global:
+    # all functions and variables in the normal name space
+    a*; b*; c*; d*; e*; f*; g*; h*; i*; j*; k*; l*; m*;
+    n*; o*; p*; q*; r*; s*; t*; u*; v*; w*; x*; y*; z*;
+
+  local:
+    *;
+};
diff --git a/math/math.h b/math/math.h
index bf3ef9bcee..5229a020e0 100644
--- a/math/math.h
+++ b/math/math.h
@@ -300,17 +300,20 @@ extern int matherr __P ((struct exception *));
 #define	M_SQRT2		_Mldbl(1.41421356237309504880)	/* sqrt(2) */
 #define	M_SQRT1_2	_Mldbl(0.70710678118654752440)	/* 1/sqrt(2) */
 
+#endif
+
 /* Our constants might specify more precision than `double' can represent.
    Use `long double' constants in standard and GNU C, where they are
-   supported and the cast to `double'.  */
+   supported and the cast to `double'.
+
+   Please not we define the macro even if the constants are not defined.
+   This helps us to use the macros in other places.  */
 #if __STDC__ - 0 || __GNUC__ - 0
 #define _Mldbl(x) x##L
 #else	/* Traditional C.  */
 #define _Mldbl(x) x
 #endif	/* Standard or GNU C.  */
 
-#endif
-
 
 /* Get machine-dependent inline versions (if there are any).  */
 #if (!defined __NO_MATH_INLINES && defined __OPTIMIZE__) \
diff --git a/md5-crypt/Makefile b/md5-crypt/Makefile
index 84ec20c5a3..aae6e8c216 100644
--- a/md5-crypt/Makefile
+++ b/md5-crypt/Makefile
@@ -32,9 +32,10 @@ extra-libs-others := $(extra-libs)
 
 md5-routines := crypt-entry md5-crypt md5
 libcrypt-routines := $(md5-routines)
+libcrypt-map := libcrypt.map
 
 onlymd5-routines := onlymd5-entry md5-crypt md5
-distribute += onlymd5-entry
+distribute += onlymd5-entry.c
 
 include ../Makeconfig
 
diff --git a/md5-crypt/libcrypt.map b/md5-crypt/libcrypt.map
new file mode 100644
index 0000000000..a3128da2e9
--- /dev/null
+++ b/md5-crypt/libcrypt.map
@@ -0,0 +1,7 @@
+GLIBC_2.0 {
+  global:
+    crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/md5-crypt/md5-crypt.c b/md5-crypt/md5-crypt.c
index dd9d413c42..6dd6740671 100644
--- a/md5-crypt/md5-crypt.c
+++ b/md5-crypt/md5-crypt.c
@@ -41,6 +41,7 @@ extern char *__md5_crypt_r __P ((const char *key, const char *salt,
 				 char *buffer, int buflen));
 extern char *md5_crypt_r __P ((const char *key, const char *salt,
 			       char *buffer, int buflen));
+extern char *__md5_crypt __P ((const char *key, const char *salt));
 extern char *md5_crypt __P ((const char *key, const char *salt));
 
 
diff --git a/misc/regexp.h b/misc/regexp.h
index 9ab25499a6..04da70a534 100644
--- a/misc/regexp.h
+++ b/misc/regexp.h
@@ -38,9 +38,12 @@
    for the here included function is weird (this really is a harmless
    word).
 
-   The user has to provide five macros before this header file can be
+   The user has to provide six macros before this header file can be
    included:
 
+   INIT		Declarations vor variables which can be used by the
+		other macros.
+
    GETC()	Return the value of the next character in the regular
 		expression pattern.  Successive calls should return
 		successive characters.
@@ -98,9 +101,10 @@ compile (char *__instring, char *__expbuf, __const char *__endbuf, int __eof)
 {
   char *__input_buffer = NULL;
   size_t __input_size = 0;
-  size_t __current_size;
+  size_t __current_size = 0;
   int __ch;
   int __error;
+  INIT
 
   /* Align the expression buffer according to the needs for an object
      of type `regex_t'.  Then check for minimum size of the buffer for
diff --git a/nis/Makefile b/nis/Makefile
index a6d14d0875..770f3b8283 100644
--- a/nis/Makefile
+++ b/nis/Makefile
@@ -50,15 +50,19 @@ libnsl-routines = yp_xdr ypclnt ypupdate_xdr \
 		  nis_removemember nis_creategroup nis_destroygroup\
 		  nis_print_group_entry nis_domain_of nis_domain_of_r\
 		  nis_modify nis_remove nis_add nis_defaults
+libnsl-map	= libnsl.map
 
 libnss_compat-routines	:= $(addprefix compat-,grp pwd spwd)
 libnss_compat-inhibit-o	= $(filter-out .so,$(object-suffixes))
+libnss_compat-map	:= libnss_compat.map
 
 libnss_nis-routines	:= $(addprefix nis-,$(databases))
 libnss_nis-inhibit-o	= $(filter-out .so,$(object-suffixes))
+libnss_nis-map		:= libnss_nis.map
 
 libnss_nisplus-routines	:= $(addprefix nisplus-,$(databases))
 libnss_nisplus-inhibit-o = $(filter-out .so,$(object-suffixes))
+libnss_nisplus-map	:= libnss_nisplus.map
 
 include ../Rules
 
diff --git a/nis/libnsl.map b/nis/libnsl.map
new file mode 100644
index 0000000000..5cb3bc30f7
--- /dev/null
+++ b/nis/libnsl.map
@@ -0,0 +1,14 @@
+GLIBC_2.0 {
+  global:
+    nis_add; nis_add_entry; nis_addmember; nis_checkpoint; nis_clone_directory;
+    nis_clone_entry; nis_clone_group; nis_clone_link; nis_clone_nis_attr;
+    nis_clone_objdata; nis_clone_object; nis_clone_result; nis_clone_table;
+    nis_creategroup; nis_destroy_object; nis_destroygroup; nis_dir_cmp;
+    nis_domain_of; nis_domain_of_r; nis_first_entry; nis_free_attr;
+    nis_free_directory; nis_free_endpoints; nis_free_entry; nis_free_group;
+    nis_free_link; nis_free_object; nis_free_request; nis_free_servers;
+    nis_free_table;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/nis/libnss_compat.map b/nis/libnss_compat.map
new file mode 100644
index 0000000000..55d6f4745f
--- /dev/null
+++ b/nis/libnss_compat.map
@@ -0,0 +1,11 @@
+GLIBC_2.0 {
+  global:
+    _nss_compat_endgrent; _nss_compat_endpwent; _nss_compat_endspent;
+    _nss_compat_getgrent_r; _nss_compat_getgrgid_r; _nss_compat_getgrnam_r;
+    _nss_compat_getpwent_r; _nss_compat_getpwnam_r; _nss_compat_getpwuid_r;
+    _nss_compat_getspent_r; _nss_compat_getspnam_r; _nss_compat_setgrent;
+    _nss_compat_setpwent; _nss_compat_setspent;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/nis/libnss_nis.map b/nis/libnss_nis.map
new file mode 100644
index 0000000000..2773fca29b
--- /dev/null
+++ b/nis/libnss_nis.map
@@ -0,0 +1,25 @@
+GLIBC_2.0 {
+  global:
+    _nss_nis_endaliasent; _nss_nis_endetherent; _nss_nis_endgrent;
+    _nss_nis_endhostent; _nss_nis_endnetent; _nss_nis_endnetgrent;
+    _nss_nis_endprotoent; _nss_nis_endpwent; _nss_nis_endrpcent;
+    _nss_nis_endservent; _nss_nis_endspent; _nss_nis_getaliasbyname_r;
+    _nss_nis_getaliasent_r; _nss_nis_getetherent_r; _nss_nis_getgrent_r;
+    _nss_nis_getgrgid_r; _nss_nis_getgrnam_r; _nss_nis_gethostbyaddr_r;
+    _nss_nis_gethostbyname2_r; _nss_nis_gethostbyname_r; _nss_nis_gethostent_r;
+    _nss_nis_gethostton_r; _nss_nis_getnetbyaddr_r; _nss_nis_getnetbyname_r;
+    _nss_nis_getnetent_r; _nss_nis_getnetgrent_r; _nss_nis_getntohost_r;
+    _nss_nis_getprotobyname_r; _nss_nis_getprotobynumber_r;
+    _nss_nis_getprotoent_r; _nss_nis_getpublickey; _nss_nis_getpwent_r;
+    _nss_nis_getpwnam_r; _nss_nis_getpwuid_r; _nss_nis_getrpcbyname_r;
+    _nss_nis_getrpcbynumber_r; _nss_nis_getrpcent_r; _nss_nis_getsecretkey;
+    _nss_nis_getservbyname_r; _nss_nis_getservbyport_r; _nss_nis_getservent_r;
+    _nss_nis_getspent_r; _nss_nis_getspnam_r; _nss_nis_netname2user;
+    _nss_nis_setaliasent; _nss_nis_setetherent; _nss_nis_setgrent;
+    _nss_nis_sethostent; _nss_nis_setnetent; _nss_nis_setnetgrent;
+    _nss_nis_setprotoent; _nss_nis_setpwent; _nss_nis_setrpcent;
+    _nss_nis_setservent; _nss_nis_setspent;
+
+  local:
+    *;
+};
diff --git a/nis/libnss_nisplus.map b/nis/libnss_nisplus.map
new file mode 100644
index 0000000000..b178c02552
--- /dev/null
+++ b/nis/libnss_nisplus.map
@@ -0,0 +1,32 @@
+GLIBC_2.0 {
+  global:
+    _nss_nisplus_endaliasent; _nss_nisplus_endetherent; _nss_nisplus_endgrent;
+    _nss_nisplus_endhostent; _nss_nisplus_endnetent; _nss_nisplus_endnetgrent;
+    _nss_nisplus_endprotoent; _nss_nisplus_endpwent; _nss_nisplus_endrpcent;
+    _nss_nisplus_endservent; _nss_nisplus_endspent;
+    _nss_nisplus_getaliasbyname_r; _nss_nisplus_getaliasent_r;
+    _nss_nisplus_getetherent_r; _nss_nisplus_getgrent_r;
+    _nss_nisplus_getgrgid_r; _nss_nisplus_getgrnam_r;
+    _nss_nisplus_gethostbyaddr_r; _nss_nisplus_gethostbyname2_r;
+    _nss_nisplus_gethostbyname_r; _nss_nisplus_gethostent_r;
+    _nss_nisplus_gethostton_r; _nss_nisplus_getnetbyaddr_r;
+    _nss_nisplus_getnetbyname_r; _nss_nisplus_getnetent_r;
+    _nss_nisplus_getnetgrent_r; _nss_nisplus_getntohost_r;
+    _nss_nisplus_getprotobyname_r; _nss_nisplus_getprotobynumber_r;
+    _nss_nisplus_getprotoent_r; _nss_nisplus_getpublickey;
+    _nss_nisplus_getpwent_r; _nss_nisplus_getpwnam_r; _nss_nisplus_getpwuid_r;
+    _nss_nisplus_getrpcbyname_r; _nss_nisplus_getrpcbynumber_r;
+    _nss_nisplus_getrpcent_r; _nss_nisplus_getsecretkey;
+    _nss_nisplus_getservbyname_r; _nss_nisplus_getservbynumber_r;
+    _nss_nisplus_getservent_r; _nss_nisplus_getspent_r;
+    _nss_nisplus_getspnam_r; _nss_nisplus_netname2user;
+    _nss_nisplus_parse_grent; _nss_nisplus_parse_pwent;
+    _nss_nisplus_parse_spent; _nss_nisplus_setaliasent;
+    _nss_nisplus_setetherent; _nss_nisplus_setgrent; _nss_nisplus_sethostent;
+    _nss_nisplus_setnetent; _nss_nisplus_setnetgrent; _nss_nisplus_setprotoent;
+    _nss_nisplus_setpwent; _nss_nisplus_setrpcent; _nss_nisplus_setservent;
+    _nss_nisplus_setspent;
+
+  local:
+    *;
+};
diff --git a/nis/nis_add.c b/nis/nis_add.c
index 6e11f17ff6..e358ea4987 100644
--- a/nis/nis_add.c
+++ b/nis/nis_add.c
@@ -41,7 +41,7 @@ nis_add (const_nis_name name, const nis_object *obj)
 
   p1 = req.ns_object.ns_object_val[0].zo_name;
   req.ns_object.ns_object_val[0].zo_name =
-    nis_name_of_r (name, buf1, sizeof (buf1));
+    nis_leaf_of_r (name, buf1, sizeof (buf1));
 
   p2 = req.ns_object.ns_object_val[0].zo_owner;
   if (p2 == NULL || strlen (p2) == 0)
diff --git a/nis/nis_addmember.c b/nis/nis_addmember.c
index 2eee9cc8bf..8fd7e12a58 100644
--- a/nis/nis_addmember.c
+++ b/nis/nis_addmember.c
@@ -26,7 +26,7 @@ nis_addmember (const_nis_name member, const_nis_name group)
 {
   if (group != NULL && strlen (group) > 0)
     {
-      char buf[strlen (group) + 50];
+      char buf[strlen (group) + 14 + NIS_MAXNAMELEN];
       char leafbuf[strlen (group) + 2];
       char domainbuf[strlen (group) + 2];
       nis_result *res, *res2;
@@ -38,8 +38,8 @@ nis_addmember (const_nis_name member, const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
         {
-          cp = stpcpy (cp, ".");
-          strcpy (cp, cp2);
+	  *cp++ = '.';
+          stpcpy (cp, cp2);
         }
       res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
       if (res->status != NIS_SUCCESS)
@@ -53,10 +53,15 @@ nis_addmember (const_nis_name member, const_nis_name group)
         return NIS_INVALIDOBJ;
 
       res->objects.objects_val[0].GR_data.gr_members.gr_members_val
-	= realloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_val, res->objects.objects_val[0].GR_data.gr_members.gr_members_len + 1);
-      ++res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+	= realloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_val,
+		   (res->objects.objects_val[0].GR_data.gr_members.gr_members_len + 1)
+		   * sizeof (char *));
       res->objects.objects_val[0].GR_data.gr_members.gr_members_val[res->objects.objects_val[0].GR_data.gr_members.gr_members_len] = strdup (member);
+      ++res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
 
+      cp = stpcpy (buf, res->objects.objects_val->zo_name);
+      *cp++ = '.';
+      strncpy (cp, res->objects.objects_val->zo_domain, NIS_MAXNAMELEN);
       res2 = nis_modify (buf, res->objects.objects_val);
       status = res2->status;
       nis_freeresult (res);
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 17f67abbde..08a20acd73 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -65,12 +65,12 @@ __nis_dobind (const nis_server *server, u_long flags)
   clnt_saddr.sin_family = AF_INET;
   for (i = 0; i < server->ep.ep_len; i++)
     {
-      if (strcmp (server->ep.ep_val[i].family,"loopback") == 0)
+      if (strcmp (server->ep.ep_val[i].family, "loopback") == 0)
 	{
 	  if (server->ep.ep_val[i].uaddr[i] == '-')
 	    clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
 	  else
-	    if (strcmp (server->ep.ep_val[i].proto,"udp") == 0)
+	    if (strcmp (server->ep.ep_val[i].proto, "udp") == 0)
 	      {
 		if ((flags & USE_DGRAM) == USE_DGRAM)
 		  clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
@@ -78,7 +78,7 @@ __nis_dobind (const nis_server *server, u_long flags)
 		  continue;
 	      }
 	    else
-	      if (strcmp (server->ep.ep_val[i].proto,"tcp") == 0)
+	      if (strcmp (server->ep.ep_val[i].proto, "tcp") == 0)
 		{
 		  if ((flags & USE_DGRAM) == USE_DGRAM)
 		    continue;
@@ -87,13 +87,13 @@ __nis_dobind (const nis_server *server, u_long flags)
 		}
 	}
       else
-	if (strcmp (server->ep.ep_val[i].family,"inet") == 0)
+	if (strcmp (server->ep.ep_val[i].family, "inet") == 0)
 	  {
 	    if (server->ep.ep_val[i].uaddr[i] == '-')
 	      clnt_saddr.sin_addr.s_addr =
 		inetstr2int (server->ep.ep_val[i].uaddr);
 	    else
-	      if (strcmp (server->ep.ep_val[i].proto,"udp") == 0)
+	      if (strcmp (server->ep.ep_val[i].proto, "udp") == 0)
 		{
 		  if ((flags & USE_DGRAM) == USE_DGRAM)
 		    clnt_saddr.sin_addr.s_addr =
@@ -102,7 +102,7 @@ __nis_dobind (const nis_server *server, u_long flags)
 		    continue;
 		}
 	      else
-		if (strcmp (server->ep.ep_val[i].proto,"tcp") == 0)
+		if (strcmp (server->ep.ep_val[i].proto, "tcp") == 0)
 		  {
 		    if ((flags & USE_DGRAM) == USE_DGRAM)
 		      continue;
@@ -310,6 +310,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags)
 	char leaf [strlen (name) + 3];
 	char ndomain [strlen (name) + 3];
 	u_int i;
+	char *cp;
 
 	do
 	  {
@@ -323,8 +324,9 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags)
 	    strcpy (domain, ndomain);
 	  }
 	while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME);
-	strcat (leaf, ".");
-	strcat (leaf, domain);
+	cp = strchr (leaf, '\0');
+	*cp++ = '.';
+	strcpy (cp, domain);
 
 	for (i = 0; i < dir->do_servers.do_servers_len; ++i)
 	  {
diff --git a/nis/nis_clone.c b/nis/nis_clone.c
index 860abb386c..e4dc87d4c9 100644
--- a/nis/nis_clone.c
+++ b/nis/nis_clone.c
@@ -264,7 +264,7 @@ nis_clone_entry (const entry_obj *src, entry_obj *dest)
   if (res->en_cols.en_cols_val == NULL && src->en_cols.en_cols_len > 0)
     {
       res->en_cols.en_cols_val =
-	malloc (src->en_cols.en_cols_len * sizeof (entry_col));
+	calloc (1, src->en_cols.en_cols_len * sizeof (entry_col));
       if (res->en_cols.en_cols_val == NULL)
 	return NULL;
     }
@@ -374,8 +374,13 @@ nis_clone_link (const link_obj *src, link_obj *dest)
 		       res->li_attrs.li_attrs_val,
 		       src->li_attrs.li_attrs_len);
 
-  if ((res->li_name = strdup (src->li_name)) == NULL)
-    return NULL;
+  if (src->li_name)
+    {
+      if ((res->li_name = strdup (src->li_name)) == NULL)
+	return NULL;
+    }
+  else
+    res->li_name = NULL;
 
   return res;
 }
@@ -477,15 +482,34 @@ nis_clone_object (const nis_object *src, nis_object *dest)
 
   res->zo_oid = src->zo_oid;
 
-  if ((res->zo_name = strdup (src->zo_name)) == NULL)
-    return NULL;
-  if ((res->zo_owner = strdup (src->zo_owner)) == NULL)
-    return NULL;
-  if ((res->zo_group = strdup (src->zo_group)) == NULL)
-    return NULL;
-  if ((res->zo_domain = strdup (src->zo_domain)) == NULL)
-    return NULL;
-
+  if (src->zo_name)
+    {
+      if ((res->zo_name = strdup (src->zo_name)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_name = NULL;
+  if (src->zo_owner)
+    {
+      if ((res->zo_owner = strdup (src->zo_owner)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_owner = NULL;
+  if (src->zo_group)
+    {
+      if ((res->zo_group = strdup (src->zo_group)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_group = NULL;
+  if (src->zo_domain)
+    {
+      if ((res->zo_domain = strdup (src->zo_domain)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_domain = NULL;
   res->zo_access = src->zo_access;
   res->zo_ttl = src->zo_ttl;
 
diff --git a/nis/nis_creategroup.c b/nis/nis_creategroup.c
index c62b039b5e..d1de08c08d 100644
--- a/nis/nis_creategroup.c
+++ b/nis/nis_creategroup.c
@@ -39,8 +39,8 @@ nis_creategroup (const_nis_name group, u_long flags)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
         {
-          cp = stpcpy (cp, ".");
-          strcpy (cp, cp2);
+	  *cp++ = '.';
+          stpcpy (cp, cp2);
         }
       else
 	return NIS_BADNAME;
diff --git a/nis/nis_defaults.c b/nis/nis_defaults.c
index 9d152d1f11..53a585b516 100644
--- a/nis/nis_defaults.c
+++ b/nis/nis_defaults.c
@@ -46,11 +46,9 @@ searchgroup (char *str)
   while (cptr[i] != '\0' && cptr[i] != ':')
     i++;
   if (i == 0)			/* only "group=" ? */
-    return (nis_name)"";
-
-  strncpy (default_group, cptr, i);
+    return (nis_name) "";
 
-  return default_group;
+  return strncpy (default_group, cptr, i);
 }
 
 static nis_name
@@ -71,9 +69,7 @@ searchowner (char *str)
   if (i == 0)			/* only "owner=" ? */
     return (nis_name)"";
 
-  strncpy (default_owner, cptr, i);
-
-  return default_owner;
+  return strncpy (default_owner, cptr, i);
 }
 
 static u_long
diff --git a/nis/nis_destroygroup.c b/nis/nis_destroygroup.c
index 524e0776ac..6ece45345d 100644
--- a/nis/nis_destroygroup.c
+++ b/nis/nis_destroygroup.c
@@ -38,8 +38,8 @@ nis_destroygroup (const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
 	{
-	  cp = stpcpy (cp, ".");
-	  strcpy (cp, cp2);
+	  *cp++ = '.';
+	  stpcpy (cp, cp2);
 	}
       res = nis_remove (buf, NULL);
       status = res->status;
diff --git a/nis/nis_getservlist.c b/nis/nis_getservlist.c
index 0c9fbfb60d..b30b70b584 100644
--- a/nis/nis_getservlist.c
+++ b/nis/nis_getservlist.c
@@ -35,7 +35,7 @@ nis_getservlist (const_nis_name dir)
       unsigned long i;
       nis_server *server;
 
-      serv = malloc (sizeof (nis_server *) *
+      serv = calloc (1, sizeof (nis_server *) *
 		     (res->objects.objects_val->DI_data.do_servers.do_servers_len + 1));
       if (serv == NULL)
 	return NULL;
@@ -43,10 +43,9 @@ nis_getservlist (const_nis_name dir)
 	{
 	  server =
 	    &res->objects.objects_val->DI_data.do_servers.do_servers_val[i];
+	  serv[i] = calloc (1, sizeof (nis_server));
 	  if (server->name != NULL)
             serv[i]->name = strdup (server->name);
-          else
-            serv[i]->name = NULL;
 
           serv[i]->ep.ep_len = server->ep.ep_len;
           if (serv[i]->ep.ep_len > 0)
@@ -110,6 +109,10 @@ nis_freeservlist (nis_server **serv)
 
   i = 0;
   while (serv[i] != NULL)
-    nis_free_servers (serv[i], 1);
+    {
+      nis_free_servers (serv[i], 1);
+      free (serv[i]);
+      ++i;
+    }
   free (serv);
 }
diff --git a/nis/nis_ismember.c b/nis/nis_ismember.c
index f0d087ca51..85c401531e 100644
--- a/nis/nis_ismember.c
+++ b/nis/nis_ismember.c
@@ -42,7 +42,7 @@ internal_ismember (const_nis_name principal, const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
         {
-          cp = stpcpy (cp, ".");
+	  *cp++ = '.';
           strcpy (cp, cp2);
 	}
       res = nis_lookup (buf, EXPAND_NAME|FOLLOW_LINKS);
@@ -112,9 +112,8 @@ internal_ismember (const_nis_name principal, const_nis_name group)
 		    char buf1[strlen (principal) + 2];
 		    char buf2[strlen (cp) + 2];
 
-		    strcpy (buf1, nis_domain_of (principal));
-		    strcpy (buf2, nis_domain_of (cp));
-		    if (strcmp (buf1, buf2) == 0)
+		    if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1),
+				nis_domain_of_r (cp, buf2, sizeof buf2)) == 0)
 		      return 1;
 		  }
 	    }
@@ -128,15 +127,7 @@ bool_t
 nis_ismember (const_nis_name principal, const_nis_name group)
 {
   if (group != NULL && strlen (group) > 0)
-    {
-      int status;
-
-      status = internal_ismember (principal, group);
-      if (status == 1)
-	return TRUE;
-      else
-	return FALSE;
-    }
+    return internal_ismember (principal, group) == 1 ? TRUE : FALSE;
   else
     return FALSE;
 }
diff --git a/nis/nis_local_names.c b/nis/nis_local_names.c
index e760f433b2..348c7534a3 100644
--- a/nis/nis_local_names.c
+++ b/nis/nis_local_names.c
@@ -31,6 +31,7 @@ nis_local_group (void)
   if (__nisgroup[0] == '\0')
     {
       char *cptr;
+      char *cp;
 
       if ((cptr = getenv ("NIS_GROUP")) == NULL)
 	return __nisgroup;
@@ -38,21 +39,18 @@ nis_local_group (void)
       if (strlen (cptr) >= NIS_MAXNAMELEN)
 	return __nisgroup;
 
-      strcpy (__nisgroup, cptr);
+      cp = stpcpy (__nisgroup, cptr);
 
-      if (__nisgroup[strlen (__nisgroup) - 1] != '.')
+      if (cp[-1] != '.')
 	{
 	  cptr = nis_local_directory ();
-	  if (strlen (__nisgroup) + strlen (cptr) + 1 < NIS_MAXNAMELEN)
+	  if ((cp - __nisgroup) + strlen (cptr) + 1 < NIS_MAXNAMELEN)
 	    {
-	      strcat (__nisgroup, ".");
-	      strcat (__nisgroup, cptr);
+	      *cp++ = '.';
+	      strcpy (cp, cptr);
 	    }
 	  else
-	    {
-	      __nisgroup[0] = '\0';
-	      return __nisgroup;
-	    }
+	    __nisgroup[0] = '\0';
 	}
     }
 
@@ -64,21 +62,20 @@ nis_name
 nis_local_directory (void)
 {
   static char __nisdomainname[NIS_MAXNAMELEN + 1];
-  int len;
 
   if (__nisdomainname[0] == '\0')
     {
       if (getdomainname (__nisdomainname, NIS_MAXNAMELEN) < 0)
-	strcpy (__nisdomainname, "\0");
+	__nisdomainname[0] = '\0';
       else
 	{
-	  len = strlen (__nisdomainname);
+	  char *cp = strchr (__nisdomainname, '\0');
 
 	  /* Missing trailing dot? */
-	  if (__nisdomainname[len - 1] != '.')
+	  if (cp[-1] != '.')
 	    {
-	      __nisdomainname[len] = '.';
-	      __nisdomainname[len + 1] = '\0';
+	      *cp++ = '.';
+	      *cp = '\0';
 	    }
 	}
     }
@@ -99,28 +96,32 @@ nis_local_principal (void)
 
       if (uid != 0)
 	{
-	  snprintf (buf, NIS_MAXNAMELEN - 1,
-		    "[auth_name=%d,auth_type=LOCAL],cred.org_dir.%s",
-		    uid, nis_local_directory ());
+	  int len = snprintf (buf, NIS_MAXNAMELEN - 1,
+			      "[auth_name=%d,auth_type=LOCAL],cred.org_dir.%s",
+			      uid, nis_local_directory ());
+
+	  if (len >= NIS_MAXNAMELEN - 1)
+	    /* XXX The buffer is too small.  Can this happen???  */
+	    return strcpy (__principal, "nobody");
 
-	  if (buf[strlen (buf) - 1] != '.')
-	    strcat (buf, ".");
+	  if (buf[len - 1] != '.')
+	    {
+	      buf[len++] = '.';
+	      buf[len] = '\0';
+	    }
 
 	  res = nis_list (buf, USE_DGRAM + NO_AUTHINFO + FOLLOW_LINKS +
 			  FOLLOW_PATH, NULL, NULL);
 
 	  if (res == NULL)
-	    {
-	      strcpy (__principal, "nobody");
-	      return __principal;
-	    }
+	    return strcpy (__principal, "nobody");
 
 	  if (res->status == NIS_SUCCESS)
 	    {
 	      if (res->objects.objects_len > 1)
 		{
 		  /* More than one principal with same uid?  something
-		     wrong with cred table. Should be unique Warn user
+		     wrong with cred table.  Should be unique.  Warn user
 		     and continue.  */
 		  printf (_("\
 LOCAL entry for UID %d in directory %s not unique\n"),
@@ -133,19 +134,14 @@ LOCAL entry for UID %d in directory %s not unique\n"),
 	  else
 	    {
 	      nis_freeresult (res);
-	      strcpy (__principal, "nobody");
-	      return __principal;
+	      return strcpy (__principal, "nobody");
 	    }
 	}
       else
-	{
-	  strcpy (__principal, nis_local_host ());
-	  return __principal;
-	}
+	return strcpy (__principal, nis_local_host ());
 
       /* Should be never reached */
-      strcpy (__principal, "nobody");
-      return __principal;
+      return strcpy (__principal, "nobody");
     }
   return __principal;
 }
@@ -154,7 +150,6 @@ nis_name
 nis_local_host (void)
 {
   static char __nishostname[NIS_MAXNAMELEN + 1];
-  int len;
 
   if (__nishostname[0] == '\0')
     {
@@ -162,21 +157,19 @@ nis_local_host (void)
 	__nishostname[0] = '\0';
       else
 	{
-	  char *cp;
-	  len = strlen(__nishostname);
+	  char *cp = strchr (__nishostname, '\0');
+	  int len = cp - __nishostname;
 
 	  /* Hostname already fully qualified? */
-	  if (__nishostname[len - 1] == '.')
+	  if (cp[-1] == '.')
 	    return __nishostname;
 
-	  if ((strlen (__nishostname) + strlen (nis_local_directory ()) + 1) >
-	      NIS_MAXNAMELEN)
+	  if (len + strlen (nis_local_directory ()) + 1 > NIS_MAXNAMELEN)
 	    {
 	      __nishostname[0] = '\0';
 	      return __nishostname;
 	    }
 
-	  cp = &__nishostname[len];
 	  *cp++ = '.';
 	  strncpy (cp, nis_local_directory (), NIS_MAXNAMELEN - len -1);
 	  __nishostname[NIS_MAXNAMELEN] = '\0';
diff --git a/nis/nis_modify.c b/nis/nis_modify.c
index 9c5aad7913..e68bf2a954 100644
--- a/nis/nis_modify.c
+++ b/nis/nis_modify.c
@@ -31,7 +31,7 @@ nis_modify (const_nis_name name, const nis_object *obj)
 
   res = calloc (1, sizeof (nis_result));
 
-  req.ns_name = (char *)name;
+  req.ns_name = (char *) name;
 
   req.ns_object.ns_object_len = 1;
   req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
diff --git a/nis/nis_ping.c b/nis/nis_ping.c
index 610cf03ea5..941adfbda4 100644
--- a/nis/nis_ping.c
+++ b/nis/nis_ping.c
@@ -40,7 +40,7 @@ nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
       obj = res->objects.objects_val;
     }
   else
-    obj = (nis_object *)dirobj;
+    obj = (nis_object *) dirobj;
 
   /* Check if obj is really a diryectory object */
   if (obj->zo_data.zo_type != DIRECTORY_OBJ)
@@ -49,7 +49,7 @@ nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
   if (dirname == NULL)
     args.dir = obj->DI_data.do_name;
   else
-    args.dir = (char *)dirname;
+    args.dir = (char *) dirname;
   args.stamp = utime;
 
   for (i = 0; i < obj->DI_data.do_servers.do_servers_len; ++i)
diff --git a/nis/nis_print_group_entry.c b/nis/nis_print_group_entry.c
index e7c866cbe2..1063ef8411 100644
--- a/nis/nis_print_group_entry.c
+++ b/nis/nis_print_group_entry.c
@@ -38,8 +38,8 @@ nis_print_group_entry (const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
 	{
-	  cp = stpcpy (cp, ".");
-	  strcpy (cp, cp2);
+	  *cp++ = '.';
+	  stpcpy (cp, cp2);
 	}
       res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
 
diff --git a/nis/nis_remove.c b/nis/nis_remove.c
index 3ffd66dfe0..e6aed00393 100644
--- a/nis/nis_remove.c
+++ b/nis/nis_remove.c
@@ -31,7 +31,7 @@ nis_remove (const_nis_name name, const nis_object *obj)
 
   res = calloc (1, sizeof (nis_result));
 
-  req.ns_name = (char *)name;
+  req.ns_name = (char *) name;
 
   if (obj != NULL)
     {
diff --git a/nis/nis_removemember.c b/nis/nis_removemember.c
index 473438ba5c..8ed67caf98 100644
--- a/nis/nis_removemember.c
+++ b/nis/nis_removemember.c
@@ -26,14 +26,14 @@ nis_removemember (const_nis_name member, const_nis_name group)
 {
   if (group != NULL && strlen (group) > 0)
     {
-      char buf[strlen (group) + 50];
+      char buf[strlen (group) + 14 + NIS_MAXNAMELEN];
       char leafbuf[strlen (group) + 2];
       char domainbuf[strlen (group) + 2];
       nis_name *newmem;
       nis_result *res, *res2;
       nis_error status;
       char *cp, *cp2;
-      u_int i, j;
+      unsigned long int i, j, k;
 
       cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
       cp = stpcpy (cp, ".groups_dir");
@@ -41,7 +41,7 @@ nis_removemember (const_nis_name member, const_nis_name group)
       if (cp2 != NULL && strlen (cp2) > 0)
         {
           cp = stpcpy (cp, ".");
-          strcpy (cp, cp2);
+          stpcpy (cp, cp2);
         }
       res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
       if (res->status != NIS_SUCCESS)
@@ -54,20 +54,35 @@ nis_removemember (const_nis_name member, const_nis_name group)
           (res->objects.objects_val[0].zo_data.zo_type != GROUP_OBJ))
         return NIS_INVALIDOBJ;
 
-      newmem = malloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_len);
 
+      newmem = calloc (1, res->objects.objects_val[0].GR_data.gr_members.gr_members_len *
+		       sizeof (char *));
+
+      k = res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
       j = 0;
-      for (i = 0; i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len - 1; ++i)
+      for (i = 0; i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+	   ++i)
 	{
-	  if (strcmp (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[j], member) != 0)
+	  if (strcmp (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i],
+		      member) != 0)
 	    {
 	      newmem[j] = res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i];
 	      ++j;
 	    }
+	  else
+	    {
+	      free (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i]);
+	      --k;
+	    }
 	}
-      --res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
       free (res->objects.objects_val[0].GR_data.gr_members.gr_members_val);
+      newmem = realloc (newmem, k * sizeof (char*));
       res->objects.objects_val[0].GR_data.gr_members.gr_members_val = newmem;
+      res->objects.objects_val[0].GR_data.gr_members.gr_members_len = k;
+
+      cp = stpcpy (buf, res->objects.objects_val->zo_name);
+      *cp++ = '.';
+      strncpy (cp, res->objects.objects_val->zo_domain, NIS_MAXNAMELEN);
       res2 = nis_modify (buf, res->objects.objects_val);
       status = res2->status;
       nis_freeresult (res);
diff --git a/nis/nis_server.c b/nis/nis_server.c
index 4d6b1c1100..5274a3bfc4 100644
--- a/nis/nis_server.c
+++ b/nis/nis_server.c
@@ -33,7 +33,7 @@ nis_servstate (const nis_server *serv, const nis_tag *tags,
   tagres.tags.tags_val = NULL;
   *result = NULL;
   taglist.tags.tags_len = numtags;
-  taglist.tags.tags_val = (nis_tag *)tags;
+  taglist.tags.tags_val = (nis_tag *) tags;
 
   if (serv == NULL)
     {
@@ -80,7 +80,7 @@ nis_stats (const nis_server *serv, const nis_tag *tags,
   tagres.tags.tags_val = NULL;
   *result = NULL;
   taglist.tags.tags_len = numtags;
-  taglist.tags.tags_val = (nis_tag *)tags;
+  taglist.tags.tags_val = (nis_tag *) tags;
 
   if (serv == NULL)
     {
diff --git a/nis/nis_table.c b/nis/nis_table.c
index 5fa3c89e0b..e9e35abf3b 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -78,7 +78,7 @@ splitname (const_nis_name name, nis_name *ibr_name, int *srch_len,
       if (!val)
 	{
 	  free (cptr);
-	  *srch_val = malloc (sizeof (char *));
+	  *srch_val = malloc (sizeof (nis_attr));
 	  if (*srch_val == NULL)
 	    {
 	      free (cptr);
@@ -86,8 +86,8 @@ splitname (const_nis_name name, nis_name *ibr_name, int *srch_len,
 	      *ibr_name = NULL;
 	      return;
 	    }
-	  (*srch_val)[*srch_len].zattr_val.zattr_val_len = 0;
-	  (*srch_val)[*srch_len].zattr_val.zattr_val_val = NULL;
+	  (*srch_val)[0].zattr_val.zattr_val_len = 0;
+	  (*srch_val)[0].zattr_val.zattr_val_val = NULL;
 	  return;
 	}
 
diff --git a/nis/nis_verifygroup.c b/nis/nis_verifygroup.c
index e57f16589a..6a8ab01bd7 100644
--- a/nis/nis_verifygroup.c
+++ b/nis/nis_verifygroup.c
@@ -38,8 +38,8 @@ nis_verifygroup (const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
 	{
-	  cp = stpcpy (cp, ".");
-	  strcpy (cp, cp2);
+	  *cp++ = '.';
+	  stpcpy (cp, cp2);
 	}
       res = nis_lookup (buf, 0);
       status = res->status;
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index 91d30c8149..5823c71a80 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -55,7 +55,7 @@ LINE_PARSER
    STRING_FIELD (addr, isspace, 1);
 
    /* Parse address.  */
-   if (inet_pton (AF_INET6, p, entdata->host_addr) > 0)
+   if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
      {
        result->h_addrtype = AF_INET6;
        result->h_length = IN6ADDRSZ;
diff --git a/nis/nss_nis/nis-netgrp.c b/nis/nss_nis/nis-netgrp.c
index 7609ea08ed..aa51c2f0df 100644
--- a/nis/nss_nis/nis-netgrp.c
+++ b/nis/nss_nis/nis-netgrp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
 
@@ -52,7 +52,7 @@ _nss_nis_setnetgrent (char *group)
 
   status = NSS_STATUS_SUCCESS;
 
-  if (group[0] == '\0')
+  if (group == NULL || group[0] == '\0')
     return NSS_STATUS_UNAVAIL;
 
   if (yp_get_default_domain (&domain))
diff --git a/nis/nss_nisplus/nisplus-hosts.c b/nis/nss_nisplus/nisplus-hosts.c
index 0a005406d1..e6d584dac8 100644
--- a/nis/nss_nisplus/nisplus-hosts.c
+++ b/nis/nss_nisplus/nisplus-hosts.c
@@ -66,7 +66,7 @@ LINE_PARSER
    STRING_FIELD (addr, isspace, 1);
 
    /* Parse address.  */
-   if (inet_pton (AF_INET6, p, entdata->host_addr) > 0)
+   if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
      {
        result->h_addrtype = AF_INET6;
        result->h_length = IN6ADDRSZ;
diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c
index d426d28684..568a1c4006 100644
--- a/nis/nss_nisplus/nisplus-spwd.c
+++ b/nis/nss_nisplus/nisplus-spwd.c
@@ -44,7 +44,6 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
 {
   char *first_unused = buffer;
   size_t room_left = buflen;
-  char *line, *cp;
 
   if (result == NULL)
     return 0;
@@ -85,52 +84,57 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
   sp->sp_lstchg = sp->sp_min = sp->sp_max = sp->sp_warn = sp->sp_inact =
     sp->sp_expire = sp->sp_flag = -1;
 
-  line = NISENTRYVAL (0, 7, result);
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_lstchg = atol (line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_min = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_max = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_warn = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_inact = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_expire = atol(line);
-
-  line = cp;
-  if (line == NULL)
-    return 0;
-  sp->sp_flag = atol(line);
+  if (NISENTRYVAL (0, 7, result) > 0)
+    {
+      char *line, *cp;
+
+      line = NISENTRYVAL (0, 7, result);
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_lstchg = atol (line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_min = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_max = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_warn = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_inact = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_expire = atol(line);
+
+      line = cp;
+      if (line == NULL)
+	return 0;
+      sp->sp_flag = atol(line);
+    }
 
   return 1;
 }
diff --git a/nss/Makefile b/nss/Makefile
index 6f555af469..02af5009bc 100644
--- a/nss/Makefile
+++ b/nss/Makefile
@@ -49,10 +49,12 @@ vpath %.c $(subdir-dirs)
 
 
 libnss_files-routines	:= $(addprefix files-,$(filter-out key, $(databases)))
+libnss_files-map	:= libnss_files.map
 distribute		+= files-XXX.c files-parse.c
 
 libnss_db-routines	:= $(addprefix db-,$(filter-out hosts network key,\
 							$(databases)))
+libnss_db-map		:= libnss_db.map
 generated		+= $(filter-out db-alias.c db-netgrp.c, \
 					$(addsuffix .c,$(libnss_db-routines)))
 distribute		+= db-XXX.c
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
index 371b2e36f5..988f46c88e 100644
--- a/nss/getXXbyYY_r.c
+++ b/nss/getXXbyYY_r.c
@@ -140,5 +140,5 @@ done:
   return status == NSS_STATUS_SUCCESS ? 0 : -1;
 }
 
-#define do_weak_alias(n1, n2) weak_alias ((n1), (n2))
+#define do_weak_alias(n1, n2) weak_alias (n1, (n2))
 do_weak_alias (INTERNAL (REENTRANT_NAME), REENTRANT_NAME)
diff --git a/nss/libnss_db.map b/nss/libnss_db.map
new file mode 100644
index 0000000000..9248107747
--- /dev/null
+++ b/nss/libnss_db.map
@@ -0,0 +1,20 @@
+GLIBC_2.0 {
+  global:
+    _nss_db_endaliasent; _nss_db_endetherent; _nss_db_endgrent;
+    _nss_db_endnetgrent; _nss_db_endprotoent; _nss_db_endpwent;
+    _nss_db_endrpcent; _nss_db_endservent; _nss_db_endspent;
+    _nss_db_getaliasbyname_r; _nss_db_getaliasent_r; _nss_db_getetherent_r;
+    _nss_db_getgrent_r; _nss_db_getgrgid_r; _nss_db_getgrnam_r;
+    _nss_db_gethostton_r; _nss_db_getnetgrent_r; _nss_db_getntohost_r;
+    _nss_db_getprotobyname_r; _nss_db_getprotobynumber_r;
+    _nss_db_getprotoent_r; _nss_db_getpwent_r; _nss_db_getpwnam_r;
+    _nss_db_getpwuid_r; _nss_db_getrpcbyname_r; _nss_db_getrpcbynumber_r;
+    _nss_db_getrpcent_r; _nss_db_getservbyname_r; _nss_db_getservbyport_r;
+    _nss_db_getservent_r; _nss_db_getspent_r; _nss_db_getspnam_r;
+    _nss_db_setaliasent; _nss_db_setetherent; _nss_db_setgrent;
+    _nss_db_setnetgrent; _nss_db_setprotoent; _nss_db_setpwent;
+    _nss_db_setrpcent; _nss_db_setservent; _nss_db_setspent;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/nss/libnss_files.map b/nss/libnss_files.map
new file mode 100644
index 0000000000..8ec5e0ee32
--- /dev/null
+++ b/nss/libnss_files.map
@@ -0,0 +1,28 @@
+GLIBC_2.0 {
+  global:
+    _nss_files_endaliasent; _nss_files_endetherent; _nss_files_endgrent;
+    _nss_files_endhostent; _nss_files_endnetent; _nss_files_endnetgrent;
+    _nss_files_endprotoent; _nss_files_endpwent; _nss_files_endrpcent;
+    _nss_files_endservent; _nss_files_endspent; _nss_files_getaliasbyname_r;
+    _nss_files_getaliasent_r; _nss_files_getetherent_r; _nss_files_getgrent_r;
+    _nss_files_getgrgid_r; _nss_files_getgrnam_r; _nss_files_gethostbyaddr_r;
+    _nss_files_gethostbyname2_r; _nss_files_gethostbyname_r;
+    _nss_files_gethostent_r; _nss_files_gethostton_r;
+    _nss_files_getnetbyaddr_r; _nss_files_getnetbyname_r;
+    _nss_files_getnetent_r; _nss_files_getnetgrent_r; _nss_files_getntohost_r;
+    _nss_files_getprotobyname_r; _nss_files_getprotobynumber_r;
+    _nss_files_getprotoent_r; _nss_files_getpwent_r; _nss_files_getpwnam_r;
+    _nss_files_getpwuid_r; _nss_files_getrpcbyname_r;
+    _nss_files_getrpcbynumber_r; _nss_files_getrpcent_r;
+    _nss_files_getservbyname_r; _nss_files_getservbyport_r;
+    _nss_files_getservent_r; _nss_files_getspent_r; _nss_files_getspnam_r;
+    _nss_files_parse_etherent; _nss_files_parse_netent;
+    _nss_files_parse_protoent; _nss_files_parse_rpcent;
+    _nss_files_parse_servent; _nss_files_setaliasent; _nss_files_setetherent;
+    _nss_files_setgrent; _nss_files_sethostent; _nss_files_setnetent;
+    _nss_files_setnetgrent; _nss_files_setprotoent; _nss_files_setpwent;
+    _nss_files_setrpcent; _nss_files_setservent; _nss_files_setspent;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/posix/glob.c b/posix/glob.c
index 44e548493c..6d9af102f8 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -307,7 +307,7 @@ next_brace_sub (const char *begin)
    If a directory cannot be opened or read and ERRFUNC is not nil,
    it is called with the pathname that caused the error, and the
    `errno' value from the failing call; if it returns non-zero
-   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+   `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
    If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
    Otherwise, `glob' returns zero.  */
 int
@@ -647,7 +647,7 @@ glob (pattern, flags, errfunc, pglob)
 	      {
 		globfree (&dirs);
 		globfree (&files);
-		return GLOB_ABEND;
+		return GLOB_ABORTED;
 	      }
 	  }
 #endif /* SHELL.  */
@@ -918,7 +918,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
 	{
 	  if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
 	      (flags & GLOB_ERR))
-	    return GLOB_ABEND;
+	    return GLOB_ABORTED;
 	}
       else
 	while (1)
diff --git a/posix/glob.h b/posix/glob.h
index 49a7b7cfe6..bfe1c9cd01 100644
--- a/posix/glob.h
+++ b/posix/glob.h
@@ -65,9 +65,15 @@ extern "C"
 
 /* Error returns from `glob'.  */
 #define	GLOB_NOSPACE	1	/* Ran out of memory.  */
-#define	GLOB_ABEND	2	/* Read error.  */
+#define	GLOB_ABORTED	2	/* Read error.  */
 #define	GLOB_NOMATCH	3	/* No matches found.  */
 
+#ifdef _GNU_SOURCE
+/* Previous versions of this file defined GLOB_ABEND instead of
+   GLOB_ABORTED.  Provide a compatibility definition here.  */
+# define GLOB_ABEND GLOB_ABORTED
+#endif
+
 /* Structure describing a globbing run.  */
 #if !defined (_AMIGA) && !defined (VMS) /* Buggy compiler.   */
 struct stat;
diff --git a/posix/unistd.h b/posix/unistd.h
index b550d2c6f4..8f1dd35ce1 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -297,7 +297,7 @@ extern int fchdir __P ((int __fd));
    directory couldn't be determined or SIZE was too small.
    If successful, returns BUF.  In GNU, if BUF is NULL,
    an array is allocated with `malloc'; the array is SIZE
-   bytes long, unless SIZE <= 0, in which case it is as
+   bytes long, unless SIZE == 0, in which case it is as
    big as necessary.  */
 extern char *__getcwd __P ((char *__buf, size_t __size));
 extern char *getcwd __P ((char *__buf, size_t __size));
diff --git a/resolv/Makefile b/resolv/Makefile
index 7b99aee550..4d11b4d366 100644
--- a/resolv/Makefile
+++ b/resolv/Makefile
@@ -32,11 +32,13 @@ extra-libs-others = $(extra-libs)
 libresolv-routines := gethnamaddr res_comp res_debug	\
 		      res_data res_mkquery res_query res_send		\
 		      inet_net_ntop inet_net_pton inet_neta base64
+libresolv-map := libresolv.map
 
 subdir-dirs = nss_dns
 vpath %.c nss_dns
 
 libnss_dns-routines	:= dns-host dns-network
+libnss_dns-map		:= libnss_dns.map
 libnss_dns-inhibit-o	= $(filter-out .so,$(object-suffixes))
 
 include ../Rules
diff --git a/resolv/libnss_dns.map b/resolv/libnss_dns.map
new file mode 100644
index 0000000000..359ddc1d15
--- /dev/null
+++ b/resolv/libnss_dns.map
@@ -0,0 +1,9 @@
+GLIBC_2.0 {
+  global:
+    _nss_dns_gethostbyaddr_r; _nss_dns_gethostbyname2_r;
+    _nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r;
+    _nss_dns_getnetbyname_r;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/resolv/libresolv.map b/resolv/libresolv.map
new file mode 100644
index 0000000000..79d70539c2
--- /dev/null
+++ b/resolv/libresolv.map
@@ -0,0 +1,11 @@
+GLIBC_2.0 {
+  global:
+    _gethtbyaddr; _gethtbyname; _gethtbyname2; _gethtent; _getlong;
+    _getshort; _res_opcodes; _res_resultcodes; _sethtent; dn_expand;
+    inet_net_ntop; inet_net_pton; inet_neta; res_gethostbyaddr;
+    res_gethostbyname; res_gethostbyname2; res_mkquery; res_query;
+    res_querydomain; res_search; res_send_setqhook; res_send_setrhook;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/shlib-versions b/shlib-versions
index d4f8cdfdc9..ac9ef78c62 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -8,18 +8,18 @@
 # Configuration		Library versions
 # -------------		------- --------
 
-# The interface to -lm depends only on cpu, not on operating system.
+# The interface to -lm depends mostly only on cpu, not on operating system.
 i.86-.*-.*		libm=6
 m68k-.*-.*		libm=6
-sparc-.*-linux.*	libm=6
+sparc-.*-.*		libm=6
 alpha-.*-linux.*	libm=6.1
 alpha-.*-.*		libm=6
+powerpc-.*-.*		libm=6
+mips-.*-.*		libm=6
 
 # We provide libc.so.6 for Linux kernel versions 2.0 and later.
-i.86-.*-linux.*		libc=6
-m68k-.*-linux.*		libc=6
-sparc-.*-linux.*	libc=6
 alpha-.*-linux.*	libc=6.1
+.*-.*-linux.*		libc=6
 
 # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release.
 .*-.*-gnu-gnu.*		libmachuser=1
diff --git a/stdlib/Makefile b/stdlib/Makefile
index b5a38bd965..2eb1843a4a 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -21,7 +21,7 @@
 #
 subdir	:= stdlib
 
-headers	:= stdlib.h alloca.h monetary.h inttypes.h fmtmsg.h
+headers	:= stdlib.h alloca.h monetary.h fmtmsg.h
 
 routines	:=							      \
 	atof atoi atol atoll						      \
diff --git a/stdlib/testsort.c b/stdlib/testsort.c
index 3ae55b14b9..a9a43c76ea 100644
--- a/stdlib/testsort.c
+++ b/stdlib/testsort.c
@@ -3,7 +3,7 @@
 #include <stdio.h>
 
 int
-compare (const char *a, const char *b)
+compare (const void *a, const void *b)
 {
   return strcmp (*(char **) a, *(char **) b);
 }
diff --git a/string/argz-addsep.c b/string/argz-addsep.c
index 7405e9ad1a..38f3138ec1 100644
--- a/string/argz-addsep.c
+++ b/string/argz-addsep.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
@@ -56,4 +56,4 @@ __argz_add_sep (char **argz, size_t *argz_len, const char *string, int delim)
 
   return 0;
 }
-weak_alias (__argz_create_sep, argz_create_sep)
+weak_alias (__argz_add_sep, argz_add_sep)
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index b5ed91dc3f..ee66e532f1 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -23,13 +23,12 @@ subdir	:= sunrpc
 
 # The code in this subdirectory is taken from Sun's RPCSRC-4.0
 # distribution with some additional changes from the TI-RPC package
-# which is also available from Sun.  A few files needed trivial
-# modifications to compile in the GNU environment; these changes are
-# marked by comments that say `roland@gnu'.  All the code from Sun's
-# rpc, etc, and rpcgen subdirectories is in this directory; the rpc
-# subdirectory contains only the header files.  Other than that,
-# several files were renamed so as not to exceed 14-character file
-# name limits:
+# which is also available from Sun.  The files are heavily changed to
+# compile cleanly and to fit in the GNU environment.  All the code
+# from Sun's rpc, etc, and rpcgen subdirectories is in this directory;
+# the rpc subdirectory contains only the header files.  Other than
+# that, several files were renamed so as not to exceed 14-character
+# file name limits:
 #
 #	authunix_prot.c -> authuxprot.c
 #	bindresvport.c -> bindrsvprt.c
diff --git a/sysdeps/i386/add_n.S b/sysdeps/i386/add_n.S
index a68fe2ed39..55c5dda446 100644
--- a/sysdeps/i386/add_n.S
+++ b/sysdeps/i386/add_n.S
@@ -32,6 +32,7 @@
 .text
 	ALIGN (3)
 	.globl C_SYMBOL_NAME(__mpn_add_n)
+	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(__mpn_add_n),@function)
 C_SYMBOL_NAME(__mpn_add_n:)
 	pushl %edi
 	pushl %esi
@@ -102,3 +103,5 @@ L(oop):	movl	(%esi),%eax
 	popl %esi
 	popl %edi
 	ret
+
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__mpn_add_n))
\ No newline at end of file
diff --git a/sysdeps/i386/addmul_1.S b/sysdeps/i386/addmul_1.S
index 3e2c5cd616..8194ec495e 100644
--- a/sysdeps/i386/addmul_1.S
+++ b/sysdeps/i386/addmul_1.S
@@ -37,6 +37,7 @@
 	TEXT
 	ALIGN (3)
 	GLOBL	C_SYMBOL_NAME(__mpn_addmul_1)
+	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(__mpn_addmul_1),@function)
 C_SYMBOL_NAME(__mpn_addmul_1:)
 
 	INSN1(push,l	,R(edi))
@@ -72,3 +73,5 @@ L(oop):
 	INSN1(pop,l	,R(esi))
 	INSN1(pop,l	,R(edi))
 	ret
+
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__mpn_addmul_1))
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 3e0f9b126c..6efa32bcd1 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -253,7 +253,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
 #endif
 	*reloc_addr += map->l_addr;
     }
-  else
+  else if (ELF32_R_TYPE (reloc->r_info) != R_386_NONE)
     {
       const Elf32_Sym *const refsym = sym;
       Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
@@ -305,8 +305,6 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
 	case R_386_PC32:
 	  *reloc_addr += (value - (Elf32_Addr) reloc_addr);
 	  break;
-	case R_386_NONE:		/* Alright, Wilbur.  */
-	  break;
 	default:
 	  assert (! "unexpected dynamic reloc type");
 	  break;
diff --git a/sysdeps/i386/fpu/__math.h b/sysdeps/i386/fpu/__math.h
index d5945e8ca2..9e1c23cec0 100644
--- a/sysdeps/i386/fpu/__math.h
+++ b/sysdeps/i386/fpu/__math.h
@@ -382,13 +382,17 @@ hypot (double __x, double __y)
   return sqrt (__x * __x + __y * __y);
 }
 
+/* We cannot rely on M_SQRT being defined.  So we do it for ourself
+   here.  */
+#define __M_SQRT2	_Mldbl(1.41421356237309504880)	/* sqrt(2) */
+
 __MATH_INLINE double log1p (double __x);
 __MATH_INLINE double
 log1p (double __x)
 {
   register double __value;
 
-  if (fabs (__x) >= 1.0 - 0.5 * M_SQRT2)
+  if (fabs (__x) >= 1.0 - 0.5 * __M_SQRT2)
     __value = log (1.0 + __x);
   else
     __asm __volatile__
diff --git a/sysdeps/i386/lshift.S b/sysdeps/i386/lshift.S
index cd6d95b62e..2f629b0303 100644
--- a/sysdeps/i386/lshift.S
+++ b/sysdeps/i386/lshift.S
@@ -31,6 +31,7 @@
 .text
 	ALIGN (3)
 	.globl C_SYMBOL_NAME(__mpn_lshift)
+	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(__mpn_lshift),@function)
 C_SYMBOL_NAME(__mpn_lshift:)
 	pushl	%edi
 	pushl	%esi
@@ -81,3 +82,5 @@ L(end):	shll	%cl,%ebx		/* compute least significant limb */
 	popl	%esi
 	popl	%edi
 	ret
+
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__mpn_lshift))
\ No newline at end of file
diff --git a/sysdeps/i386/rshift.S b/sysdeps/i386/rshift.S
index f00f9d59f2..a0382672de 100644
--- a/sysdeps/i386/rshift.S
+++ b/sysdeps/i386/rshift.S
@@ -31,6 +31,7 @@
 .text
 	ALIGN (3)
 	.globl C_SYMBOL_NAME(__mpn_rshift)
+	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(__mpn_rshift),@function)
 C_SYMBOL_NAME(__mpn_rshift:)
 	pushl	%edi
 	pushl	%esi
@@ -83,3 +84,5 @@ L(end):	shrl	%cl,%ebx		/* compute most significant limb */
 	popl	%esi
 	popl	%edi
 	ret
+
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__mpn_rshift))
\ No newline at end of file
diff --git a/sysdeps/i386/sub_n.S b/sysdeps/i386/sub_n.S
index 229734c2e9..c41c9a6408 100644
--- a/sysdeps/i386/sub_n.S
+++ b/sysdeps/i386/sub_n.S
@@ -32,6 +32,7 @@
 .text
 	ALIGN (3)
 	.globl C_SYMBOL_NAME(__mpn_sub_n)
+	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(__mpn_sub_n),@function)
 C_SYMBOL_NAME(__mpn_sub_n:)
 	pushl %edi
 	pushl %esi
@@ -102,3 +103,5 @@ L(oop):	movl	(%esi),%eax
 	popl %esi
 	popl %edi
 	ret
+
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__mpn_sub_n))
\ No newline at end of file
diff --git a/sysdeps/i386/submul_1.S b/sysdeps/i386/submul_1.S
index 8efef7609f..6bba494417 100644
--- a/sysdeps/i386/submul_1.S
+++ b/sysdeps/i386/submul_1.S
@@ -37,6 +37,7 @@
 	TEXT
 	ALIGN (3)
 	GLOBL	C_SYMBOL_NAME(__mpn_submul_1)
+	ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(__mpn_submul_1),@function)
 C_SYMBOL_NAME(__mpn_submul_1:)
 
 	INSN1(push,l	,R(edi))
@@ -72,3 +73,5 @@ L(oop):
 	INSN1(pop,l	,R(esi))
 	INSN1(pop,l	,R(edi))
 	ret
+
+	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__mpn_addmul_1))
diff --git a/sysdeps/libm-ieee754/s_fmin.c b/sysdeps/libm-ieee754/s_fmin.c
index f9a937c850..b79e6eca5a 100644
--- a/sysdeps/libm-ieee754/s_fmin.c
+++ b/sysdeps/libm-ieee754/s_fmin.c
@@ -28,6 +28,6 @@ __fmin (double x, double y)
 }
 weak_alias (__fmin, fmin)
 #ifdef NO_LONG_DOUBLE
-strong_alias (__fmim, __fminl)
+strong_alias (__fmin, __fminl)
 weak_alias (__fmin, fminl)
 #endif
diff --git a/sysdeps/powerpc/fenvbits.h b/sysdeps/powerpc/fenvbits.h
index 867ea5f5b4..8acd0ab8a4 100644
--- a/sysdeps/powerpc/fenvbits.h
+++ b/sysdeps/powerpc/fenvbits.h
@@ -85,7 +85,7 @@ enum
     FE_INVALID_INTEGER_CONVERSION = 1 << 31-23,
 #define FE_INVALID_INTEGER_CONVERSION	FE_INVALID_INTEGER_CONVERSION
 
-#define __FE_ALL_INVALID \
+#define FE_ALL_INVALID \
         (FE_INVALID_SNAN | FE_INVALID_ISI | FE_INVALID_IDI | FE_INVALID_ZDZ \
 	 | FE_INVALID_IMZ | FE_INVALID_COMPARE | FE_INVALID_SOFTWARE \
 	 | FE_INVALID_SQRT | FE_INVALID_INTEGER_CONVERSION)
diff --git a/sysdeps/powerpc/fraiseexcpt.c b/sysdeps/powerpc/fraiseexcpt.c
index aa8f1fcdc6..4305c3dcd2 100644
--- a/sysdeps/powerpc/fraiseexcpt.c
+++ b/sysdeps/powerpc/fraiseexcpt.c
@@ -34,9 +34,9 @@ feraiseexcept (int excepts)
 
   /* Add the exceptions */
   u.l[1] = (u.l[1]
-	    | excepts & __FPSCR_STICKY_BITS
+	    | excepts & FPSCR_STICKY_BITS
 	    /* Turn FE_INVALID into FE_INVALID_SOFTWARE.  */
-	    | excepts << (31 - 21) - (31 - 24)  &  __FE_INVALID_SOFTWARE);
+	    | excepts << (31 - 21) - (31 - 24) & FE_INVALID_SOFTWARE);
 
   /* Store the new status word (along with the rest of the environment),
      triggering any appropriate exceptions.  */
diff --git a/sysdeps/powerpc/strlen.s b/sysdeps/powerpc/strlen.s
index fa1c670912..9d671cabc3 100644
--- a/sysdeps/powerpc/strlen.s
+++ b/sysdeps/powerpc/strlen.s
@@ -100,8 +100,8 @@ strlen:
 	bne   done0
  # Handle second word of pair. Put addi between branches to avoid hurting
  # branch prediction.
-	addi  %r6,%r6,0xfffffeff
-	
+	addi  %r6,%r6,-0x101
+
 	bne   %cr1,loop
 	lwzu  %r8,4(%r4)
 	and   %r0,%r7,%r8
@@ -111,7 +111,7 @@ strlen:
 	bne   done0
 
  # The loop.
-	
+
 loop:	lwz   %r8,4(%r4)
 	lwzu  %r9,8(%r4)
 	add   %r0,%r6,%r8
@@ -127,12 +127,12 @@ loop:	lwz   %r8,4(%r4)
 	add   %r0,%r0,%r7
 	andc  %r8,%r12,%r0
 	b     done0
-	
+
 done1:	and   %r0,%r7,%r8
 	subi  %r4,%r4,4
 	add   %r0,%r0,%r7
 	andc  %r8,%r10,%r0
-	
+
  # When we get to here, r4 points to the first word in the string that
  # contains a zero byte, and the most significant set bit in r8 is in that
  # byte.
diff --git a/sysdeps/unix/arm/brk.S b/sysdeps/unix/arm/brk.S
new file mode 100644
index 0000000000..a801674283
--- /dev/null
+++ b/sysdeps/unix/arm/brk.S
@@ -0,0 +1,43 @@
+/* Copyright (C) 1991, 1992, 1993, 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 <sysdep.h>
+
+#ifndef	SYS_brk
+#define	SYS_brk	17
+#endif
+
+.data
+.globl C_SYMBOL_NAME(__curbrk)
+C_LABEL(__curbrk)
+#ifdef	HAVE_GNU_LD
+	.long C_SYMBOL_NAME(_end)
+#else
+	.long C_SYMBOL_NAME(end)
+#endif
+
+.text
+SYSCALL__ (brk, 1)
+	ldr r1, _cb_addr
+	str r0, [r1]
+	mov r0, $0
+	RETINSTR(mov, pc, r14)
+_cb_addr:	.long C_SYMBOL_NAME(__curbrk)
+	
+	
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/arm/sysdep.S b/sysdeps/unix/arm/sysdep.S
new file mode 100644
index 0000000000..5d3ad551c6
--- /dev/null
+++ b/sysdeps/unix/arm/sysdep.S
@@ -0,0 +1,49 @@
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 <sysdep.h>
+#define _ERRNO_H
+#include <errnos.h>
+
+.globl C_SYMBOL_NAME(errno)
+.globl syscall_error
+
+_errno_loc:	.long C_SYMBOL_NAME(errno)
+	
+#undef syscall_error
+#ifdef NO_UNDERSCORES
+__syscall_error:
+#else
+syscall_error:
+#endif
+#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
+	/* We translate the system's EWOULDBLOCK error into EAGAIN.
+	   The GNU C library always defines EWOULDBLOCK==EAGAIN.
+	   EWOULDBLOCK_sys is the original number.  */
+	cmp r0, $EWOULDBLOCK_sys /* Is it the old EWOULDBLOCK?  */
+	moveq r0, $EAGAIN	/* Yes; translate it to EAGAIN.  */
+#endif
+#ifndef	PIC
+	ldr r1, _errno_loc	
+	str r0, [r1]
+#endif
+	mvn r0, $0
+	RETINSTR(mov, pc, r14)
+
+#undef	__syscall_error
+END (__syscall_error)
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index d4b6bac217..fc403871f3 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -13,8 +13,7 @@ net/if_ppp.h
 net/ppp-comp.h
 net/ppp_defs.h
 net/route.h
-netatalk/atalk.h
-netinet/icmp.h
+netatalk/at.h
 netinet/if_fddi.h
 netinet/if_tr.h
 netinet/igmp.h
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 4e698ce1d8..c61904a3b8 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -55,7 +55,8 @@ endif
 ifeq ($(subdir),inet)
 sysdep_headers += netinet/in_systm.h netinet/udp.h \
 		  netinet/if_fddi.h netinet/if_tr.h netinet/igmp.h \
-		  netinet/ip_fw.h  netinet/ip_icmp.h sys/socketvar.h
+		  netinet/ip_fw.h  netinet/ip_icmp.h netipx/ipx.h \
+		  sys/socketvar.h
 endif
 
 # Don't compile the ctype glue code, since there is no old non-GNU C library.
diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.S b/sysdeps/unix/sysv/linux/arm/sysdep.S
new file mode 100644
index 0000000000..a71181c911
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/sysdep.S
@@ -0,0 +1,51 @@
+/* Copyright (C) 1995, 1996, 1997 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 <sysdep.h>
+
+/* We define errno here, to be consistent with Linux/i386.  */
+	.bss
+	.globl errno
+	.type errno,@object
+	.size errno,4
+errno:	.zero 4
+	.globl _errno
+	.type _errno,@object
+_errno = errno	/* This name is expected by hj's libc.so.5 startup code.  */
+	.text
+
+/* The following code is only used in the shared library when we
+   compile the reentrant version.  Otherwise each system call defines
+   each own version.  */
+
+#ifndef PIC
+
+/* The syscall stubs jump here when they detect an error.
+   The code for Linux is almost identical to the canonical Unix/i386
+   code, except that the error number in %eax is negated.  */
+
+#undef CALL_MCOUNT
+#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers %eax.  */
+
+ENTRY (__syscall_error)
+	mvn r0, r0
+
+#define __syscall_error __syscall_error_1
+#include <sysdeps/unix/arm/sysdep.S>
+
+#endif	/* !PIC */
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index a38e4b3531..66fbeca73e 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -62,6 +62,7 @@
 /* Store (- %eax) into errno through the GOT.  */
 #ifdef _LIBC_REENTRANT
 #define SYSCALL_ERROR_HANDLER						      \
+  .type syscall_error,@function;					      \
 syscall_error:								      \
   pushl %ebx;								      \
   call 0f;								      \
@@ -77,11 +78,13 @@ syscall_error:								      \
   popl %ebx;								      \
   movl %ecx, (%eax);							      \
   movl $-1, %eax;							      \
-  ret;
+  ret;									      \
+  .size syscall_error,.-syscall_error;
 /* A quick note: it is assumed that the call to `__errno_location' does
    not modify the stack!  */
 #else
 #define SYSCALL_ERROR_HANDLER						      \
+  .type syscall_error,@function;					      \
 syscall_error:								      \
   call 0f;								      \
 0:popl %ecx;								      \
@@ -91,7 +94,8 @@ syscall_error:								      \
   movl errno@GOT(%ecx), %ecx;						      \
   movl %edx, (%ecx);							      \
   movl $-1, %eax;							      \
-  ret;
+  ret;									      \
+  .size syscall_error,.-syscall_error;
 #endif	/* _LIBC_REENTRANT */
 #endif	/* PIC */
 
diff --git a/sysdeps/unix/sysv/linux/net/if_arp.h b/sysdeps/unix/sysv/linux/net/if_arp.h
index b1cd18360e..d784f0cfc7 100644
--- a/sysdeps/unix/sysv/linux/net/if_arp.h
+++ b/sysdeps/unix/sysv/linux/net/if_arp.h
@@ -90,6 +90,8 @@ struct arphdr
 #define ARPHRD_ROSE	270
 #define ARPHRD_X25	271		/* CCITT X.25.  */
 #define ARPHRD_PPP	512
+#define ARPHRD_HDLC	513		/* (Cisco) HDLC.  */
+#define ARPHRD_LAPB	516		/* LAPB.  */
 
 #define ARPHRD_TUNNEL	768		/* IPIP tunnel.  */
 #define ARPHRD_TUNNEL6	769		/* IPIP6 tunnel.  */
diff --git a/sysdeps/unix/sysv/linux/powerpc/Dist b/sysdeps/unix/sysv/linux/powerpc/Dist
index c8c265c474..27a951f169 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Dist
+++ b/sysdeps/unix/sysv/linux/powerpc/Dist
@@ -1,7 +1,6 @@
 clone.S
 ioctl-types.h
 termbits.h
-termios.h
 kernel_stat.h
 kernel_termios.h
 sys/kernel_termios.h
diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
index 1c79f6a93c..7280315933 100644
--- a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
+++ b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c
@@ -149,38 +149,3 @@ _dl_sysdep_open_zero_fill (void)
   return __open ("/dev/zero", O_RDONLY);
 }
 #endif
-
-/* Read the whole contents of FILE into new mmap'd space with given
-   protections.  *SIZEP gets the size of the file.  */
-
-void *
-_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
-{
-  void *result;
-  struct stat st;
-  int fd = __open (file, O_RDONLY);
-  if (fd < 0)
-    return NULL;
-  if (__fstat (fd, &st) < 0)
-    result = NULL;
-  else
-    {
-      /* Map a copy of the file contents.  */
-      result = __mmap (0, st.st_size, prot,
-#ifdef MAP_COPY
-		       MAP_COPY
-#else
-		       MAP_PRIVATE
-#endif
-#ifdef MAP_FILE
-		       | MAP_FILE
-#endif
-		       , fd, 0);
-      if (result == (void *) -1)
-	result = NULL;
-      else
-	*sizep = st.st_size;
-    }
-  __close (fd);
-  return result;
-}
diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/Dist
index ab22392c04..c31f140137 100644
--- a/sysdeps/unix/sysv/linux/sparc/Dist
+++ b/sysdeps/unix/sysv/linux/sparc/Dist
@@ -1,6 +1,5 @@
 __sigtrampoline.S
 clone.S
-start.c
 pipe.S
 fork.S
 kernel_stat.h
diff --git a/sysdeps/wordsize-32/Dist b/sysdeps/wordsize-32/Dist
new file mode 100644
index 0000000000..625e4d0fc7
--- /dev/null
+++ b/sysdeps/wordsize-32/Dist
@@ -0,0 +1 @@
+inttypes.h
\ No newline at end of file
diff --git a/sysdeps/wordsize-32/Makefile b/sysdeps/wordsize-32/Makefile
new file mode 100644
index 0000000000..73b64ed054
--- /dev/null
+++ b/sysdeps/wordsize-32/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),stdlib)
+sysdep_headers += inttypes.h
+endif
\ No newline at end of file
diff --git a/sysdeps/wordsize-64/Dist b/sysdeps/wordsize-64/Dist
new file mode 100644
index 0000000000..625e4d0fc7
--- /dev/null
+++ b/sysdeps/wordsize-64/Dist
@@ -0,0 +1 @@
+inttypes.h
\ No newline at end of file
diff --git a/sysdeps/wordsize-64/Makefile b/sysdeps/wordsize-64/Makefile
new file mode 100644
index 0000000000..73b64ed054
--- /dev/null
+++ b/sysdeps/wordsize-64/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),stdlib)
+sysdep_headers += inttypes.h
+endif
\ No newline at end of file