summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-05-08 02:07:47 +0000
committerRoland McGrath <roland@gnu.org>1996-05-08 02:07:47 +0000
commit0e3426bbcf2ff61d06d580fc9362fde79953a281 (patch)
tree6bc37583e3ea48a41eb273fbb112613b51cf64e6
parentb928942eaa0401de9189a2709188f584425f5ca6 (diff)
downloadglibc-0e3426bbcf2ff61d06d580fc9362fde79953a281.tar.gz
glibc-0e3426bbcf2ff61d06d580fc9362fde79953a281.tar.xz
glibc-0e3426bbcf2ff61d06d580fc9362fde79953a281.zip
Tue May 7 19:00:01 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
	* string/argz-extract.c: Remove const from decl.
	* string/argz.h: Here too.

	* Makeconfig (version.mk): Fix regexp in sed cmd.
	Depend on $(..)Makeconfig.

	* GMP code updated from gmp-2.0 release.
	* stdlib/Makefile (mpn-routines): Removed add_1, added inlines.
	* sysdeps/generic/add_1.c: File removed.
	* stdlib/strtod.c: mp_limb is now mp_limb_t.
	* stdlib/fpioconst.c, stdlib/fpioconst.h: Likewise.
	* stdio-common/_itoa.c: Likewise.
	* stdio-common/printf_fp.c: Likewise.
	Don't include ansidecl.h.

	* sysdeps/mach/hurd/getcwd.c: Use io_identity instead of io_stat.

	* shlib-versions: New file.
	* Makerules (soversions.mk): New target, include file generated from
	shlib-versions.  Moved shared library rules before installation rules.
	Rewrote shared library installation rules for versioned libraries.
	* math/Makefile (libm.so-version): Variable removed.

	* sysdeps/mach/hurd/i386/exc2signal.c: Use struct hurd_signal_detail.

	* hurd/report-wait.c (_S_msg_describe_ports): New function.

	* configure.in: Add AC_PROG_LN_S check.
	* config.make.in (LN_S): New variable.

Sun May  5 03:10:44 1996  Ulrich Drepper  <drepper@cygnus.com>

	* misc/efgcvt_r.c (ecvt_r): Work aroung gcc bug.  gcc does
	not know about weak aliases now and optimizes necessary `if'
	statement away.

	* posix/unistd.h: Add swapoff prototype.

	* sysdeps/generic/confname.h: Add even more POSIX.4 symbols.

	* sysdeps/posix/fpathconf.c (__fpathconf): Get information
	for _PC_PATH_MAX from fstatfs function if available.

	* sysdeps/posix/sysconf.c: Add code to handle _SC_AIO_LISTIO_MAX,
	_SC_AIO_MAX, _SC_AIO_PRIO_DELTA_MAX, _SC_DELAYTIMER_MAX,
	_SC_MQ_OPEN_MAX, _SC_MQ_PRIO_MAX, _SC_RTSIG_MAX,
	_SC_SEM_NSEMS_MAX, _SC_SEM_VALUE_MAX, _SC_SIGQUEUE_MAX, and
	_SC_TIMER_MAX.
	* sysdeps/unix/sysv/sysv4/sysconf.c: Ditto.

	* sysdeps/stub/swapoff.c: New file.  Stub version for swapoff
	function.

	* sysdeps/unix/syscalls.list:  Add swapoff.

	* sysdeps/unix/sysv/linux/Dist: Add sys/acct.h.

	* sysdeps/unix/sysv/linux/Makefile [$(subdir) == misc]
	(sysdep_routines): Add mount, umount, llseek, setfsgid, setfsuid,
	sysinfo, and uselib.
	(headers): Add sys/sysinfo.h.

	* sysdeps/unix/sysv/linux/gethostid.c: Prevent warning.

	* sysdeps/unix/sysv/linux/i386/Makefile [$(subdir) == misc]
	(sysdep_routines): Add ioperm, iopl, and vm86.
	(headers): Add sys/perm.h and sys/vm86.h.

	* sysdeps/unix/sysv/linux/i386/sys/perm.h: New file.  Contains
	prototypes for iopl and ioperm.

	* sysdeps/unix/sysv/linux/i386/sys/vm86.h:  New file.  Contains
	prototype for vm86.

	* sysdeps/unix/sysv/linux/i386/syscalls.list: New file.  Add
	vm86 system call.

	* sysdeps/unix/sysv/linux/sys/acct.h: New file.  Contains
	prototypes for acct function.

	* sysdeps/unix/sysv/linux/sys/socket.h: Provide real header
	file with prototypes.

	* sysdeps/unix/sysv/linux/sys/sysinfo.h: New file.  Contains
	prototype for sysinfo function.

	* sysdeps/unix/sysv/linux/syscalls.list: Add flock, ioperm, iopl,
	llseek, setfsgid, setfsuid, sysinfo, and uselib.

	* sysdeps/unix/sysv/linux/sysconf.c: Instead of duplicating
	posix/sysconf.c now only handle cases different to that
	implementation.

Tue May  7 15:08:19 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* stdio/linewrap.c (__line_wrap_output): Renamed from lwoutput
	(all references changed).  Now exported.

	* stdio/linewrap.c (struct data): Type deleted (moved to linewrap.h).
	(wrap_stream, unwrap_stream, lwclose, lwfileno, lwoutput,
	line_wrap_stream, line_unwrap_stream): Use struct line_wrap_data
	instead of struct data.
	(lwoutput, line_wrap_stream, line_unwrap_stream): Rename various
	occurences of `wrap' and `wrapmargin' to `wmargin'.
	(line_wrapped, line_wrap_lmargin, line_wrap_set_lmargin,
	line_wrap_rmargin, line_wrap_set_rmargin, line_wrap_wmargin,
	line_wrap_set_wmargin, line_wrap_point): New functions.
	* stdio/linewrap.h: New file.
	* stdio/Makefile (headers): Add linewrap.h.

Tue May  7 14:19:12 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* sysdeps/unix/sysv/linux/i386/Makefile: File removed.

	* stdio/stdio.h: Remove line_wrap_stream, line_unwap_stream decls.

	* sysdeps/unix/sysv/linux/schedbits.h: New file.

Tue May  7 13:47:02 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* stdio/linewrap.c (struct data): Make margin fields not-pointers.
	(lwoutput): Adjust uses acordingly.

	* sysdeps/mach/hurd/fdatasync.c: New file.
	* sysdeps/mach/hurd/fsync.c: Pass new flag to file_sync.

	* sysdeps/mach/hurd/xmknod.c: Pass new flag to dir_link.
	* sysdeps/mach/hurd/symlink.c: Likewise.
	* sysdeps/mach/hurd/link.c: Likewise.
	* sysdeps/mach/hurd/bind.c: Likewise.
	* hurd/hurdsig.c (write_corefile): Likewise.

	* hurd/hurdsig.c (write_corefile): Pass cttyid port to crash server.

	* sysdeps/mach/hurd/fpathconf.c: RPC takes int pointer, not long int.

	* sysdeps/mach/hurd/_exit.c (_hurd_exit): Pass sigcode arg to
	proc_mark_exit.
	* sysdeps/mach/hurd/dl-sysdep.c (_exit): Likewise.

	* sysdeps/mach/hurd/wait4.c: Pass sigcode arg to proc_wait.

	* sysdeps/mach/hurd/rename.c: Pass new flag to dir_rename.

	* hurd/hurdfault.c (_hurdsig_fault_catch_exception_raise): Use struct
	hurd_signal_detail.
	* hurd/catch-exc.c (_S_catch_exception_raise): Likewise.
	* hurd/hurd-raise.c (_hurd_raise_signal): Likewise.
	* sysdeps/mach/hurd/i386/trampoline.c (_hurd_setup_sighandler):
	Likewise.
	* sysdeps/mach/hurd/setitimer.c (restart_itimer): Likewise.

	* hurd/hurd/signal.h: Fix _hurd_exception2signal prototype.

	* hurd/hurdsig.c (write_corefile): Take const struct
	hurd_signal_detail * arg.  Pass all details to crash_dump_task.
	(_hurd_internal_post_signal): Pass DETAIL to write_corefile.
	(_hurd_internal_post_signal: suspend): Pass code and error to
	proc_mark_stop.

	* hurd/hurdprio.c (_hurd_priority_which_map): Pass flags arg to
	proc_getprocinfo by reference.
-rw-r--r--ChangeLog165
-rw-r--r--Makeconfig6
-rw-r--r--Makerules164
-rw-r--r--config.make.in1
-rw-r--r--configure.in3
-rw-r--r--hurd/catch-exc.c13
-rw-r--r--hurd/hurd-raise.c7
-rw-r--r--hurd/hurd/signal.h5
-rw-r--r--hurd/hurdfault.c12
-rw-r--r--hurd/hurdprio.c4
-rw-r--r--hurd/hurdsig.c34
-rw-r--r--hurd/report-wait.c25
-rw-r--r--math/Makefile1
-rw-r--r--misc/efgcvt_r.c4
-rw-r--r--posix/unistd.h3
-rw-r--r--shlib-versions21
-rw-r--r--stdio-common/_itoa.c72
-rw-r--r--stdio-common/printf_fp.c31
-rw-r--r--stdio/linewrap.c183
-rw-r--r--stdio/linewrap.h189
-rw-r--r--stdio/stdio.h16
-rw-r--r--stdlib/Makefile2
-rw-r--r--stdlib/fpioconst.c56
-rw-r--r--stdlib/fpioconst.h2
-rw-r--r--stdlib/strtod.c90
-rw-r--r--string/argz-extract.c2
-rw-r--r--string/argz.h4
-rw-r--r--sysdeps/generic/add_1.c61
-rw-r--r--sysdeps/generic/confname.h22
-rw-r--r--sysdeps/generic/inlines.c3
-rw-r--r--sysdeps/mach/hurd/_exit.c6
-rw-r--r--sysdeps/mach/hurd/bind.c4
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c2
-rw-r--r--sysdeps/mach/hurd/fdatasync.c32
-rw-r--r--sysdeps/mach/hurd/fpathconf.c4
-rw-r--r--sysdeps/mach/hurd/fsync.c4
-rw-r--r--sysdeps/mach/hurd/getcwd.c59
-rw-r--r--sysdeps/mach/hurd/i386/exc2signal.c95
-rw-r--r--sysdeps/mach/hurd/i386/trampoline.c4
-rw-r--r--sysdeps/mach/hurd/link.c4
-rw-r--r--sysdeps/mach/hurd/rename.c4
-rw-r--r--sysdeps/mach/hurd/setitimer.c3
-rw-r--r--sysdeps/mach/hurd/symlink.c8
-rw-r--r--sysdeps/mach/hurd/wait4.c5
-rw-r--r--sysdeps/mach/hurd/xmknod.c2
-rw-r--r--sysdeps/posix/fpathconf.c10
-rw-r--r--sysdeps/posix/sysconf.c77
-rw-r--r--sysdeps/stub/swapoff.c30
-rw-r--r--sysdeps/unix/syscalls.list1
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/Makefile5
-rw-r--r--sysdeps/unix/sysv/linux/gethostid.c6
-rw-r--r--sysdeps/unix/sysv/linux/i386/Makefile8
-rw-r--r--sysdeps/unix/sysv/linux/i386/sys/perm.h36
-rw-r--r--sysdeps/unix/sysv/linux/i386/sys/vm86.h34
-rw-r--r--sysdeps/unix/sysv/linux/i386/syscalls.list3
-rw-r--r--sysdeps/unix/sysv/linux/schedbits.h1
-rw-r--r--sysdeps/unix/sysv/linux/sys/acct.h34
-rw-r--r--sysdeps/unix/sysv/linux/sys/socket.h168
-rw-r--r--sysdeps/unix/sysv/linux/sys/sysinfo.h30
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list10
-rw-r--r--sysdeps/unix/sysv/linux/sysconf.c294
-rw-r--r--sysdeps/unix/sysv/sysv4/sysconf.c77
63 files changed, 1518 insertions, 744 deletions
diff --git a/ChangeLog b/ChangeLog
index be527d6ac2..866a3b44f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,170 @@
+Tue May  7 19:00:01 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* string/argz-extract.c: Remove const from decl.
+	* string/argz.h: Here too.
+
+	* Makeconfig (version.mk): Fix regexp in sed cmd.
+	Depend on $(..)Makeconfig.
+
+	* GMP code updated from gmp-2.0 release.
+	* stdlib/Makefile (mpn-routines): Removed add_1, added inlines.
+	* sysdeps/generic/add_1.c: File removed.
+	* stdlib/strtod.c: mp_limb is now mp_limb_t.
+	* stdlib/fpioconst.c, stdlib/fpioconst.h: Likewise.
+	* stdio-common/_itoa.c: Likewise.
+	* stdio-common/printf_fp.c: Likewise.
+	Don't include ansidecl.h.
+
+	* sysdeps/mach/hurd/getcwd.c: Use io_identity instead of io_stat.
+
+	* shlib-versions: New file.
+	* Makerules (soversions.mk): New target, include file generated from
+	shlib-versions.  Moved shared library rules before installation rules.
+	Rewrote shared library installation rules for versioned libraries.
+	* math/Makefile (libm.so-version): Variable removed.
+
+	* sysdeps/mach/hurd/i386/exc2signal.c: Use struct hurd_signal_detail.
+
+	* hurd/report-wait.c (_S_msg_describe_ports): New function.
+
+	* configure.in: Add AC_PROG_LN_S check.
+	* config.make.in (LN_S): New variable.
+
+Sun May  5 03:10:44 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* misc/efgcvt_r.c (ecvt_r): Work aroung gcc bug.  gcc does
+	not know about weak aliases now and optimizes necessary `if'
+	statement away.
+
+	* posix/unistd.h: Add swapoff prototype.
+
+	* sysdeps/generic/confname.h: Add even more POSIX.4 symbols.
+
+	* sysdeps/posix/fpathconf.c (__fpathconf): Get information
+	for _PC_PATH_MAX from fstatfs function if available.
+
+	* sysdeps/posix/sysconf.c: Add code to handle _SC_AIO_LISTIO_MAX,
+	_SC_AIO_MAX, _SC_AIO_PRIO_DELTA_MAX, _SC_DELAYTIMER_MAX,
+	_SC_MQ_OPEN_MAX, _SC_MQ_PRIO_MAX, _SC_RTSIG_MAX,
+	_SC_SEM_NSEMS_MAX, _SC_SEM_VALUE_MAX, _SC_SIGQUEUE_MAX, and
+	_SC_TIMER_MAX.
+	* sysdeps/unix/sysv/sysv4/sysconf.c: Ditto.
+
+	* sysdeps/stub/swapoff.c: New file.  Stub version for swapoff
+	function.
+
+	* sysdeps/unix/syscalls.list:  Add swapoff.
+
+	* sysdeps/unix/sysv/linux/Dist: Add sys/acct.h.
+
+	* sysdeps/unix/sysv/linux/Makefile [$(subdir) == misc]
+	(sysdep_routines): Add mount, umount, llseek, setfsgid, setfsuid,
+	sysinfo, and uselib.
+	(headers): Add sys/sysinfo.h.
+
+	* sysdeps/unix/sysv/linux/gethostid.c: Prevent warning.
+
+	* sysdeps/unix/sysv/linux/i386/Makefile [$(subdir) == misc]
+	(sysdep_routines): Add ioperm, iopl, and vm86.
+	(headers): Add sys/perm.h and sys/vm86.h.
+
+	* sysdeps/unix/sysv/linux/i386/sys/perm.h: New file.  Contains
+	prototypes for iopl and ioperm.
+
+	* sysdeps/unix/sysv/linux/i386/sys/vm86.h:  New file.  Contains
+	prototype for vm86.
+
+	* sysdeps/unix/sysv/linux/i386/syscalls.list: New file.  Add
+	vm86 system call.
+
+	* sysdeps/unix/sysv/linux/sys/acct.h: New file.  Contains
+	prototypes for acct function.
+
+	* sysdeps/unix/sysv/linux/sys/socket.h: Provide real header
+	file with prototypes.
+
+	* sysdeps/unix/sysv/linux/sys/sysinfo.h: New file.  Contains
+	prototype for sysinfo function.
+
+	* sysdeps/unix/sysv/linux/syscalls.list: Add flock, ioperm, iopl,
+	llseek, setfsgid, setfsuid, sysinfo, and uselib.
+
+	* sysdeps/unix/sysv/linux/sysconf.c: Instead of duplicating
+	posix/sysconf.c now only handle cases different to that
+	implementation.
+
+Tue May  7 15:08:19 1996  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* stdio/linewrap.c (__line_wrap_output): Renamed from lwoutput
+	(all references changed).  Now exported.
+
+	* stdio/linewrap.c (struct data): Type deleted (moved to linewrap.h).
+	(wrap_stream, unwrap_stream, lwclose, lwfileno, lwoutput,
+	line_wrap_stream, line_unwrap_stream): Use struct line_wrap_data
+	instead of struct data.
+	(lwoutput, line_wrap_stream, line_unwrap_stream): Rename various
+	occurences of `wrap' and `wrapmargin' to `wmargin'.
+	(line_wrapped, line_wrap_lmargin, line_wrap_set_lmargin,
+	line_wrap_rmargin, line_wrap_set_rmargin, line_wrap_wmargin,
+	line_wrap_set_wmargin, line_wrap_point): New functions.
+	* stdio/linewrap.h: New file.
+	* stdio/Makefile (headers): Add linewrap.h.
+
+Tue May  7 14:19:12 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* sysdeps/unix/sysv/linux/i386/Makefile: File removed.
+
+	* stdio/stdio.h: Remove line_wrap_stream, line_unwap_stream decls.
+
+	* sysdeps/unix/sysv/linux/schedbits.h: New file.
+
+Tue May  7 13:47:02 1996  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* stdio/linewrap.c (struct data): Make margin fields not-pointers.
+	(lwoutput): Adjust uses acordingly.
+
 Tue May  7 10:51:52 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
