about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog101
-rw-r--r--FAQ.in2
-rw-r--r--Make-dist5
-rw-r--r--Makerules31
-rwxr-xr-xdebug/catchsegv.sh51
-rw-r--r--extra-lib.mk7
-rw-r--r--inet/protocols/rwhod.h3
-rw-r--r--libio/stdio.h3
-rw-r--r--manual/memory.texi20
-rw-r--r--manual/signal.texi3
-rw-r--r--manual/top-menu.texi7
-rw-r--r--posix/fnmatch.c183
-rw-r--r--posix/glob.h2
-rw-r--r--posix/regex.c2
-rw-r--r--shlib-versions3
-rw-r--r--stdio/Versions3
-rw-r--r--stdio/fputs.c3
-rw-r--r--stdio/stdio.h7
-rw-r--r--sysdeps/arm/dl-machine.h2
-rw-r--r--sysdeps/generic/glob.c190
-rw-r--r--sysdeps/generic/paths.h1
-rw-r--r--sysdeps/generic/segfault.c8
-rw-r--r--sysdeps/generic/sigcontextinfo.h2
-rw-r--r--sysdeps/generic/sigsuspend.c7
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c53
-rw-r--r--sysdeps/mach/hurd/i386/sigcontextinfo.h22
-rw-r--r--sysdeps/mach/hurd/sigsuspend.c6
-rw-r--r--sysdeps/posix/sigsuspend.c5
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/paths.h1
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/sigpending.c37
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/sigstack.c3
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c2
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S2
-rw-r--r--sysdeps/unix/sysv/sysv4/solaris2/syscalls.list4
-rw-r--r--timezone/leapseconds3
36 files changed, 554 insertions, 232 deletions
diff --git a/ChangeLog b/ChangeLog
index fe9d421510..c6b8fbd9b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,104 @@
+1998-07-20 17:09  Ulrich Drepper  <drepper@cygnus.com>
+
+	* shlib-versions: Remove definition for libSegFault.
+
+	* memory.texi: Comment out the relocating allocator description.
+	* manual/signal.texi: Remove reference to relocating allocator.
+	* manual/top-menu.texi: Regenerated.
+
+	* posix/fnmatch.c: Implement [: :] and change to recognize
+	^ as negation only when not _POSIXLY_CORRECT.
+
+	* sysdeps/generic/glob.c: Add several optimizations.
+
+	* posix/glob.h: Undefine __PMT to prevent warnings.
+	Reported by Roland McGrath.
+
+	* posix/regex.c: Define namespace macros only for _LIBC.
+
+	* sysdeps/arm/dl-machine.h: Fix typo.
+
+	* sysdeps/unix/sysv/sysv4/solaris2/sigpending.c: New file.
+	* sysdeps/unix/sysv/sysv4/solaris2/sigstack.c: New file.
+	* sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c: New file.
+	* sysdeps/unix/sysv/sysv4/solaris2/syscalls.list: Add sigaltstack,
+	sigpending, sigqueue, and sigtimedwait.
+	* sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S: New file.
+
+	* timezone/leapseconds: Update from tzdata1998f.
+
+1998-07-18  Mark Kettenis  <kettenis@phys.uva.nl>
+
+	* stdio/stdio.h [__USE_GNU]: Add prototype for fputs_unlocked.
+	* stdio/Versions [GLIBC_2.1]: Add fputs_unlocked.
+	* libio/stdio.h: Fix typo.
+
+1998-07-19  Roland McGrath  <roland@baalperazim.frob.com>
+
+	* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start): #if 0 out the
+	magic memobj port arg parsing stuff.  Fix it someday when we are ready
+	to really use it.
+	(_dl_sysdep_output): New function, modified from _dl_sysdep_error.
+	(_dl_sysdep_error, _dl_sysdep_message, _dl_sysdep_fatal): Removed.
+
+1998-07-19  Roland McGrath  <roland@baalperazim.frob.com>
+
+	* stdio/fputs.c: Add fputs_unlocked as weak alias for fputs.
+
+1998-07-19  Roland McGrath  <roland@baalperazim.frob.com>
+
+	* sysdeps/posix/sigsuspend.c: Define __sigsuspend with sigsuspend as
+	a weak alias.
+	* sysdeps/mach/hurd/sigsuspend.c: Likewise.
+	* sysdeps/generic/sigsuspend.c: Likewise.
+
+1998-07-19  Roland McGrath  <roland@baalperazim.frob.com>
+
+	* sysdeps/mach/hurd/i386/sigcontextinfo.h: New file.
+
+1998-07-19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* Makerules (map-file): Don't use $(wildcard) to find the
+	generated version script, instead look in $(version-maps).
+	($(common-objpfx)libc.so): Only depend on libc.map if versioning
+	is used.
+	* extra-lib.mk ($(objpfx)$(lib).so): Only depend on version script
+	if versioning is used.  Don't use $(wildcard) to find the
+	generated version script, instead look in $(verson-maps).
+
+1998-07-17  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/generic/segfault.c: Rename GET_EIP to GET_PC.  Remove
+	unused function handle.
+	* sysdeps/generic/sigcontextinfo.h: Rename GET_EIP to GET_PC.
+	* sysdeps/unix/sysv/linux/i386/sigcontextinfo.h: Likewise.
+	* debug/catchsegv.sh: Fix argument processing, quoting and various
+	typos.  Put the crash info always in the current directory.  Find
+	program in $PATH if it contains no directory component.
+	* Makerules (install-lib.so-versioned,
+	install-lib.so-unversioned): New variables.
+	(install-lib-nosubdir): Depend on unversioned libs in
+	slibdir, not libdir.
+
+1998-07-19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* Make-dist (+tsrcs): Remove references to %-map variables and
+	*.map files.  Add Versions in subdirs.
+	* Makerules (distinfo-vars): Don't write out %-map variables.
+
+1998-07-20 13:55  Ulrich Drepper  <drepper@cygnus.com>
+
+	* inet/protocols/rwhod.h: Remove definition of _PATH_RWHODIR.
+	Include <paths.h> instead.
+	* sysdeps/generic/paths.h: Define _PATH_RWHODIR.
+	* sysdeps/unix/sysv/linux/paths.h: Likewise.
+	Reported by Dale Scheetz <dwarf@polaris.net>.
+
+1998-07-17 21:44  Ulrich Drepper  <drepper@cygnus.com>
+
+	* catgets/open_catalog.c: Strictly check whether catalog file is
+	larger enough for the data.  Reported by Andries.Brouwer@cwi.nl.
+
 1998-07-17  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
 
 	* sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h: New file.