+	* sysdeps/mach/hurd/fdatasync.c: New file.
+	* sysdeps/mach/hurd/fsync.c: Pass new flag to file_sync.
+
+	* sysdeps/mach/hurd/xmknod.c: Pass new flag to dir_link.
+	* sysdeps/mach/hurd/symlink.c: Likewise.
+	* sysdeps/mach/hurd/link.c: Likewise.
+	* sysdeps/mach/hurd/bind.c: Likewise.
+	* hurd/hurdsig.c (write_corefile): Likewise.
+
+	* hurd/hurdsig.c (write_corefile): Pass cttyid port to crash server.
+
+	* sysdeps/mach/hurd/fpathconf.c: RPC takes int pointer, not long int.
+
+	* sysdeps/mach/hurd/_exit.c (_hurd_exit): Pass sigcode arg to
+	proc_mark_exit.
+	* sysdeps/mach/hurd/dl-sysdep.c (_exit): Likewise.
+
+	* sysdeps/mach/hurd/wait4.c: Pass sigcode arg to proc_wait.
+
+	* sysdeps/mach/hurd/rename.c: Pass new flag to dir_rename.
+
+	* hurd/hurdfault.c (_hurdsig_fault_catch_exception_raise): Use struct
+	hurd_signal_detail.
+	* hurd/catch-exc.c (_S_catch_exception_raise): Likewise.
+	* hurd/hurd-raise.c (_hurd_raise_signal): Likewise.
+	* sysdeps/mach/hurd/i386/trampoline.c (_hurd_setup_sighandler):
+	Likewise.
+	* sysdeps/mach/hurd/setitimer.c (restart_itimer): Likewise.
+
+	* hurd/hurd/signal.h: Fix _hurd_exception2signal prototype.
+
+	* hurd/hurdsig.c (write_corefile): Take const struct
+	hurd_signal_detail * arg.  Pass all details to crash_dump_task.
+	(_hurd_internal_post_signal): Pass DETAIL to write_corefile.
+	(_hurd_internal_post_signal: suspend): Pass code and error to
+	proc_mark_stop.
+
+	* hurd/hurdprio.c (_hurd_priority_which_map): Pass flags arg to
+	proc_getprocinfo by reference.
+
 	* wcsmbs/wcwidth.c, wcsmbs/wcswidth.c: Fixed typos.
 
 	* sysdeps/unix/sysv/linux/sys/mman.h: Fixed typo.
diff --git a/Makeconfig b/Makeconfig
index e0522ab815..b9de4f3329 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -471,9 +471,9 @@ endif
 
 # Figure out the version numbers from version.h.
 
-$(common-objpfx)version.mk: $(..)version.h
-	sed -n -e 's/^.*RELEASE.*\"\([^"]*\)";$$/release=\1/p' \
-	       -e 's/^.*VERSION.*\"\([^"]*\)";$$/version=\1/p' \
+$(common-objpfx)version.mk: $(..)version.h $(..)Makeconfig
+	sed -n -e 's/^.*RELEASE.*"\([^"]*\)".*$$/release=\1/p' \
+	       -e 's/^.*VERSION.*"\([^"]*\)".*$$/version=\1/p' \
 	    < $< > $@-new
 	mv -f $@-new $@
 
diff --git a/Makerules b/Makerules
index 876134756f..47e5fb8b0f 100644
--- a/Makerules
+++ b/Makerules
@@ -428,6 +428,71 @@ $(AR) cru$(verbose) $(@:$(objpfx)%=%) \
 $(RANLIB) $@
 endef
 
+# Shared library building.
+
+ifeq (yes,$(build-shared))
+
+# Process the shlib-versions file, which tells us what shared library
+# version numbers to use when we install shared objects on this system.
+-include $(common-objpfx)soversions.mk
+$(common-objpfx)soversions.mk: $(..)shlib-versions $(..)Makerules \
+			       $(common-objpfx)config.make
+	sed 's/#.*$$//' $< | while read conf versions; do \
+	  test -n "$$versions" || continue; \
+	  case '$(config-machine)-$(config-vendor)-$(config-os)' in $$conf)\
+	    for v in $$versions; do \
+	      lib="$${v%%=*}"; if eval "test -z \"\$$vers_lib$$lib\""; then \
+		eval vers_lib$${lib}=yes; \
+		echo $$lib.so-version=.$${v##$$lib=}; fi; \
+	  done ;; esac; done > $@T
+	mv -f $@T $@
+
+# Get $(version) defined with the release version number.
+-include $(common-objpfx)version.mk
+
+
+# Pattern rule to build a shared object from an archive of PIC objects.
+# This must come after the installation rules so Make doesn't try to
+# build shared libraries in place from the installed *_pic.a files.
+# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
+# on other shared objects.
+lib%.so: lib%_pic.a; $(build-shlib)
+
+ifeq ($(have-no-whole-archive),yes)
+no-whole-archive = -Wl,--no-whole-archive
+else
+no-whole-archive =
+endif
+
+define build-shlib
+$(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
+	  -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
+	  $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
+	  -Wl,-rpath-link=$(common-objdir) \
+	  -Wl,--whole-archive $^ $(no-whole-archive) \
+	  $(LDLIBS-$(@F:lib%.so=%).so)
+endef
+
+# Don't try to use -lc when making libc.so itself.
+# Also omits crti.o and crtn.o, which we do not want
+# since we define our own `.init' section specially.
+LDFLAGS-c.so = -nostdlib -nostartfiles
+# Give libc.so an entry point and make it directly runnable itself.
+LDFLAGS-c.so += -e __libc_print_version
+# Use our own special initializer and finalizer files for libc.so.
+elfobjdir := $(firstword $(objdir) $(..)elf)
+$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
+			 $(common-objpfx)libc_pic.a \
+			 $(elfobjdir)/sofini.so
+	$(build-shlib)
+
+ifdef libc.so-version
+$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
+	rm -f $@
+	ln -s $(<F) $@ || ln $< $@
+endif
+endif
+
 # Installation.
 
 # $(install-lib) are installed from the object directory into $(libdir);
@@ -483,13 +548,56 @@ 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: $(foreach so,$(install-lib.so),\
-  $(libdir)/$(patsubst $(libprefix)lib%,lib$(libprefix)%,\
-		       $(libprefix)$(so))$($(so)-version))
 
-install: $(slibdir)/libc.so$(libc.so-version)
-$(slibdir)/lib$(libprefix)c.so$(libc.so-version): $(common-objpfx)libc.so
-	$(do-install-so)
+install-lib-nosubdir: $(install-lib.so:%=$(libdir)/%)
+install: $(slibdir)/libc.so
+
+# Find which .so's have versions.
+versioned := $(foreach so,$(install-lib.so),\
+		       $(patsubst %,$(so),$($(so)-version)))
+
+# Install all the unversioned shared libraries.
+$(addprefix $(libdir)/,$(filter-out $(versioned),$(install-lib.so))): \
+$(libdir)/%: $(objpfx)lib%.so; $(do-install-program)
+
+make-link = cd $(@D); rm -f $(@F); $(LN_S) $(<F) $(@F)
+
+ifdef libc.so-version
+# For a library specified to be version N, install three files:
+# libc.so	->	libc.so.N	(e.g. libc.so.6)
+# libc.so.6	->	libc-VERSION.so	(e.g. libc-1.10.so)
+
+$(slibdir)/libc.so: $(slibdir)/libc.so$(libc.so-version)
+	$(make-link)
+$(slibdir)/libc.so$(libc.so-version): $(slibdir)/libc-$(version).so
+	$(make-link)
+$(slibdir)/libc-$(version).so: $(common-objpfx)libc.so; $(do-install-program)
+else
+$(slibdir)/libc.so: $(common-objpfx)libc.so; $(do-install-program)
+endif
+
+
+ifneq (,$(versioned))
+# Produce three sets of rules as above for all the smaller versioned libraries.
+
+define o-iterator-doit
+$$(libdir)/$o: $$(libdir)/$o$$($o-version); $$(make-link)
+endef
+object-suffixes-left := $(versioned)
+include $(..)o-iterator.mk
+
+define o-iterator-doit
+$$(libdir)/$o$$($o-version): $$(libdir)/$(o:.so=)-$$(version).so; $$(make-link)
+endef
+object-suffixes-left := $(versioned)
+include $(..)o-iterator.mk
+
+define o-iterator-doit
+$$(libdir)/$(o:.so=)-$$(version).so: $$(objpfx)$o; $$(do-install-program)
+endef
+object-suffixes-left := $(versioned)
+include $(..)o-iterator.mk
+endif
 
 define do-install-so
 $(do-install-program)
@@ -561,50 +669,6 @@ install-no-libc.a-nosubdir: install-headers-nosubdir install-data-nosubdir\
 			    install-others-nosubdir install-sbin-nosubdir
 install: install-no-libc.a-nosubdir
 
-ifeq (yes,$(build-shared))
-# Pattern rule to build a shared object from an archive of PIC objects.
-# This must come after the installation rules so Make doesn't try to
-# build shared libraries in place from the installed *_pic.a files.
-# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
-# on other shared objects.
-lib%.so: lib%_pic.a; $(build-shlib)
-
-ifeq ($(have-no-whole-archive),yes)
-no-whole-archive = -Wl,--no-whole-archive
-else
-no-whole-archive =
-endif
-
-define build-shlib
-$(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS)  \
-	  -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
-	  $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
-	  -Wl,-rpath-link=$(common-objdir) \
-	  -Wl,--whole-archive $^ $(no-whole-archive) \
-	  $(LDLIBS-$(@F:lib%.so=%).so)
-endef
-
-# Don't try to use -lc when making libc.so itself.
-# Also omits crti.o and crtn.o, which we do not want
-# since we define our own `.init' section specially.
-LDFLAGS-c.so = -nostdlib -nostartfiles
-# Give libc.so an entry point and make it directly runnable itself.
-LDFLAGS-c.so += -e __libc_print_version
-# Use our own special initializer and finalizer files for libc.so.
-elfobjdir := $(firstword $(objdir) $(..)elf)
-$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
-			 $(common-objpfx)libc_pic.a \
-			 $(elfobjdir)/sofini.so
-	$(build-shlib)
-
-ifdef libc.so-version
-$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
-	rm -f $@
-	ln -s $(<F) $@ || ln $< $@
-endif
-endif
-
-
 # Command to compile $< in $(objdir) using the native libraries.
 define native-compile
 cwd=`pwd`; cd $(@D); $(BUILD_CC) $(BUILD_CFLAGS) \
diff --git a/config.make.in b/config.make.in
index 593d9ca908..2ba60d8b3e 100644
--- a/config.make.in
+++ b/config.make.in
@@ -37,5 +37,6 @@ AS = $(CC) -c
 INSTALL = @INSTALL@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_DATA = @INSTALL_DATA@
+LN_S = @LN_S@
 
 # More variables may be inserted below by configure.
diff --git a/configure.in b/configure.in
index 711635cc5d..4a310bc4c8 100644
--- a/configure.in
+++ b/configure.in
@@ -1,6 +1,6 @@
 Dnl Process this file with autoconf to produce a configure script.
 AC_REVISION([$CVSid$])
-AC_PREREQ(2.9)dnl		dnl Minimum Autoconf version required.
+AC_PREREQ(2.10)dnl		dnl Minimum Autoconf version required.
 AC_INIT(features.h)
 AC_CONFIG_HEADER(config.h)
 
@@ -293,6 +293,7 @@ if test "$INSTALL" = "${srcdir}/install-sh"; then
   # The makefiles need to use a different form to find it in $srcdir.
   INSTALL='$(..)./install-sh'
 fi
+AC_PROG_LN_S
 
 AC_CHECK_TOOL(CC, gcc)
 AC_CHECK_TOOL(AR, ar)
diff --git a/hurd/catch-exc.c b/hurd/catch-exc.c
index 8ab38a2a61..e3186eb0cd 100644
--- a/hurd/catch-exc.c
+++ b/hurd/catch-exc.c
@@ -29,18 +29,21 @@ _S_catch_exception_raise (mach_port_t port,
 			  int code,
 			  int subcode)
 {
-  int signo, error;
-  long int sigcode;
   struct hurd_sigstate *ss;
+  int signo;
+  struct hurd_signal_detail d;
 
   if (task != __mach_task_self ())
     /* The sender wasn't the kernel.  */
     return EPERM;
 
+  d.exc = exception;
+  d.exc_code = code;
+  d.exc_subcode = subcode;
+
   /* Call the machine-dependent function to translate the Mach exception
      codes into a signal number and subcode.  */
-  _hurd_exception2signal (exception, code, subcode,
-			  &signo, &sigcode, &error);
+  _hurd_exception2signal (&d, &signo);
 
   /* Find the sigstate structure for the faulting thread.  */
   __mutex_lock (&_hurd_siglock);
@@ -70,7 +73,7 @@ _S_catch_exception_raise (mach_port_t port,
     }
 
   /* Post the signal.  */
-  _hurd_internal_post_signal (ss, signo, sigcode, error,
+  _hurd_internal_post_signal (ss, signo, &d,
 			      MACH_PORT_NULL, MACH_MSG_TYPE_PORT_SEND,
 			      0);
 
diff --git a/hurd/hurd-raise.c b/hurd/hurd-raise.c
index 59179da5f6..8ebe2c8ff3 100644
--- a/hurd/hurd-raise.c
+++ b/hurd/hurd-raise.c
@@ -27,7 +27,7 @@ Cambridge, MA 02139, USA.  */
 
 void
 _hurd_raise_signal (struct hurd_sigstate *ss,
-		    int signo, long int sigcode, int sigerror)
+		    int signo, const struct hurd_signal_detail *detail)
 {
   if (ss == NULL)
     {
@@ -37,12 +37,11 @@ _hurd_raise_signal (struct hurd_sigstate *ss,
 
   /* Mark SIGNO as pending to be delivered.  */
   __sigaddset (&ss->pending, signo);
-  ss->pending_data[signo].code = sigcode;
-  ss->pending_data[signo].error = sigerror;
+  ss->pending_data[signo] = *detail;
 
   __spin_unlock (&ss->lock);
 
   /* Send a message to the signal thread so it
      will wake up and check for pending signals.  */
-  __msg_sig_post (_hurd_msgport, signo, sigcode, __mach_task_self ());
+  __msg_sig_post (_hurd_msgport, signo, detail->code, __mach_task_self ());
 }
diff --git a/hurd/hurd/signal.h b/hurd/hurd/signal.h
index 27349d3ed0..7dee18c1ed 100644
--- a/hurd/hurd/signal.h
+++ b/hurd/hurd/signal.h
@@ -233,7 +233,8 @@ extern void _hurd_raise_signal (struct hurd_sigstate *ss, int signo,
 
 /* Translate a Mach exception into a signal (machine-dependent).  */
 
-extern void _hurd_exception2signal (struct hurd_signal_detail *);
+extern void _hurd_exception2signal (struct hurd_signal_detail *detail,
+				    int *signo);
 
 
 /* Make the thread described by SS take the signal described by SIGNO and
@@ -259,7 +260,7 @@ extern void _hurd_internal_post_signal (struct hurd_sigstate *ss,
 struct machine_thread_all_state;
 extern struct sigcontext *
 _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
-			int signo, const struct hurd_signal_detail *detail,
+			int signo, struct hurd_signal_detail *detail,
 			int rpc_wait, struct machine_thread_all_state *state);
 
 /* Function run by the signal thread to receive from the signal port.  */
diff --git a/hurd/hurdfault.c b/hurd/hurdfault.c
index bb6fa9576d..a8fe8fb07f 100644
--- a/hurd/hurdfault.c
+++ b/hurd/hurdfault.c
@@ -42,19 +42,21 @@ _hurdsig_fault_catch_exception_raise (mach_port_t port,
 				      int subcode)
 {
   int signo;
-  long int sigcode;
-  int sigerror;
+  struct hurd_signal_detail d;
 
   if (port != forward_sigexc ||
       thread != _hurd_msgport_thread || task != __mach_task_self ())
     return EPERM;		/* Strange bogosity.  */
 
+  d.exc = exception;
+  d.exc_code = code;
+  d.exc_subcode = subcode;
+
   /* Call the machine-dependent function to translate the Mach exception
      codes into a signal number and subcode.  */
-  _hurd_exception2signal (exception, code, subcode,
-			  &signo, &sigcode, &sigerror);
+  _hurd_exception2signal (&d, &signo);
 
-  return HURD_PREEMPT_SIGNAL_P (&_hurdsig_fault_preempter, signo, sigcode)
+  return HURD_PREEMPT_SIGNAL_P (&_hurdsig_fault_preempter, signo, d.code)
     ? 0 : EGREGIOUS;
 }
 
diff --git a/hurd/hurdprio.c b/hurd/hurdprio.c
index bbbe317406..66ef41656d 100644
--- a/hurd/hurdprio.c
+++ b/hurd/hurdprio.c
@@ -1,5 +1,5 @@
 /* Support code for dealing with priorities in the Hurd.
-Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -62,7 +62,7 @@ _hurd_priority_which_map (enum __priority_which which, int who,
 	  char *tw = 0;
 	  size_t twsz = 0;
 	  if (err = __USEPORT (PROC, __proc_getprocinfo (port, pids[i],
-							 pi_flags,
+							 &pi_flags,
 							 &pi, &pisize,
 							 &tw, &twsz)))
 	    continue;
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 2a517cfa5a..710d8d915a 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -130,7 +130,7 @@ int _hurd_core_limit;	/* XXX */
 /* Call the crash dump server to mummify us before we die.
    Returns nonzero if a core file was written.  */
 static int
-write_corefile (int signo, long int sigcode, int sigerror)
+write_corefile (int signo, const struct hurd_signal_detail *detail)
 {
   error_t err;
   mach_port_t coreserver;
@@ -168,13 +168,16 @@ write_corefile (int signo, long int sigcode, int sigerror)
   /* Call the core dumping server to write the core file.  */
   err = __crash_dump_task (coreserver,
 			   __mach_task_self (),
-			   file, _hurdsig_getenv ("GNUTARGET"),
-			   signo, sigcode, sigerror);
+			   file,
+			   signo, detail->code, detail->error,
+			   detail->exc, detail->exc_code, detail->exc_subcode,
+			   _hurd_ports[INIT_PORT_CTTYID].port,
+			   MACH_MSG_TYPE_COPY_SEND);
   __mach_port_deallocate (__mach_task_self (), coreserver);
   if (! err)
     /* The core dump into FILE succeeded, so now link it into the
        directory.  */
-    err = __dir_link (file, coredir, name);
+    err = __dir_link (file, coredir, name, 1);
   __mach_port_deallocate (__mach_task_self (), file);
   __mach_port_deallocate (__mach_task_self (), coredir);
   return !err;
@@ -477,7 +480,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 		   __mutex_unlock (&_hurd_siglock);
 		   abort_all_rpcs (signo, &thread_state, 1);
 		   reply ();
-		   __proc_mark_stop (port, signo);
+		   __proc_mark_stop (port, signo, detail->code);
 		 }));
       _hurd_stopped = 1;
     }
@@ -546,8 +549,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
     {
       __mutex_lock (&_hurd_siglock);
       for (pe = _hurdsig_preempters; pe && handler == SIG_ERR; pe = pe->next)
-	if (HURD_PREEMPT_SIGNAL_P (pe, signo, sigcode))
-	  handler = (*pe->preempter) (pe, ss, &signo, &sigcode, &sigerror);
+	if (HURD_PREEMPT_SIGNAL_P (pe, signo, detail->code))
+	  handler = (*pe->preempter) (pe, ss, &signo, detail);
       __mutex_unlock (&_hurd_siglock);
     }
 
@@ -664,7 +667,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
       /* If we would ordinarily stop for a job control signal, but we are
 	 orphaned so noone would ever notice and continue us again, we just
 	 quietly die, alone and in the dark.  */
-      sigcode = signo;
+      detail->code = signo;
       signo = SIGKILL;
       act = term;
     }
@@ -686,7 +689,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 	  /* We are already stopped, but receiving an untraced stop
 	     signal.  Instead of resuming and suspending again, just
 	     notify the proc server of the new stop signal.  */
-	  error_t err = __USEPORT (PROC, __proc_mark_stop (port, signo));
+	  error_t err = __USEPORT (PROC, __proc_mark_stop
+				   (port, signo, detail->code));
 	  assert_perror (err);
 	}
       else