diff --git a/FAQ.in b/FAQ.in
index 3f6aa3aa79..eeeb2f546c 100644
--- a/FAQ.in
+++ b/FAQ.in
@@ -826,7 +826,7 @@ new type.
 
 {UD,AJ} On Linux, the use of kernel headers is reduced to the minimum.  This
 gives Linus the ability to change the headers more freely.  Also, user
-programs are not insulated from changes in the size of kernel data
+programs are now insulated from changes in the size of kernel data
 structures.
 
 For example, the sigset_t type is 32 or 64 bits wide in the kernel.  In
diff --git a/Make-dist b/Make-dist
index 9f9531daae..ed1dec4d47 100644
--- a/Make-dist
+++ b/Make-dist
@@ -122,8 +122,7 @@ sources := $(filter-out $(addsuffix .c,$(basename $(.S.s))),$(sources)) $(.S.s)
 	$(+subdir-nodist) $(dont_distribute)
 foo:=$(shell echo '+out=$(+out)' >&2; echo foofoo >&2)
 +tsrcs	:= $(filter-out $(+out), $(sources) $(all-headers) $(distribute)) \
-	   $(foreach l,$(extra-libs),$($l-map)) \
-	   $(wildcard $(addsuffix .map,$(extra-libs))) $(+sysdeps)
+	   $(+sysdeps)
 foo:=$(shell echo 'made +tsrcs=$(+tsrcs)'>&2)
 foo:=$(shell echo generated='$(generated)' >&2)
 #generated := $(sort $(generated) $(generated:.S=.c) $(generated:.s=.c))
@@ -149,7 +148,7 @@ ifdef	   subdir
 
 foo:=$(shell echo subdir foo >&2)
 
-+tsrcs := Makefile $(+tsrcs) \
++tsrcs := Makefile $(wildcard Versions) $(+tsrcs) \
 	  $(addsuffix .c,$(others) $(tests) $(tests-static) $(test-srcs)) \
 	  $(wildcard $(addsuffix .input,$(tests) (tests-static) $(test-srcs)) \
 	  $(addsuffix .args,$(tests) $(tests-static) $(test-srcs)))
diff --git a/Makerules b/Makerules
index 9bf62c6cf6..ec6b12ccfd 100644
--- a/Makerules
+++ b/Makerules
@@ -350,8 +350,9 @@ ifeq (yes,$(build-shared))
 # Reference map file only when versioning is selected and a map file name
 # is given.
 ifeq ($(versioning),yes)
-map-file = $(firstword $(wildcard $($(@F:.so=-map)) \
-				  $(common-objpfx)$(@F:.so=.map)))
+map-file = $(firstword $($(@F:.so=-map)) \
+		       $(addprefix $(common-objpfx), \
+				   $(filter $(@F:.so=.map),$(version-maps))))
 load-map-file = $(map-file:%=-Wl,--version-script=%)
 endif
 
@@ -370,8 +371,7 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
 	  $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
 	  -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
 	  -Wl,--whole-archive \
-	  $(filter-out $(map-file) $(common-objpfx)$(@F:.so=.map) \
-		       $(+preinit) $(+postinit),$^) \
+	  $(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
 	  $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
 endef
 
@@ -411,9 +411,11 @@ $(common-objpfx)libc_pic.os: $(common-objpfx)libc_pic.a
 $(common-objpfx)libc.so: $(elfobjdir)/soinit.os \
 			 $(common-objpfx)libc_pic.os \
 			 $(elfobjdir)/sofini.os \
-			 $(elfobjdir)/interp.os $(elfobjdir)/ld.so \
-			 $(common-objpfx)libc.map
+			 $(elfobjdir)/interp.os $(elfobjdir)/ld.so
 	$(build-shlib)
+ifeq ($(versioning),yes)
+$(common-objpfx)libc.so: $(common-objpfx)libc.map
+endif
 common-generated += libc.so libc_pic.os
 ifdef libc.so-version
 $(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
@@ -615,17 +617,22 @@ endef
 
 install-lib.so := $(filter %.so,$(install-lib:%_pic.a=%.so))
 install-lib := $(filter-out %.so %_pic.a,$(install-lib))
-ifeq (yes,$(build-shared))
-
-install-lib-nosubdir: $(install-lib.so:%=$(inst_libdir)/%)
 
+ifeq (yes,$(build-shared))
 # Find which .so's have versions.
 versioned := $(strip $(foreach so,$(install-lib.so),\
 			       $(patsubst %,$(so),$($(so)-version))))
 
+install-lib.so-versioned := $(filter $(versioned), $(install-lib.so))
+install-lib.so-unversioned := $(filter-out $(versioned), $(install-lib.so))
+
+install-lib-nosubdir: $(install-lib.so-versioned:%=$(inst_libdir)/%) \
+		      $(install-lib.so-unversioned:%=$(inst_slibdir)/%)
+
 # Install all the unversioned shared libraries.
-$(addprefix $(inst_slibdir)/, $(filter-out $(versioned),$(install-lib.so))): \
-	$(inst_slibdir)/%.so: $(objpfx)%.so $(+force); $(do-install-program)
+$(install-lib.so-unversioned:%=$(inst_slibdir)/%): $(inst_slibdir)/%.so: \
+    $(objpfx)%.so $(+force)
+	$(do-install-program)
 
 ifneq ($(findstring -s,$(LN_S)),)
 define make-link
@@ -954,7 +961,7 @@ echo > $@.new 'subdir := $(subdir)'
 $(foreach var,subdir-dirs sources elided-routines sysdep_routines \
 	      headers sysdep_headers distribute dont_distribute generated \
 	      others tests test-srcs extra-libs $(extra-libs:%=%-routines) \
-	      tests-static $(extra-libs:%=%-map) versioned \
+	      tests-static versioned \
 	      $(addprefix install-,lib lib.so data bin sbin others),
 echo >> $@.new '$(subdir)-$(var) := $($(var))'
 echo >> $@.new '$(var) = $$($(subdir)-$(var))')
diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh
index 26407a7ae6..48c447b039 100755
--- a/debug/catchsegv.sh
+++ b/debug/catchsegv.sh
@@ -19,9 +19,14 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 # Boston, MA 02111-1307, USA.
 
+if test $# -eq 0; then
+  echo "$0: missing programm name" >&2
+  echo "Try \`$0 --help' for more information." >&2
+  exit 1
+fi
+
 prog="$1"
 shift
-args="$*"
 
 if test $# -eq 0; then
   case "$prog" in
@@ -45,31 +50,43 @@ Written by Ulrich Drepper.'
   esac
 fi
 
-LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so@SOVER@"
-export LD_PRELOAD
-SEGFAULT_USE_ALTSTACK=1
-export SEGFAULT_USE_ALTSTACK
-SEGFAULT_OUTPUT_NAME="${TMPDIR:-/tmp}/`basename $prog`.segv.$$"
-export SEGFAULT_OUTPUT_NAME
+segv_output=`basename "$prog"`.segv.$$
 
-$prog $args
+LD_PRELOAD=${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so \
+SEGFAULT_USE_ALTSTACK=1 \
+SEGFAULT_OUTPUT_NAME=$segv_output \
+"$prog" ${1+"$@"}
 exval=$?
 
-unset LD_PRELOAD
-# Check for an segmentation error.
-if test $exval -eq 139; then
+# Check for a segmentation error.
+if test $exval -eq 139 && test -f "$segv_output"; then
   # We caught a segmentation error.  The output is in the file with the
   # name we have in SEGFAULT_OUTPUT_NAME.  In the output the names of
   # functions in shared objects are available, but names in the static
   # part of the program are not.  We use addr2line to get this information.
+  case $prog in
+  */*) ;;
+  *)
+    old_IFS=$IFS
+    IFS=:
+    for p in $PATH; do
+      test -n "$p" || p=.
+      if test -f "$p/$prog"; then
+	prog=$p/$prog
+      break
+      fi
+    done
+    IFS=$old_IFS
+    ;;
+  esac
   (read line; echo "$line"
    read line; echo "$line"
    while read line; do
      case "$line" in
-       [*) addr="`echo $line | sed 's/^\[\(.*\)\]$/\1/'`"
-           complete="`addr2line -f -e $prog $addr 2>/dev/null`"
-           if test $? -eq 0; then
-             echo "`echo $complete|sed 's/\(.*\) \(.*\)/\2(\1)/;'`$line"
+       [*) addr=`echo $line | sed 's/^\[\(.*\)\]$/\1/'`
+	   complete=`addr2line -f -e "$prog" $addr 2>/dev/null`
+	   if test $? -eq 0; then
+             echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line"
            else
              echo "$line"
            fi
@@ -77,8 +94,8 @@ if test $exval -eq 139; then
         *) echo "$line"
            ;;
      esac
-   done) < $SEGFAULT_OUTPUT_NAME
-   rm $SEGFAULT_OUTPUT_NAME
+   done) < "$segv_output"
+   rm -f "$segv_output"
 fi
 
 exit $exval
diff --git a/extra-lib.mk b/extra-lib.mk
index 0b79d4a459..87d4fa3863 100644
--- a/extra-lib.mk
+++ b/extra-lib.mk
@@ -49,7 +49,12 @@ endef
 object-suffixes-left = $(object-suffixes-$(lib))
 include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-$(lib)))
 
+ifeq ($(versioning),yes)
 # Add the version script to the dependencies of the shared library.
-$(objpfx)$(lib).so: $(firstword $(wildcard $($(lib)-map) $(lib).map $(..)$(lib).map))
+$(objpfx)$(lib).so: $(firstword $($(lib)-map) \
+				$(addprefix $(common-objpfx), \
+					    $(filter $(lib).map, \
+						     $(version-maps))))
+endif
 
 endif
diff --git a/inet/protocols/rwhod.h b/inet/protocols/rwhod.h
index e5d9f991a8..ad790fc9a9 100644
--- a/inet/protocols/rwhod.h
+++ b/inet/protocols/rwhod.h
@@ -65,6 +65,7 @@ struct	whod {
 #define	WHODVERSION	1
 #define	WHODTYPE_STATUS	1		/* host status */
 
-#define	_PATH_RWHODIR	"/var/rwho"
+/* We used to define _PATH_RWHOD here but it's now in <paths.h>.  */
+#include <paths.h>
 
 #endif /* protocols/rwhod.h */
diff --git a/libio/stdio.h b/libio/stdio.h
index 87ca35b068..a3ae40b536 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -518,10 +518,11 @@ extern int fputs __P ((__const char *__restrict __s,
 		       FILE *__restrict __stream));
 
 #ifdef __USE_GNU
-/* This function does the same as `fgets' but does not lock the stream.  */
+/* This function does the same as `fputs' but does not lock the stream.  */
 extern int fputs_unlocked __P ((__const char *__restrict __s,
 				FILE *__restrict __stream));
 #endif
+
 /* Write a string, followed by a newline, to stdout.  */
 extern int puts __P ((__const char *__s));
 
diff --git a/manual/memory.texi b/manual/memory.texi
index b87bc3f160..a3cf3724b3 100644
--- a/manual/memory.texi
+++ b/manual/memory.texi
@@ -38,8 +38,6 @@ will be freed automatically.  @xref{Variable Size Automatic}.
 * Variable Size Automatic::     Allocation of variable-sized blocks
 				 of automatic storage that are freed when the
 				 calling function returns.
-* Relocating Allocator::        Waste less memory, if you can tolerate
-				 automatic relocation of the blocks you get.
 @end menu
 
 @node Memory Concepts
@@ -2030,7 +2028,8 @@ within one function, exiting a scope in which a variable-sized array was
 declared frees all blocks allocated with @code{alloca} during the
 execution of that scope.
 
-
+@ignore
+@c This was never actually implemented.  -zw
 @node Relocating Allocator
 @section Relocating Allocator
 
@@ -2040,10 +2039,10 @@ space it uses is more than the amount the program asks for.  The
 @dfn{relocating memory allocator} achieves very low overhead by moving
 blocks in memory as necessary, on its own initiative.
 
-@menu
-* Relocator Concepts::		How to understand relocating allocation.
-* Using Relocator::		Functions for relocating allocation.
-@end menu
+@c @menu
+@c * Relocator Concepts::		How to understand relocating allocation.
+@c * Using Relocator::		Functions for relocating allocation.
+@c @end menu
 
 @node Relocator Concepts
 @subsection Concepts of Relocating Allocation
@@ -2085,7 +2084,7 @@ extensions.
 
 @comment malloc.h
 @comment GNU
-@deftypefun {void *} r_alloc (void **@var{handleptr}, size_t @var{size})
+@c @deftypefun {void *} r_alloc (void **@var{handleptr}, size_t @var{size})
 This function allocates a relocatable block of size @var{size}.  It
 stores the block's address in @code{*@var{handleptr}} and returns
 a non-null pointer to indicate success.
@@ -2096,7 +2095,7 @@ in @code{*@var{handleptr}}, and returns a null pointer.
 
 @comment malloc.h
 @comment GNU
-@deftypefun void r_alloc_free (void **@var{handleptr})
+@c @deftypefun void r_alloc_free (void **@var{handleptr})
 This function is the way to free a relocatable block.  It frees the
 block that @code{*@var{handleptr}} points to, and stores a null pointer
 in @code{*@var{handleptr}} to show it doesn't point to an allocated
@@ -2105,7 +2104,7 @@ block any more.
 
 @comment malloc.h
 @comment GNU
-@deftypefun {void *} r_re_alloc (void **@var{handleptr}, size_t @var{size})
+@c @deftypefun {void *} r_re_alloc (void **@var{handleptr}, size_t @var{size})
 The function @code{r_re_alloc} adjusts the size of the block that
 @code{*@var{handleptr}} points to, making it @var{size} bytes long.  It
 stores the address of the resized block in @code{*@var{handleptr}} and
@@ -2114,6 +2113,7 @@ returns a non-null pointer to indicate success.
 If enough memory is not available, this function returns a null pointer
 and does not modify @code{*@var{handleptr}}.
 @end deftypefun
+@end ignore
 
 @ignore
 @comment No longer available...
diff --git a/manual/signal.texi b/manual/signal.texi
index 029485c8e0..b3f67b6685 100644
--- a/manual/signal.texi
+++ b/manual/signal.texi
@@ -1900,8 +1900,11 @@ handlers.  The obstack allocation functions are safe as long as you
 don't use the same obstack both inside and outside of a signal handler.
 @end ignore
 
+@ignore
+@comment Once we have r_alloc again add this paragraph.
 The relocating allocation functions (@pxref{Relocating Allocator})
 are certainly not safe to use in a signal handler.
+@end ignore
 
 @item
 Any function that modifies @code{errno} is non-reentrant, but you can
diff --git a/manual/top-menu.texi b/manual/top-menu.texi
index 6ff8bd64d1..05a8ed680e 100644
--- a/manual/top-menu.texi
+++ b/manual/top-menu.texi
@@ -116,8 +116,6 @@ Memory Allocation
 * Variable Size Automatic::     Allocation of variable-sized blocks
 				 of automatic storage that are freed when the
 				 calling function returns.
-* Relocating Allocator::        Waste less memory, if you can tolerate
-				 automatic relocation of the blocks you get.
 
 Unconstrained Allocation
 
@@ -176,11 +174,6 @@ Variable Size Automatic
 				 method of allocating dynamically and
 				 freeing automatically.
 
-Relocating Allocator
-
-* Relocator Concepts::		How to understand relocating allocation.
-* Using Relocator::		Functions for relocating allocation.
-
 Character Handling
 
 * Classification of Characters::   Testing whether characters are
diff --git a/posix/fnmatch.c b/posix/fnmatch.c
index e143743215..4f5c667b02 100644
--- a/posix/fnmatch.c
+++ b/posix/fnmatch.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 96, 97, 98 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    This library is free software; you can redistribute it and/or
@@ -29,6 +29,23 @@
 #include <fnmatch.h>
 #include <ctype.h>
 
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
+#ifdef	STDC_HEADERS
+# include <stdlib.h>
+#endif
+
+/* For platform which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+# include <wchar.h>
+# include <wctype.h>
+#endif
 
 /* Comment out all this code if we are using the GNU C Library, and are not
    actually compiling the library itself.  This code is part of the GNU C
@@ -47,8 +64,64 @@
 #  define ISASCII(c) isascii(c)
 # endif
 
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
+#ifdef isblank
+# define ISBLANK(c) (ISASCII (c) && isblank (c))
+#else
+# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+#ifdef isgraph
+# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+#else
+# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+#endif
+
+#define ISPRINT(c) (ISASCII (c) && isprint (c))
+#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+#define ISALNUM(c) (ISASCII (c) && isalnum (c))
+#define ISALPHA(c) (ISASCII (c) && isalpha (c))
+#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+#define ISLOWER(c) (ISASCII (c) && islower (c))
+#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+#define ISSPACE(c) (ISASCII (c) && isspace (c))
+#define ISUPPER(c) (ISASCII (c) && isupper (c))
+#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendement 1.  */
+#  ifdef CHARCLASS_NAME_MAX
+#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+#  else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#   define CHAR_CLASS_MAX_LENGTH 256
+#  endif
+
+#  ifdef _LIBC
+#   define IS_CHAR_CLASS(string) __wctype (string)
+#  else
+#   define IS_CHAR_CLASS(string) wctype (string)
+#  endif
+# else
+#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#  define IS_CHAR_CLASS(string)						      \
+   (STREQ (string, "alpha") || STREQ (string, "upper")			      \
+    || STREQ (string, "lower") || STREQ (string, "digit")		      \
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")		      \
+    || STREQ (string, "space") || STREQ (string, "print")		      \
+    || STREQ (string, "punct") || STREQ (string, "graph")		      \
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
 
+# if !defined _LIBC && !defined getenv
+extern char *getenv ();
+# endif
 
 # ifndef errno
 extern int errno;
@@ -66,7 +139,11 @@ fnmatch (pattern, string, flags)
   register char c;
 
 /* Note that this evaluates C many times.  */
-# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# ifdef _LIBC
+#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# else
+#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# endif
 
   while ((c = *p++) != '\0')
     {
@@ -137,67 +214,104 @@ fnmatch (pattern, string, flags)
 	case '[':
 	  {
 	    /* Nonzero if the sense of the character class is inverted.  */
+	    static int posixly_correct;
 	    register int not;
 
+	    if (posixly_correct == 0)
+	      posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
 	    if (*n == '\0')
 	      return FNM_NOMATCH;
 
-	    if ((flags & FNM_PERIOD) && *n == '.' &&
+	    if (*n == '.' && (flags & FNM_PERIOD) &&
 		(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
 	      return FNM_NOMATCH;
 
-	    not = (*p == '!' || *p == '^');
+	    not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
 	    if (not)
 	      ++p;
 
 	    c = *p++;
 	    for (;;)
 	      {
-		register char cstart = c, cend = c;
+		int fn = FOLD (*n);
 
 		if (!(flags & FNM_NOESCAPE) && c == '\\')
 		  {
 		    if (*p == '\0')
 		      return FNM_NOMATCH;
-		    cstart = cend = *p++;
+		    c = FOLD (*p++);
+
+		    if (c == fn)
+		      goto matched;
 		  }
+		else if (c == '[' && *p == ':')
+		  {
+		    /* Leave room for the null.  */
+		    char str[CHAR_CLASS_MAX_LENGTH + 1];
+		    size_t c1 = 0;
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+		    wctype_t wt;
+# endif
 
-		cstart = cend = FOLD (cstart);
+		    for (;;)
+		      {
+			if (c1 == CHAR_CLASS_MAX_LENGTH)
+			  /* The name is too long and therefore the pattern
+			     is ill-formed.  */
+			  return FNM_NOMATCH;
+
+			c = *++p;
+			if (c == ':' && p[1] == ']')
+			  {
+			    p += 2;
+			    break;
+			  }
+			str[c1++] = 'c';
+		      }
+		    str[c1] = '\0';
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+		    wt = IS_CHAR_CLASS (str);
+		    if (wt == 0)
+		      /* Invalid character class name.  */
+		      return FNM_NOMATCH;
 
-		if (c == '\0')
+		    if (__iswctype (__btowc (*n), wt))
+		      goto matched;
+# else
+		    if ((STREQ (str, "alnum") && ISALNUM (*n))
+			|| (STREQ (str, "alpha") && ISALPHA (*n))
+			|| (STREQ (str, "blank") && ISBLANK (*n))
+			|| (STREQ (str, "cntrl") && ISCNTRL (*n))
+			|| (STREQ (str, "digit") && ISDIGIT (*n))
+			|| (STREQ (str, "graph") && ISGRAPH (*n))
+			|| (STREQ (str, "lower") && ISLOWER (*n))
+			|| (STREQ (str, "print") && ISPRINT (*n))
+			|| (STREQ (str, "punct") && ISPUNCT (*n))
+			|| (STREQ (str, "space") && ISSPACE (*n))
+			|| (STREQ (str, "upper") && ISUPPER (*n))
+			|| (STREQ (str, "xdigit") && ISXDIGIT (*n)))
+		      goto matched;
+# endif
+		  }
+		else if (c == '\0')
 		  /* [ (unterminated) loses.  */
 		  return FNM_NOMATCH;
+		else if (FOLD (c) == fn)
+		  goto matched;
 
 		c = *p++;
-		c = FOLD (c);
-
-		if ((flags & FNM_FILE_NAME) && c == '/')
-		  /* [/] can never match.  */
-		  return FNM_NOMATCH;
-
-		if (c == '-' && *p != ']')
-		  {
-		    cend = *p++;
-		    if (!(flags & FNM_NOESCAPE) && cend == '\\')
-		      cend = *p++;
-		    if (cend == '\0')
-		      return FNM_NOMATCH;
-		    cend = FOLD (cend);
-
-		    c = *p++;
-		  }
-
-		if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
-		  goto matched;
 
 		if (c == ']')
 		  break;
 	      }
+
 	    if (!not)
 	      return FNM_NOMATCH;
 	    break;
 
-	  matched:;
+	  matched:
 	    /* Skip the rest of the [...] that already matched.  */
 	    while (c != ']')
 	      {
@@ -213,6 +327,15 @@ fnmatch (pattern, string, flags)
 		    /* XXX 1003.2d11 is unclear if this is right.  */
 		    ++p;
 		  }
+		else if (c == '[' && *p == ':')
+		  {
+		    do
+		      if (*++p == '\0')
+			return FNM_NOMATCH;
+		    while (*p != ':' || p[1] == ']');
+		    p += 2;
+		    c = *p;
+		  }
 	      }
 	    if (not)
 	      return FNM_NOMATCH;
diff --git a/posix/glob.h b/posix/glob.h
index 5a8e48c196..91d95494e7 100644
--- a/posix/glob.h
+++ b/posix/glob.h
@@ -25,6 +25,7 @@ extern "C" {
 #undef	__ptr_t
 #if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
 # undef	__P
+# undef __PMT
 # define __P(protos)	protos
 # define __PMT(protos)	protos
 # define __ptr_t	void *
@@ -34,6 +35,7 @@ extern "C" {
 # endif
 #else /* Not C++ or ANSI C.  */
 # undef	__P
+# undef __PMT
 # define __P(protos)	()
 # define __PMT(protos)	()
 # undef	__const
diff --git a/posix/regex.c b/posix/regex.c
index 3868da3eb7..62c41c11bb 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -52,7 +52,9 @@
 /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
 # include <wchar.h>
 # include <wctype.h>
+#endif
 
+#ifdef _LIBC
 /* We have to keep the namespace clean.  */
 # define regfree(preg) __regfree (preg)
 # define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
diff --git a/shlib-versions b/shlib-versions
index eccb027cb9..2745152679 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -82,6 +82,3 @@ alpha.*-.*-linux.*	libBrokenLocale=1.1
 
 # The real-time library from POSIX.1b.
 .*-.*-.*		librt=1
-
-# Preloading modules.
-.*-.*-.*		libSegFault=1
diff --git a/stdio/Versions b/stdio/Versions
index e3df0765a6..9700ba68cc 100644
--- a/stdio/Versions
+++ b/stdio/Versions
@@ -53,7 +53,8 @@ libc {
 
     # f*
     feof_unlocked; ferror_unlocked; fflush_unlocked;  fgets_unlocked;
-    fileno_unlocked; fputc_unlocked; fread_unlocked; fwrite_unlocked;
+    fileno_unlocked; fputc_unlocked; fputs_unlocked;
+    fread_unlocked; fwrite_unlocked;
 
     # g*
     getc_unlocked; getchar_unlocked;
diff --git a/stdio/fputs.c b/stdio/fputs.c
index 16406bbb6a..8e5e72512b 100644
--- a/stdio/fputs.c
+++ b/stdio/fputs.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1997, 1998 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
@@ -32,3 +32,4 @@ fputs (const char *s, FILE *stream)
     return EOF;
   return 0;
 }
+weak_alias (fputs, fputs_unlocked)
diff --git a/stdio/stdio.h b/stdio/stdio.h
index eac8bd41b1..7594f13840 100644
--- a/stdio/stdio.h
+++ b/stdio/stdio.h
@@ -684,6 +684,13 @@ getline (char **__lineptr, size_t *__n, FILE *__stream)
 /* Write a string to STREAM.  */
 extern int fputs __P ((__const char *__restrict __s,
 		       FILE *__restrict __stream));
+
+#ifdef __USE_GNU
+/* This function does the same as `fputs' but does not lock the stream.  */
+extern int fputs_unlocked __P ((__const char *__restrict __s,
+				FILE *__restrict __stream));
+#endif
+
 /* Write a string, followed by a newline, to stdout.  */
 extern int puts __P ((__const char *__s));
 
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index e6a686e626..7612285907 100644
--- a/sysdeps/arm/dl-machine.h
+++ b/sysdeps/arm/dl-machine.h
@@ -313,7 +313,7 @@ _dl_start_user:
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT	R_ARM_JUMP_SLOT
 
-/* The i386 never uses Elf32_Rela relocations.  */
+/* The ARM never uses Elf32_Rela relocations.  */
 #define ELF_MACHINE_NO_RELA 1
 
 /* We define an initialization functions.  This is called very early in
diff --git a/sysdeps/generic/glob.c b/sysdeps/generic/glob.c
index 70d125c200..9182c0585a 100644
--- a/sysdeps/generic/glob.c
+++ b/sysdeps/generic/glob.c
@@ -797,10 +797,10 @@ glob (pattern, flags, errfunc, pglob)
       int i;
       struct stat st;
       for (i = oldcount; i < pglob->gl_pathc; ++i)
-	if (((flags & GLOB_ALTDIRFUNC) ?
-	     (*pglob->gl_stat) (pglob->gl_pathv[i], &st) :
-	     __stat (pglob->gl_pathv[i], &st)) == 0 &&
-	    S_ISDIR (st.st_mode))
+	if (((flags & GLOB_ALTDIRFUNC)
+	     ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
+	     : __stat (pglob->gl_pathv[i], &st)) == 0
+	    && S_ISDIR (st.st_mode))
 	  {
  	    size_t len = strlen (pglob->gl_pathv[i]) + 2;
 	    char *new = realloc (pglob->gl_pathv[i], len);
@@ -958,7 +958,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
      int (*errfunc) __P ((const char *, int));
      glob_t *pglob;
 {
-  __ptr_t stream;
+  __ptr_t stream = NULL;
 
   struct globlink
     {
@@ -970,92 +970,127 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
   int meta;
   int save;
 
-  stream = ((flags & GLOB_ALTDIRFUNC) ?
- 	    (*pglob->gl_opendir) (directory) :
-	    (__ptr_t) opendir (directory));
-  if (stream == NULL)
+  meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
+  if (meta == 0)
     {
-      if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
-	  (flags & GLOB_ERR))
-	return GLOB_ABORTED;
+      if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
+	/* We need not do any tests.  The PATTERN contains no meta
+	   characters and we must not return an error therefore the
+	   result will always contain exactly the one name.  */
+	flags |= GLOB_NOCHECK;
+      else
+	{
+	  /* Since we use the normal file functions we can also use stat()
+	     to verify the file is there.  */
+	  struct stat st;
+	  size_t patlen = strlen (pattern);
+	  size_t dirlen = strlen (directory);
+	  char *fullname = __alloca (dirlen + 1 + patlen + 1);
+
+# ifdef HAVE_MEMPCPY
+	  mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
+			    "/", 1),
+		   pattern, patlen + 1);
+# else
+	  memcpy (fullname, directory, dirlen);
+	  fullname[dirlen] = '/';
+	  memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
+# endif
+	  if (((flags & GLOB_ALTDIRFUNC)
+	       ? (*pglob->gl_stat) (fullname, &st)
+	       : __stat (fullname, &st)) == 0)
+	    /* We found this file to be existing.  No tell the rest
+	       of the function to copy this name into the result.  */
+	    flags |= GLOB_NOCHECK;
+	}
+
       nfound = 0;
-      meta = 0;
-    }
-  else if (pattern[0] == '\0')
-    {
-      /* This is a special case for matching directories like in
-	 "*a/".  */
-      names = (struct globlink *) __alloca (sizeof (struct globlink));
-      names->name = (char *) malloc (1);
-      if (names->name == NULL)
-	goto memory_error;
-      names->name[0] = '\0';
-      names->next = NULL;
-      nfound = 1;
-      meta = 0;
     }
   else
     {
-      nfound = 0;
-      meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
-      if(meta)
-	flags |= GLOB_MAGCHAR;
-
-      while (1)
+      if (pattern[0] == '\0')
 	{
-	  const char *name;
-	  size_t len;
-	  struct dirent *d = ((flags & GLOB_ALTDIRFUNC) ?
-			      (*pglob->gl_readdir) (stream) :
-			      readdir ((DIR *) stream));
-	  if (d == NULL)
-	    break;
-	  if (! REAL_DIR_ENTRY (d))
-	    continue;
+	  /* This is a special case for matching directories like in
+	     "*a/".  */
+	  names = (struct globlink *) __alloca (sizeof (struct globlink));
+	  names->name = (char *) malloc (1);
+	  if (names->name == NULL)
+	    goto memory_error;
+	  names->name[0] = '\0';
+	  names->next = NULL;
+	  nfound = 1;
+	  meta = 0;
+	}
+      else
+	{
+	  stream = ((flags & GLOB_ALTDIRFUNC)
+		    ? (*pglob->gl_opendir) (directory)
+		    : (__ptr_t) opendir (directory));
+	  if (stream == NULL)
+	    {
+	      if ((errfunc != NULL && (*errfunc) (directory, errno))
+		  || (flags & GLOB_ERR))
+		return GLOB_ABORTED;
+	      nfound = 0;
+	      meta = 0;
+	    }
+	  else
+	    {
+	      int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
+			       | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
+#if defined _AMIGA || defined VMS
+				   | FNM_CASEFOLD
+#endif
+				   );
+	      nfound = 0;
+	      flags |= GLOB_MAGCHAR;
+
+	      while (1)
+		{
+		  const char *name;
+		  size_t len;
+		  struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
+				      ? (*pglob->gl_readdir) (stream)
+				      : readdir ((DIR *) stream));
+		  if (d == NULL)
+		    break;
+		  if (! REAL_DIR_ENTRY (d))
+		    continue;
 
 #ifdef HAVE_D_TYPE
-	  /* If we shall match only directories use the information
-	     provided by the dirent call if possible.  */
-	  if ((flags & GLOB_ONLYDIR)
-	      && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
-	    continue;
+		  /* If we shall match only directories use the information
+		     provided by the dirent call if possible.  */
+		  if ((flags & GLOB_ONLYDIR)
+		      && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
+		    continue;
 #endif
 
-	  name = d->d_name;
+		  name = d->d_name;
 
-	  if ((!meta && strcmp (pattern, name) == 0)
-	      || fnmatch (pattern, name,
-			  (!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) |
-			  ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
-#if defined _AMIGA || defined VMS
-			  | FNM_CASEFOLD
-#endif
-			 ) == 0)
-	    {
-	      struct globlink *new
-		= (struct globlink *) __alloca (sizeof (struct globlink));
-	      len = NAMLEN (d);
-	      new->name = (char *) malloc (len + 1);
-	      if (new->name == NULL)
-		goto memory_error;
+		  if (fnmatch (pattern, name, fnm_flags) == 0)
+		    {
+		      struct globlink *new = (struct globlink *)
+			__alloca (sizeof (struct globlink));
+		      len = NAMLEN (d);
+		      new->name = (char *) malloc (len + 1);
+		      if (new->name == NULL)
+			goto memory_error;
 #ifdef HAVE_MEMPCPY
-	      *((char *) mempcpy ((__ptr_t) new->name, name, len)) = '\0';
+		      *((char *) mempcpy ((__ptr_t) new->name, name, len))
+			= '\0';
 #else
-	      memcpy ((__ptr_t) new->name, name, len);
-	      new->name[len] = '\0';
+		      memcpy ((__ptr_t) new->name, name, len);
+		      new->name[len] = '\0';
 #endif
-	      new->next = names;
-	      names = new;
-	      ++nfound;
-	      if (!meta)
-		break;
+		      new->next = names;
+		      names = new;
+		      ++nfound;
+		    }
+		}
 	    }
 	}
     }
 
-  if (nfound == 0 && (flags & GLOB_NOMAGIC) && !meta)
-    flags |= GLOB_NOCHECK;
-
   if (nfound == 0 && (flags & GLOB_NOCHECK))
     {
       size_t len = strlen (pattern);
@@ -1096,10 +1131,11 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
     }
 
   save = errno;
-  if (flags & GLOB_ALTDIRFUNC)
-    (*pglob->gl_closedir) (stream);
-  else
-    closedir ((DIR *) stream);
+  if (stream != NULL)
+    if (flags & GLOB_ALTDIRFUNC)
+      (*pglob->gl_closedir) (stream);
+    else
+      closedir ((DIR *) stream);
   __set_errno (save);
 
   return nfound == 0 ? GLOB_NOMATCH : 0;
diff --git a/sysdeps/generic/paths.h b/sysdeps/generic/paths.h
index 3e6053aeaf..59e00c8c23 100644
--- a/sysdeps/generic/paths.h
+++ b/sysdeps/generic/paths.h
@@ -57,6 +57,7 @@
 #define	_PATH_MOUNTED   "/var/run/mtab"
 #define	_PATH_NOLOGIN	"/etc/nologin"
 #define	_PATH_PRESERVE	"/var/preserve"
+#define	_PATH_RWHODIR	"/var/rwho"
 #define	_PATH_SENDMAIL	"/usr/sbin/sendmail"
 #define	_PATH_SHADOW	"/etc/shadow"
 #define	_PATH_SHELLS	"/etc/shells"
diff --git a/sysdeps/generic/segfault.c b/sysdeps/generic/segfault.c
index 868ff1dfd7..6504123e18 100644
--- a/sysdeps/generic/segfault.c
+++ b/sysdeps/generic/segfault.c
@@ -63,12 +63,6 @@ struct layout
 };
 
 
-static void
-handle (int fd, void *addr)
-{
-}
-
-
 /* This function is called when a segmentation fault is caught.  The system
    is in an instable state now.  This means especially that malloc() might
    not work anymore.  */
@@ -115,7 +109,7 @@ catch_segfault (int signal, SIGCONTEXT ctx)
   arr = alloca (cnt * sizeof (void *));
 
   /* First handle the program counter from the structure.  */
-  arr[0] = GET_EIP (ctx);
+  arr[0] = GET_PC (ctx);
 
   current = (struct layout *) top_frame;
   cnt = 1;
diff --git a/sysdeps/generic/sigcontextinfo.h b/sysdeps/generic/sigcontextinfo.h
index 014db6624c..9623599698 100644
--- a/sysdeps/generic/sigcontextinfo.h
+++ b/sysdeps/generic/sigcontextinfo.h
@@ -19,6 +19,6 @@
 
 /* In general we cannot provide any information.  */
 #define SIGCONTEXT struct sigcontext *
-#define GET_EIP(ctx)	((void *) 0)
+#define GET_PC(ctx)	((void *) 0)
 #define GET_FRAME(ctx)	((void *) 0)
 #define GET_STACK(ctx)	((void *) 0)
diff --git a/sysdeps/generic/sigsuspend.c b/sysdeps/generic/sigsuspend.c
index 15166acfb7..17650c78da 100644
--- a/sysdeps/generic/sigsuspend.c
+++ b/sysdeps/generic/sigsuspend.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 1998 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
@@ -23,13 +23,14 @@
 /* Change the set of blocked signals to SET,
    wait until a signal arrives, and restore the set of blocked signals.  */
 int
-sigsuspend (set)
+__sigsuspend (set)
      const sigset_t *set;
 {
   __set_errno (ENOSYS);
   return -1;
 }
-
+weak_alias (__sigsuspend, sigsuspend)
 
 stub_warning (sigsuspend)
+stub_warning (__sigsuspend)
 #include <stub-tag.h>
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 44049cef57..8edde69337 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -122,6 +122,7 @@ _dl_sysdep_start (void **start_argptr,
 
 unfmh();			/* XXX */
 
+#if 0				/* XXX make this work for real someday... */
       if (_dl_hurd_data->user_entry == (vm_address_t) &ENTRY_POINT)
 	/* We were invoked as a command, not as the program interpreter.
 	   The generic ld.so code supports this: it will parse the args
@@ -166,6 +167,7 @@ unfmh();			/* XXX */
 	       can be retrieved by the program later.  */
 	    l->l_info[DT_NULL] = (void *) memobj;
 	  }
+#endif
 
       /* Call elf/rtld.c's main program.  It will set everything
 	 up and leave us to transfer control to USER_ENTRY.  */
@@ -643,58 +645,13 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
   return result;
 }
 
-void weak_function
-_dl_sysdep_fatal (const char *msg, ...)
-{
-  va_list ap;
-
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      mach_msg_type_number_t nwrote;
-      do
-	{
-	  if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
-	    break;
-	  len -= nwrote;
-	  msg += nwrote;
-	} while (nwrote > 0);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-
-  _exit (127);
-}
-
 
 void weak_function
-_dl_sysdep_error (const char *msg, ...)
+_dl_sysdep_output (int fd, const char *msg, ...)
 {
   va_list ap;
 
-  va_start (ap, msg);
-  do
-    {
-      size_t len = strlen (msg);
-      mach_msg_type_number_t nwrote;
-      do
-	{
-	  if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
-	    break;
-	  len -= nwrote;
-	  msg += nwrote;
-	} while (nwrote > 0);
-      msg = va_arg (ap, const char *);
-    } while (msg);
-  va_end (ap);
-}
-
-
-void weak_function
-_dl_sysdep_message (const char *msg, ...)
-{
-  va_list ap;
+  assert(fd < _hurd_init_dtablesize);
 
   va_start (ap, msg);
   do
@@ -703,7 +660,7 @@ _dl_sysdep_message (const char *msg, ...)
       mach_msg_type_number_t nwrote;
       do
 	{
-	  if (__io_write (_hurd_init_dtable[1], msg, len, -1, &nwrote))
+	  if (__io_write (_hurd_init_dtable[fd], msg, len, -1, &nwrote))
 	    break;
 	  len -= nwrote;
 	  msg += nwrote;
diff --git a/sysdeps/mach/hurd/i386/sigcontextinfo.h b/sysdeps/mach/hurd/i386/sigcontextinfo.h
new file mode 100644
index 0000000000..6dd80f25ea
--- /dev/null
+++ b/sysdeps/mach/hurd/i386/sigcontextinfo.h
@@ -0,0 +1,22 @@
+/* Copyright (C) 1998 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.  */
+
+#define SIGCONTEXT struct sigcontext
+#define GET_PC(ctx)	((void *) (ctx).sc_eip)
+#define GET_FRAME(ctx)	((void *) (ctx).sc_ebp)
+#define GET_STACK(ctx)	((void *) (ctx).sc_uesp)
diff --git a/sysdeps/mach/hurd/sigsuspend.c b/sysdeps/mach/hurd/sigsuspend.c
index ec7849557a..58f1417699 100644
--- a/sysdeps/mach/hurd/sigsuspend.c
+++ b/sysdeps/mach/hurd/sigsuspend.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,95,96,97,98 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
@@ -23,9 +23,8 @@
 
 /* Change the set of blocked signals to SET,
    wait until a signal arrives, and restore the set of blocked signals.  */
-/* XXX should be __sigsuspend ? */
 int
-sigsuspend (set)
+__sigsuspend (set)
      const sigset_t *set;
 {
   struct hurd_sigstate *ss;
@@ -80,3 +79,4 @@ sigsuspend (set)
   errno = EINTR;
   return -1;
 }
+weak_alias (__sigsuspend, sigsuspend)
diff --git a/sysdeps/posix/sigsuspend.c b/sysdeps/posix/sigsuspend.c
index db7899bfd4..914340d681 100644
--- a/sysdeps/posix/sigsuspend.c
+++ b/sysdeps/posix/sigsuspend.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -25,7 +25,7 @@
 /* Change the set of blocked signals to SET,
    wait until a signal arrives, and restore the set of blocked signals.  */
 int
-sigsuspend (set)
+__sigsuspend (set)
      const sigset_t *set;
 {
   sigset_t oset;
@@ -49,3 +49,4 @@ sigsuspend (set)
   __set_errno (save);
   return -1;
 }
+weak_alias (__sigsuspend, sigsuspend)
diff --git a/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h b/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h
index b9913a4f4c..6560b9441e 100644
--- a/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h
@@ -18,6 +18,6 @@
    Boston, MA 02111-1307, USA.  */
 
 #define SIGCONTEXT struct sigcontext
-#define GET_EIP(ctx)	((void *) ctx.eip)
+#define GET_PC(ctx)	((void *) ctx.eip)
 #define GET_FRAME(ctx)	((void *) ctx.ebp)
 #define GET_STACK(ctx)	((void *) ctx.esp_at_signal)
diff --git a/sysdeps/unix/sysv/linux/paths.h b/sysdeps/unix/sysv/linux/paths.h
index cb5b57122c..c0a4940855 100644
--- a/sysdeps/unix/sysv/linux/paths.h
+++ b/sysdeps/unix/sysv/linux/paths.h
@@ -58,6 +58,7 @@
 #define	_PATH_MOUNTED	"/etc/mtab"
 #define	_PATH_NOLOGIN	"/etc/nologin"
 #define	_PATH_PRESERVE	"/var/preserve"
+#define	_PATH_RWHODIR	"/var/spool/rwho"
 #define	_PATH_SENDMAIL	"/usr/sbin/sendmail"
 #define	_PATH_SHADOW	"/etc/shadow"
 #define	_PATH_SHELLS	"/etc/shells"
diff --git a/sysdeps/unix/sysv/sysv4/solaris2/sigpending.c b/sysdeps/unix/sysv/sysv4/solaris2/sigpending.c
new file mode 100644
index 0000000000..4e1ce0eb58
--- /dev/null
+++ b/sysdeps/unix/sysv/sysv4/solaris2/sigpending.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1998 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 <errno.h>
+#include <stddef.h>
+#include <signal.h>
+
+extern int __syscall_sigpending (int subcode, sigset_t *set);
+
+
+/* Store in SET all signals that are blocked and pending.  */
+int
+sigpending (sigset_t *set)
+{
+  if (set == NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  return __syscall_sigpending (1, set);
+}
diff --git a/sysdeps/unix/sysv/sysv4/solaris2/sigstack.c b/sysdeps/unix/sysv/sysv4/solaris2/sigstack.c
new file mode 100644
index 0000000000..5aa73c8dcb
--- /dev/null
+++ b/sysdeps/unix/sysv/sysv4/solaris2/sigstack.c
@@ -0,0 +1,3 @@
+/* We can reuse the Linux implementation with some tricks.  */
+#define __NR_sigaltstack 1
+#include <sysdeps/unix/sysv/linux/sigstack.c>
diff --git a/sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c b/sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c
new file mode 100644
index 0000000000..026e61102e
--- /dev/null
+++ b/sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c
@@ -0,0 +1,2 @@
+/* We can reuse the Linux implementation.  */
+#include <sysdeps/unix/sysv/linux/sigwaitinfo.h>
diff --git a/sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S b/sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S
new file mode 100644
index 0000000000..b9f2996e31
--- /dev/null
+++ b/sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S
@@ -0,0 +1,2 @@
+/* Bets are that the Linux code works... */
+#include <sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S>
diff --git a/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list b/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list
index 52063630dc..092d869efc 100644
--- a/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list
+++ b/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list
@@ -1,3 +1,7 @@
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
 sigaction	-	sigaction	3	__sigaction	sigaction
+sigaltstack	-	sigaltstack	2	sigaltstack
+sigpending	-	sigpending	2	__syscall_sigpending
+sigqueue	-	sigqueue	3	__sigqueue	sigqueue
+sigtimedwait	-	sigtimedwait	3	__sigtimedwait	sigtime
diff --git a/timezone/leapseconds b/timezone/leapseconds
index 903da5aaae..1cd114b91f 100644
--- a/timezone/leapseconds
+++ b/timezone/leapseconds
@@ -1,4 +1,4 @@
-# @(#)leapseconds	7.10
+# @(#)leapseconds	7.11
 
 # Allowance for leapseconds added to each timezone file.
 
@@ -41,3 +41,4 @@ Leap	1993	Jun	30	23:59:60	+	S
 Leap	1994	Jun	30	23:59:60	+	S
 Leap	1995	Dec	31	23:59:60	+	S
 Leap	1997	Jun	30	23:59:60	+	S
+Leap	1998	Dec	31	23:59:60	+	S