@@ -701,7 +705,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
     sigbomb:
       /* We got a fault setting up the stack frame for the handler.
 	 Nothing to do but die; BSD gets SIGILL in this case.  */
-      sigcode = signo;	/* XXX ? */
+      detail->code = signo;	/* XXX ? */
       signo = SIGILL;
       act = core;
       /* FALLTHROUGH */
@@ -721,7 +725,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 	int status = W_EXITCODE (0, signo);
 	/* Do a core dump if desired.  Only set the wait status bit saying we
 	   in fact dumped core if the operation was actually successful.  */
-	if (act == core && write_corefile (signo, sigcode, sigerror))
+	if (act == core && write_corefile (signo, detail))
 	  status |= WCOREFLAG;
 	/* Tell proc how we died and then stick the saber in the gut.  */
 	_hurd_exit (status);
@@ -808,8 +812,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 
 	/* Call the machine-dependent function to set the thread up
 	   to run the signal handler, and preserve its old context.  */
-	scp = _hurd_setup_sighandler (ss, handler,
-				      signo, sigcode,
+	scp = _hurd_setup_sighandler (ss, handler, signo, detail,
 				      wait_for_reply, &thread_state);
 	if (scp == NULL)
 	  goto sigbomb;
@@ -848,7 +851,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 	}
 
 	/* Backdoor extra argument to signal handler.  */
-	scp->sc_error = sigerror;
+	scp->sc_error = detail->error;
 
 	/* Block SIGNO and requested signals while running the handler.  */
 	scp->sc_mask = ss->blocked;
@@ -897,8 +900,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 	  if (__sigismember (&pending, signo))
 	    {
 	      __sigdelset (&ss->pending, signo);
-	      sigcode = ss->pending_data[signo].code;
-	      sigerror = ss->pending_data[signo].error;
+	      *detail = ss->pending_data[signo];
 	      __spin_unlock (&ss->lock);
 	      goto post_signal;
 	    }
diff --git a/hurd/report-wait.c b/hurd/report-wait.c
index 35cf7c1a61..7fc92935bf 100644
--- a/hurd/report-wait.c
+++ b/hurd/report-wait.c
@@ -149,3 +149,28 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
   __mach_port_deallocate (__mach_task_self (), thread);
   return 0;
 }
+
+kern_return_t
+_S_msg_describe_ports (mach_port_t msgport, mach_port_t refport,
+		       mach_port_t *ports, mach_msg_type_number_t nports,
+		       char **desc, mach_msg_type_number_t *desclen)
+{
+  char *p, *end;
+
+  if (__USEPORT (AUTH, msgport != port))
+    return EPERM;
+
+  end = *desc + *desclen;
+  p = *desc;
+  while (nports-- > 0)
+    {
+      char this[200];
+      describe_port (this, *ports++);
+      p = __stpncpy (p, this, end - p);
+      if (p == end && p[-1] != '\0')
+	return ENOMEM;
+    }
+
+  *desclen = p - *desc;
+  return 0;
+}
diff --git a/math/Makefile b/math/Makefile
index 48652167ad..e1caa2908f 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -30,7 +30,6 @@ distribute	:= math_private.h machine/asm.h machine/endian.h
 # Build the -lm library.
 
 extra-libs	:= libm
-libm.so-version	:= .0
 libm-routines	:= e_acos e_acosf e_acosh e_acoshf e_asin e_asinf	\
 		   e_atan2 e_atan2f e_atanh e_atanhf e_cosh e_coshf	\
 		   e_exp e_expf e_fmod e_fmodf e_hypot e_hypotf e_j0	\
diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c
index 3e33f660c6..1f99c64e48 100644
--- a/misc/efgcvt_r.c
+++ b/misc/efgcvt_r.c
@@ -69,7 +69,9 @@ ecvt_r (value, ndigit, decpt, sign, buf, len)
      char *buf;
      size_t len;
 {
-  if (&log10)
+  double (*log10_function) (double) = &log10;
+  
+  if (log10_function)
     {
       /* Use the reasonable code if -lm is included.  */
       ndigit -= (int) floor (log10 (fabs (value)));
diff --git a/posix/unistd.h b/posix/unistd.h
index b48f24b389..15c40c434d 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -650,6 +650,9 @@ extern int chroot __P ((__const char *__path));
    This call is restricted to the super-user.  */
 extern int swapon __P ((__const char *__path));
 
+/* Stop using block special device PATH for swapping.  */
+extern int swapoff __P ((__const char *__path));
+
 /* Reboot or halt the system.  */
 extern int reboot __P ((int __howto));
 
diff --git a/shlib-versions b/shlib-versions
new file mode 100644
index 0000000000..7c899d4be9
--- /dev/null
+++ b/shlib-versions
@@ -0,0 +1,21 @@
+# This file defines the shared library version numbers we will install.
+
+# The following lines list filename patterns matching canonical configurations,
+# and the associated versions to use for various libraries.  The entire
+# list processed, with earlier entries taking precedence over later entries.
+# So loose patterns at the end of the list can give defaults.
+
+# Configuration		Library versions
+# -------------		------- --------
+
+# The interface to -lm depends only on cpu, not on operating system.
+i?86-*-*		libm=6
+
+# We provide libc.so.6 for Linux kernel versions 1.3.95 and later.
+i?86-*-linux*		libc=6
+
+# libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release.
+*-*-gnu*		libmachuser=1
+
+# libhurduser.so.0.0 corresponds to hurd/*.defs as of 7 May 1996.
+*-*-gnu*		libhurduser=0.0
diff --git a/stdio-common/_itoa.c b/stdio-common/_itoa.c
index 38d5367ba2..f85b15b030 100644
--- a/stdio-common/_itoa.c
+++ b/stdio-common/_itoa.c
@@ -49,7 +49,7 @@ Cambridge, MA 02139, USA.  */
 struct base_table_t
 {
 #if (UDIV_TIME > 2 * UMUL_TIME)
-  mp_limb base_multiplier;
+  mp_limb_t base_multiplier;
 #endif
   char flag;
   char post_shift;
@@ -58,9 +58,9 @@ struct base_table_t
     {
       char normalization_steps;
       char ndigits;
-      mp_limb base PACK;
+      mp_limb_t base PACK;
 #if UDIV_TIME > 2 * UMUL_TIME
-      mp_limb base_ninv PACK;
+      mp_limb_t base_ninv PACK;
 #endif
     } big;
 #endif
@@ -183,12 +183,12 @@ _itoa (value, buflim, base, upper_case)
       do								  \
         {								  \
 	  /* `unsigned long long int' always has 64 bits.  */		  \
-	  mp_limb work_hi = value >> (64 - BITS_PER_MP_LIMB);		  \
+	  mp_limb_t work_hi = value >> (64 - BITS_PER_MP_LIMB);		  \
 									  \
 	  if (BITS_PER_MP_LIMB == 32)					  \
 	    if (work_hi != 0)						  \
 	      {								  \
-		mp_limb work_lo;					  \
+		mp_limb_t work_lo;					  \
 		int cnt;						  \
 									  \
 		work_lo = value & 0xfffffffful;				  \
@@ -228,11 +228,11 @@ _itoa (value, buflim, base, upper_case)
     default:
       {
 #if BITS_PER_MP_LIMB == 64
-	mp_limb base_multiplier = brec->base_multiplier;
+	mp_limb_t base_multiplier = brec->base_multiplier;
 	if (brec->flag)
 	  while (value != 0)
 	    {
-	      mp_limb quo, rem, x, dummy;
+	      mp_limb_t quo, rem, x, dummy;
 
 	      umul_ppmm (x, dummy, value, base_multiplier);
 	      quo = (x + ((value - x) >> 1)) >> (brec->post_shift - 1);
@@ -243,7 +243,7 @@ _itoa (value, buflim, base, upper_case)
 	else
 	  while (value != 0)
 	    {
-	      mp_limb quo, rem, x, dummy;
+	      mp_limb_t quo, rem, x, dummy;
 
 	      umul_ppmm (x, dummy, value, base_multiplier);
 	      quo = x >> brec->post_shift;
@@ -253,36 +253,36 @@ _itoa (value, buflim, base, upper_case)
 	    }
 #endif
 #if BITS_PER_MP_LIMB == 32
-	mp_limb t[3];
+	mp_limb_t t[3];
 	int n;
 
 	/* First convert x0 to 1-3 words in base s->big.base.
 	   Optimize for frequent cases of 32 bit numbers.  */
-	if ((mp_limb) (value >> 32) >= 1)
+	if ((mp_limb_t) (value >> 32) >= 1)
 	  {
 	    int big_normalization_steps = brec->big.normalization_steps;
-	    mp_limb big_base_norm = brec->big.base << big_normalization_steps;
+	    mp_limb_t big_base_norm = brec->big.base << big_normalization_steps;
 
-	    if ((mp_limb) (value >> 32) >= brec->big.base)
+	    if ((mp_limb_t) (value >> 32) >= brec->big.base)
 	      {
-		mp_limb x1hi, x1lo, r;
+		mp_limb_t x1hi, x1lo, r;
 		/* If you want to optimize this, take advantage of
 		   that the quotient in the first udiv_qrnnd will
 		   always be very small.  It might be faster just to
 		   subtract in a tight loop.  */
 
 #if UDIV_TIME > 2 * UMUL_TIME
-		mp_limb x, xh, xl;
+		mp_limb_t x, xh, xl;
 
 		if (big_normalization_steps == 0)
 		  xh = 0;
 		else
-		  xh = (mp_limb) (value >> 64 - big_normalization_steps);
-		xl = (mp_limb) (value >> 32 - big_normalization_steps);
+		  xh = (mp_limb_t) (value >> 64 - big_normalization_steps);
+		xl = (mp_limb_t) (value >> 32 - big_normalization_steps);
 		udiv_qrnnd_preinv (x1hi, r, xh, xl, big_base_norm,
 				   brec->big.base_ninv);
 
-		xl = ((mp_limb) value) << big_normalization_steps;
+		xl = ((mp_limb_t) value) << big_normalization_steps;
 		udiv_qrnnd_preinv (x1lo, x, r, xl, big_base_norm,
 				   big_normalization_steps);
 		t[2] = x >> big_normalization_steps;
@@ -297,16 +297,16 @@ _itoa (value, buflim, base, upper_case)
 				   big_normalization_steps);
 		t[1] = x >> big_normalization_steps;
 #elif UDIV_NEEDS_NORMALIZATION
-		mp_limb x, xh, xl;
+		mp_limb_t x, xh, xl;
 
 		if (big_normalization_steps == 0)
 		  xh = 0;
 		else
-		  xh = (mp_limb) (value >> 64 - big_normalization_steps);
-		xl = (mp_limb) (value >> 32 - big_normalization_steps);
+		  xh = (mp_limb_t) (value >> 64 - big_normalization_steps);
+		xl = (mp_limb_t) (value >> 32 - big_normalization_steps);
 		udiv_qrnnd (x1hi, r, xh, xl, big_base_norm);
 
-		xl = ((mp_limb) value) << big_normalization_steps;
+		xl = ((mp_limb_t) value) << big_normalization_steps;
 		udiv_qrnnd (x1lo, x, r, xl, big_base_norm);
 		t[2] = x >> big_normalization_steps;
 
@@ -319,9 +319,9 @@ _itoa (value, buflim, base, upper_case)
 		udiv_qrnnd (t[0], x, xh, xl, big_base_norm);
 		t[1] = x >> big_normalization_steps;
 #else
-		udiv_qrnnd (x1hi, r, 0, (mp_limb) (value >> 32),
+		udiv_qrnnd (x1hi, r, 0, (mp_limb_t) (value >> 32),
 			    brec->big.base);
-		udiv_qrnnd (x1lo, t[2], r, (mp_limb) value, brec->big.base);
+		udiv_qrnnd (x1lo, t[2], r, (mp_limb_t) value, brec->big.base);
 		udiv_qrnnd (t[0], t[1], x1hi, x1lo, brec->big.base);
 #endif
 		n = 3;
@@ -329,23 +329,23 @@ _itoa (value, buflim, base, upper_case)
 	    else
 	      {
 #if (UDIV_TIME > 2 * UMUL_TIME)
-		mp_limb x;
+		mp_limb_t x;
 
 		value <<= brec->big.normalization_steps;
-		udiv_qrnnd_preinv (t[0], x, (mp_limb) (value >> 32),
-				   (mp_limb) value, big_base_norm,
+		udiv_qrnnd_preinv (t[0], x, (mp_limb_t) (value >> 32),
+				   (mp_limb_t) value, big_base_norm,
 				   brec->big.base_ninv);
 		t[1] = x >> brec->big.normalization_steps;
 #elif UDIV_NEEDS_NORMALIZATION
-		mp_limb x;
+		mp_limb_t x;
 
 		value <<= big_normalization_steps;
-		udiv_qrnnd (t[0], x, (mp_limb) (value >> 32),
-			    (mp_limb) value, big_base_norm);
+		udiv_qrnnd (t[0], x, (mp_limb_t) (value >> 32),
+			    (mp_limb_t) value, big_base_norm);
 		t[1] = x >> big_normalization_steps;
 #else
-		udiv_qrnnd (t[0], t[1], (mp_limb) (value >> 32),
-			    (mp_limb) value, brec->big.base);
+		udiv_qrnnd (t[0], t[1], (mp_limb_t) (value >> 32),
+			    (mp_limb_t) value, brec->big.base);
 #endif
 		n = 2;
 	      }
@@ -359,15 +359,15 @@ _itoa (value, buflim, base, upper_case)
 	/* Convert the 1-3 words in t[], word by word, to ASCII.  */
 	do
 	  {
-	    mp_limb ti = t[--n];
+	    mp_limb_t ti = t[--n];
 	    int ndig_for_this_limb = 0;
 
 #if UDIV_TIME > 2 * UMUL_TIME
-	    mp_limb base_multiplier = brec->base_multiplier;
+	    mp_limb_t base_multiplier = brec->base_multiplier;
 	    if (brec->flag)
 	      while (ti != 0)
 		{
-		  mp_limb quo, rem, x, dummy;
+		  mp_limb_t quo, rem, x, dummy;
 
 		  umul_ppmm (x, dummy, ti, base_multiplier);
 		  quo = (x + ((ti - x) >> 1)) >> (brec->post_shift - 1);
@@ -379,7 +379,7 @@ _itoa (value, buflim, base, upper_case)
 	    else
 	      while (ti != 0)
 		{
-		  mp_limb quo, rem, x, dummy;
+		  mp_limb_t quo, rem, x, dummy;
 
 		  umul_ppmm (x, dummy, ti, base_multiplier);
 		  quo = x >> brec->post_shift;
@@ -391,7 +391,7 @@ _itoa (value, buflim, base, upper_case)
 #else
 	    while (ti != 0)
 	      {
-		mp_limb quo, rem;
+		mp_limb_t quo, rem;
 
 		quo = ti / base;
 		rem = ti % base;
diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c
index 4e6104a71b..237deb99a5 100644
--- a/stdio-common/printf_fp.c
+++ b/stdio-common/printf_fp.c
@@ -28,7 +28,6 @@ Cambridge, MA 02139, USA.  */
 #  include <stdio.h>
 #endif
 #include <alloca.h>
-#include <ansidecl.h>
 #include <ctype.h>
 #include <float.h>
 #include <gmp-mparam.h>
@@ -69,7 +68,7 @@ ssize_t __printf_pad __P ((FILE *, char pad, int n)); /* In vfprintf.c.  */
 #define outchar(ch)							      \
   do									      \
     {									      \
-      register CONST int outc = (ch);					      \
+      register const int outc = (ch);					      \
       if (putc (outc, fp) == EOF)					      \
 	return -1;							      \
       ++done;								      \
@@ -107,10 +106,10 @@ ssize_t __printf_pad __P ((FILE *, char pad, int n)); /* In vfprintf.c.  */
    An MP variable occupies a varying number of entries in its array.  We keep
    track of this number for efficiency reasons.  Otherwise we would always
    have to process the whole array.  */
-#define MPN_VAR(name) mp_limb *name; mp_size_t name##size
+#define MPN_VAR(name) mp_limb_t *name; mp_size_t name##size
 
 #define MPN_ASSIGN(dst,src)						      \
-  memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb))
+  memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t))
 #define MPN_GE(u,v) \
   (u##size > v##size || (u##size == v##size && __mpn_cmp (u, v, u##size) >= 0))
 
@@ -139,7 +138,7 @@ __printf_fp (FILE *fp,
   union
     {
       double dbl;
-      LONG_DOUBLE ldbl;
+      __long_double_t ldbl;
     }
   fpnum;
 
@@ -151,11 +150,11 @@ __printf_fp (FILE *fp,
   const char *grouping;
 
   /* "NaN" or "Inf" for the special cases.  */
-  CONST char *special = NULL;
+  const char *special = NULL;
 
   /* We need just a few limbs for the input before shifting to the right
      position.	*/
-  mp_limb fp_input[(LDBL_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB];
+  mp_limb_t fp_input[(LDBL_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB];
   /* We need to shift the contents of fp_input by this amount of bits.	*/
   int to_shift;
 
@@ -184,11 +183,11 @@ __printf_fp (FILE *fp,
   int done = 0;
 
   /* General helper (carry limb).  */
-  mp_limb cy;
+  mp_limb_t cy;
 
   char hack_digit (void)
     {
-      mp_limb hi;
+      mp_limb_t hi;
 
       if (expsign != 0 && type == 'f' && exponent-- > 0)
 	hi = 0;
@@ -337,10 +336,10 @@ __printf_fp (FILE *fp,
      would be really big it could lead to memory problems.  */
   {
     mp_size_t bignum_size = ((ABS (exponent) + BITS_PER_MP_LIMB - 1)
-			     / BITS_PER_MP_LIMB + 4) * sizeof (mp_limb);
-    frac = (mp_limb *) alloca (bignum_size);
-    tmp = (mp_limb *) alloca (bignum_size);
-    scale = (mp_limb *) alloca (bignum_size);
+			     / BITS_PER_MP_LIMB + 4) * sizeof (mp_limb_t);
+    frac = (mp_limb_t *) alloca (bignum_size);
+    tmp = (mp_limb_t *) alloca (bignum_size);
+    scale = (mp_limb_t *) alloca (bignum_size);
   }
 
   /* We now have to distinguish between numbers with positive and negative
@@ -515,7 +514,7 @@ __printf_fp (FILE *fp,
 	  if (exponent >= tens->m_expo)
 	    {
 	      int i, incr, cnt_h, cnt_l;
-	      mp_limb topval[2];
+	      mp_limb_t topval[2];
 
 	      /* The __mpn_mul function expects the first argument to be
 		 bigger than the second.  */
@@ -545,11 +544,11 @@ __printf_fp (FILE *fp,
 		  {
 		    topval[0] = 0;
 		    topval[1]
-		      = ((mp_limb) 10) << (BITS_PER_MP_LIMB - 4 - cnt_h);
+		      = ((mp_limb_t) 10) << (BITS_PER_MP_LIMB - 4 - cnt_h);
 		  }
 		else
 		  {
-		    topval[0] = ((mp_limb) 10) << (BITS_PER_MP_LIMB - 4);
+		    topval[0] = ((mp_limb_t) 10) << (BITS_PER_MP_LIMB - 4);
 		    topval[1] = 0;
 		    (void) __mpn_lshift (topval, topval, 2,
 					 BITS_PER_MP_LIMB - cnt_h);
diff --git a/stdio/linewrap.c b/stdio/linewrap.c
index e821cc3575..7f6576f29b 100644
--- a/stdio/linewrap.c
+++ b/stdio/linewrap.c
@@ -22,42 +22,27 @@ Cambridge, MA 02139, USA.  */
 #include <string.h>
 #include <stdlib.h>
 
-/* We keep this data for each line-wrapping stream.  */
-
-struct data
-  {
-    const size_t *lmargin, *rmargin; /* Left and right margins.  */
-    const size_t *wrapmargin;	/* Margin to wrap to, or null to truncate.  */
-    size_t point;		/* Current column of last chars flushed.  */
-
-    /* Original cookie and hooks from the stream.  */
-    void *cookie;
-    void (*output) (FILE *, int);
-    __io_close_fn *close;
-    __io_fileno_fn *fileno;
-    __io_seek_fn *seek;
-  };
+#include <linewrap.h>
+
+void __line_wrap_output (FILE *, int);
 
 /* Install our hooks into a stream.  */
-
 static inline void
-wrap_stream (FILE *stream, struct data *d)
+wrap_stream (FILE *stream, struct line_wrap_data *d)
 {
-  static void lwoutput (FILE *, int);
   static __io_close_fn lwclose;
   static __io_fileno_fn lwfileno;
 
   stream->__cookie = d;
-  stream->__room_funcs.__output = &lwoutput;
+  stream->__room_funcs.__output = &__line_wrap_output;
   stream->__io_funcs.__close = &lwclose;
   stream->__io_funcs.__fileno = &lwfileno;
   stream->__io_funcs.__seek = NULL; /* Cannot seek.  */
 }
 
 /* Restore a stream to its original state.  */
-
 static inline void
-unwrap_stream (FILE *stream, struct data *d)
+unwrap_stream (FILE *stream, struct line_wrap_data *d)
 {
   stream->__cookie = d->cookie;
   stream->__room_funcs.__output = d->output;
@@ -72,41 +57,40 @@ unwrap_stream (FILE *stream, struct data *d)
 static int
 lwclose (void *cookie)
 {
-  struct data *d = cookie;
+  struct line_wrap_data *d = cookie;
   return (*d->close) (d->cookie);
 }
 
 static int
 lwfileno (void *cookie)
 {
-  struct data *d = cookie;
+  struct line_wrap_data *d = cookie;
   return (*d->fileno) (d->cookie);
 }
 
 /* This function is called when STREAM must be flushed.
    C is EOF or a character to be appended to the buffer contents.  */
-
-static void
-lwoutput (FILE *stream, int c)
+void
+__line_wrap_output (FILE *stream, int c)
 {
   char *buf, *nl;
   size_t len;
 
   /* Extract our data and restore the stream's original cookie
      and output function so writes we do really go out.  */
-  struct data *d = stream->__cookie;
+  struct line_wrap_data *d = stream->__cookie;
   unwrap_stream (stream, d);
 
   /* Scan the buffer for newlines.  */
-  for (buf = stream->__buffer;
-       (buf < stream->__bufp || (c != EOF && c != '\n')) && !stream->__error)
+  buf = stream->__buffer;
+  while ((buf < stream->__bufp || (c != EOF && c != '\n')) && !stream->__error)
     {
       size_t r;
 
-      if (d->point == 0 && d->lmargin && *d->lmargin != 0)
+      if (d->point == 0 && d->lmargin != 0)
 	{
 	  /* We are starting a new line.  Print spaces to the left margin.  */
-	  const size_t pad = *d->lmargin;
+	  const size_t pad = d->lmargin;
 	  if (stream->__bufp + pad < stream->__put_limit)
 	    {
 	      /* We can fit in them in the buffer by moving the
@@ -141,8 +125,7 @@ lwoutput (FILE *stream, int c)
 	{
 	  /* The buffer ends in a partial line.  */
 
-	  if (!d->rmargin ||
-	      d->point + len + (c != EOF && c != '\n') <= d->rmargin)
+	  if (d->point + len + (c != EOF && c != '\n') <= d->rmargin)
 	    {
 	      /* The remaining buffer text is a partial line and fits
 		 within the maximum line width.  Advance point for the
@@ -155,7 +138,7 @@ lwoutput (FILE *stream, int c)
 	       the end of the buffer.  */
 	    nl = stream->__bufp;
 	}
-      else if (!d->rmargin || d->point + (nl - buf) <= d->rmargin)
+      else if (d->point + (nl - buf) <= d->rmargin)
 	{
 	  /* The buffer contains a full line that fits within the maximum
 	     line width.  Reset point and scan the next line.  */
@@ -165,9 +148,9 @@ lwoutput (FILE *stream, int c)
 	}
 
       /* This line is too long.  */
-      r = *d->rmargin;
+      r = d->rmargin;
 
-      if (! d->wrapmargin)
+      if (d->wmargin < 0)
 	{
 	  /* Truncate the line by overwriting the excess with the
 	     newline and anything after it in the buffer.  */
@@ -242,7 +225,7 @@ lwoutput (FILE *stream, int c)
 
 	  /* Temporarily reset bufp to include just the first line.  */
 	  stream->__bufp = nl;
-	  if (nextline - (nl + 1) < d->wrap)
+	  if (nextline - (nl + 1) < d->wmargin)
 	    /* The margin needs more blanks than we removed.
 	       Output the first line so we can use the space.  */
 	    (*d->output) (stream, '\n');
@@ -255,7 +238,7 @@ lwoutput (FILE *stream, int c)
 	  d->point = 0;
 
 	  /* Add blanks up to the wrap margin column.  */
-	  for (i = 0; i < d->wrap; ++i)
+	  for (i = 0; i < d->wmargin; ++i)
 	    *stream->__bufp++ = ' ';
 
 	  /* Copy the tail of the original buffer into the current buffer
@@ -284,19 +267,16 @@ lwoutput (FILE *stream, int c)
   wrap_stream (stream, d);
 }
 
-/* Modify STREAM so that it prefixes lines written on it with *LMARGIN
-   spaces and limits them to *RMARGIN columns total.  If WRAP is not null,
-   words that extend past *RMARGIN are wrapped by replacing the whitespace
-   before them with a newline and *WRAP spaces.  Otherwise, chars beyond
-   *RMARGIN are simply dropped until a newline.  Returns STREAM after
-   modifying it, or NULL if there was an error.  The pointers passed are
-   stored in the stream and so must remain valid until `line_unwrap_stream'
-   is called; the values pointed to can be changed between stdio calls.  */
-
+/* Modify STREAM so that it prefixes lines written on it with LMARGIN spaces
+   and limits them to RMARGIN columns total.  If WMARGIN >= 0, words that
+   extend past RMARGIN are wrapped by replacing the whitespace before them
+   with a newline and WMARGIN spaces.  Otherwise, chars beyond RMARGIN are
+   simply dropped until a newline.  Returns STREAM after modifying it, or
+   NULL if there was an error.  */
 FILE *
-line_wrap_stream (FILE *stream, size_t *lmargin, size_t *rmargin, size_t *wrap)
+line_wrap_stream (FILE *stream, size_t lmargin, size_t rmargin, size_t wmargin)
 {
-  struct data *d = malloc (sizeof *d);
+  struct line_wrap_data *d = malloc (sizeof *d);
 
   if (!d)
     return NULL;
@@ -321,25 +301,116 @@ line_wrap_stream (FILE *stream, size_t *lmargin, size_t *rmargin, size_t *wrap)
      to work if the stream is switched to full or no buffering.  */
   stream->__linebuf = 1;
 
-#define	ref(arg)	d->arg = arg
-  ref (lmargin);
-  ref (rmargin);
-  ref (wrap);
-#undef	ref
+  d->lmargin = lmargin;
+  d->rmargin = rmargin;
+  d->wmargin = wmargin;
 
   return stream;
 }
 
 /* Remove the hooks placed in STREAM by `line_wrap_stream'.  */
-
 void
 line_unwrap_stream (FILE *stream)
 {
-  struct data *d = stream->__cookie;
+  struct line_wrap_data *d = stream->__cookie;
   unwrap_stream (stream, d);
   free (d);
 }
 
+/* Functions on wrapped streams.  */
+
+/* Returns true if STREAM is line wrapped.  */
+inline int
+line_wrapped (FILE *stream)
+{
+  return (stream->__room_funcs.__output == &__line_wrap_output);
+}
+
+/* If STREAM is not line-wrapped return -1, else return its left margin.  */
+size_t
+line_wrap_lmargin (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->lmargin;
+}
+
+/* If STREAM is not line-wrapped return -1, else set its left margin to
+   LMARGIN and return the old value.  */
+size_t
+line_wrap_set_lmargin (FILE *stream, size_t lmargin)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  else
+    {
+      struct line_wrap_data *d = stream->__cookie;
+      size_t old = d->lmargin;
+      d->lmargin = lmargin;
+      return old;
+    }
+}
+
+/* If STREAM is not line-wrapped return -1, else return its left margin.  */
+size_t
+line_wrap_rmargin (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->rmargin;
+}
+
+/* If STREAM is not line-wrapped return -1, else set its right margin to
+   RMARGIN and return the old value.  */
+size_t
+line_wrap_set_rmargin (FILE *stream, size_t rmargin)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  else
+    {
+      struct line_wrap_data *d = stream->__cookie;
+      size_t old = d->rmargin;
+      d->rmargin = rmargin;
+      return old;
+    }
+}
+
+/* If STREAM is not line-wrapped return -1, else return its wrap margin.  */
+size_t
+line_wrap_wmargin (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->wmargin;
+}
+
+/* If STREAM is not line-wrapped return -1, else set its left margin to
+   WMARGIN and return the old value.  */
+size_t
+line_wrap_set_wmargin (FILE *stream, size_t wmargin)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  else
+    {
+      struct line_wrap_data *d = stream->__cookie;
+      size_t old = d->wmargin;
+      d->wmargin = wmargin;
+      return old;
+    }
+}
+
+/* If STREAM is not line-wrapped return -1, else return the column number of
+   the current output point.  */
+size_t
+line_wrap_point (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->point;
+}
+
 #ifdef TEST
 int
 main (int argc, char **argv)
diff --git a/stdio/linewrap.h b/stdio/linewrap.h
new file mode 100644
index 0000000000..7ba337fad2
--- /dev/null
+++ b/stdio/linewrap.h
@@ -0,0 +1,189 @@
+/* Word-wrapping and line-truncating streams.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef __LINEWRAP_H__
+#define __LINEWRAP_H__
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include <features.h>
+
+#include <string.h>		/* Need size_t.  */
+
+__BEGIN_DECLS
+
+/* We keep this data for each line-wrapping stream.  */
+struct line_wrap_data
+  {
+    size_t lmargin, rmargin;	/* Left and right margins.  */
+    size_t wmargin;		/* Margin to wrap to, or -1 to truncate.  */
+    size_t point;		/* Current column of last chars flushed.  */
+
+    /* Original cookie and hooks from the stream.  */
+    void *cookie;
+    void (*output) (FILE *, int);
+    __io_close_fn *close;
+    __io_fileno_fn *fileno;
+    __io_seek_fn *seek;
+  };
+
+/* Modify STREAM so that it prefixes lines written on it with LMARGIN spaces
+   and limits them to RMARGIN columns total.  If WMARGIN >= 0, words that
+   extend past RMARGIN are wrapped by replacing the whitespace before them
+   with a newline and WMARGIN spaces.  Otherwise, chars beyond RMARGIN are
+   simply dropped until a newline.  Returns STREAM after modifying it, or
+   NULL if there was an error.  */
+FILE *line_wrap_stream (FILE *stream,
+			size_t lmargin, size_t rmargin, size_t wmargin);
+
+/* Remove the hooks placed in STREAM by `line_wrap_stream'.  */
+void line_unwrap_stream (FILE *stream);
+
+/* Returns true if STREAM is line wrapped.  */
+extern inline int line_wrapped (FILE *stream); 
+
+/* If STREAM is not line-wrapped return -1, else return its left margin.  */
+extern size_t line_wrap_lmargin (FILE *stream); 
+
+/* If STREAM is not line-wrapped return -1, else set its left margin to
+   LMARGIN and return the old value.  */
+extern size_t line_wrap_set_lmargin (FILE *stream, size_t lmargin); 
+
+/* If STREAM is not line-wrapped return -1, else return its left margin.  */
+extern size_t line_wrap_rmargin (FILE *stream); 
+
+/* If STREAM is not line-wrapped return -1, else set its right margin to
+   RMARGIN and return the old value.  */
+extern size_t line_wrap_set_rmargin (FILE *stream, size_t rmargin); 
+
+/* If STREAM is not line-wrapped return -1, else return its wrap margin.  */
+extern size_t line_wrap_wmargin (FILE *stream); 
+
+/* If STREAM is not line-wrapped return -1, else set its left margin to
+   WMARGIN and return the old value.  */
+extern size_t line_wrap_set_wmargin (FILE *stream, size_t wmargin); 
+
+/* If STREAM is not line-wrapped return -1, else return the column number of
+   the current output point.  */
+extern size_t line_wrap_point (FILE *stream); 
+
+
+#ifdef	__OPTIMIZE__
+
+extern void __line_wrap_output (FILE *, int); /* private */
+
+/* Returns true if STREAM is line wrapped.  */
+extern inline int
+line_wrapped (FILE *stream)
+{
+  return (stream->__room_funcs.__output == &__line_wrap_output);
+}
+
+/* If STREAM is not line-wrapped return -1, else return its left margin.  */
+extern inline size_t
+line_wrap_lmargin (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->lmargin;
+}
+
+/* If STREAM is not line-wrapped return -1, else set its left margin to
+   LMARGIN and return the old value.  */
+extern inline size_t
+line_wrap_set_lmargin (FILE *stream, size_t lmargin)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  else
+    {
+      struct line_wrap_data *d = stream->__cookie;
+      size_t old = d->lmargin;
+      d->lmargin = lmargin;
+      return old;
+    }
+}
+
+/* If STREAM is not line-wrapped return -1, else return its left margin.  */
+extern inline size_t
+line_wrap_rmargin (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->rmargin;
+}
+
+/* If STREAM is not line-wrapped return -1, else set its right margin to
+   RMARGIN and return the old value.  */
+extern inline size_t
+line_wrap_set_rmargin (FILE *stream, size_t rmargin)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  else
+    {
+      struct line_wrap_data *d = stream->__cookie;
+      size_t old = d->rmargin;
+      d->rmargin = rmargin;
+      return old;
+    }
+}
+
+/* If STREAM is not line-wrapped return -1, else return its wrap margin.  */
+extern inline size_t
+line_wrap_wmargin (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->wmargin;
+}
+
+/* If STREAM is not line-wrapped return -1, else set its left margin to
+   WMARGIN and return the old value.  */
+extern inline size_t
+line_wrap_set_wmargin (FILE *stream, size_t wmargin)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  else
+    {
+      struct line_wrap_data *d = stream->__cookie;
+      size_t old = d->wmargin;
+      d->wmargin = wmargin;
+      return old;
+    }
+}
+
+/* If STREAM is not line-wrapped return -1, else return the column number of
+   the current output point.  */
+extern inline size_t
+line_wrap_point (FILE *stream)
+{
+  if (! line_wrapped (stream))
+    return -1;
+  return ((struct line_wrap_data *)stream->__cookie)->point;
+}
+
+#endif /* Optimizing.  */
+
+__END_DECLS
+
+#endif /* __LINEWRAP_H__ */
diff --git a/stdio/stdio.h b/stdio/stdio.h
index efaf2b95bf..38bfc148d7 100644
--- a/stdio/stdio.h
+++ b/stdio/stdio.h
@@ -353,22 +353,6 @@ extern FILE *fmemopen __P ((__ptr_t __s, size_t __len, __const char *__modes));
    necessary.  *BUFLOC and *SIZELOC are updated with the buffer's location
    and the number of characters written on fflush or fclose.  */
 extern FILE *open_memstream __P ((char **__bufloc, size_t *__sizeloc));
-
-
-/* Modify STREAM so that it prefixes lines written on it with *LMARGIN
-   spaces and limits them to *RMARGIN columns total.  If WRAP is not null,
-   words that extend past *RMARGIN are wrapped by replacing the whitespace
-   before them with a newline and *WRAP spaces.  Otherwise, chars beyond
-   *RMARGIN are simply dropped until a newline.  Returns STREAM after
-   modifying it, or NULL if there was an error.  The pointers passed are
-   stored in the stream and so must remain valid until `line_unwrap_stream'
-   is called; the values pointed to can be changed between stdio calls.  */
-extern FILE *line_wrap_stream __P ((FILE *__stream,
-				    size_t *__lmargin, size_t *__rmargin,
-				    size_t *__wrap));
-
-/* Remove the hooks placed in STREAM by `line_wrap_stream'.  */
-extern void line_unwrap_stream __P ((FILE *__stream));
 #endif
 
 
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 1fdfb68bb4..212ea0a54b 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -49,7 +49,7 @@ tests		:= tst-strtol tst-strtod testmb testrand testsort testdiv
 
 
 # Several mpn functions from GNU MP are used by the strtod function.
-mpn-routines := add_1 add_n addmul_1 cmp divrem divmod_1 udiv_qrnnd \
+mpn-routines := inlines add_n addmul_1 cmp divmod_1 divrem udiv_qrnnd \
 		lshift rshift mod_1 mul mul_1 mul_n sub_n submul_1
 mpn-headers = longlong.h gmp.h gmp-impl.h gmp-mparam.h asm-syntax.h
 
diff --git a/stdlib/fpioconst.c b/stdlib/fpioconst.c
index 8d0a8233b0..92eae7de90 100644
--- a/stdlib/fpioconst.c
+++ b/stdlib/fpioconst.c
@@ -1,5 +1,5 @@
 /* Table of MP integer constants 10^(2^i), used for floating point <-> decimal.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -29,32 +29,32 @@ Cambridge, MA 02139, USA.  */
 
 /* Table with constants of 10^(2^i), i=0..12 for 32-bit limbs.	*/
 
-static const mp_limb _ten_p0[] =
+static const mp_limb_t _ten_p0[] =
   { 0x00000000, 0x00000000, 0x0000000a };
-static const mp_limb _ten_p1[] =
+static const mp_limb_t _ten_p1[] =
   { 0x00000000, 0x00000000, 0x00000064 };
-static const mp_limb _ten_p2[] =
+static const mp_limb_t _ten_p2[] =
   { 0x00000000, 0x00000000, 0x00002710 };
-static const mp_limb _ten_p3[] =
+static const mp_limb_t _ten_p3[] =
   { 0x00000000, 0x00000000, 0x05f5e100 };
-static const mp_limb _ten_p4[] =
+static const mp_limb_t _ten_p4[] =
   { 0x00000000, 0x00000000, 0x6fc10000, 0x002386f2 };
-static const mp_limb _ten_p5[] =
+static const mp_limb_t _ten_p5[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x85acef81, 0x2d6d415b, 0x000004ee };
-static const mp_limb _ten_p6[] =
+static const mp_limb_t _ten_p6[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbf6a1f01, 0x6e38ed64,
     0xdaa797ed, 0xe93ff9f4, 0x00184f03 };
-static const mp_limb _ten_p7[] =
+static const mp_limb_t _ten_p7[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x2e953e01, 0x03df9909, 0x0f1538fd, 0x2374e42f, 0xd3cff5ec, 0xc404dc08,
     0xbccdb0da, 0xa6337f19, 0xe91f2603, 0x0000024e };
-static const mp_limb _ten_p8[] =
+static const mp_limb_t _ten_p8[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x982e7c01, 0xbed3875b,
     0xd8d99f72, 0x12152f87, 0x6bde50c6, 0xcf4a6e70, 0xd595d80f, 0x26b2716e,
     0xadc666b0, 0x1d153624, 0x3c42d35a, 0x63ff540e, 0xcc5573c0, 0x65f9ef17,
     0x55bc28f2, 0x80dcc7f7, 0xf46eeddc, 0x5fdcefce, 0x000553f7 };
-static const mp_limb _ten_p9[] =
+static const mp_limb_t _ten_p9[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -65,7 +65,7 @@ static const mp_limb _ten_p9[] =
     0x93abade4, 0x1366732a, 0x9449775c, 0x69be5b0e, 0x7343afac, 0xb099bc81,
     0x45a71d46, 0xa2699748, 0x8cb07303, 0x8a0b1f13, 0x8cab8a97, 0xc1d238d9,
     0x633415d4, 0x0000001c };
-static const mp_limb _ten_p10[] =
+static const mp_limb_t _ten_p10[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -85,7 +85,7 @@ static const mp_limb _ten_p10[] =
     0x36a8de06, 0x73c55349, 0xa7e6bd2a, 0xc1a6970c, 0x47187094, 0xd2db49ef,
     0x926c3f5b, 0xae6209d4, 0x2d433949, 0x34f4a3c6, 0xd4305d94, 0xd9d61a05,
     0x00000325 };
-static const mp_limb _ten_p11[] =
+static const mp_limb_t _ten_p11[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -122,7 +122,7 @@ static const mp_limb _ten_p11[] =
     0x8c983623, 0xe50f3027, 0x94222771, 0x1d08e2d6, 0xf7e928e6, 0xf2ee5ca6,
     0x1b61b93c, 0x11eb962b, 0x9648b21c, 0xce2bcba1, 0x34f77154, 0x7bbebe30,
     0xe526a319, 0x8ce329ac, 0xde4a74d2, 0xb5dc53d5, 0x0009e8b3 };
-static const mp_limb _ten_p12[] =
+static const mp_limb_t _ten_p12[] =
   { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -203,32 +203,32 @@ static const mp_limb _ten_p12[] =
 
 /* Table with constants of 10^(2^i), i=0..12 for 64-bit limbs.	*/
 
-static const mp_limb _ten_p0[] =
+static const mp_limb_t _ten_p0[] =
   { 0x0000000000000000, 0x000000000000000a };
-static const mp_limb _ten_p1[] =
+static const mp_limb_t _ten_p1[] =
   { 0x0000000000000000, 0x0000000000000064 };
-static const mp_limb _ten_p2[] =
+static const mp_limb_t _ten_p2[] =
   { 0x0000000000000000, 0x0000000000002710 };
-static const mp_limb _ten_p3[] =
+static const mp_limb_t _ten_p3[] =
   { 0x0000000000000000, 0x0000000005f5e100 };
-static const mp_limb _ten_p4[] =
+static const mp_limb_t _ten_p4[] =
   { 0x0000000000000000, 0x002386f26fc10000 };
-static const mp_limb _ten_p5[] =
+static const mp_limb_t _ten_p5[] =
   { 0x0000000000000000, 0x85acef8100000000, 0x000004ee2d6d415b };
-static const mp_limb _ten_p6[] =
+static const mp_limb_t _ten_p6[] =
   { 0x0000000000000000, 0x0000000000000000, 0x6e38ed64bf6a1f01,
     0xe93ff9f4daa797ed, 0x0000000000184f03 };
-static const mp_limb _ten_p7[] =
+static const mp_limb_t _ten_p7[] =
   { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x03df99092e953e01, 0x2374e42f0f1538fd, 0xc404dc08d3cff5ec,
     0xa6337f19bccdb0da, 0x0000024ee91f2603 };
-static const mp_limb _ten_p8[] =
+static const mp_limb_t _ten_p8[] =
   { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0xbed3875b982e7c01,
     0x12152f87d8d99f72, 0xcf4a6e706bde50c6, 0x26b2716ed595d80f,
     0x1d153624adc666b0, 0x63ff540e3c42d35a, 0x65f9ef17cc5573c0,
     0x80dcc7f755bc28f2, 0x5fdcefcef46eeddc, 0x00000000000553f7 };
-static const mp_limb _ten_p9[] =
+static const mp_limb_t _ten_p9[] =
   { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
@@ -239,7 +239,7 @@ static const mp_limb _ten_p9[] =
     0x1366732a93abade4, 0x69be5b0e9449775c, 0xb099bc817343afac,
     0xa269974845a71d46, 0x8a0b1f138cb07303, 0xc1d238d98cab8a97,
     0x0000001c633415d4 };
-static const mp_limb _ten_p10[] =
+static const mp_limb_t _ten_p10[] =
   { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
@@ -259,7 +259,7 @@ static const mp_limb _ten_p10[] =
     0x73c5534936a8de06, 0xc1a6970ca7e6bd2a, 0xd2db49ef47187094,
     0xae6209d4926c3f5b, 0x34f4a3c62d433949, 0xd9d61a05d4305d94,
     0x0000000000000325 };
-static const mp_limb _ten_p11[] =
+static const mp_limb_t _ten_p11[] =
   { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
@@ -296,7 +296,7 @@ static const mp_limb _ten_p11[] =
     0xe50f30278c983623, 0x1d08e2d694222771, 0xf2ee5ca6f7e928e6,
     0x11eb962b1b61b93c, 0xce2bcba19648b21c, 0x7bbebe3034f77154,
     0x8ce329ace526a319, 0xb5dc53d5de4a74d2, 0x000000000009e8b3 };
-static const mp_limb _ten_p12[] =
+static const mp_limb_t _ten_p12[] =
   { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
@@ -374,7 +374,7 @@ static const mp_limb _ten_p12[] =
 #define _LAST_POW10	12
 
 #else
-#  error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
+#  error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for"
 #endif
 
 
diff --git a/stdlib/fpioconst.h b/stdlib/fpioconst.h
index 309660ced6..110fc8b86a 100644
--- a/stdlib/fpioconst.h
+++ b/stdlib/fpioconst.h
@@ -41,7 +41,7 @@ Cambridge, MA 02139, USA.  */
    strtof/strtod/strtold.  */
 struct mp_power
   {
-    const mp_limb *array;	/* The array with the number representation. */
+    const mp_limb_t *array;	/* The array with the number representation. */
     mp_size_t arraysize;	/* Size of the array.  */
     int p_expo;			/* Exponent of the number 10^(2^i).  */
     int m_expo;			/* Exponent of the number 10^-(2^i-1).  */
diff --git a/stdlib/strtod.c b/stdlib/strtod.c
index e262f3de83..525a6f98a9 100644
--- a/stdlib/strtod.c
+++ b/stdlib/strtod.c
@@ -95,12 +95,12 @@ extern FLOAT MPN2FLOAT (mp_srcptr mpn, int exponent, int negative);
 #  define MAX_DIG_PER_LIMB	19
 #  define MAX_FAC_PER_LIMB	10000000000000000000UL
 #else
-#  error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
+#  error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for"
 #endif
 
 
 /* Local data structure.  */
-static const mp_limb _tens_in_limb[MAX_DIG_PER_LIMB + 1] =
+static const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] =
 {    0,                   10,                   100,
      1000,                10000,                100000,
      1000000,             10000000,             100000000,
@@ -132,17 +132,17 @@ static const mp_limb _tens_in_limb[MAX_DIG_PER_LIMB + 1] =
 #define	MPNSIZE		(howmany (MAX_EXP + 2 * MANT_DIG, BITS_PER_MP_LIMB) \
 			 + 2)
 /* Declare an mpn integer variable that big.  */
-#define	MPN_VAR(name)	mp_limb name[MPNSIZE]; mp_size_t name##size
+#define	MPN_VAR(name)	mp_limb_t name[MPNSIZE]; mp_size_t name##size
 /* Copy an mpn integer value.  */
 #define MPN_ASSIGN(dst, src) \
-	memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb))
+	memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t))
 
 
 /* Return a floating point number of the needed type according to the given
    multi-precision number after possible rounding.  */
 static inline FLOAT
-round_and_return (mp_limb *retval, int exponent, int negative,
-		  mp_limb round_limb, mp_size_t round_bit, int more_bits)
+round_and_return (mp_limb_t *retval, int exponent, int negative,
+		  mp_limb_t round_limb, mp_size_t round_bit, int more_bits)
 {
   if (exponent < MIN_EXP - 1)
     {
@@ -154,7 +154,7 @@ round_and_return (mp_limb *retval, int exponent, int negative,
 	  return 0.0;
 	}
 
-      more_bits |= (round_limb & ((((mp_limb) 1) << round_bit) - 1)) != 0;
+      more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0;
       if (shift == MANT_DIG)
 	/* This is a special case to handle the very seldom case where
 	   the mantissa will be empty after the shift.  */
@@ -175,7 +175,8 @@ round_and_return (mp_limb *retval, int exponent, int negative,
 	  round_bit = (shift - 1) % BITS_PER_MP_LIMB;
 	  for (i = 0; i < (shift - 1) / BITS_PER_MP_LIMB; ++i)
 	    more_bits |= retval[i] != 0;
-	  more_bits |= (round_limb & ((((mp_limb) 1) << round_bit) - 1)) != 0;
+	  more_bits |= ((round_limb & ((((mp_limb_t) 1) << round_bit) - 1))
+			!= 0);
 
 	  (void) __mpn_rshift (retval, &retval[shift / BITS_PER_MP_LIMB],
                                RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB),
@@ -192,25 +193,25 @@ round_and_return (mp_limb *retval, int exponent, int negative,
       exponent = MIN_EXP - 2;
     }
 
-  if ((round_limb & (((mp_limb) 1) << round_bit)) != 0
+  if ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0
       && (more_bits || (retval[0] & 1) != 0
-          || (round_limb & ((((mp_limb) 1) << round_bit) - 1)) != 0))
+          || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0))
     {
-      mp_limb cy = __mpn_add_1 (retval, retval, RETURN_LIMB_SIZE, 1);
+      mp_limb_t cy = __mpn_add_1 (retval, retval, RETURN_LIMB_SIZE, 1);
 
       if (((MANT_DIG % BITS_PER_MP_LIMB) == 0 && cy) ||
           ((MANT_DIG % BITS_PER_MP_LIMB) != 0 &&
            (retval[RETURN_LIMB_SIZE - 1]
-            & (((mp_limb) 1) << (MANT_DIG % BITS_PER_MP_LIMB))) != 0))
+            & (((mp_limb_t) 1) << (MANT_DIG % BITS_PER_MP_LIMB))) != 0))
 	{
 	  ++exponent;
 	  (void) __mpn_rshift (retval, retval, RETURN_LIMB_SIZE, 1);
 	  retval[RETURN_LIMB_SIZE - 1]
-	    |= ((mp_limb) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB);
+	    |= ((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB);
 	}
       else if (exponent == MIN_EXP - 2
 	       && (retval[RETURN_LIMB_SIZE - 1]
-		   & (((mp_limb) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB)))
+		   & (((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB)))
 	       != 0)
 	  /* The number was denormalized but now normalized.  */
 	exponent = MIN_EXP - 1;
@@ -229,13 +230,13 @@ round_and_return (mp_limb *retval, int exponent, int negative,
    value.  If the EXPONENT is small enough to be taken as an additional
    factor for the resulting number (see code) multiply by it.  */
 static inline const STRING_TYPE *
-str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb *n, mp_size_t *nsize,
+str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
 	    int *exponent)
 {
   /* Number of digits for actual limb.  */
   int cnt = 0;
-  mp_limb low = 0;
-  mp_limb base;
+  mp_limb_t low = 0;
+  mp_limb_t base;
 
   *nsize = 0;
   assert (digcnt > 0);
@@ -247,7 +248,7 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb *n, mp_size_t *nsize,
 	    n[0] = low;
 	  else
 	    {
-	      mp_limb cy;
+	      mp_limb_t cy;
 	      cy = __mpn_mul_1 (n, n, *nsize, MAX_FAC_PER_LIMB);
 	      cy += __mpn_add_1 (n, n, *nsize, low);
 	      if (cy != 0)
@@ -284,7 +285,7 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb *n, mp_size_t *nsize,
     }
   else
     {
-      mp_limb cy;
+      mp_limb_t cy;
       cy = __mpn_mul_1 (n, n, *nsize, base);
       cy += __mpn_add_1 (n, n, *nsize, low);
       if (cy != 0)
@@ -300,7 +301,8 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb *n, mp_size_t *nsize,
    Tege doesn't like this function so I have to write it here myself. :)
    --drepper */
 static inline void
-__mpn_lshift_1 (mp_limb *ptr, mp_size_t size, unsigned int count, mp_limb limb)
+__mpn_lshift_1 (mp_limb_t *ptr, mp_size_t size, unsigned int count,
+		mp_limb_t limb)
 {
   if (count == BITS_PER_MP_LIMB)
     {
@@ -347,7 +349,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
   MPN_VAR (den);
 
   /* Representation for the return value.  */
-  mp_limb retval[RETURN_LIMB_SIZE];
+  mp_limb_t retval[RETURN_LIMB_SIZE];
   /* Number of bits currently in result value.  */
   int bits;
 
@@ -638,8 +640,8 @@ INTERNAL (STRTOF) (nptr, endptr, group)
       if (exponent > 0)
 	{
 	  /* We now multiply the gained number by the given power of ten.  */
-	  mp_limb *psrc = num;
-	  mp_limb *pdest = den;
+	  mp_limb_t *psrc = num;
+	  mp_limb_t *pdest = den;
 	  int expbit = 1;
 	  const struct mp_power *ttab = &_fpioconst_pow10[0];
 
@@ -647,7 +649,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	    {
 	      if ((exponent & expbit) != 0)
 		{
-		  mp_limb cy;
+		  mp_limb_t cy;
 		  exponent ^= expbit;
 
 		  /* FIXME: not the whole multiplication has to be done.
@@ -672,7 +674,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	  while (exponent != 0);
 
 	  if (psrc == den)
-	    memcpy (num, den, numsize * sizeof (mp_limb));
+	    memcpy (num, den, numsize * sizeof (mp_limb_t));
 	}
 
       /* Determine how many bits of the result we already have.  */
@@ -702,7 +704,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 
 	  if (least_bit == 0)
 	    memcpy (retval, &num[least_idx],
-		    RETURN_LIMB_SIZE * sizeof (mp_limb));
+		    RETURN_LIMB_SIZE * sizeof (mp_limb_t));
 	  else
             {
               for (i = least_idx; i < numsize - 1; ++i)
@@ -730,7 +732,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	  if (target_bit == is_bit)
 	    {
 	      memcpy (&retval[RETURN_LIMB_SIZE - numsize], num,
-		      numsize * sizeof (mp_limb));
+		      numsize * sizeof (mp_limb_t));
 	      /* FIXME: the following loop can be avoided if we assume a
 		 maximal MANT_DIG value.  */
 	      MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize);
@@ -745,7 +747,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	    }
 	  else
 	    {
-	      mp_limb cy;
+	      mp_limb_t cy;
 	      assert (numsize < RETURN_LIMB_SIZE);
 
 	      cy = __mpn_rshift (&retval[RETURN_LIMB_SIZE - numsize],
@@ -761,7 +763,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	}
 
       /* Store the bits we already have.  */
-      memcpy (retval, num, numsize * sizeof (mp_limb));
+      memcpy (retval, num, numsize * sizeof (mp_limb_t));
 #if RETURN_LIMB_SIZE > 1
       if (numsize < RETURN_LIMB_SIZE)
         retval[numsize] = 0;
@@ -779,9 +781,9 @@ INTERNAL (STRTOF) (nptr, endptr, group)
     int cnt;
     int neg_exp;
     int more_bits;
-    mp_limb cy;
-    mp_limb *psrc = den;
-    mp_limb *pdest = num;
+    mp_limb_t cy;
+    mp_limb_t *psrc = den;
+    mp_limb_t *pdest = num;
     const struct mp_power *ttab = &_fpioconst_pow10[0];
 
     assert (dig_no > int_no && exponent <= 0);
@@ -810,14 +812,14 @@ INTERNAL (STRTOF) (nptr, endptr, group)
       {
 	if ((neg_exp & expbit) != 0)
 	  {
-	    mp_limb cy;
+	    mp_limb_t cy;
 	    neg_exp ^= expbit;
 
 	    if (densize == 0)
 	      {
 		densize = ttab->arraysize - _FPIO_CONST_OFFSET;
 		memcpy (psrc, &ttab->array[_FPIO_CONST_OFFSET],
-			densize * sizeof (mp_limb));
+			densize * sizeof (mp_limb_t));
 	      }
 	    else
 	      {
@@ -836,7 +838,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
     while (neg_exp != 0);
 
     if (psrc == num)
-      memcpy (den, num, densize * sizeof (mp_limb));
+      memcpy (den, num, densize * sizeof (mp_limb_t));
 
     /* Read the fractional digits from the string.  */
     (void) str_to_mpn (startp, dig_no - int_no, num, &numsize, &exponent);
@@ -873,7 +875,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
       {
       case 1:
 	{
-	  mp_limb d, n, quot;
+	  mp_limb_t d, n, quot;
 	  int used = 0;
 
 	  n = num[0];
@@ -930,8 +932,8 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	}
       case 2:
 	{
-	  mp_limb d0, d1, n0, n1;
-	  mp_limb quot = 0;
+	  mp_limb_t d0, d1, n0, n1;
+	  mp_limb_t quot = 0;
 	  int used = 0;
 
 	  d0 = den[0];
@@ -976,14 +978,14 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 
 	  while (bits <= MANT_DIG)
 	    {
-	      mp_limb r;
+	      mp_limb_t r;
 
 	      if (n1 == d1)
 		{
 		  /* QUOT should be either 111..111 or 111..110.  We need
 		     special treatment of this rare case as normal division
 		     would give overflow.  */
-		  quot = ~(mp_limb) 0;
+		  quot = ~(mp_limb_t) 0;
 
 		  r = n0 + d1;
 		  if (r < d1)	/* Carry in the addition?  */
@@ -1024,8 +1026,8 @@ INTERNAL (STRTOF) (nptr, endptr, group)
       default:
 	{
 	  int i;
-	  mp_limb cy, dX, d1, n0, n1;
-	  mp_limb quot = 0;
+	  mp_limb_t cy, dX, d1, n0, n1;
+	  mp_limb_t quot = 0;
 	  int used = 0;
 
 	  dX = den[densize - 1];
@@ -1105,10 +1107,10 @@ INTERNAL (STRTOF) (nptr, endptr, group)
 	      if (n0 == dX)
 		/* This might over-estimate QUOT, but it's probably not
 		   worth the extra code here to find out.  */
-		quot = ~(mp_limb) 0;
+		quot = ~(mp_limb_t) 0;
 	      else
 		{
-		  mp_limb r;
+		  mp_limb_t r;
 
 		  udiv_qrnnd (quot, r, n0, num[densize - 1], dX);
 		  umul_ppmm (n1, n0, d1, quot);
diff --git a/string/argz-extract.c b/string/argz-extract.c
index 5eb0e84b01..49a1426d73 100644
--- a/string/argz-extract.c
+++ b/string/argz-extract.c
@@ -23,7 +23,7 @@
 /* Puts pointers to each string in ARGZ into ARGV, which must be large enough
    to hold them all.  */
 void
-__argz_extract (const char *argz, size_t len, char **argv)
+__argz_extract (char *argz, size_t len, char **argv)
 {
   while (len > 0)
     {
diff --git a/string/argz.h b/string/argz.h
index c2a3139dbb..248a4da1f3 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -50,8 +50,8 @@ size_t argz_count __P ((__const char *argz, size_t len));
 
 /* Puts pointers to each string in ARGZ into ARGV, which must be large enough
    to hold them all.  */
-void __argz_extract __P ((__const char *argz, size_t len, char **argv));
-void argz_extract __P ((__const char *argz, size_t len, char **argv));
+void __argz_extract __P ((char *argz, size_t len, char **argv));
+void argz_extract __P ((char *argz, size_t len, char **argv));
 
 /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
    except the last into the character SEP.  */
diff --git a/sysdeps/generic/add_1.c b/sysdeps/generic/add_1.c
deleted file mode 100644
index 7b1c697a67..0000000000
--- a/sysdeps/generic/add_1.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* mpn_add_1 --
-
-Copyright (C) 1993, 1994 Free Software Foundation, Inc.
-
-This file is part of the GNU MP Library.
-
-The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB.  If not, write to
-the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-#define __mpn_add_1 __noname
-#include "gmp.h"
-#undef __mpn_add_1
-
-#include "gmp-impl.h"
-
-mp_limb
-__mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
-     register mp_ptr res_ptr;
-     register mp_srcptr s1_ptr;
-     register mp_size_t s1_size;
-     register mp_limb s2_limb;
-{
-  register mp_limb x;
-
-  x = *s1_ptr++;
-  s2_limb = x + s2_limb;
-  *res_ptr++ = s2_limb;
-  if (s2_limb < x)
-    {
-      while (--s1_size != 0)
-	{
-	  x = *s1_ptr++ + 1;
-	  *res_ptr++ = x;
-	  if (x != 0)
-	    goto fin;
-	}
-
-      return 1;
-    }
-
- fin:
-  if (res_ptr != s1_ptr)
-    {
-      mp_size_t i;
-      for (i = 0; i < s1_size - 1; i++)
-	res_ptr[i] = s1_ptr[i];
-    }
-
-  return 0;
-}
diff --git a/sysdeps/generic/confname.h b/sysdeps/generic/confname.h
index 6c58410b10..717229a3ab 100644
--- a/sysdeps/generic/confname.h
+++ b/sysdeps/generic/confname.h
@@ -94,10 +94,32 @@ enum
 #define	_SC_SEMAPHORES		_SC_SEMAPHORES
     _SC_SHARED_MEMORY_OBJECTS,
 #define	_SC_SHARED_MEMORY_OBJECTS	_SC_SHARED_MEMORY_OBJECTS
+    _SC_AIO_LISTIO_MAX,
+#define	_SC_AIO_LIST_MAX	_SC_AIO_LIST_MAX
+    _SC_AIO_MAX,
+#define	_SC_AIO_MAX		_SC_AIO_MAX
+    _SC_AIO_PRIO_DELTA_MAX,
+#define	_SC_AIO_PRIO_DELTA_MAX	_SC_AIO_PRIO_DELTA_MAX
+    _SC_DELAYTIMER_MAX,
+#define	_SC_DELAYTIMER_MAX	_SC_DELAYTIMER_MAX
+    _SC_MQ_OPEN_MAX,
+#define	_SC_MQ_OPEN_MAX		_SC_MQ_OPEN_MAX
+    _SC_MQ_PRIO_MAX,
+#define	_SC_MQ_PRIO_MAX		_SC_MQ_PRIO_MAX
     _SC_VERSION,
 #define	_SC_VERSION		_SC_VERSION
     _SC_PAGESIZE,
 #define	_SC_PAGESIZE		_SC_PAGESIZE
+    _SC_RTSIG_MAX,
+#define	_SC_RTSIG_MAX		_SC_RTSIG_MAX
+    _SC_SEM_NSEMS_MAX,
+#define	_SC_SEM_NSEMS_MAX	_SC_SEM_NSEMS_MAX
+    _SC_SEM_VALUE_MAX,
+#define	_SC_SEM_VALUE_MAX	_SC_SEM_VALUE_MAX
+    _SC_SIGQUEUE_MAX,
+#define	_SC_SIGQUEUE_MAX	_SC_SIGQUEUE_MAX
+    _SC_TIMER_MAX,
+#define	_SC_TIMER_MAX		_SC_TIMER_MAX
 
     /* Values for the argument to `sysconf'
        corresponding to _POSIX2_* symbols.  */
diff --git a/sysdeps/generic/inlines.c b/sysdeps/generic/inlines.c
new file mode 100644
index 0000000000..dca305e6e4
--- /dev/null
+++ b/sysdeps/generic/inlines.c
@@ -0,0 +1,3 @@
+#define _FORCE_INLINES
+#define _EXTERN_INLINE /* empty */
+#include "gmp.h"
diff --git a/sysdeps/mach/hurd/_exit.c b/sysdeps/mach/hurd/_exit.c
index fd56791ee8..aa0a2616ff 100644
--- a/sysdeps/mach/hurd/_exit.c
+++ b/sysdeps/mach/hurd/_exit.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -27,14 +27,14 @@ void
 _hurd_exit (int status)
 {
   /* Give the proc server our exit status.  */
-  __USEPORT (PROC, __proc_mark_exit (port, status));
+  __USEPORT (PROC, __proc_mark_exit (port, status, 0));
 
   /* Commit suicide.  */
   __task_terminate (__mach_task_self ());
 
   /* Perhaps the cached mach_task_self was bogus.  */
   __task_terminate ((__mach_task_self) ());
-  
+
   /* This sucker really doesn't want to die.  */
   while (1)
     {
diff --git a/sysdeps/mach/hurd/bind.c b/sysdeps/mach/hurd/bind.c
index a6ebc1ea34..37ddcb8c01 100644
--- a/sysdeps/mach/hurd/bind.c
+++ b/sysdeps/mach/hurd/bind.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 94, 95, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -67,7 +67,7 @@ DEFUN(bind, (fd, addr, len),
 	  if (! err)
 	    {
 	      /* Link the node, now a socket, into the target directory.  */
-	      err = __dir_link (dir, node, n);
+	      err = __dir_link (dir, node, n, 1);
 	      if (err == EEXIST)
 		err = EADDRINUSE;
 	    }
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index c580bb31ed..7e0152bf6c 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -548,7 +548,7 @@ void
 _exit (int status)
 {
   __proc_mark_exit (_dl_hurd_data->portarray[INIT_PORT_PROC],
-		    W_EXITCODE (status, 0));
+		    W_EXITCODE (status, 0), 0);
   while (__task_terminate (__mach_task_self ()))
     __mach_task_self_ = (__mach_task_self) ();
 }
diff --git a/sysdeps/mach/hurd/fdatasync.c b/sysdeps/mach/hurd/fdatasync.c
new file mode 100644
index 0000000000..d7f82efe25
--- /dev/null
+++ b/sysdeps/mach/hurd/fdatasync.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+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 <errno.h>
+#include <unistd.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+/* Make all changes done to FD's file data actually appear on disk.  */
+int
+fdatasync (int fd)
+{
+  error_t err = HURD_DPORT_USE (fd, __file_sync (port, 1, 1));
+  if (err)
+    return __hurd_dfail (fd, err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/fpathconf.c b/sysdeps/mach/hurd/fpathconf.c
index f5e6579ee8..5fc51010fb 100644
--- a/sysdeps/mach/hurd/fpathconf.c
+++ b/sysdeps/mach/hurd/fpathconf.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -27,7 +27,7 @@ long int
 __fpathconf (int fd, int name)
 {
   error_t err;
-  long int value;
+  int value;
 
   if (err = HURD_DPORT_USE (fd, __io_pathconf (port, name, &value)))
     return __hurd_dfail (fd, err), -1L;
diff --git a/sysdeps/mach/hurd/fsync.c b/sysdeps/mach/hurd/fsync.c
index adfe9800d3..d4982c1e41 100644
--- a/sysdeps/mach/hurd/fsync.c
+++ b/sysdeps/mach/hurd/fsync.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -26,7 +26,7 @@ Cambridge, MA 02139, USA.  */
 int
 DEFUN(fsync, (fd), int fd)
 {
-  error_t err = HURD_DPORT_USE (fd, __file_sync (port, 1));
+  error_t err = HURD_DPORT_USE (fd, __file_sync (port, 1, 0));
   if (err)
     return __hurd_dfail (fd, err);
   return 0;
diff --git a/sysdeps/mach/hurd/getcwd.c b/sysdeps/mach/hurd/getcwd.c
index 02699a7e84..ed8ed96697 100644
--- a/sysdeps/mach/hurd/getcwd.c
+++ b/sysdeps/mach/hurd/getcwd.c
@@ -39,11 +39,10 @@ char *
 __getcwd (char *buf, size_t size)
 {
   error_t err;
-  dev_t rootdev, thisdev;
+  mach_port_t rootid, thisid, rootdevid, thisdevid;
   ino_t rootino, thisino;
   char *file_name;
   register char *file_namep;
-  struct stat st;
   file_t parent;
   char *dirbuf = NULL;
   unsigned int dirbufsize = 0;
@@ -51,6 +50,10 @@ __getcwd (char *buf, size_t size)
   inline void cleanup (void)
     {
       __mach_port_deallocate (__mach_task_self (), parent);
+      __mach_port_deallocate (__mach_task_self (), thisid);
+      __mach_port_deallocate (__mach_task_self (), thisdevid);
+      __mach_port_deallocate (__mach_task_self (), rootid);
+      __mach_port_deallocate (__mach_task_self (), rootdevid);
 
       if (dirbuf != NULL)
 	__vm_deallocate (__mach_task_self (),
@@ -81,37 +84,30 @@ __getcwd (char *buf, size_t size)
   file_namep = file_name + size;
   *--file_namep = '\0';
 
-  /* Get a port to our root directory and stat it.  */
+  /* Get a port to our root directory and get its identity.  */
 
-  if (err = __USEPORT (CRDIR, __io_stat (port, &st)))
+  if (err = __USEPORT (CRDIR, __io_identity (port,
+					     &rootid, &rootdevid, &rootino)))
     return __hurd_fail (err), NULL;
-  rootdev = st.st_dev;
-  rootino = st.st_ino;
+  __mach_port_deallocate (__mach_task_self (), rootdevid);
 
   /* Get a port to our current working directory and stat it.  */
 
-  if (err = __USEPORT (CWDIR, __mach_port_mod_refs (__mach_task_self (),
-						    (parent = port),
-						    MACH_PORT_RIGHT_SEND,
-						    1)))
-    return __hurd_fail (err), NULL;
-  if (err = __io_stat (parent, &st))
+  if (err = __USEPORT (CRDIR, __io_identity (port,
+					     &thisid, &thisdevid, &thisino)))
     {
-      cleanup ();
+      __mach_port_deallocate (__mach_task_self (), rootid);
       return __hurd_fail (err), NULL;
     }
 
-  thisdev = st.st_dev;
-  thisino = st.st_ino;
-
-  while (!(thisdev == rootdev && thisino == rootino))
+  while (thisid != rootid)
     {
       /* PARENT is a port to the directory we are currently on;
-	 THISDEV and THISINO are its device and node numbers.
-	 Look in its parent (..) for a file with the same numbers.  */
+	 THISID, THISDEV, and THISINO are its identity.
+	 Look in its parent (..) for a file with the same file number.  */
 
       struct dirent *d;
-      dev_t dotdev;
+      mach_port_t dotid, dotdevid;
       ino_t dotino;
       int mount_point;
       file_t newp;
@@ -127,12 +123,12 @@ __getcwd (char *buf, size_t size)
       __mach_port_deallocate (__mach_task_self (), parent);
       parent = newp;
 
-      /* Figure out if this directory is a mount point.  */
-      if (err = __io_stat (parent, &st))
+      /* Get this directory's identity and figure out if it's a mount point. */
+      if (err = __io_identity (parent, &dotid, &dotdevid, &dotino))
 	goto errlose;
-      dotdev = st.st_dev;
-      dotino = st.st_ino;
-      mount_point = dotdev != thisdev;
+      __mach_port_deallocate (__mach_task_self (), dotid);
+      __mach_port_deallocate (__mach_task_self (), dotdevid);
+      mount_point = dotdevid != thisdevid;
 
       /* Search for the last directory.  */
       direntry = 0;
@@ -178,13 +174,17 @@ __getcwd (char *buf, size_t size)
 		{
 		  file_t try = __file_name_lookup_under (parent, d->d_name,
 							 O_NOLINK, 0);
+		  file_t id, devid;
+		  ino_t fileno;
 		  if (try == MACH_PORT_NULL)
 		    goto lose;
-		  err = __io_stat (try, &st);
+		  err = __io_identity (try, &id, &devid, &fileno);
 		  __mach_port_deallocate (__mach_task_self (), try);
 		  if (err)
 		    goto errlose;
-		  if (st.st_dev == thisdev && st.st_ino == thisino)
+		  __mach_port_deallocate (__mach_task_self (), id);
+		  __mach_port_deallocate (__mach_task_self (), devid);
+		  if (id == thisid)
 		    goto found;
 		}
 	    }
@@ -232,7 +232,10 @@ __getcwd (char *buf, size_t size)
 
       /* The next iteration will find the name of the directory we
 	 just searched through.  */
-      thisdev = dotdev;
+      __mach_port_deallocate (__mach_task_self (), thisid);
+      __mach_port_deallocate (__mach_task_self (), thisdevid);
+      thisid = dotid;
+      thisdevid = dotdevid;
       thisino = dotino;
     }
 
diff --git a/sysdeps/mach/hurd/i386/exc2signal.c b/sysdeps/mach/hurd/i386/exc2signal.c
index 19f845a49e..10fe500f82 100644
--- a/sysdeps/mach/hurd/i386/exc2signal.c
+++ b/sysdeps/mach/hurd/i386/exc2signal.c
@@ -1,5 +1,5 @@
 /* Translate Mach exception codes into signal numbers.  i386 version.
-Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
+Copyright (C) 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -25,48 +25,47 @@ Cambridge, MA 02139, USA.  */
    into a signal number and signal subcode.  */
 
 void
-_hurd_exception2signal (int exception, int code, int subcode,
-			int *signo, long int *sigcode, int *error)
+_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
 {
-  *error = 0;
+  detail->error = 0;
 
-  switch (exception)
+  switch (detail->exc)
     {
     default:
       *signo = SIGIOT;
-      *sigcode = exception;
+      detail->code = detail->exc;
       break;
-      
+
     case EXC_BAD_ACCESS:
-      if (code == KERN_PROTECTION_FAILURE)
+      if (detail->exc_code == KERN_PROTECTION_FAILURE)
 	*signo = SIGSEGV;
       else
 	*signo = SIGBUS;
-      *sigcode = subcode;
-      *error = code;
+      detail->code = detail->exc_subcode;
+      detail->error = detail->exc_code;
       break;
 
     case EXC_BAD_INSTRUCTION:
       *signo = SIGILL;
-      if (code == EXC_I386_INVOP)
-	*sigcode = ILL_INVOPR_FAULT;
-      else if (code == EXC_I386_STKFLT)
-	*sigcode = ILL_STACK_FAULT;
+      if (detail->exc_code == EXC_I386_INVOP)
+	detail->code = ILL_INVOPR_FAULT;
+      else if (detail->exc_code == EXC_I386_STKFLT)
+	detail->code = ILL_STACK_FAULT;
       else
-	*sigcode = 0;
+	detail->code = 0;
       break;
-      
+
     case EXC_ARITHMETIC:
-      switch (code)
+      switch (detail->exc_code)
 	{
 	case EXC_I386_DIV:	/* integer divide by zero */
 	  *signo = SIGFPE;
-	  *sigcode = FPE_INTDIV_FAULT;
+	  detail->code = FPE_INTDIV_FAULT;
 	  break;
-	  
+
 	case EXC_I386_INTO:	/* integer overflow */
 	  *signo = SIGFPE;
-	  *sigcode = FPE_INTOVF_TRAP;
+	  detail->code = FPE_INTOVF_TRAP;
 	  break;
 
 	  /* These aren't anywhere documented or used in Mach 3.0.  */
@@ -74,92 +73,92 @@ _hurd_exception2signal (int exception, int code, int subcode,
 	case EXC_I386_EXTOVR:
 	default:
 	  *signo = SIGFPE;
-	  *sigcode = 0;
+	  detail->code = 0;
 	  break;
 
 	case EXC_I386_EXTERR:
 	  /* Subcode is the fp_status word saved by the hardware.
 	     Give an error code corresponding to the first bit set.  */
-	  if (subcode & FPS_IE)
+	  if (detail->exc_subcode & FPS_IE)
 	    {
 	      *signo = SIGILL;
-	      *sigcode = ILL_FPEOPR_FAULT;
+	      detail->code = ILL_FPEOPR_FAULT;
 	    }
-	  else if (subcode & FPS_DE)
+	  else if (detail->exc_subcode & FPS_DE)
 	    {
 	      *signo = SIGFPE;
-	      *sigcode = FPE_FLTDNR_FAULT;
+	      detail->code = FPE_FLTDNR_FAULT;
 	    }
-	  else if (subcode & FPS_ZE)
+	  else if (detail->exc_subcode & FPS_ZE)
 	    {
 	      *signo = SIGFPE;
-	      *sigcode = FPE_FLTDIV_FAULT;
+	      detail->code = FPE_FLTDIV_FAULT;
 	    }
-	  else if (subcode & FPS_OE)
+	  else if (detail->exc_subcode & FPS_OE)
 	    {
 	      *signo = SIGFPE;
-	      *sigcode = FPE_FLTOVF_FAULT;
+	      detail->code = FPE_FLTOVF_FAULT;
 	    }
-	  else if (subcode & FPS_UE)
+	  else if (detail->exc_subcode & FPS_UE)
 	    {
 	      *signo = SIGFPE;
-	      *sigcode = FPE_FLTUND_FAULT;
+	      detail->code = FPE_FLTUND_FAULT;
 	    }
-	  else if (subcode & FPS_PE)
+	  else if (detail->exc_subcode & FPS_PE)
 	    {
 	      *signo = SIGFPE;
-	      *sigcode = FPE_FLTINX_FAULT;
+	      detail->code = FPE_FLTINX_FAULT;
 	    }
 	  else
 	    {
 	      *signo = SIGFPE;
-	      *sigcode = 0;
+	      detail->code = 0;
 	    }
 	  break;
 
-	  /* These two can only be arithmetic exceptions if we 
+	  /* These two can only be arithmetic exceptions if we
 	     are in V86 mode, which sounds like emulation to me.
 	     (See Mach 3.0 i386/trap.c.)  */
 	case EXC_I386_EMERR:
 	  *signo = SIGFPE;
-	  *sigcode = FPE_EMERR_FAULT;
+	  detail->code = FPE_EMERR_FAULT;
 	  break;
 	case EXC_I386_BOUND:
 	  *signo = SIGFPE;
-	  *sigcode = FPE_EMBND_FAULT;
+	  detail->code = FPE_EMBND_FAULT;
 	  break;
 	}
       break;
 
-    case EXC_EMULATION:		
+    case EXC_EMULATION:
       /* 3.0 doesn't give this one, why, I don't know.  */
       *signo = SIGEMT;
-      *sigcode = 0;
+      detail->code = 0;
       break;
 
     case EXC_SOFTWARE:
       /* The only time we get this in Mach 3.0
 	 is for an out of bounds trap.  */
-      if (code == EXC_I386_BOUND)
+      if (detail->exc_code == EXC_I386_BOUND)
 	{
 	  *signo = SIGFPE;
-	  *sigcode = FPE_SUBRNG_FAULT;
+	  detail->code = FPE_SUBRNG_FAULT;
 	}
       else
 	{
 	  *signo = SIGEMT;
-	  *sigcode = 0;
+	  detail->code = 0;
 	}
       break;
-      
+
     case EXC_BREAKPOINT:
       *signo = SIGTRAP;
-      if (code == EXC_I386_SGL)
-	*sigcode = DBG_SINGLE_TRAP;
-      else if (code == EXC_I386_BPT)
-	*sigcode = DBG_BRKPNT_FAULT;
+      if (detail->exc_code == EXC_I386_SGL)
+	detail->code = DBG_SINGLE_TRAP;
+      else if (detail->exc_code == EXC_I386_BPT)
+	detail->code = DBG_BRKPNT_FAULT;
       else
-	*sigcode = 0;
+	detail->code = 0;
       break;
     }
 }
diff --git a/sysdeps/mach/hurd/i386/trampoline.c b/sysdeps/mach/hurd/i386/trampoline.c
index bd91c24304..a2b2897c6e 100644
--- a/sysdeps/mach/hurd/i386/trampoline.c
+++ b/sysdeps/mach/hurd/i386/trampoline.c
@@ -28,7 +28,7 @@ Cambridge, MA 02139, USA.  */
 
 struct sigcontext *
 _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
-			int signo, long int sigcode,
+			int signo, struct hurd_signal_detail *detail,
 			volatile int rpc_wait,
 			struct machine_thread_all_state *state)
 {
@@ -137,7 +137,7 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
 
       /* Set up the arguments for the signal handler.  */
       stackframe->signo = signo;
-      stackframe->sigcode = sigcode;
+      stackframe->sigcode = detail->code;
       stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx;
       stackframe->sigreturn_addr = &__sigreturn;
       stackframe->sigreturn_returns_here = &&firewall; /* Crash on return.  */
diff --git a/sysdeps/mach/hurd/link.c b/sysdeps/mach/hurd/link.c
index a4ae21095a..1fb9f9aad2 100644
--- a/sysdeps/mach/hurd/link.c
+++ b/sysdeps/mach/hurd/link.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -45,7 +45,7 @@ DEFUN(__link, (from, to), CONST char *from AND CONST char *to)
   todir = __file_name_split (to, &toname);
   if (todir != MACH_PORT_NULL)
     {
-      err = __dir_link (todir, linknode, toname);
+      err = __dir_link (todir, linknode, toname, 1);
       __mach_port_deallocate (__mach_task_self (), todir);
     }
   __mach_port_deallocate (__mach_task_self (), linknode);
diff --git a/sysdeps/mach/hurd/rename.c b/sysdeps/mach/hurd/rename.c
index 63efbfb43f..6d1367f4f2 100644
--- a/sysdeps/mach/hurd/rename.c
+++ b/sysdeps/mach/hurd/rename.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -38,7 +38,7 @@ DEFUN(rename, (old, new), CONST char *old AND CONST char *new)
       return -1;
     }
 
-  err = __dir_rename (olddir, oldname, newdir, newname);
+  err = __dir_rename (olddir, oldname, newdir, newname, 0);
   __mach_port_deallocate (__mach_task_self (), olddir);
   __mach_port_deallocate (__mach_task_self (), newdir);
   if (err)
diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c
index cba1d0e65a..9ee33e0446 100644
--- a/sysdeps/mach/hurd/setitimer.c
+++ b/sysdeps/mach/hurd/setitimer.c
@@ -114,8 +114,7 @@ timer_thread (void)
 static sighandler_t
 restart_itimer (struct hurd_signal_preempter *preempter,
 		struct hurd_sigstate *ss,
-		int *signo, long int *sigcode,
-		int *sigerror)
+		int *signo, struct hurd_signal_detail *detail)
 {
   static int setitimer_locked (const struct itimerval *new,
 			       struct itimerval *old, void *crit);
diff --git a/sysdeps/mach/hurd/symlink.c b/sysdeps/mach/hurd/symlink.c
index e3937cc88c..efae880caf 100644
--- a/sysdeps/mach/hurd/symlink.c
+++ b/sysdeps/mach/hurd/symlink.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -47,15 +47,15 @@ DEFUN(__symlink, (from, to), CONST char *from AND CONST char *to)
 
   if (! err)
     /* Set the node's translator to make it a symlink.  */
-    err = __file_set_translator (node, 
-				 FS_TRANS_EXCL|FS_TRANS_SET, 
+    err = __file_set_translator (node,
+				 FS_TRANS_EXCL|FS_TRANS_SET,
 				 FS_TRANS_EXCL|FS_TRANS_SET, 0,
 				 buf, sizeof (_HURD_SYMLINK) + len,
 				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
 
   if (! err)
     /* Link the node, now a valid symlink, into the target directory.  */
-    err = __dir_link (dir, node, name);
+    err = __dir_link (dir, node, name, 1);
 
   __mach_port_deallocate (__mach_task_self (), dir);
   __mach_port_deallocate (__mach_task_self (), node);
diff --git a/sysdeps/mach/hurd/wait4.c b/sysdeps/mach/hurd/wait4.c
index 61e985505e..83eba88e6d 100644
--- a/sysdeps/mach/hurd/wait4.c
+++ b/sysdeps/mach/hurd/wait4.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -30,8 +30,9 @@ __wait4 (pid_t pid, __WAIT_STATUS_DEFN stat_loc,
   pid_t dead;
   error_t err;
   struct rusage ignored;
+  natural_t sigcode;
 
-  err = __USEPORT (PROC, __proc_wait (port, pid, options, stat_loc,
+  err = __USEPORT (PROC, __proc_wait (port, pid, options, stat_loc, &sigcode,
 				      usage ?: &ignored, &dead));
 
   return err ? (pid_t) __hurd_fail (err) : dead;
diff --git a/sysdeps/mach/hurd/xmknod.c b/sysdeps/mach/hurd/xmknod.c
index b2386d80ee..3552874bb0 100644
--- a/sysdeps/mach/hurd/xmknod.c
+++ b/sysdeps/mach/hurd/xmknod.c
@@ -102,7 +102,7 @@ __xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev)
 
   if (! err)
     /* Link the node, now a valid device, into the target directory.  */
-    err = __dir_link (dir, node, name);
+    err = __dir_link (dir, node, name, 1);
 
   __mach_port_deallocate (__mach_task_self (), dir);
   __mach_port_deallocate (__mach_task_self (), node);
diff --git a/sysdeps/posix/fpathconf.c b/sysdeps/posix/fpathconf.c
index 5c91c4a7df..649a2a4c49 100644
--- a/sysdeps/posix/fpathconf.c
+++ b/sysdeps/posix/fpathconf.c
@@ -21,6 +21,7 @@ Cambridge, MA 02139, USA.  */
 #include <stddef.h>
 #include <unistd.h>
 #include <limits.h>
+#include <sys/statfs.h>
 
 
 /* Get file-specific information about descriptor FD.  */
@@ -73,7 +74,14 @@ DEFUN(__fpathconf, (fd, name), int fd AND int name)
 
     case _PC_PATH_MAX:
 #ifdef	PATH_MAX
-      return PATH_MAX;
+      {
+	struct statfs buf;
+
+	if (__fstatfs (fd, &buf) < 0)
+	  return errno == ENOSYS ? PATH_MAX : -1;
+	else
+	  return buf.f_namelen;
+      }
 #else
       errno = ENOSYS;
       return -1;
diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c
index bf3c5b83e8..a52258fee2 100644
--- a/sysdeps/posix/sysconf.c
+++ b/sysdeps/posix/sysconf.c
@@ -196,6 +196,83 @@ DEFUN(__sysconf, (name), int name)
     case _SC_PAGESIZE:
       return __getpagesize ();
 
+    case _SC_AIO_LISTIO_MAX:
+#ifdef	AIO_LISTIO_MAX
+      return AIO_LISTIO_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_AIO_MAX:
+#ifdef	AIO_MAX
+      return AIO_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_AIO_PRIO_DELTA_MAX:
+#ifdef	AIO_PRIO_DELTA_MAX
+      return AIO_PRIO_DELTA_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_DELAYTIMER_MAX:
+#ifdef	DELAYTIMER_MAX
+      return DELAYTIMER_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_MQ_OPEN_MAX:
+#ifdef	MQ_OPEN_MAX
+      return MQ_OPEN_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_MQ_PRIO_MAX:
+#ifdef	MQ_PRIO_MAX
+      return MQ_PRIO_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_RTSIG_MAX:
+#ifdef	RTSIG_MAX
+      return RTSIG_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_SEM_NSEMS_MAX:
+#ifdef	SEM_NSEMS_MAX
+      return SEM_NSEMS_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_SEM_VALUE_MAX:
+#ifdef	SEM_VALUE_MAX
+      return SEM_VALUE_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_SIGQUEUE_MAX:
+#ifdef	SIGQUEUE_MAX
+      return SIGQUEUE_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_TIMER_MAX:
+#ifdef	TIMER_MAX
+      return TIMER_MAX;
+#else
+      return -1;
+#endif
+
     case _SC_BC_BASE_MAX:
 #ifdef	BC_BASE_MAX
       return BC_BASE_MAX;
diff --git a/sysdeps/stub/swapoff.c b/sysdeps/stub/swapoff.c
new file mode 100644
index 0000000000..d082bbcd53
--- /dev/null
+++ b/sysdeps/stub/swapoff.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Stop using block special device PATH for swapping.  */
+int
+swapoff (const char *path)
+{
+  errno = ENOSYS;
+  return -1;
+}
+
+stub_warning (swapoff)
diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list
index 19c11f4d9d..5b3e30de89 100644
--- a/sysdeps/unix/syscalls.list
+++ b/sysdeps/unix/syscalls.list
@@ -48,6 +48,7 @@ settimeofday	-	settimeofday	2	__settimeofday	settimeofday
 setuid		-	setuid		1	__setuid	setuid
 sigsuspend	-	sigsuspend	1	sigsuspend
 sstk		-	sstk		1	sstk
+swapoff		-	swapoff		1	swapoff
 swapon		-	swapon		1	swapon
 symlink		-	symlink		2	__symlink	symlink
 sync		-	sync		0	sync
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index e6505c0ed9..8c8be26b92 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -1,3 +1,4 @@
+sys/acct.h
 sys/socketcall.h
 sys/sysctl.h
 sys/timex.h
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 4d484ab092..53837ab53f 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -15,8 +15,9 @@ sysdep_routines += fxstat lxstat xstat
 endif
 
 ifeq ($(subdir), misc)
-sysdep_routines += xmknod s_ptrace s_sysctl sysctl
-headers += sys/mount.h
+sysdep_routines += mount umount xmknod s_ptrace s_sysctl sysctl llseek \
+setfsgid setfsuid sysinfo uselib
+headers += sys/mount.h sys/sysinfo.h
 endif
 
 ifeq ($(subdir), time)
diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c
index 94f4a1ece7..5fd25ba2e7 100644
--- a/sysdeps/unix/sysv/linux/gethostid.c
+++ b/sysdeps/unix/sysv/linux/gethostid.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 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
@@ -80,14 +80,14 @@ gethostid ()
     /* This also fails.  Return and arbitrary value.  */
     return 0;
 
-  /* To get the IP address we need to knoe the host name.  */
+  /* To get the IP address we need to know the host name.  */
   hp = gethostbyname (hostname);
   if (hp == NULL)
     return 0;
 
   in.s_addr = 0;
   memcpy (&in, hp->h_addr,
-	  sizeof (in) < hp->h_length ? sizeof (in) : hp->h_length);
+	  (int) sizeof (in) < hp->h_length ? sizeof (in) : hp->h_length);
 
   /* For the return value to be not exactly the IP address we do some
      bit fiddling.  */
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
index 19eb60fb6d..bd345b6fc6 100644
--- a/sysdeps/unix/sysv/linux/i386/Makefile
+++ b/sysdeps/unix/sysv/linux/i386/Makefile
@@ -1,4 +1,4 @@
-# Set the shared library version numbers for Linux/i386.
-
-libc.so-version = .6
-libm.so-version = .6
+ifeq ($(subdir), misc)
+sysdep_routines += ioperm iopl vm86
+headers += sys/perm.h sys/vm86.h
+endif
diff --git a/sysdeps/unix/sysv/linux/i386/sys/perm.h b/sysdeps/unix/sysv/linux/i386/sys/perm.h
new file mode 100644
index 0000000000..1ae5f2e1db
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sys/perm.h
@@ -0,0 +1,36 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_PERM_H
+
+#define _SYS_PERM_H	1
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* Set port input/output permissions.  */
+extern int ioperm __P ((unsigned long __from, unsigned long __num,
+			int __turn_on));
+
+
+/* Change I/O privilege level.  */
+extern int iopl __P ((int __level));
+
+__END_DECLS
+
+#endif	/* sys/perm.h */
diff --git a/sysdeps/unix/sysv/linux/i386/sys/vm86.h b/sysdeps/unix/sysv/linux/i386/sys/vm86.h
new file mode 100644
index 0000000000..32e0055ce8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sys/vm86.h
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_VM86_H
+
+#define _SYS_VM86_H	1
+#include <features.h>
+
+/* Get constants and data types from kernel header file.  */
+#include <linux/vm86.h>
+
+__BEGIN_DECLS
+
+/* Enter virtual 8086 mode.  */
+extern int vm86 __P ((struct vm86_struct *__info));
+
+__END_DECLS
+
+#endif	/* sys/vm86.h */
diff --git a/sysdeps/unix/sysv/linux/i386/syscalls.list b/sysdeps/unix/sysv/linux/i386/syscalls.list
new file mode 100644
index 0000000000..63dd0bd8e2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/syscalls.list
@@ -0,0 +1,3 @@
+# File name	Caller	Syscall name	# args	Strong name	Weak names
+
+vm86		-	vm86		1	__vm86		vm86
diff --git a/sysdeps/unix/sysv/linux/schedbits.h b/sysdeps/unix/sysv/linux/schedbits.h
new file mode 100644
index 0000000000..7b887aab25
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/schedbits.h
@@ -0,0 +1 @@
+#include <linux/posix_sched.h>
diff --git a/sysdeps/unix/sysv/linux/sys/acct.h b/sysdeps/unix/sysv/linux/sys/acct.h
new file mode 100644
index 0000000000..adb2da7a99
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/acct.h
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_ACCT_H
+
+#define _SYS_ACCT_H	1
+#include <features.h>
+
+/* Get needed constants.  */
+#include <linux/acct.h>
+
+__BEGIN_DECLS
+
+/* Switch process accounting on and off.  */
+extern int acct __P ((__const char *__filename));
+
+__END_DECLS
+
+#endif	/* sys/acct.h */
diff --git a/sysdeps/unix/sysv/linux/sys/socket.h b/sysdeps/unix/sysv/linux/sys/socket.h
index cd6c58bd32..a680d5fb29 100644
--- a/sysdeps/unix/sysv/linux/sys/socket.h
+++ b/sysdeps/unix/sysv/linux/sys/socket.h
@@ -1 +1,169 @@
+/* Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+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.  */
+
+#ifndef	_SYS_SOCKET_H
+
+#define	_SYS_SOCKET_H	1
+#include <features.h>
+
+__BEGIN_DECLS
+
+#define	__need_size_t
+#include <stddef.h>
+
+
+/* Get Linux specific constants and data types.  */
 #include <linux/socket.h>
+
+/* This is the type we use for generic socket address arguments.
+
+   With GCC 2.7 and later, the funky union causes redeclarations or uses with
+   any of the listed types to be allowed without complaint.  */
+#if	(!defined (__GNUC__) || __GNUC__ < 2 || \
+	 (__GNUC__ == 2 && __GNUC_MINOR__ < 7))
+#define	__SOCKADDR_ARG		struct sockaddr *
+#define	__CONST_SOCKADDR_ARG	__const struct sockaddr *
+#else
+/* Add more `struct sockaddr_AF' types here as necessary.
+   These are all the ones I found on NetBSD and Linux.  */
+#define __SOCKADDR_ALLTYPES \
+  __SOCKADDR_ONETYPE (sockaddr) \
+  __SOCKADDR_ONETYPE (sockaddr_at) \
+  __SOCKADDR_ONETYPE (sockaddr_ax25) \
+  __SOCKADDR_ONETYPE (sockaddr_dl) \
+  __SOCKADDR_ONETYPE (sockaddr_eon) \
+  __SOCKADDR_ONETYPE (sockaddr_in) \
+  __SOCKADDR_ONETYPE (sockaddr_in6) \
+  __SOCKADDR_ONETYPE (sockaddr_inarp) \
+  __SOCKADDR_ONETYPE (sockaddr_ipx) \
+  __SOCKADDR_ONETYPE (sockaddr_iso) \
+  __SOCKADDR_ONETYPE (sockaddr_ns) \
+  __SOCKADDR_ONETYPE (sockaddr_un) \
+  __SOCKADDR_ONETYPE (sockaddr_x25)
+
+#define __SOCKADDR_ONETYPE(type) struct type *__##type##__;
+typedef union { __SOCKADDR_ALLTYPES
+	      } __SOCKADDR_ARG __attribute__ ((__transparent_union__));
+#undef __SOCKADDR_ONETYPE
+#define __SOCKADDR_ONETYPE(type) __const struct type *__##type##__;
+typedef union { __SOCKADDR_ALLTYPES
+	      } __CONST_SOCKADDR_ARG __attribute__ ((__transparent_union__));
+#undef __SOCKADDR_ONETYPE
+#endif
+
+
+/* Create a new socket of type TYPE in domain DOMAIN, using
+   protocol PROTOCOL.  If PROTOCOL is zero, one is chosen automatically.
+   Returns a file descriptor for the new socket, or -1 for errors.  */
+extern int socket __P ((int __domain, int __type, int __protocol));
+
+/* Create two new sockets, of type TYPE in domain DOMAIN and using
+   protocol PROTOCOL, which are connected to each other, and put file
+   descriptors for them in FDS[0] and FDS[1].  If PROTOCOL is zero,
+   one will be chosen automatically.  Returns 0 on success, -1 for errors.  */
+extern int socketpair __P ((int __domain, int __type, int __protocol,
+			    int __fds[2]));
+
+/* Give the socket FD the local address ADDR (which is LEN bytes long).  */
+extern int bind __P ((int __fd, __CONST_SOCKADDR_ARG __addr, size_t __len));
+
+/* Put the local address of FD into *ADDR and its length in *LEN.  */
+extern int getsockname __P ((int __fd, __SOCKADDR_ARG __addr,
+			     size_t *__len));
+
+/* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
+   For connectionless socket types, just set the default address to send to
+   and the only address from which to accept transmissions.
+   Return 0 on success, -1 for errors.  */
+extern int connect __P ((int __fd,
+			 __CONST_SOCKADDR_ARG __addr, size_t __len));
+
+/* Put the address of the peer connected to socket FD into *ADDR
+   (which is *LEN bytes long), and its actual length into *LEN.  */
+extern int getpeername __P ((int __fd, __SOCKADDR_ARG __addr,
+			     size_t *__len));
+
+
+/* Send N bytes of BUF to socket FD.  Returns the number sent or -1.  */
+extern int send __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
+
+/* Read N bytes into BUF from socket FD.
+   Returns the number read or -1 for errors.  */
+extern int recv __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
+
+/* Send N bytes of BUF on socket FD to peer at address ADDR (which is
+   ADDR_LEN bytes long).  Returns the number sent, or -1 for errors.  */
+extern int sendto __P ((int __fd, __ptr_t __buf, size_t __n, int __flags,
+			__CONST_SOCKADDR_ARG __addr, size_t __addr_len));
+
+/* Read N bytes into BUF through socket FD.
+   If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of
+   the sender, and store the actual size of the address in *ADDR_LEN.
+   Returns the number of bytes read or -1 for errors.  */
+extern int recvfrom __P ((int __fd, __ptr_t __buf, size_t __n, int __flags,
+			  __SOCKADDR_ARG __addr, size_t *__addr_len));
+
+
+/* Send a message described MESSAGE on socket FD.
+   Returns the number of bytes sent, or -1 for errors.  */
+extern int sendmsg __P ((int __fd, __const struct msghdr *__message,
+			 int __flags));
+
+/* Receive a message as described by MESSAGE from socket FD.
+   Returns the number of bytes read or -1 for errors.  */
+extern int recvmsg __P ((int __fd, struct msghdr *__message, int __flags));
+
+
+/* Put the current value for socket FD's option OPTNAME at protocol level LEVEL
+   into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's
+   actual length.  Returns 0 on success, -1 for errors.  */
+extern int getsockopt __P ((int __fd, int __level, int __optname,
+			    __ptr_t __optval, size_t *__optlen));
+
+/* Set socket FD's option OPTNAME at protocol level LEVEL
+   to *OPTVAL (which is OPTLEN bytes long).
+   Returns 0 on success, -1 for errors.  */
+extern int setsockopt __P ((int __fd, int __level, int __optname,
+			    __ptr_t __optval, size_t __optlen));
+
+
+/* Prepare to accept connections on socket FD.
+   N connection requests will be queued before further requests are refused.
+   Returns 0 on success, -1 for errors.  */
+extern int listen __P ((int __fd, unsigned int __n));
+
+/* Await a connection on socket FD.
+   When a connection arrives, open a new socket to communicate with it,
+   set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
+   peer and *ADDR_LEN to the address's actual length, and return the
+   new socket's descriptor, or -1 for errors.  */
+extern int accept __P ((int __fd, __SOCKADDR_ARG __addr,
+			size_t *__addr_len));
+
+/* Shut down all or part of the connection open on socket FD.
+   HOW determines what to shut down:
+     0 = No more receptions;
+     1 = No more transmissions;
+     2 = No more receptions or transmissions.
+   Returns 0 on success, -1 for errors.  */
+extern int shutdown __P ((int __fd, int __how));
+
+
+__END_DECLS
+
+#endif /* sys/socket.h */
diff --git a/sysdeps/unix/sysv/linux/sys/sysinfo.h b/sysdeps/unix/sysv/linux/sys/sysinfo.h
new file mode 100644
index 0000000000..c05da05b3d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/sysinfo.h
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_SYSINFO_H
+
+#define _SYS_SYSINFO_H	1
+#include <features.h>
+
+/* Get sysinfo structure from kernel header.  */
+#include <linux/kernel.h>
+
+/* Returns information on overall system statistics.  */
+extern int sysinfo __P ((struct sysinfo *__info));
+
+#endif	/* sys/sysinfo.h */
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index d78a1f7e89..019d746a73 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -2,6 +2,7 @@
 
 adjtimex	adjtime	adjtimex	1	__adjtimex
 fdatasync	-	fdatasync	1	fdatasync
+flock		-	flock		2	__flock		flock
 fork		-	fork		0	__fork		fork
 getegid		-	getegid		0	__getegid	getegid
 geteuid		-	geteuid		0	__geteuid	geteuid
@@ -9,7 +10,10 @@ getpgid		-	getpgid		1	getpgid
 getpgrp		-	getpgrp		0	getpgrp
 getppid		-	getppid		0	__getppid	getppid
 getsid		-	getsid		1	getsid
+ioperm		-	ioperm		3	ioperm
+iopl		-	iopl		1	iopl
 ipc		msgget	ipc		5	__ipc
+llseek		-	_llseek		5	llseek
 mlock		-	mlock		2	__mlock	mlock
 mlockall	-	mlockall	1	__mlockall	mlockall
 mount		-	mount		5	__mount	mount
@@ -18,7 +22,7 @@ munlock		-	munlock		2	__munlock	munlock
 munlockall	-	munlockall	0	__munlockall	munlockall
 nanosleep	-	nanosleep	2	nanosleep
 personality	init-first personality	1	__personality	personality
-pipe		-	pipe		1	__pipe	pipe
+pipe		-	pipe		1	__pipe		pipe
 reboot		-	reboot		3	reboot
 s_getpriority	getpriority getpriority	2	__syscall_getpriority
 s_ptrace	ptrace	ptrace		4	__syscall_ptrace
@@ -31,9 +35,13 @@ sched_yield	-	sched_yield	0	__sched_yield	sched_yield
 sched_primax	-	sched_get_priority_max	1	__sched_get_priority_max	sched_get_priority_max
 sched_primin	-	sched_get_priority_min	1	__sched_get_priority_min	sched_get_priority_min
 sched_rr_gi	-	sched_rr_get_interval	2	__sched_rr_get_interval	sched_rr_get_interval
+setfsgid	-	setfsgid	1	setfsgid
+setfsuid	-	setfsuid	1	setfsuid
 setpgid		-	setpgid		2	setpgid
 sigpending	-	sigpending	1	sigpending
 sigprocmask	-	sigprocmask	3	__sigprocmask	sigprocmask
 s_sysctl	sysctl	_sysctl		1	__syscall__sysctl
+sysinfo		-	sysinfo		1	sysinfo
 umount		-	umount		1	__umount	umount
+uselib		-	uselib		1	uselib
 wait4		-	wait4		4	__wait4		wait4
diff --git a/sysdeps/unix/sysv/linux/sysconf.c b/sysdeps/unix/sysv/linux/sysconf.c
index d658165b07..2ae584f164 100644
--- a/sysdeps/unix/sysv/linux/sysconf.c
+++ b/sysdeps/unix/sysv/linux/sysconf.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991, 1993, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Library General Public License as
@@ -13,291 +12,26 @@ Library General Public License for more details.
 
 You should have received a copy of the GNU Library General Public
 License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* On Linux we must not ask __getdtablesize for te value for _SC_OPEN_MAX
+   because this would mean an endless loop.  */
 
-#include <ansidecl.h>
-#include <errno.h>
 #include <limits.h>
 #include <unistd.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 
-extern size_t EXFUN(__getpagesize, (NOARGS));
+extern long int __default_sysconf (int name);
 
-/* Get the value of the system variable NAME.  */
 long int
-DEFUN(__sysconf, (name), int name)
+__sysconf (int name)
 {
-  switch (name)
-    {
-    default:
-      errno = EINVAL;
-      return -1;
-
-    case _SC_ARG_MAX:
-#ifdef	ARG_MAX
-      return ARG_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_CHILD_MAX:
-#ifdef	CHILD_MAX
-      return CHILD_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_CLK_TCK:
-#ifdef	CLK_TCK
-      return CLK_TCK;
-#else
-      return 60;
-#endif
-
-    case _SC_NGROUPS_MAX:
-#ifdef	NGROUPS_MAX
-      return NGROUPS_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_OPEN_MAX:
-      return OPEN_MAX;
-
-    case _SC_STREAM_MAX:
-#ifdef	STREAM_MAX
-      return STREAM_MAX;
-#else
-      return FOPEN_MAX;
-#endif
-
-    case _SC_TZNAME_MAX:
-      return __tzname_max ();
-
-    case _SC_JOB_CONTROL:
-#ifdef	_POSIX_JOB_CONTROL
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_SAVED_IDS:
-#ifdef	_POSIX_SAVED_IDS
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_REALTIME_SIGNALS:
-#ifdef	_POSIX_REALTIME_SIGNALS
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_PRIORITY_SCHEDULING:
-#ifdef	_POSIX_PRIORITY_SCHEDULING
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_TIMERS:
-#ifdef	_POSIX_TIMERS
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_ASYNCHRONOUS_IO:
-#ifdef	_POSIX_ASYNCHRONOUS_IO
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_PRIORITIZED_IO:
-#ifdef	_POSIX_PRIORITIZED_IO
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_SYNCHRONIZED_IO:
-#ifdef	_POSIX_SYNCHRONIZED_IO
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_FSYNC:
-#ifdef	_POSIX_FSYNC
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_MAPPED_FILES:
-#ifdef	_POSIX_MAPPED_FILES
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_MEMLOCK:
-#ifdef	_POSIX_MEMLOCK
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_MEMLOCK_RANGE:
-#ifdef	_POSIX_MEMLOCK_RANGE
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_MEMORY_PROTECTION:
-#ifdef	_POSIX_MEMORY_PROTECTION
-      return 1;
-#else
-      return -1;
-#endif
+  if (name == _SC_OPEN_MAX)
+    return OPEN_MAX;
 
-    case _SC_MESSAGE_PASSING:
-#ifdef	_POSIX_MESSAGE_PASSING
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_SEMAPHORES:
-#ifdef	_POSIX_SEMAPHORES
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_SHARED_MEMORY_OBJECTS:
-#ifdef	_POSIX_SHARED_MEMORY_OBJECTS
-      return 1;
-#else
-      return -1;
-#endif
-
-    case _SC_VERSION:
-      return _POSIX_VERSION;
-
-    case _SC_PAGESIZE:
-      return __getpagesize ();
-
-    case _SC_BC_BASE_MAX:
-#ifdef	BC_BASE_MAX
-      return BC_BASE_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_BC_DIM_MAX:
-#ifdef	BC_DIM_MAX
-      return BC_DIM_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_BC_SCALE_MAX:
-#ifdef	BC_SCALE_MAX
-      return BC_SCALE_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_BC_STRING_MAX:
-#ifdef	BC_STRING_MAX
-      return BC_STRING_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_EQUIV_CLASS_MAX:
-#ifdef	EQUIV_CLASS_MAX
-      return EQUIV_CLASS_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_EXPR_NEST_MAX:
-#ifdef	EXPR_NEST_MAX
-      return EXPR_NEST_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_LINE_MAX:
-#ifdef	LINE_MAX
-      return LINE_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_RE_DUP_MAX:
-#ifdef	RE_DUP_MAX
-      return RE_DUP_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_CHARCLASS_NAME_MAX:
-#ifdef	CHARCLASS_NAME_MAX
-      return CHARCLASS_NAME_MAX;
-#else
-      return -1;
-#endif
-
-    case _SC_2_VERSION:
-      /* This is actually supposed to return the version
-	 of the 1003.2 utilities on the system {POSIX2_VERSION}.  */
-      return _POSIX2_C_VERSION;
-
-    case _SC_2_C_BIND:
-#ifdef	_POSIX2_C_BIND
-      return _POSIX2_C_BIND;
-#else
-      return -1;
-#endif
-
-    case _SC_2_C_DEV:
-#ifdef	_POSIX2_C_DEV
-      return _POSIX2_C_DEV;
-#else
-      return -1;
-#endif
-
-    case _SC_2_FORT_DEV:
-#ifdef	_POSIX2_FORT_DEV
-      return _POSIX2_FORT_DEV;
-#else
-      return -1;
-#endif
-
-    case _SC_2_LOCALEDEF:
-#ifdef	_POSIX2_LOCALEDEF
-      return _POSIX2_LOCALEDEF;
-#else
-      return -1;
-#endif
-
-    case _SC_2_SW_DEV:
-#ifdef	_POSIX2_SW_DEV
-      return _POSIX2_SW_DEV;
-#else
-      return -1;
-#endif
-    }
+  return __default_sysconf (name);
 }
 
-weak_alias (__sysconf, sysconf)
+#define __sysconf __default_sysconf
+
+#include <sysdeps/posix/sysconf.c>
diff --git a/sysdeps/unix/sysv/sysv4/sysconf.c b/sysdeps/unix/sysv/sysv4/sysconf.c
index 9ed5cbcd20..81d660fe64 100644
--- a/sysdeps/unix/sysv/sysv4/sysconf.c
+++ b/sysdeps/unix/sysv/sysv4/sysconf.c
@@ -186,6 +186,83 @@ DEFUN(__sysconf, (name), int name)
     case _SC_PAGESIZE:
       return __sysconfig (_CONFIG_PAGESIZE);
 
+    case _SC_AIO_LISTIO_MAX:
+#ifdef	AIO_LISTIO_MAX
+      return AIO_LISTIO_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_AIO_MAX:
+#ifdef	AIO_MAX
+      return AIO_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_AIO_PRIO_DELTA_MAX:
+#ifdef	AIO_PRIO_DELTA_MAX
+      return AIO_PRIO_DELTA_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_DELAYTIMER_MAX:
+#ifdef	DELAYTIMER_MAX
+      return DELAYTIMER_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_MQ_OPEN_MAX:
+#ifdef	MQ_OPEN_MAX
+      return MQ_OPEN_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_MQ_PRIO_MAX:
+#ifdef	MQ_PRIO_MAX
+      return MQ_PRIO_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_RTSIG_MAX:
+#ifdef	RTSIG_MAX
+      return RTSIG_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_SEM_NSEMS_MAX:
+#ifdef	SEM_NSEMS_MAX
+      return SEM_NSEMS_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_SEM_VALUE_MAX:
+#ifdef	SEM_VALUE_MAX
+      return SEM_VALUE_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_SIGQUEUE_MAX:
+#ifdef	SIGQUEUE_MAX
+      return SIGQUEUE_MAX;
+#else
+      return -1;
+#endif
+
+    case _SC_TIMER_MAX:
+#ifdef	TIMER_MAX
+      return TIMER_MAX;
+#else
+      return -1;
+#endif
+
     case _SC_BC_BASE_MAX:
 #ifdef	BC_BASE_MAX
       return BC_BASE_MAX;