summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.cvsignore1
-rw-r--r--BUGS4
-rw-r--r--ChangeLog226
-rw-r--r--FAQ8
-rw-r--r--Makeconfig6
-rw-r--r--Makefile2
-rw-r--r--NEWS19
-rw-r--r--bits/confname.h11
-rw-r--r--bits/siginfo.h184
-rw-r--r--bits/utsname.h2
-rw-r--r--elf/dl-profile.c16
-rw-r--r--grp/initgroups.c76
-rw-r--r--inet/arpa/inet.h5
-rw-r--r--libc.map4
-rw-r--r--math/Makefile2
-rw-r--r--math/libm-test.c75
-rw-r--r--posix/Makefile2
-rw-r--r--posix/confstr.c4
-rw-r--r--posix/getopt.c8
-rw-r--r--posix/getopt_init.c2
-rw-r--r--posix/sys/wait.h2
-rw-r--r--posix/unistd.h9
-rw-r--r--resolv/inet_addr.c2
-rw-r--r--resolv/inet_neta.c2
-rw-r--r--rt/Makefile42
-rw-r--r--rt/aio.h231
-rw-r--r--rt/aio_cancel.c172
-rw-r--r--rt/aio_error.c40
-rw-r--r--rt/aio_fsync.c42
-rw-r--r--rt/aio_misc.c306
-rw-r--r--rt/aio_misc.h45
-rw-r--r--rt/aio_read.c31
-rw-r--r--rt/aio_read64.c31
-rw-r--r--rt/aio_return.c40
-rw-r--r--rt/aio_suspend.c55
-rw-r--r--rt/aio_write.c31
-rw-r--r--rt/aio_write64.c31
-rw-r--r--rt/lio_listio.c68
-rw-r--r--rt/lio_listio64.c66
-rw-r--r--shlib-versions3
-rw-r--r--signal/Makefile7
-rw-r--r--signal/allocrtsig.c89
-rw-r--r--signal/signal.h44
-rw-r--r--stdio-common/tmpfile64.c1
-rw-r--r--stdio/stdio.h6
-rw-r--r--string/string.h1
-rw-r--r--string/strverscmp.c3
-rw-r--r--sysdeps/arm/__longjmp.S3
-rw-r--r--sysdeps/arm/setjmp.S3
-rw-r--r--sysdeps/generic/Makefile2
-rw-r--r--sysdeps/generic/aio_sigqueue.c33
-rw-r--r--sysdeps/generic/bits/confname.h11
-rw-r--r--sysdeps/generic/bits/siginfo.h184
-rw-r--r--sysdeps/generic/bits/utsname.h2
-rw-r--r--sysdeps/generic/dl-sysdep.c3
-rw-r--r--sysdeps/generic/enbl-secure.c8
-rw-r--r--sysdeps/generic/sigqueue.c32
-rw-r--r--sysdeps/generic/sigtimedwait.c33
-rw-r--r--sysdeps/generic/sigwaitinfo.c32
-rw-r--r--sysdeps/generic/testrtsig.h28
-rw-r--r--sysdeps/i386/Makefile4
-rw-r--r--sysdeps/i386/sys/ucontext.h4
-rw-r--r--sysdeps/libm-ieee754/s_csqrt.c10
-rw-r--r--sysdeps/libm-ieee754/s_csqrtf.c10
-rw-r--r--sysdeps/libm-ieee754/s_csqrtl.c10
-rw-r--r--sysdeps/m68k/fpu/e_acos.c1
-rw-r--r--sysdeps/m68k/fpu/e_atan2.c1
-rw-r--r--sysdeps/m68k/fpu/e_fmod.c1
-rw-r--r--sysdeps/m68k/fpu/e_pow.c1
-rw-r--r--sysdeps/m68k/fpu/e_scalb.c1
-rw-r--r--sysdeps/m68k/fpu/k_cos.c1
-rw-r--r--sysdeps/m68k/fpu/k_sin.c1
-rw-r--r--sysdeps/m68k/fpu/k_tan.c1
-rw-r--r--sysdeps/m68k/fpu/s_atan.c1
-rw-r--r--sysdeps/m68k/fpu/s_ccos.c1
-rw-r--r--sysdeps/m68k/fpu/s_ccosh.c1
-rw-r--r--sysdeps/m68k/fpu/s_cexp.c1
-rw-r--r--sysdeps/m68k/fpu/s_csin.c1
-rw-r--r--sysdeps/m68k/fpu/s_csinh.c1
-rw-r--r--sysdeps/m68k/fpu/s_frexp.c1
-rw-r--r--sysdeps/m68k/fpu/s_ilogb.c1
-rw-r--r--sysdeps/m68k/fpu/s_isinf.c1
-rw-r--r--sysdeps/m68k/fpu/s_llrint.c1
-rw-r--r--sysdeps/m68k/fpu/s_llrintf.c1
-rw-r--r--sysdeps/m68k/fpu/s_llrintl.c1
-rw-r--r--sysdeps/m68k/fpu/s_lrint.c1
-rw-r--r--sysdeps/m68k/fpu/s_modf.c1
-rw-r--r--sysdeps/m68k/fpu/s_remquo.c1
-rw-r--r--sysdeps/m68k/fpu/s_scalbn.c1
-rw-r--r--sysdeps/m68k/fpu/s_sincos.c1
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c2
-rw-r--r--sysdeps/unix/sysv/linux/Dist8
-rw-r--r--sysdeps/unix/sysv/linux/Makefile8
-rw-r--r--sysdeps/unix/sysv/linux/aio_sigqueue.c54
-rw-r--r--sysdeps/unix/sysv/linux/arm/bits/mman.h75
-rw-r--r--sysdeps/unix/sysv/linux/bits/local_lim.h6
-rw-r--r--sysdeps/unix/sysv/linux/bits/posix_opt.h8
-rw-r--r--sysdeps/unix/sysv/linux/bits/sigaction.h22
-rw-r--r--sysdeps/unix/sysv/linux/bits/siginfo.h257
-rw-r--r--sysdeps/unix/sysv/linux/bits/signum.h21
-rw-r--r--sysdeps/unix/sysv/linux/bits/sigset.h38
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S7
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigaction.c37
-rw-r--r--sysdeps/unix/sysv/linux/i386/sys/ucontext.h106
-rw-r--r--sysdeps/unix/sysv/linux/init-first.c2
-rw-r--r--sysdeps/unix/sysv/linux/kernel_sigaction.h4
-rw-r--r--sysdeps/unix/sysv/linux/netinet/ip.h52
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigaction.c28
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigprocmask.c28
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigqueueinfo.c27
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigreturn.c27
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigsuspend.c33
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigtimedwait.c34
-rw-r--r--sysdeps/unix/sysv/linux/sigaction.c27
-rw-r--r--sysdeps/unix/sysv/linux/sigpending.c53
-rw-r--r--sysdeps/unix/sysv/linux/sigprocmask.c55
-rw-r--r--sysdeps/unix/sysv/linux/sigqueue.c53
-rw-r--r--sysdeps/unix/sysv/linux/sigreturn.c53
-rw-r--r--sysdeps/unix/sysv/linux/sigsuspend.c27
-rw-r--r--sysdeps/unix/sysv/linux/sigtimedwait.c37
-rw-r--r--sysdeps/unix/sysv/linux/sigwaitinfo.c36
-rw-r--r--sysdeps/unix/sysv/linux/sys/pci.h25
-rw-r--r--sysdeps/unix/sysv/linux/sys/timex.h6
-rw-r--r--sysdeps/unix/sysv/linux/sys/ultrasound.h1
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list13
-rw-r--r--sysdeps/unix/sysv/linux/testrtsig.h30
-rw-r--r--sysdeps/wordsize-32/bits/environments.h32
-rw-r--r--sysdeps/wordsize-64/bits/environments.h30
128 files changed, 3653 insertions, 203 deletions
diff --git a/.cvsignore b/.cvsignore
index e724ae9d55..7654da865a 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -20,7 +20,6 @@ docs
 
 crypt
 linuxthreads
-localedata
 secure_rpc
 
 aio
diff --git a/BUGS b/BUGS
index f4b60398ed..3a0b52397b 100644
--- a/BUGS
+++ b/BUGS
@@ -1,7 +1,7 @@
 	    List of known bugs (certainly very incomplete)
 	    ----------------------------------------------
 
-Time-stamp: <1997-11-12T04:42:03+0100 drepper>
+Time-stamp: <1997-12-03T15:30:07+0100 drepper>
 
 This following list contains those bugs which I'm aware of.  Please
 make sure that bugs you report are not listed here.  If you can fix one
@@ -27,8 +27,6 @@ Severity: [  *] to [***]
 
 [ **]  The libm-ieee `log2' function seems to be very inaccurate.
 
-[  *]  The libm-ieee `remquo' function rounds 3.0/2.0 incorrectly.
-
 [  *]  The precision of the `sinhl' and/or `asinhl' function do not seem
        to be the best.
 
diff --git a/ChangeLog b/ChangeLog
index bd36132a93..d26d6448f8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,229 @@
+1997-12-03 23:50  Ulrich Drepper  <drepper@cygnus.com>
+
+	* Makeconfig: Add shared-thread-library variable.
+
+	* math/Makfile (CPPFLAGS): Add -D__LIBC_INTERNAL_MATH_INLINES.
+	* sysdeps/i386/Makefile: Don't define ___LIBC_INTERNAL_MATH_INLINES
+	here.
+	* sysdeps/m68k/fpu/e_acos.c: Likewise.
+	* sysdeps/m68k/fpu/e_atan2.c: Likewise.
+	* sysdeps/m68k/fpu/e_fmod.c: Likewise.
+	* sysdeps/m68k/fpu/e_pow.c: Likewise.
+	* sysdeps/m68k/fpu/e_scalb.c: Likewise.
+	* sysdeps/m68k/fpu/k_cos.c: Likewise.
+	* sysdeps/m68k/fpu/k_sin.c: Likewise.
+	* sysdeps/m68k/fpu/k_tan.c: Likewise.
+	* sysdeps/m68k/fpu/s_atan.c: Likewise.
+	* sysdeps/m68k/fpu/s_ccos.c: Likewise.
+	* sysdeps/m68k/fpu/s_ccosh.c: Likewise.
+	* sysdeps/m68k/fpu/s_cexp.c: Likewise.
+	* sysdeps/m68k/fpu/s_csin.c: Likewise.
+	* sysdeps/m68k/fpu/s_csinh.c: Likewise.
+	* sysdeps/m68k/fpu/s_frexp.c: Likewise.
+	* sysdeps/m68k/fpu/s_ilogb.c: Likewise.
+	* sysdeps/m68k/fpu/s_isinf.c: Likewise.
+	* sysdeps/m68k/fpu/s_llrint.c: Likewise.
+	* sysdeps/m68k/fpu/s_llrintf.c: Likewise.
+	* sysdeps/m68k/fpu/s_llrintl.c: Likewise.
+	* sysdeps/m68k/fpu/s_lrint.c: Likewise.
+	* sysdeps/m68k/fpu/s_modf.c: Likewise.
+	* sysdeps/m68k/fpu/s_remquo.c: Likewise.
+	* sysdeps/m68k/fpu/s_scalbn.c: Likewise.
+	* sysdeps/m68k/fpu/s_sincos.c: Likewise.
+
+	* libc.map: Add __libc_current_sigrtmin, __libc_current_sigrtmax,
+	__libc_allocate_rtsig, sigqueue, sigtimedwait, sigwaitinfo.
+	* signal/Makefile (headers): Add bits/siginfo.h.
+	(routines): Add allocrtsig, sigtimedwait, sigwaitinfo, sigqueue.
+	(distribute): Add testrtsig.h.
+	* signal/allocrtsig.c: New file.
+	* signal/signal.h: Define `union sigval'.  Include <bits/siginfo.h>.
+	Declare sigwaitinfo, sigtimedwait, sigqueue, __libc_current_sigrtmin,
+	__libc_current_sigrtmax.
+	* sysdeps/generic/sigqueue.c: New file.
+	* sysdeps/generic/sigtimedwait.c: New file.
+	* sysdeps/generic/sigwaitinfo.c: New file.
+	* sysdeps/generic/testrtsig.h: New file.
+	* sysdeps/generic/bits/siginfo.h: New file.
+	* sysdeps/unix/sysv/linux/bits/siginfo.h: New file.
+	* sysdeps/unix/sysv/linux/kernel_sigaction.h: Define struct as
+	old_kernel_sigaction and rename sa_handler member to k_sa_handler.
+	* sysdeps/unix/sysv/linux/rt_sigaction.c: New file.
+	* sysdeps/unix/sysv/linux/rt_sigprocmask.c: New file.
+	* sysdeps/unix/sysv/linux/rt_sigqueueinfo.c: New file.
+	* sysdeps/unix/sysv/linux/rt_sigreturn.c: New file.
+	* sysdeps/unix/sysv/linux/rt_sigsuspend.c: New file.
+	* sysdeps/unix/sysv/linux/rt_sigtimedwait.c: New file.
+	* sysdeps/unix/sysv/linux/sigpending.c: New file.
+	* sysdeps/unix/sysv/linux/sigprocmask.c: New file.
+	* sysdeps/unix/sysv/linux/sigqueue.c: New file.
+	* sysdeps/unix/sysv/linux/sigreturn.c: New file.
+	* sysdeps/unix/sysv/linux/sigtimedwait.c: New file.
+	* sysdeps/unix/sysv/linux/sigwaitinfo.c: New file.
+	* sysdeps/unix/sysv/linux/testrtsig.h: New file.
+	* sysdeps/unix/sysv/linux/sigsuspend.c: Update for AIO.
+	* sysdeps/unix/sysv/linux/syscalls.list: Update for AIO.
+	* sysdeps/unix/sysv/linux/sigaction.c: Update for AIO.
+	* sysdeps/unix/sysv/linux/bits/local_lim.h: Define AIO_PRIO_DELTA_MAX.
+	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _XOPEN_REALTIME
+	and _POSIX_REALTIME_SIGNALS.
+	* sysdeps/unix/sysv/linux/bits/sigaction.h: Update for AIO.
+	* sysdeps/unix/sysv/linux/bits/signum.h: Define SIGRTMIN/MAX and
+	update _NSIG.
+	* sysdeps/unix/sysv/linux/i386/sigaction.c: Update for AIO.
+	* sysdeps/unix/sysv/linux/i386/sys/ucontext.h: Linux/i386 specific
+	definitions.
+
+	* Makefile (subdirs): Add rt.
+	* shlib-versions: Add entry for librt.
+	* rt/Makefile: New file.
+	* rt/aio.h: New file.
+	* rt/aio_cancel.c: New file.
+	* rt/aio_error.c: New file.
+	* rt/aio_fsync.c: New file.
+	* rt/aio_misc.c: New file.
+	* rt/aio_misc.h: New file.
+	* rt/aio_read.c: New file.
+	* rt/aio_read64.c: New file.
+	* rt/aio_return.c: New file.
+	* rt/aio_suspend.c: New file.
+	* rt/aio_write.c: New file.
+	* rt/aio_write64.c: New file.
+	* rt/lio_listio.c: New file.
+	* rt/lio_listio64.c: New file.
+	* sysdeps/generic/aio_sigqueue.c: New file.
+	* sysdeps/unix/sysv/linux/aio_sigqueue.c: New file.
+	* sysdeps/unix/sysv/linux/Dist: Add new files
+	* sysdeps/unix/sysv/linux/Makefile [$(subdir)=signal]
+	(sysdep_routines): Add rt_sigsuspend, rt_sigprocmask, rt_sigtimedwait,
+	rt_sigqueueinfo, rt_sigaction.
+
+	* posix/Makefile (headers): Add bits/environments.h.
+	* posix/confstr.c: Correctly handle _CS_XBS5_ILP32_OFFBIG_CFLAGS
+	and _CS_LFS_CFLAGS on 64bit platforms.
+	* posix/unistd.h: Define _XOPEN_LEGACY.  Explain _XOPEN_REALTIME
+	and _XOPEN_REALTIME_THREADS.  Include bits/environments.h.
+	* sysdeps/generic/bits/confname.h: Define _SC_* constants for
+	compilation modules.
+	* sysdeps/wordsize-32/bits/environments.h: New file.
+	* sysdeps/wordsize-64/bits/environments.h: New file.
+
+	* posix/getopt.c: Remove declaration of getpid and __libc_pid.
+	* posix/getopt_init.c: Test for value 0xf00baa of uninitialized
+	__libc_pid.
+	* sysdeps/unix/sysv/linux/init-first.c: Initialize __libc_pid to
+	0xf00baa.
+
+	* string/string.h: Add declaration of __strverscmp.
+	* string/strverscmp.c: Rename function ot __strverscmp and make old
+	name weak alias.
+
+	* sysdeps/generic/dl-sysdep.c: Declare and define __libc_uid.
+	* sysdeps/generic/enbl-secure.c: Likewise.
+	* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
+
+	* sysdeps/unix/sysv/linux/bits/sigset.h: Pretty print.
+
+	* sysdeps/unix/sysv/linux/sys/pci.h: New file.
+
+1997-12-03  Ulrich Drepper  <drepper@cygnus.com>
+
+	* posix/sys/wait.h: Use __transparent_union__ instead of
+	transparent_union.  Reported by Roland McGrath.
+
+1997-12-03  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+	* resolv/inet_neta.c (inet_neta): Change type of first parameter
+	to u_int32_t.  Suggested by John Lavagnino <John_Lavagnino@Brown.edu>
+	[PR libc/366].
+
+	* resolv/inet_addr.c (inet_addr): Change return type to u_int32_t.
+
+	* inet/arpa/inet.h: Change types of inet_neta and inet_addr.
+
+1997-12-03 20:40  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
+
+	* grp/initgroups.c: Increase buffer if it is too small.
+
+1997-12-03  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/netinet/ip.h: Don't use u_int8_t for bit
+	fields, this is no ISO C.  Reported by Andreas Jaeger.
+
+1997-12-03  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+	* sysdeps/i386/sys/ucontext.h (enum): Add missing commata.
+
+1997-12-03 08:58  Philip Blundell  <pb@nexus.co.uk>
+
+	* sysdeps/generic/bits/utsname.h: <sys/utsname.h> defines
+	_SYS_UTSNAME_H not _UTSNAME_H.
+
+1997-11-28  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* elf/dl-profile.c (_dl_start_profile): Avoid overflow when
+	computing s_scale.
+
+1997-11-29  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/libm-ieee754/s_csqrt.c: Use different formula for now.
+	* sysdeps/libm-ieee754/s_csqrtf.c: Likewise.
+	* sysdeps/libm-ieee754/s_csqrtl.c: Likewise.
+
+	* math/libm-test.c (csqrt_test): Add testcase.
+
+1997-12-03 15:44  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/sys/ultrasound.h: New file.
+	* sysdeps/unix/sysv/linux/sys/Dist: Add it.
+	* sysdeps/unix/sysv/linux/sys/Makefile [$(subdir)=misc]: Likewise.
+
+1997-11-30  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/unix/sysv/linux/sys/timex.h: Fix declaration.
+
+1997-12-01  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+
+	* math/libm-test.c (acos_test): Add more tests.
+	(asin_test): Likewise.
+	(atan_test): Likewise.
+	(exp_test): Likewise.
+	(sin_test): Likewise.
+	(sqrt_test): Likewise.
+	(cpow_test): Likewise.
+	(csqrt_test): Likewise.
+	(cexp_test): Correct typo in gcc version test.
+
+1997-12-02 17:14  Philip Blundell  <pb@nexus.co.uk>
+
+	* sysdeps/arm/__longjmp.S: Define _SETJMP_H before including
+	<bits/setjmp.h>.
+	* sysdeps/arm/setjmp.S: Likewise.
+
+	* sysdeps/unix/sysv/linux/arm/bits/mman.h: New file.
+
+1997-12-02 18:07  Philip Blundell  <pb@nexus.co.uk>
+
+	* stdio/stdio.h: Add prototype for tmpfile64().
+
+1997-12-02 17:47  Philip Blundell  <pb@nexus.co.uk>
+
+	* stdio/stdio.h (__stdio_gen_tempname): Add extra argument to
+	prototype to keep in step with libio version.
+
+	* stdio-common/tmpfile64.c: Include <errno.h> for ENOSYS.
+
+1997-12-02 17:41  Philip Blundell  <pb@nexus.co.uk>
+
+	* sysdeps/generic/Makefile: Don't try to use make_siglist if
+	cross-compiling.
+
+1997-12-02 01:18  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/i386/clone.S: When cloned process returns
+	load GOT ptr before jumping to _exit.
+	Reported by Xavier Leroy.
+
 1997-12-01 17:27  Ulrich Drepper  <drepper@cygnus.com>
 
 	* Makefile (subdirs): Add iconvdata and localedata.
diff --git a/FAQ b/FAQ
index c555488f4f..38023476e8 100644
--- a/FAQ
+++ b/FAQ
@@ -176,6 +176,10 @@ other make program has the needed functionality.
 Versions before 3.74 have bugs which prevent correct execution so you
 should upgrade to the latest version before starting the compilation.
 
+We recommend version GNU make version 3.75.  Versions 3.76 and
+3.76.1 are known to have bugs which only show up in big projects like
+GNU libc.
+
 
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 [Q4]	``After I changed configure.in I get `Autoconf version X.Y.
@@ -338,10 +342,6 @@ incompatibilities:
        syscall name:	wrapper name:	declaring header file:
        -------------	-------------	----------------------
        bdflush		bdflush		<sys/kdaemon.h>
-       create_module	create_module	<sys/module.h>
-       delete_module	delete_module	<sys/module.h>
-       get_kernel_syms	get_kernel_syms	<sys/module.h>
-       init_module	init_module	<sys/module.h>
        syslog		ksyslog_ctl	<sys/klog.h>
 
 * lpd: Older versions of lpd depend on a routine called _validuser().
diff --git a/Makeconfig b/Makeconfig
index ba777880bf..4d816a0815 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -688,6 +688,12 @@ ifndef rtld-version-installed-name
 rtld-version-installed-name = ld-$(version).so
 endif
 
+# The librt must contain be linked with the thread library.  It least
+# for now.
+ifneq (,$(findstring linuxthreads,$(add-ons)))
+shared-thread-library = $(common-objpfx)linuxthreads/libpthread.so
+endif
+
 endif # build-shared
 
 endif # Makeconfig not yet included
diff --git a/Makefile b/Makefile
index 559c968858..90ba29b76d 100644
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@ subdirs = csu assert ctype db2 locale intl catgets math setjmp signal stdlib \
 	  stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd \
 	  posix io termios resource misc socket sysvipc gmon gnulib iconv \
 	  iconvdata wctype manual shadow md5-crypt po argp $(add-ons) nss \
-	  localedata $(sysdep-subdirs) $(binfmt-subdir)
+	  localedata rt $(sysdep-subdirs) $(binfmt-subdir)
 export subdirs := $(subdirs)	# Benign, useless in GNU make before 3.63.
 
 # The mach and hurd subdirectories have many generated header files which
diff --git a/NEWS b/NEWS
index f616e82fda..71159014b0 100644
--- a/NEWS
+++ b/NEWS
@@ -18,24 +18,33 @@ Version 2.1
 * Miles Bader provided the `argp' function family to support hierachical
   command line argument parsing, layered on top of getopt.
 
-* strtod accepts new hexadecimal floating-point format from ISO C 9X
+* strtod accepts new hexadecimal floating-point format from ISO C 9X.
 
 * printf has two new specifiers %a and %A to print hexadecimal flaoting-point
-  numbers
+  numbers.
 
-* scanf recognizes the %A format for scanning floating point numbers
+* scanf recognizes the %a and %A format for scanning floating point numbers.
 
 * the new header <inttypes.h> from ISO C 9X provides information and
-  interfaces for the available integer types
+  interfaces for the available integer types.
 
 * the new header <complex.h> contains definitions of the complex math
-  functions from ISO C 9X
+  functions from ISO C 9X.
+
+* the new header <tgmath.h> defines generic macros to use complex or
+  real valued functions.
 
 * Thorsten Kukuk provided an implementation for NIS+, securelevel 0, 1 and 2.
 
 * Andreas Jaeger provided a test suite for the math library.
 
 * Mark Kettenis implemented the utmpx interface and an utmp daemon.
+
+* Ulrich Drepper added character conversion functions.
+
+* Optimized string functions have been added.
+
+* The localedata addon is now part of glibc.
 
 Version 2.0.5
 
diff --git a/bits/confname.h b/bits/confname.h
index 3991fb1df4..1b75d6e5b5 100644
--- a/bits/confname.h
+++ b/bits/confname.h
@@ -316,8 +316,17 @@ enum
 #define	_SC_NL_NMAX			_SC_NL_NMAX
     _SC_NL_SETMAX,
 #define	_SC_NL_SETMAX			_SC_NL_SETMAX
-    _SC_NL_TEXTMAX
+    _SC_NL_TEXTMAX,
 #define	_SC_NL_TEXTMAX			_SC_NL_TEXTMAX
+
+    _SC_XBS5_ILP32_OFF32,
+#define _SC_XBS5_ILP32_OFF32		_SC_XBS5_ILP32_OFF32
+    _SC_XBS5_ILP32_OFFBIG,
+#define _SC_XBS5_ILP32_OFFBIG		_SC_XBS5_ILP32_OFFBIG
+    _SC_XBS5_LP64_OFF64,
+#define _SC_XBS5_LP64_OFF64		_SC_XBS5_LP64_OFF64
+    _SC_XBS5_LPBIG_OFFBIG
+#define _SC_XBS5_LPBIG_OFFBIG		_SC_XBS5_LPBIG_OFFBIG
   };
 
 #if (defined __USE_POSIX2 || defined __USE_UNIX98 \
diff --git a/bits/siginfo.h b/bits/siginfo.h
new file mode 100644
index 0000000000..35d9d69892
--- /dev/null
+++ b/bits/siginfo.h
@@ -0,0 +1,184 @@
+/* siginfo_t, sigevent and constants.  Stub version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SIGNAL_H
+# error "Never include this file directly.  Use <signal.h> instead"
+#endif
+
+typedef struct siginfo
+  {
+    int si_signo;		/* Signal number.  */
+    int si_errno;		/* If non-zero, an errno value associated with
+				   this signal, as defined in <errno.h>.  */
+    int si_code;		/* Signal code.  */
+    __pid_t si_pid;		/* Sending process ID.  */
+    __uid_t si_uid;		/* Real user ID of sending process.  */
+    void *si_addr;		/* Address of faulting instruction.  */
+    int si_status;		/* Exit value or signal.  */
+    long int si_band;		/* Band event for SIGPOLL.  */
+    union sigval si_value;	/* Signal value.  */
+  } siginfo_t;
+
+
+/* Values for `si_code'.  Positive values are reserved for kernel-generated
+   signals.  */
+enum
+{
+  SI_ASYNCIO = -4,		/* Sent by AIO completion.  */
+#define SI_ASYNCIO	SI_ASYNCIO
+  SI_MESGQ,			/* Sent by real time mesq state change.  */
+#define SI_MESGQ	SI_MESGQ
+  SI_TIMER,			/* Sent by timer expiration.  */
+#define SI_TIMER	SI_TIMER
+  SI_QUEUE,			/* Sent by sigqueue.  */
+#define SI_QUEUE	SI_QUEUE
+  SI_USER			/* Sent by kill, sigsend, raise.  */
+#define SI_USER		SI_USER
+};
+
+
+/* `si_code' values for SIGILL signal.  */
+enum
+{
+  ILL_ILLOPC = 1,		/* Illegal opcode.  */
+#define ILL_ILLOPC	ILL_ILLOPC
+  ILL_ILL_OPN,			/* Illegal operand.  */
+#define ILL_ILLOPN	ILL_ILLOPN
+  ILL_ILLADR,			/* Illegal addressing mode.  */
+#define ILL_ILLADR	ILL_ILLADR
+  ILL_ILLTRP,			/* Illegal trap. */
+#define ILL_ILLTRP	ILL_ILLTRP
+  ILL_PRVOPC,			/* Privileged opcode.  */
+#define ILL_PRVOPC	ILL_PRVOPC
+  ILL_PRVREG,			/* Privileged register.  */
+#define ILL_PRVREG	ILL_PRVREG
+  ILL_COPROC,			/* Coprocessor error.  */
+#define ILL_COPROC	ILL_COPROC
+  ILL_BADSTK			/* Internal stack error.  */
+#define ILL_BADSTK	ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal.  */
+enum
+{
+  FPE_INTDIV = 1,		/* Integer divide by zero.  */
+#define FPE_INTDIV	FPE_INTDIV
+  FPE_INTOVF,			/* Integer overflow.  */
+#define FPE_INTOVF	FPE_INTOVF
+  FPE_FLTDIV,			/* Floating point divide by zero.  */
+#define FPE_FLTDIV	FPE_FLTDIV
+  FPE_FLTOVF,			/* Floating point overflow.  */
+#define FPE_FLTOVF	FPE_FLTOVF
+  FPE_FLTUND,			/* Floating point underflow.  */
+#define FPE_FLTUND	FPE_FLTUND
+  FPE_FLTRES,			/* Floating point inexact result.  */
+#define FPE_FLTRES	FPE_FLTRES
+  FPE_FLTINV,			/* Floating point invalid operation.  */
+#define FPE_FLTINV	FPE_FLTINV
+  FPE_FLTSUB			/* Subscript out of range.  */
+#define FPE_FLTSUB	FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal.  */
+enum
+{
+  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
+#define SEGV_MAPERR	SEGV_MAPERR
+  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
+#define SEGV_ACCERR	SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal.  */
+enum
+{
+  BUS_ADRALN = 1,		/* Invalid address alignment.  */
+#define BUS_ADRALN	BUS_ADRALN
+  BUS_ADRERR,			/* Non-existant physical address.  */
+#define BUS_ADRERR	BUS_ADRERR
+  BUS_OBJERR			/* Object specific hardware error.  */
+#define BUS_OBJERR	BUS_OBJERR
+};
+
+/* `si_code' values for SIGTRAP signal.  */
+enum
+{
+  TRAP_BRKPT = 1,		/* Process breakpoint.  */
+#define TRAP_BRKPT	TRAP_BRKPT
+  TRAP_TRACE			/* Process trace trap.  */
+#define TRAP_TRACE	TRAP_TRACE
+};
+
+/* `si_code' values for SIGCHLD signal.  */
+enum
+{
+  CLD_EXITED = 1,		/* Child has exited.  */
+#define CLD_EXITED	CLD_EXITED
+  CLD_KILLED,			/* Child was killed.  */
+#define CLD_KILLED	CLD_KILLED
+  CLD_DUMPED,			/* Child terminated abnormally.  */
+#define CLD_DUMPED	CLD_DUMPED
+  CLD_TRAPPED,			/* Traced child has trapped.  */
+#define CLD_TRAPPED	CLD_TRAPPED
+  CLD_STOPPED,			/* Child has stopped.  */
+#define CLD_STOPPED	CLD_STOPPED
+  CLD_CONTINUED			/* Stopped child has continued.  */
+#define CLD_CONTINUED	CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal.  */
+enum
+{
+  POLL_IN = 1,			/* Data input available.  */
+#define POLL_IN		POLL_IN
+  POLL_OUT,			/* Output buffers available.  */
+#define POLL_OUT	POLL_OUT
+  POLL_MSG,			/* Input message available.   */
+#define POLL_MSG	POLL_MSG
+  POLL_ERR,			/* I/O error.  */
+#define POLL_ERR	POLL_ERR
+  POLL_PRI,			/* High priority input available.  */
+#define POLL_PRI	POLL_PRI
+  POLL_HUP			/* Device disconnected.  */
+#define POLL_HUP	POLL_HUP
+};
+
+
+/* Structure to transport application-defined values with signals.  */
+#define SIGEV_MAX_SIZE	64
+#define SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE / sizeof (int)) - 3)
+
+typedef struct sigevent
+  {
+    sigval_t sigev_value;
+    int sigev_signo;
+    int sigev_notify;
+    void (*sigev_notify_function) __P ((sigval_t)); /* Function to start.  */
+    void *sigev_notify_attributes;		    /* Really pthread_attr_t.*/
+  } sigevent_t;
+
+/* `sigev_notify' values.  */
+enum
+{
+  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
+#define SIGEV_SIGNAL	SIGEV_SIGNAL
+  SIGEV_NONE,			/* Other notification: meaningless.  */
+#define SIGEV_NONE	SIGEV_NONE
+  SIGEV_THREAD			/* Deliver via thread creation.  */
+#define SIGEV_THREAD	SIGEV_THREAD
+};
diff --git a/bits/utsname.h b/bits/utsname.h
index ea3f163cef..cd05db1438 100644
--- a/bits/utsname.h
+++ b/bits/utsname.h
@@ -16,7 +16,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#ifndef _UTSNAME_H
+#ifndef _SYS_UTSNAME_H
 # error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead."
 #endif
 
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
index f67b5d08b5..40c4757307 100644
--- a/elf/dl-profile.c
+++ b/elf/dl-profile.c
@@ -22,6 +22,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <limits.h>
 #include <link.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -403,13 +404,20 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
   /* Setup counting data.  */
   if (kcountsize < highpc - lowpc)
     {
-      /* XXX I've not yet verified that the second expression is really
-	 well suited but something like this is in any case necessary
-	 for targets without hardware FP support.  --drepper  */
 #if 0
       s_scale = ((double) kcountsize / (highpc - lowpc)) * SCALE_1_TO_1;
 #else
-      s_scale = (kcountsize * SCALE_1_TO_1) / (highpc - lowpc);
+      size_t range = highpc - lowpc;
+      size_t quot = range / kcountsize;
+
+      if (quot >= SCALE_1_TO_1)
+	s_scale = 1;
+      else if (quot >= SCALE_1_TO_1 / 256)
+	s_scale = SCALE_1_TO_1 / quot;
+      else if (range > ULONG_MAX / 256)
+	s_scale = (SCALE_1_TO_1 * 256) / (range / (kcountsize / 256));
+      else
+	s_scale = (SCALE_1_TO_1 * 256) / ((range * 256) / kcountsize);
 #endif
     }
   else
diff --git a/grp/initgroups.c b/grp/initgroups.c
index a659f0d3ae..2ca90ab18d 100644
--- a/grp/initgroups.c
+++ b/grp/initgroups.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1989, 1991, 1993, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1989, 1991, 1993, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -17,10 +17,11 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <alloca.h>
-#include <unistd.h>
-#include <string.h>
+#include <errno.h>
 #include <grp.h>
 #include <limits.h>
+#include <string.h>
+#include <unistd.h>
 #include <sys/types.h>
 
 
@@ -32,7 +33,7 @@ initgroups (user, group)
      const char *user;
      gid_t group;
 {
-#if defined (NGROUPS_MAX) && NGROUPS_MAX == 0
+#if defined NGROUPS_MAX && NGROUPS_MAX == 0
 
   /* No extra groups allowed.  */
   return 0;
@@ -42,9 +43,10 @@ initgroups (user, group)
   struct group grpbuf, *g;
   size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
   char *tmpbuf;
-  register size_t n;
+  size_t n;
   size_t ngroups;
   gid_t *groups;
+  int status;
 #ifdef NGROUPS_MAX
 # define limit NGROUPS_MAX
 
@@ -67,32 +69,44 @@ initgroups (user, group)
   n = 0;
   groups[n++] = group;
 
-  while (__getgrent_r (&grpbuf, tmpbuf, buflen, &g) >= 0)
-    if (g->gr_gid != group)
-      {
-	register char **m;
-
-	for (m = g->gr_mem; *m != NULL; ++m)
-	  if (strcmp (*m, user) == 0)
-	    {
-	      /* Matches user.  Insert this group.  */
-	      if (n == ngroups && limit <= 0)
-		{
-		  /* Need a bigger buffer.  */
-		  groups = memcpy (__alloca (ngroups * 2 * sizeof *groups),
-				   groups, ngroups * sizeof *groups);
-		  ngroups *= 2;
-		}
-
-	      groups[n++] = g->gr_gid;
-
-	      if (n == limit)
-		/* Can't take any more groups; stop searching.  */
-		goto done;
-
-	      break;
-	    }
-      }
+  do
+    {
+      while ((status = __getgrent_r (&grpbuf, tmpbuf, buflen, &g)) != 0
+	     && errno == ERANGE)
+	{
+	  buflen *= 2;
+	  tmpbuf = __alloca (buflen);
+	}
+
+      if (status == 0 && g->gr_gid != group)
+	{
+	  char **m;
+
+	  for (m = g->gr_mem; *m != NULL; ++m)
+	    if (strcmp (*m, user) == 0)
+	      {
+		/* Matches user.  Insert this group.  */
+		if (n == ngroups && limit <= 0)
+		  {
+		    /* Need a bigger buffer.  */
+		    gid_t *newgrp;
+		    newgrp = __alloca (ngroups * 2 * sizeof *groups);
+		    groups = memcpy (newgrp, groups, ngroups * sizeof *groups);
+		    ngroups *= 2;
+		  }
+
+		groups[n++] = g->gr_gid;
+
+		if (n == limit)
+		  /* Can't take any more groups; stop searching.  */
+		  goto done;
+
+		break;
+	      }
+	}
+    }
+  while (status == 0);
+
 done:
   endgrent ();
 
diff --git a/inet/arpa/inet.h b/inet/arpa/inet.h
index d89612f4f9..e34c4726ab 100644
--- a/inet/arpa/inet.h
+++ b/inet/arpa/inet.h
@@ -28,7 +28,7 @@ __BEGIN_DECLS
 
 /* Convert Internet host address from numbers-and-dots notation in CP
    into binary data in network byte order.  */
-extern unsigned long int inet_addr __P ((__const char *__cp));
+extern u_int32_t inet_addr __P ((__const char *__cp));
 
 /* Convert Internet host address from numbers-and-dots notation in CP
    into binary data and store the result in the structure INP.  */
@@ -43,8 +43,7 @@ extern struct in_addr inet_makeaddr __P ((u_int32_t __net, u_int32_t __host));
 
 /* Format a network number NET into presentation format and place result
    in buffer starting at BUF with length of LEN bytes.  */
-extern char *inet_neta __P ((unsigned long int __net, char *__buf,
-			     size_t __len));
+extern char *inet_neta __P ((u_int32_t __net, char *__buf, size_t __len));
 
 /* Return network number part of the Internet address IN.  */
 extern u_int32_t inet_netof __P ((struct in_addr __in));
diff --git a/libc.map b/libc.map
index 81954cbb49..a4b880b52b 100644
--- a/libc.map
+++ b/libc.map
@@ -20,6 +20,7 @@ GLIBC_2.0 {
 
     # helper functions
     __errno_location; __libc_init_first; __h_errno_location;
+    __libc_current_sigrtmin; __libc_current_sigrtmax; __libc_allocate_rtsig;
 
     # functions with special/multiple interfaces
     __sigsetjmp; _setjmp; __sigaddset; __sigdelset; __sigismember;
@@ -433,4 +434,7 @@ GLIBC_2.1 {
     # functions in normal name space
     fopen; fclose;
 
+    # New RT signal functions.
+    sigqueue; sigtimedwait; sigwaitinfo;
+
 } GLIBC_2.0;
diff --git a/math/Makefile b/math/Makefile
index 174170d99d..d52de78c3d 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -117,7 +117,7 @@ CPPFLAGS-s_lib_version.c := -D_POSIX_MODE
 
 # We don't want the fdlibm code to use the inline math functions,
 # only the fdlibm code.
-CPPFLAGS += -D__NO_MATH_INLINES
+CPPFLAGS += -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES
 
 # Using omit-long-double-fcts is only a temporary hack.
 ifneq ($(omit-long-double-fcts),yes)
diff --git a/math/libm-test.c b/math/libm-test.c
index a4b31a6929..c9b3b4d06e 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -78,12 +78,13 @@
 
 /* "Philosophy":
 
-   This suite tests the correct implementation of mathematical
-   functions in libm.  Some simple, specific parameters are tested for
-   correctness. Handling of specific inputs (e.g. infinity,
-   not-a-number) is also tested. Correct handling of exceptions is
-   checked against. These implemented tests should check all cases
-   that are specified in ISO C 9X.
+   This suite tests some aspects of the correct implementation of
+   mathematical functions in libm.  Some simple, specific parameters
+   are tested for correctness but there's no exhaustive
+   testing. Handling of specific inputs (e.g. infinity, not-a-number)
+   is also tested. Correct handling of exceptions is checked
+   against. These implemented tests should check all cases that are
+   specified in ISO C 9X.
 
    Exception testing: At the moment only divide-by-zero and invalid
    exceptions are tested. Overflow/underflow and inexact exceptions
@@ -837,9 +838,15 @@ acos_test (void)
 		   FUNC(acos) (x),
 		   INVALID_EXCEPTION);
 #endif
+  check ("acos (0) == pi/2", FUNC(acos) (0), M_PI_2);
+  check ("acos (-0) == pi/2", FUNC(acos) (minus_zero), M_PI_2);
 
   check ("acos (1) == 0", FUNC(acos) (1), 0);
   check ("acos (-1) == pi", FUNC(acos) (-1), M_PI);
+
+  check ("acos (0.5) == pi/3", FUNC(acos) (0.5), M_PI_6 * 2.0);
+  check ("acos (-0.5) == 2*pi/3", FUNC(acos) (-0.5), M_PI_6 * 4.0);
+
 }
 
 
@@ -878,9 +885,14 @@ asin_test (void)
 #endif
 
   check ("asin (0) == 0", FUNC(asin) (0), 0);
+  check ("asin (-0) == -0", FUNC(asin) (minus_zero), minus_zero);
   check_eps ("asin (0.5) ==  pi/6", FUNC(asin) (0.5), M_PI_6,
 	     CHOOSE(3.5e-18, 0, 2e-7));
+  check_eps ("asin (-0.5) ==  -pi/6", FUNC(asin) (-0.5), -M_PI_6,
+	     CHOOSE(3.5e-18, 0, 2e-7));
   check ("asin (1.0) ==  pi/2", FUNC(asin) (1.0), M_PI_2);
+  check ("asin (-1.0) ==  -pi/2", FUNC(asin) (-1.0), -M_PI_2);
+
 }
 
 
@@ -906,6 +918,10 @@ atan_test (void)
 
   check ("atan (+inf) == pi/2", FUNC(atan) (plus_infty), M_PI_2);
   check ("atan (-inf) == -pi/2", FUNC(atan) (minus_infty), -M_PI_2);
+
+  check ("atan (1) == pi/4", FUNC(atan) (1), M_PI_4);
+  check ("atan (-1) == -pi/4", FUNC(atan) (1), M_PI_4);
+
 }
 
 
@@ -1062,6 +1078,8 @@ cos_test (void)
 
   check_eps ("cos (pi/3) == 0.5", FUNC(cos) (M_PI_6 * 2.0),
 	     0.5, CHOOSE (4e-18L, 1e-15L, 1e-7L));
+  check_eps ("cos (2*pi/3) == -0.5", FUNC(cos) (M_PI_6 * 4.0),
+	     -0.5, CHOOSE (4e-18L, 1e-15L, 1e-7L));
   check_eps ("cos (pi/2) == 0", FUNC(cos) (M_PI_2),
 	     0, CHOOSE (1e-19L, 1e-16L, 1e-7L));
 
@@ -1123,6 +1141,9 @@ exp_test (void)
   check ("exp (-inf) == 0", FUNC(exp) (minus_infty), 0);
 #endif
   check_eps ("exp (1) == e", FUNC(exp) (1), M_E, CHOOSE (4e-18L, 5e-16, 0));
+
+  check ("exp (2) == e^2", FUNC(exp) (2), M_E * M_E);
+  check ("exp (3) == e^3", FUNC(exp) (3), M_E * M_E * M_E);
 }
 
 
@@ -1724,8 +1745,11 @@ sin_test (void)
 		   INVALID_EXCEPTION);
 
   check_eps ("sin (pi/6) == 0.5", FUNC(sin) (M_PI_6),
-	     0.5,CHOOSE (4e-18L, 0, 0));
+	     0.5, CHOOSE (4e-18L, 0, 0));
+  check_eps ("sin (-pi/6) == -0.5", FUNC(sin) (-M_PI_6),
+	     -0.5, CHOOSE (4e-18L, 0, 0));
   check ("sin (pi/2) == 1", FUNC(sin) (M_PI_2), 1);
+  check ("sin (-pi/2) == -1", FUNC(sin) (-M_PI_2), -1);
 }
 
 
@@ -2328,6 +2352,9 @@ sqrt_test (void)
   check_ext ("sqrt (x*x) == x", FUNC(sqrt) (x*x), x, x);
   check ("sqrt (4) == 2", FUNC(sqrt) (4), 2);
   check ("sqrt (0.25) == 0.5", FUNC(sqrt) (0.25), 0.5);
+  check ("sqrt (6642.25) == 81.5", FUNC(sqrt) (6642.25), 81.5);
+  check_eps ("sqrt (15239.903) == 123.45", FUNC(sqrt) (15239.903), 123.45,
+	     CHOOSE (3e-6L, 3e-6, 8e-6));
 
 }
 
@@ -2459,7 +2486,7 @@ cexp_test (void)
   check_isnan ("imag(cexp(0 + i inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
-#if defined __GNUC__ && __GNUC__ <= 2 && __GNUC_MINOR <= 7
+#if defined __GNUC__ && __GNUC__ <= 2 && __GNUC_MINOR__ <= 7
   if (verbose)
     printf ("The following test for cexp might fail due to a gcc compiler error!\n");
 #endif
@@ -4767,9 +4794,21 @@ csqrt_test (void)
   check_isnan ("real(csqrt(NaN + i NaN)) = NaN", __real__ result);
   check_isnan ("imag(csqrt(NaN + i NaN)) = NaN", __imag__ result);
 
+  result = FUNC(csqrt) (BUILD_COMPLEX (16.0, -30.0));
+  check ("real(csqrt(16 - 30i)) = 5", __real__ result, 5.0);
+  check ("imag(csqrt(16 - 30i)) = -3", __imag__ result, -3.0);
+
   result = FUNC(csqrt) (BUILD_COMPLEX (-1, 0));
   check ("real(csqrt(1 + i0) = 0", __real__ result, 0);
   check ("imag(csqrt(1 + i0) = 1", __imag__ result, 1);
+
+  result = FUNC(csqrt) (BUILD_COMPLEX (0, 2));
+  check ("real(csqrt(0 + i 2) = 1", __real__ result, 1);
+  check ("imag(csqrt(0 + i 2) = 1", __imag__ result, 1);
+
+  result = FUNC(csqrt) (BUILD_COMPLEX (119, 120));
+  check ("real(csqrt(119 + i 120) = 12", __real__ result, 12);
+  check ("imag(csqrt(119 + i 120) = 5", __imag__ result, 5);
 }
 
 
@@ -4779,14 +4818,24 @@ cpow_test (void)
   __complex__ MATHTYPE result;
 
   result = FUNC (cpow) (BUILD_COMPLEX (1, 0), BUILD_COMPLEX (0, 0));
-  check ("real(cpow (1 + i0), (0 + i0)) = 0", __real__ result, 1);
-  check ("imag(cpow (1 + i0), (0 + i0)) = 0", __imag__ result, 0);
+  check ("real(cpow (1 + i0), (0 + i0)) == 0", __real__ result, 1);
+  check ("imag(cpow (1 + i0), (0 + i0)) == 0", __imag__ result, 0);
 
   result = FUNC (cpow) (BUILD_COMPLEX (2, 0), BUILD_COMPLEX (10, 0));
-  check_eps ("real(cpow (2 + i0), (10 + i0)) = 1024", __real__ result, 1024,
+  check_eps ("real(cpow (2 + i0), (10 + i0)) == 1024", __real__ result, 1024,
 	     CHOOSE (2e-16L, 0, 0));
-  check ("imag(cpow (2 + i0), (10 + i0)) = 0", __imag__ result, 0);
-
+  check ("imag(cpow (2 + i0), (10 + i0)) == 0", __imag__ result, 0);
+
+  result = FUNC (cpow) (BUILD_COMPLEX (M_E, 0), BUILD_COMPLEX (0, 2*M_PI));
+  check ("real(cpow (e + i0), (0 + i 2*PI)) == 1", __real__ result, 1);
+  check_eps ("imag(cpow (e + i0), (0 + i 2*PI)) == 0", __imag__ result, 0,
+	     CHOOSE (1e-18L, 3e-16, 4e-7));
+
+  result = FUNC (cpow) (BUILD_COMPLEX (2, 3), BUILD_COMPLEX (4, 0));
+  check_eps ("real(cpow (2 + i3), (4 + i0)) == -119", __real__ result, -119,
+	     CHOOSE (2e-17L, 2e-14, 4e-5));
+  check_eps ("imag(cpow (2 + i3), (4 + i0)) == -120", __imag__ result, -120,
+	     CHOOSE (4e-17L, 0, 8e-6));
 }
 
 
diff --git a/posix/Makefile b/posix/Makefile
index b7050867e4..3fbacdc918 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -26,7 +26,7 @@ headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
 	   bits/posix1_lim.h bits/posix2_lim.h bits/posix_opt.h 	      \
 	   bits/local_lim.h tar.h bits/utsname.h bits/confname.h	      \
 	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
-	   bits/sched.h re_comp.h wait.h
+	   bits/sched.h re_comp.h wait.h bits/environments.h
 
 distribute := confstr.h TESTS TESTS2C.sed testcases.h \
 	      globtest.c globtest.sh
diff --git a/posix/confstr.c b/posix/confstr.c
index 3fabf1a883..c2b12dfd33 100644
--- a/posix/confstr.c
+++ b/posix/confstr.c
@@ -44,7 +44,9 @@ confstr (name, buf, len)
       }
       break;
 
+    case _CS_XBS5_ILP32_OFFBIG_CFLAGS:
     case _CS_LFS_CFLAGS:
+#if defined _XBS5_ILP32_OFF32 && !defined _XBS5_ILP32_OFFBIG
       /* Signal that we want the new ABI.  */
       {
 	static const char file_offset[] = "-D_FILE_OFFSET_BITS=64";
@@ -52,6 +54,7 @@ confstr (name, buf, len)
 	string_len = sizeof (file_offset);
       }
       break;
+#endif
 
     case _CS_LFS_LINTFLAGS:
     case _CS_LFS_LDFLAGS:
@@ -65,7 +68,6 @@ confstr (name, buf, len)
     case _CS_XBS5_ILP32_OFF32_LDFLAGS:
     case _CS_XBS5_ILP32_OFF32_LIBS:
     case _CS_XBS5_ILP32_OFF32_LINTFLAGS:
-    case _CS_XBS5_ILP32_OFFBIG_CFLAGS:
     case _CS_XBS5_ILP32_OFFBIG_LDFLAGS:
     case _CS_XBS5_ILP32_OFFBIG_LIBS:
     case _CS_XBS5_ILP32_OFFBIG_LINTFLAGS:
diff --git a/posix/getopt.c b/posix/getopt.c
index 8311121385..3199925828 100644
--- a/posix/getopt.c
+++ b/posix/getopt.c
@@ -76,12 +76,6 @@
 #endif
 #endif
 
-#if defined (WINDOWS32) && !defined (__CYGWIN32__)
-/* It's not Unix, really.  See?  Capital letters.  */
-#include <windows.h>
-#define getpid() GetCurrentProcessId()
-#endif
-
 #ifndef _
 /* This is for other GNU distributions with internationalized messages.
    When compiling libc, the _ macro is predefined.  */
@@ -259,8 +253,6 @@ static int nonoption_flags_len;
 static int original_argc;
 static char *const *original_argv;
 
-extern pid_t __libc_pid;
-
 /* Make sure the environment variable bash 2.0 puts in the environment
    is valid for the getopt call we must make sure that the ARGV passed
    to getopt is that one passed to the process.  */
diff --git a/posix/getopt_init.c b/posix/getopt_init.c
index 02165ee733..6619f2522b 100644
--- a/posix/getopt_init.c
+++ b/posix/getopt_init.c
@@ -53,7 +53,7 @@ __getopt_clean_environment (char **env)
 
   /* Generate name of the environment variable.  We must know the PID
      and we must not use `sprintf'.  */
-  if (__libc_pid == 0)
+  if (__libc_pid == 0xf00baa)
     __libc_pid = getpid ();
 
   /* Construct "_<PID>_GNU_nonoption_argv_flags_=" string.  */
diff --git a/posix/sys/wait.h b/posix/sys/wait.h
index bc2298f667..4774885ecf 100644
--- a/posix/sys/wait.h
+++ b/posix/sys/wait.h
@@ -60,7 +60,7 @@ typedef union
   {
     union wait *__uptr;
     int *__iptr;
-  } __WAIT_STATUS __attribute__ ((transparent_union));
+  } __WAIT_STATUS __attribute__ ((__transparent_union__));
 # define __WAIT_STATUS_DEFN	int *
 #endif
 
diff --git a/posix/unistd.h b/posix/unistd.h
index f14e02d02b..2fbdae5652 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -77,6 +77,9 @@ __BEGIN_DECLS
    are present.  */
 #define	_XOPEN_ENH_I18N	1
 
+/* The legacy interfaces are also available.  */
+#define _XOPEN_LEGACY	1
+
 
 /* Get values of POSIX options:
 
@@ -122,6 +125,8 @@ __BEGIN_DECLS
    _POSIX_POLL			Implementation supports `poll' function.
    _POSIX_SELECT		Implementation supports `select' and `pselect'.
 
+   _XOPEN_REALTIME		X/Open realtime support is available.
+   _XOPEN_REALTIME_THREADS	X/Open realtime thread support is available.
    _XOPEN_SHM			Shared memory interface according to XPG4.2.
 
    _XBS5_ILP32_OFF32		Implementation provides environment with 32-bit
@@ -162,6 +167,10 @@ __BEGIN_DECLS
 
 #include <bits/posix_opt.h>
 
+/* Get the environment definitions from Unix98.  */
+#ifdef __USE_UNIX98
+# include <bits/environments.h>
+#endif
 
 /* Standard file descriptors.  */
 #define	STDIN_FILENO	0	/* Standard input.  */
diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c
index 3452672a0a..7e38af223f 100644
--- a/resolv/inet_addr.c
+++ b/resolv/inet_addr.c
@@ -71,7 +71,7 @@ static char rcsid[] = "$Id$";
  * Ascii internet address interpretation routine.
  * The value returned is in network order.
  */
-u_long
+u_int32_t
 inet_addr(cp)
 	register const char *cp;
 {
diff --git a/resolv/inet_neta.c b/resolv/inet_neta.c
index 324c01b696..5633ed124f 100644
--- a/resolv/inet_neta.c
+++ b/resolv/inet_neta.c
@@ -47,7 +47,7 @@ static const char rcsid[] = "$Id$";
  */
 char *
 inet_neta(src, dst, size)
-	u_long src;
+	u_int32_t src;
 	char *dst;
 	size_t size;
 {
diff --git a/rt/Makefile b/rt/Makefile
new file mode 100644
index 0000000000..4eb9dfcb7a
--- /dev/null
+++ b/rt/Makefile
@@ -0,0 +1,42 @@
+# Copyright (C) 1997 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB.  If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#
+#	Sub-makefile for real-time portion of the library.
+#
+subdir	:= rt
+
+headers	:= aio.h
+
+extra-libs := librt
+extra-libs-others := $(extra-libs)
+
+librt-routines := aio_cancel aio_error aio_fsync aio_misc aio_read	\
+		  aio_read64 aio_return aio_suspend aio_write		\
+		  aio_write64 lio_listio lio_listio64 aio_sigqueue
+
+librt-map := librt.map
+
+distribute := aio_misc.h
+
+include ../Rules
+
+# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
+# This ensures they will load libc.so for needed symbols if loaded by
+# a statically-linked program that hasn't already loaded it.
+$(objpfx)librt.so: $(common-objpfx)libc.so $(shared-thread-library)
diff --git a/rt/aio.h b/rt/aio.h
new file mode 100644
index 0000000000..561776c2d3
--- /dev/null
+++ b/rt/aio.h
@@ -0,0 +1,231 @@
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/*
+ * ISO/IEC 9945-1:1996 6.7: Asynchronous Input and Output
+ */
+
+#ifndef _AIO_H
+#define _AIO_H	1
+
+#include <features.h>
+#include <fcntl.h>
+#include <signal.h>
+#define __need_timespec
+#include <time.h>
+#include <sys/types.h>
+
+__BEGIN_DECLS
+
+/* Asynchronous I/O control block.  */
+struct aiocb
+{
+  int aio_fildes;		/* File desriptor.  */
+  int aio_lio_opcode;		/* Operation to be performed.  */
+  int aio_reqprio;		/* Request priority offset.  */
+  volatile void *aio_buf;	/* Location of buffer.  */
+  size_t aio_nbytes;		/* Length of transfer.  */
+  struct sigevent aio_sigevent;	/* Signal number and value.  */
+
+  /* Internal members.  */
+  struct aiocb *__last_fd;
+  struct aiocb *__next_fd;
+  struct aiocb *__next_prio;
+  int __abs_prio;
+  int __policy;
+  int __error_code;
+  __ssize_t __return_value;
+
+#ifndef __USE_FILE_OFFSET64
+  __off_t aio_offset;		/* File offset.  */
+#else
+  __off64_t aio_offset;		/* File offset.  */
+#endif
+  int __unused[32];
+};
+
+/* The same for the 64bit offsets.  */
+#ifdef __USE_LARGEFILE64
+struct aiocb64
+{
+  int aio_fildes;		/* File desriptor.  */
+  int aio_lio_opcode;		/* Operation to be performed.  */
+  int aio_reqprio;		/* Request priority offset.  */
+  volatile void *aio_buf;	/* Location of buffer.  */
+  size_t aio_nbytes;		/* Length of transfer.  */
+  struct sigevent aio_sigevent;	/* Signal number and value.  */
+
+  /* Internal members.  */
+  struct aiocb64 *__last_fd;
+  struct aiocb64 *__next_fd;
+  struct aiocb64 *__next_prio;
+  int __abs_prio;
+  int __policy;
+  int __error_code;
+  __ssize_t __return_value;
+
+  __off64_t aio_offset;		/* File offset.  */
+  int __unused[32];
+};
+#endif
+
+
+/* Return values of cancelation function.  */
+enum
+{
+  AIO_CANCELED,
+#define AIO_CANCELED AIO_CANCELED
+  AIO_NOTCANCELED,
+#define AIO_NOTCANCELED AIO_NOTCANCELED
+  AIO_ALLDONE
+#define AIO_ALLDONE AIO_ALLDONE
+};
+
+
+/* Operation codes for `aio_lio_opcode'.  */
+enum
+{
+  LIO_READ,
+#define LIO_READ LIO_READ
+  LIO_WRITE,
+#define LIO_WRITE LIO_WRITE
+  LIO_NOP,
+#define LIO_NOP LIO_NOP
+  __LIO_DSYNC,
+  __LIO_SYNC,
+  __LIO_READ64 = LIO_READ | 128,
+  __LIO_WRITE64 = LIO_WRITE | 128
+};
+
+
+/* Synchronization options for `lio_listio' function.  */
+enum
+{
+  LIO_WAIT,
+#define LIO_WAIT LIO_WAIT
+  LIO_NOWAIT
+#define LIO_NOWAIT LIO_NOWAIT
+};
+
+
+/* Enqueue read request for given number of bytes and the given priority.  */
+#ifndef __USE_FILE_OFFSET64
+extern int aio_read __P ((struct aiocb *__aiocbp));
+#else
+extern int aio_read __P ((struct aiocb *__aiocbp)) __asm__ ("aio_read64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern int aio_read64 __P ((struct aiocb64 *__aiocbp));
+#endif
+
+/* Enqueue write request for given number of bytes and the given priority.  */
+#ifndef __USE_FILE_OFFSET64
+extern int aio_write __P ((struct aiocb *__aiocbp));
+#else
+extern int aio_write __P ((struct aiocb *__aiocbp)) __asm__ ("aio_write64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern int aio_write64 __P ((struct aiocb64 *__aiocbp));
+#endif
+
+
+/* Initiate list of I/O requests.  */
+#ifndef __USE_FILE_OFFSET64
+extern int lio_listio __P ((int __mode, struct aiocb *__const __list[],
+			    int __nent, struct sigevent *__sig));
+#else
+extern int lio_listio __P ((int __mode, struct aiocb *__const __list[],
+			    int __nent, struct sigevent *__sig))
+     __asm__ ("lio_listio64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern int lio_listio64 __P ((int __mode, struct aiocb64 *__const __list[],
+			      int __nent, struct sigevent *__sig));
+#endif
+
+
+/* Retrieve error status associated with AIOCBP.  */
+#ifndef __USE_FILE_OFFSET64
+extern int aio_error __P ((__const struct aiocb *__aiocbp));
+#else
+extern int aio_error __P ((__const struct aiocb *__aiocbp))
+     __asm__ ("aio_error64");;
+#endif
+#ifdef __USE_LARGEFILE64
+extern int aio_error64 __P ((__const struct aiocb64 *__aiocbp));
+#endif
+
+
+/* Return status associated with AIOCBP.  */
+#ifndef __USE_FILE_OFFSET64
+extern __ssize_t aio_return __P ((struct aiocb *__aiocbp));
+#else
+extern __ssize_t aio_return __P ((struct aiocb *__aiocbp))
+     __asm__ ("aio_return64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern __ssize_t aio_return64 __P ((struct aiocb64 *__aiocbp));
+#endif
+
+
+/* Try to cancel asynchronous I/O requests outstanding against file
+   descriptot FILDES.  */
+#ifndef __USE_FILE_OFFSET64
+extern int aio_cancel __P ((int __fildes, struct aiocb *__aiocbp));
+#else
+extern int aio_cancel __P ((int __fildes, struct aiocb *__aiocbp))
+     __asm__ ("aio_cancel64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern int aio_cancel64 __P ((int __fildes, struct aiocb64 *__aiocbp));
+#endif
+
+
+/* Suspend calling thread until at least one of the asynchronous I/O
+   operations referenced by LIST has completed.  */
+#ifndef __USE_FILE_OFFSET64
+extern int aio_suspend __P ((__const struct aiocb *__const __list[],
+			     int __nent, __const struct timespec *__timeout));
+#else
+extern int aio_suspend __P ((__const struct aiocb *__const __list[],
+			     int __nent, __const struct timespec *__timeout))
+     __asm__ ("aio_suspend64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern int aio_suspend64 __P ((__const struct aiocb64 *__const __list[],
+			       int __nent,
+			       __const struct timespec *__timeout));
+#endif
+
+
+/* Force all operations associated with file desriptor described by
+   `aio_fildes' member of AIOCBP.  */
+#ifndef __USE_FILE_OFFSET64
+extern int aio_fsync __P ((int __op, struct aiocb *__aiocbp));
+#else
+extern int aio_fsync __P ((int __op, struct aiocb *__aiocbp))
+     __asm__ ("aio_fsync64");
+#endif
+#ifdef __USE_LARGEFILE64
+extern int aio_fsync64 __P ((int __op, struct aiocb64 *__aiocbp));
+#endif
+
+
+__END_DECLS
+
+#endif /* aio.h */
diff --git a/rt/aio_cancel.c b/rt/aio_cancel.c
new file mode 100644
index 0000000000..f2d9389650
--- /dev/null
+++ b/rt/aio_cancel.c
@@ -0,0 +1,172 @@
+/* Cancel requests associated with given file descriptor.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+/* We use an UGLY hack to prevent gcc from finding us cheating.  The
+   implementation of aio_cancel and aio_cancel64 are identical and so
+   we want to avoid code duplication by using aliases.  But gcc sees
+   the different parameter lists and prints a warning.  We define here
+   a function so that aio_cancel64 has no prototype.  */
+#define aio_cancel64 XXX
+#include <aio.h>
+/* And undo the hack.  */
+#undef aio_cancel64
+
+#include <errno.h>
+#include <pthread.h>
+
+#include "aio_misc.h"
+
+
+/* Argh, so far there is no ECANCELED.  */
+#define ECANCELED 125
+
+int
+aio_cancel (fildes, aiocbp)
+     int fildes;
+     struct aiocb *aiocbp;
+{
+  struct aiocb *firstp;
+  int result = AIO_ALLDONE;
+
+  /* Request the semaphore.  */
+  sem_wait (&__aio_requests_sema);
+
+  /* Search for the list of requests associated with the given file
+     descriptor.  */
+  for (firstp = (struct aiocb *) __aio_requests; firstp != NULL;
+       firstp = firstp->__next_fd)
+    if (firstp->aio_fildes == fildes)
+      break;
+
+  /* If the file descriptor is not found all work seems to done
+     already.  Otherwise try to cancel the request(s).  */
+  if (firstp != NULL)
+    {
+      if (aiocbp != NULL)
+	{
+	  /* Locate the entry corresponding to the AIOCBP parameter.  */
+	  if (aiocbp == firstp)
+	    /* The requests is currently handled, therefore don't
+	       cancel it and signal this to the user.  */
+	    result = AIO_NOTCANCELED;
+	  else
+	    {
+	      while (firstp->__next_prio != NULL
+		     && aiocbp != firstp->__next_prio)
+		firstp = firstp->__next_prio;
+
+	      if (firstp->__next_prio != NULL)
+		{
+		  /* The request the user wants to cancel is in the
+		     queue.  Simply remove it.  */
+		  firstp->__next_prio = aiocbp->__next_prio;
+
+		  /* Mark as canceled.  */
+		  aiocbp->__error_code = ECANCELED;
+		  aiocbp->__return_value = -1;
+
+		  /* Send the signal to notify about canceled
+		     processing of the request.  */
+		  if (aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD)
+		    {
+		      /* We have to start a thread.  */
+		      pthread_t tid;
+		      pthread_attr_t attr, *pattr;
+
+		      pattr = (pthread_attr_t *)
+			aiocbp->aio_sigevent.sigev_notify_attributes;
+		      if (pattr == NULL)
+			{
+			  pthread_attr_init (&attr);
+			  pthread_attr_setdetachstate (&attr,
+						       PTHREAD_CREATE_DETACHED);
+			  pattr = &attr;
+			}
+
+		      pthread_create (&tid, pattr,
+				      (void *(*) (void *))
+				      aiocbp->aio_sigevent.sigev_notify_function,
+				      aiocbp->aio_sigevent.sigev_value.sival_ptr);
+		    }
+		  else if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
+		    /* We have to send a signal.  */
+		    __aio_sigqueue (aiocbp->aio_sigevent.sigev_signo,
+				    aiocbp->aio_sigevent.sigev_value);
+
+		  result = AIO_CANCELED;
+		}
+	    }
+	}
+      else
+	{
+	  /* First dequeue all waiting requests.  */
+	  aiocbp = firstp;
+
+	  while ((firstp = firstp->__next_prio) != NULL)
+	    {
+	      firstp->__error_code = ECANCELED;
+	      firstp->__return_value = -1;
+
+
+	      /* Send the signal to notify about canceled processing
+		 of the request.  */
+	      if (firstp->aio_sigevent.sigev_notify == SIGEV_THREAD)
+		{
+		  /* We have to start a thread.  */
+		  pthread_t tid;
+		  pthread_attr_t attr, *pattr;
+
+		  pattr = (pthread_attr_t *)
+		    aiocbp->aio_sigevent.sigev_notify_attributes;
+		  if (pattr == NULL)
+		    {
+		      pthread_attr_init (&attr);
+		      pthread_attr_setdetachstate (&attr,
+						   PTHREAD_CREATE_DETACHED);
+		      pattr = &attr;
+		    }
+
+		  pthread_create (&tid, pattr,
+				  (void *(*) (void *))
+				  firstp->aio_sigevent.sigev_notify_function,
+				  firstp->aio_sigevent.sigev_value.sival_ptr);
+		}
+	      else if (firstp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
+		/* We have to send a signal.  */
+		__aio_sigqueue (firstp->aio_sigevent.sigev_signo,
+				firstp->aio_sigevent.sigev_value);
+	    }
+
+	  /* We have to signal that not all requests could be canceled
+	     since the first requests is currently processed.  */
+	  result = AIO_NOTCANCELED;
+
+	  aiocbp->__next_prio = NULL;
+	}
+    }
+
+  /* Release the semaphore.  */
+  sem_post (&__aio_requests_sema);
+
+  return result;
+}
+
+weak_alias (aio_cancel, aio_cancel64)
diff --git a/rt/aio_error.c b/rt/aio_error.c
new file mode 100644
index 0000000000..a051e94af5
--- /dev/null
+++ b/rt/aio_error.c
@@ -0,0 +1,40 @@
+/* Return error status of asynchronous I/O request.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+/* We use an UGLY hack to prevent gcc from finding us cheating.  The
+   implementation of aio_error and aio_error64 are identical and so
+   we want to avoid code duplication by using aliases.  But gcc sees
+   the different parameter lists and prints a warning.  We define here
+   a function so that aio_error64 has no prototype.  */
+#define aio_error64 XXX
+#include <aio.h>
+/* And undo the hack.  */
+#undef aio_error64
+
+
+int
+aio_error (aiocbp)
+     const struct aiocb *aiocbp;
+{
+  return aiocbp->__error_code;
+}
+
+weak_alias (aio_error, aio_error64)
diff --git a/rt/aio_fsync.c b/rt/aio_fsync.c
new file mode 100644
index 0000000000..6daaca1e97
--- /dev/null
+++ b/rt/aio_fsync.c
@@ -0,0 +1,42 @@
+/* Synchronize I/O in given file descriptor.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+/* We use an UGLY hack to prevent gcc from finding us cheating.  The
+   implementation of aio_fsync and aio_fsync64 are identical and so
+   we want to avoid code duplication by using aliases.  But gcc sees
+   the different parameter lists and prints a warning.  We define here
+   a function so that aio_fsync64 has no prototype.  */
+#define aio_fsync64 XXX
+#include <aio.h>
+/* And undo the hack.  */
+#undef aio_fsync64
+
+#include "aio_misc.h"
+
+
+int
+aio_fsync (int op, struct aiocb *aiocbp)
+{
+  return __aio_enqueue_request ((aiocb_union *) aiocbp,
+				op == O_SYNC ? __LIO_SYNC : __LIO_DSYNC, 1);
+}
+
+weak_alias (aio_fsync, aio_fsync64)
diff --git a/rt/aio_misc.c b/rt/aio_misc.c
new file mode 100644
index 0000000000..e4bb12c500
--- /dev/null
+++ b/rt/aio_misc.c
@@ -0,0 +1,306 @@
+/* Handle general operations.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+#include <errno.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include "aio_misc.h"
+
+
+/* We need a list of pending operations.  This is sorted according to
+   the priority given in the aio_reqprio member.  */
+aiocb_union *__aio_requests;
+
+/* Since the list is global we need a semaphore protecting it.  */
+sem_t __aio_requests_sema;
+
+
+/* The initialization function.  It gets automatically called if any
+   aio_* function is used in the program.  */
+static void
+__attribute__ ((unused))
+aio_initialize (void)
+{
+  /* Initialize the semaphore.  We allow exactly one user at a time.  */
+  sem_init (&__aio_requests_sema, 0, 1);
+}
+
+text_set_element (__libc_subinit, aio_initialize);
+
+
+/* The thread handler.  */
+static void *handle_fildes_io (void *arg);
+
+
+/* The main function of the async I/O handling.  It enqueues requests
+   and if necessary starts and handles threads.  */
+int
+__aio_enqueue_request (aiocb_union *aiocbp, int operation, int require_lock)
+{
+  int result;
+  int policy, prio;
+  struct sched_param param;
+  aiocb_union *runp;
+
+  if (aiocbp->aiocb.aio_reqprio < 0
+      || aiocbp->aiocb.aio_reqprio > AIO_PRIO_DELTA_MAX)
+    {
+      /* Invalid priority value.  */
+      __set_errno (EINVAL);
+      aiocbp->aiocb.__error_code = EINVAL;
+      aiocbp->aiocb.__return_value = -1;
+      return -1;
+    }
+
+  if (pthread_getschedparam (pthread_self (), &policy, &param) < 0)
+    {
+      /* Something went wrong.  */
+      aiocbp->aiocb.__error_code = errno;
+      aiocbp->aiocb.__return_value = -1;
+      return -1;
+    }
+
+  /* Compute priority for this request.  */
+  prio = param.sched_priority - aiocbp->aiocb.aio_reqprio;
+
+
+  /* Get the semaphore.  */
+  if (require_lock)
+    sem_wait (&__aio_requests_sema);
+
+  runp = __aio_requests;
+  /* First look whether the current file descriptor is currently
+     worked with.  */
+  while (runp != NULL && runp->aiocb.aio_fildes < aiocbp->aiocb.aio_fildes)
+    runp = (aiocb_union *) runp->aiocb.__next_fd;
+
+  if (runp != NULL)
+    {
+      /* The current file descriptor is worked on.  It makes no sense
+	 to start another thread since this new thread would have to
+	 wait for the previous one to terminate.  Simply enqueue it
+	 after the running one according to the priority.  */
+      while (runp->aiocb.__next_prio != NULL
+	     && runp->aiocb.__next_prio->__abs_prio >= prio)
+	runp = (aiocb_union *) runp->aiocb.__next_prio;
+
+      aiocbp->aiocb.__next_prio = runp->aiocb.__next_prio;
+      aiocbp->aiocb.__abs_prio = prio;
+      aiocbp->aiocb.__policy = policy;
+      aiocbp->aiocb.aio_lio_opcode = operation;
+      aiocbp->aiocb.__error_code = EINPROGRESS;
+      aiocbp->aiocb.__return_value = 0;
+      runp->aiocb.__next_prio = (struct aiocb *) aiocbp;
+
+      result = 0;
+    }
+  else
+    {
+      /* We create a new thread for this file descriptor.  The
+	 function which gets called will handle all available requests
+	 for this descriptor and when all are processed it will
+	 terminate.  */
+      pthread_t thid;
+      pthread_attr_t attr;
+
+      /* First enqueue the request (the list is empty).  */
+      aiocbp->aiocb.__next_fd = NULL;
+      aiocbp->aiocb.__last_fd = NULL;
+
+      aiocbp->aiocb.__next_prio = NULL;
+      aiocbp->aiocb.__abs_prio = prio;
+      aiocbp->aiocb.__policy = policy;
+      aiocbp->aiocb.aio_lio_opcode = operation;
+      aiocbp->aiocb.__error_code = EINPROGRESS;
+      aiocbp->aiocb.__return_value = 0;
+
+      /* Make sure the thread is created detached.  */
+      pthread_attr_init (&attr);
+      pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+
+      /* Now try to start a thread.  */
+      if (pthread_create (&thid, &attr, handle_fildes_io, aiocbp) < 0)
+	{
+	  result = -1;
+	  aiocbp->aiocb.__error_code = errno;
+	  aiocbp->aiocb.__return_value = -1;
+	}
+      else
+	/* We managed to enqueue the request.  All errors which can
+	   happen now can be recognized by calls to `aio_return' and
+	   `aio_error'.  */
+	  result = 0;
+    }
+
+  /* Release the semaphore.  */
+  if (require_lock)
+    sem_post (&__aio_requests_sema);
+
+  return result;
+}
+
+
+static void *
+handle_fildes_io (void *arg)
+{
+  pthread_t self = pthread_self ();
+  struct sched_param param;
+  aiocb_union *runp = (aiocb_union *) arg;
+  int policy;
+  int fildes = runp->aiocb.aio_fildes;	/* This is always the same.  */
+
+  pthread_getschedparam (self, &policy, &param);
+
+  do
+    {
+      /* Change the priority to the requested value (if necessary).  */
+      if (runp->aiocb.__abs_prio != param.sched_priority
+	  || runp->aiocb.__policy != policy)
+	{
+	  param.sched_priority = runp->aiocb.__abs_prio;
+	  policy = runp->aiocb.__policy;
+	  pthread_setschedparam (self, policy, &param);
+	}
+
+      /* Process request pointed to by RUNP.  We must not be disturbed
+	 by signals.  */
+      if ((runp->aiocb.aio_lio_opcode & 127) == LIO_READ)
+	{
+	  if (runp->aiocb.aio_lio_opcode & 128)
+	    runp->aiocb.__return_value =
+	      TEMP_FAILURE_RETRY (__pread64 (fildes,
+					     (void *) runp->aiocb64.aio_buf,
+					     runp->aiocb64.aio_nbytes,
+					     runp->aiocb64.aio_offset));
+	  else
+	    runp->aiocb.__return_value =
+	      TEMP_FAILURE_RETRY (__pread (fildes,
+					   (void *) runp->aiocb.aio_buf,
+					   runp->aiocb.aio_nbytes,
+					   runp->aiocb.aio_offset));
+	}
+      else if ((runp->aiocb.aio_lio_opcode & 127) == LIO_WRITE)
+	{
+	  if (runp->aiocb.aio_lio_opcode & 128)
+	    runp->aiocb.__return_value =
+	      TEMP_FAILURE_RETRY (__pwrite64 (fildes,
+					      (const void *) runp->aiocb64.aio_buf,
+					      runp->aiocb64.aio_nbytes,
+					      runp->aiocb64.aio_offset));
+	  else
+	    runp->aiocb.__return_value =
+	      TEMP_FAILURE_RETRY (__pwrite (fildes,
+					    (const void *) runp->aiocb.aio_buf,
+					    runp->aiocb.aio_nbytes,
+					    runp->aiocb.aio_offset));
+	}
+      else if (runp->aiocb.aio_lio_opcode == __LIO_DSYNC)
+	runp->aiocb.__return_value = TEMP_FAILURE_RETRY (fdatasync (fildes));
+      else if (runp->aiocb.aio_lio_opcode == __LIO_SYNC)
+	runp->aiocb.__return_value = TEMP_FAILURE_RETRY (fsync (fildes));
+      else
+	{
+	  /* This is an invalid opcode.  */
+	  runp->aiocb.__return_value = -1;
+	  __set_errno (EINVAL);
+	}
+
+      if (runp->aiocb.__return_value == -1)
+	runp->aiocb.__error_code = errno;
+      else
+	runp->aiocb.__error_code = 0;
+
+      /* Send the signal to notify about finished processing of the
+	 request.  */
+      if (runp->aiocb.aio_sigevent.sigev_notify == SIGEV_THREAD)
+	{
+	  /* We have to start a thread.  */
+	  pthread_t tid;
+	  pthread_attr_t attr, *pattr;
+
+	  pattr = (pthread_attr_t *)
+	    runp->aiocb.aio_sigevent.sigev_notify_attributes;
+	  if (pattr == NULL)
+	    {
+	      pthread_attr_init (&attr);
+	      pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+	      pattr = &attr;
+	    }
+
+	  if (pthread_create (&tid,
+			      (pthread_attr_t *)
+			      runp->aiocb.aio_sigevent.sigev_notify_attributes,
+			      (void *(*) (void *))
+			      runp->aiocb.aio_sigevent.sigev_notify_function,
+			      runp->aiocb.aio_sigevent.sigev_value.sival_ptr)
+	      < 0)
+	    {
+	      /* XXX What shall we do if already an error is set by
+		 read/write/fsync?  */
+	      runp->aiocb.__error_code = errno;
+	      runp->aiocb.__return_value = -1;
+	    }
+	}
+      else if (runp->aiocb.aio_sigevent.sigev_notify == SIGEV_SIGNAL)
+	/* We have to send a signal.  */
+	if (__aio_sigqueue (runp->aiocb.aio_sigevent.sigev_signo,
+			    runp->aiocb.aio_sigevent.sigev_value) < 0)
+	  {
+	    /* XXX What shall we do if already an error is set by
+	       read/write/fsync?  */
+	    runp->aiocb.__error_code = errno;
+	    runp->aiocb.__return_value = -1;
+	  }
+
+      /* Get the semaphore.  */
+      sem_wait (&__aio_requests_sema);
+
+      /* Now dequeue the current request.  */
+      if (runp->aiocb.__next_prio == NULL)
+	{
+	  if (runp->aiocb.__next_fd != NULL)
+	    runp->aiocb.__next_fd->__last_fd = runp->aiocb.__last_fd;
+	  if (runp->aiocb.__last_fd != NULL)
+	    runp->aiocb.__last_fd->__next_fd = runp->aiocb.__next_fd;
+	  runp = NULL;
+	}
+      else
+	{
+	  runp->aiocb.__next_prio->__last_fd = runp->aiocb.__last_fd;
+	  runp->aiocb.__next_prio->__next_fd = runp->aiocb.__next_fd;
+	  if (runp->aiocb.__next_fd != NULL)
+	    runp->aiocb.__next_fd->__last_fd = runp->aiocb.__next_prio;
+	  if (runp->aiocb.__last_fd != NULL)
+	    runp->aiocb.__last_fd->__next_fd = runp->aiocb.__next_prio;
+	  runp = (aiocb_union *) runp->aiocb.__next_prio;
+	}
+
+      /* Release the semaphore.  */
+      sem_post (&__aio_requests_sema);
+    }
+  while (runp != NULL);
+
+  pthread_exit (NULL);
+}
diff --git a/rt/aio_misc.h b/rt/aio_misc.h
new file mode 100644
index 0000000000..c2eb9fcea1
--- /dev/null
+++ b/rt/aio_misc.h
@@ -0,0 +1,45 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _AIO_MISC_H
+#define _AIO_MISC_H	1
+
+#include <semaphore.h>
+
+/* Union of the two request types.  */
+typedef union
+  {
+    struct aiocb aiocb;
+    struct aiocb64 aiocb64;
+  } aiocb_union;
+
+/* List of enqueued requests.  */
+extern aiocb_union *__aio_requests;
+
+/* Lock for global I/O list of requests.  */
+extern sem_t __aio_requests_sema;
+
+
+/* Enqueue request.  */
+extern int __aio_enqueue_request (aiocb_union *aiocbp, int operation,
+				  int require_lock);
+
+/* Send the signal.  */
+extern int __aio_sigqueue (int sig, const union sigval val);
+
+#endif /* aio_misc.h */
diff --git a/rt/aio_read.c b/rt/aio_read.c
new file mode 100644
index 0000000000..8286ba9334
--- /dev/null
+++ b/rt/aio_read.c
@@ -0,0 +1,31 @@
+/* Asynchronous read.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+
+#include "aio_misc.h"
+
+
+int
+aio_read (aiocbp)
+     struct aiocb *aiocbp;
+{
+  return __aio_enqueue_request ((aiocb_union *) aiocbp, LIO_READ, 1);
+}
diff --git a/rt/aio_read64.c b/rt/aio_read64.c
new file mode 100644
index 0000000000..bf808fb3da
--- /dev/null
+++ b/rt/aio_read64.c
@@ -0,0 +1,31 @@
+/* Asynchronous read, 64bit offset version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+
+#include "aio_misc.h"
+
+
+int
+aio_read64 (aiocbp)
+     struct aiocb64 *aiocbp;
+{
+  return __aio_enqueue_request ((aiocb_union *) aiocbp, __LIO_READ64, 1);
+}
diff --git a/rt/aio_return.c b/rt/aio_return.c
new file mode 100644
index 0000000000..304e1c98d2
--- /dev/null
+++ b/rt/aio_return.c
@@ -0,0 +1,40 @@
+/* Return exit value of asynchronous I/O request.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+/* We use an UGLY hack to prevent gcc from finding us cheating.  The
+   implementation of aio_return and aio_return64 are identical and so
+   we want to avoid code duplication by using aliases.  But gcc sees
+   the different parameter lists and prints a warning.  We define here
+   a function so that aio_return64 has no prototype.  */
+#define aio_return64 XXX
+#include <aio.h>
+/* And undo the hack.  */
+#undef aio_return64
+
+
+ssize_t
+aio_return (aiocbp)
+     struct aiocb *aiocbp;
+{
+  return aiocbp->__return_value;
+}
+
+weak_alias (aio_return, aio_return64)
diff --git a/rt/aio_suspend.c b/rt/aio_suspend.c
new file mode 100644
index 0000000000..75bf9ba94b
--- /dev/null
+++ b/rt/aio_suspend.c
@@ -0,0 +1,55 @@
+/* Suspend until termination of a requests.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+
+/* We use an UGLY hack to prevent gcc from finding us cheating.  The
+   implementation of aio_suspend and aio_suspend64 are identical and so
+   we want to avoid code duplication by using aliases.  But gcc sees
+   the different parameter lists and prints a warning.  We define here
+   a function so that aio_suspend64 has no prototype.  */
+#define aio_suspend64 XXX
+#include <aio.h>
+/* And undo the hack.  */
+#undef aio_suspend64
+
+#include <errno.h>
+
+#include "aio_misc.h"
+
+
+int
+aio_suspend (list, nent, timeout)
+     const struct aiocb *const list[];
+     int nent;
+     const struct timespec *timeout;
+{
+  int cnt;
+
+  /* First look whether there is already a terminated request.  */
+  for (cnt = 0; cnt < nent; ++cnt)
+    if (list[cnt] != NULL && list[cnt]->__error_code != EINPROGRESS)
+      return 0;
+
+  /* XXX We have to write code which waits.  */
+
+  return -1;
+}
+
+weak_alias (aio_suspend, aio_suspend64)
diff --git a/rt/aio_write.c b/rt/aio_write.c
new file mode 100644
index 0000000000..80b827c1aa
--- /dev/null
+++ b/rt/aio_write.c
@@ -0,0 +1,31 @@
+/* Asynchronous write.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+
+#include "aio_misc.h"
+
+
+int
+aio_write (aiocbp)
+     struct aiocb *aiocbp;
+{
+  return __aio_enqueue_request ((aiocb_union *) aiocbp, LIO_WRITE, 1);
+}
diff --git a/rt/aio_write64.c b/rt/aio_write64.c
new file mode 100644
index 0000000000..477ce2cbe4
--- /dev/null
+++ b/rt/aio_write64.c
@@ -0,0 +1,31 @@
+/* Asynchronous write, 64bit offset version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+
+#include "aio_misc.h"
+
+
+int
+aio_write64 (aiocbp)
+     struct aiocb64 *aiocbp;
+{
+  return __aio_enqueue_request ((aiocb_union *) aiocbp, __LIO_WRITE64, 1);
+}
diff --git a/rt/lio_listio.c b/rt/lio_listio.c
new file mode 100644
index 0000000000..73df5c2f5c
--- /dev/null
+++ b/rt/lio_listio.c
@@ -0,0 +1,68 @@
+/* Enqueue and list of read or write requests.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+#include <errno.h>
+#include <semaphore.h>
+
+#include "aio_misc.h"
+
+
+int
+lio_listio (mode, list, nent, sig)
+     int mode;
+     struct aiocb *const list[];
+     int nent;
+     struct sigevent *sig;
+{
+  int cnt;
+  int total = 0;
+  int result = 0;
+
+  /* Check arguments.  */
+  if (mode != LIO_WAIT && mode != LIO_NOWAIT)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  /* Request the semaphore.  */
+  sem_wait (&__aio_requests_sema);
+
+  /* Now we can enqueue all requests.  Since we already acquired the
+     semaphore the enqueue function need not do this.  */
+  for (cnt = 0; cnt < nent; ++cnt)
+    if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP)
+      if (__aio_enqueue_request ((aiocb_union *) list[cnt],
+				 list[cnt]->aio_lio_opcode, 0) >= 0)
+	/* Successfully enqueued.  */
+	++total;
+      else
+	/* Signal that we've seen an error.  `errno' and the error code
+	   of the aiocb will tell more.  */
+	result = -1;
+
+
+
+  /* Release the semaphore.  */
+  sem_post (&__aio_requests_sema);
+
+  return result;
+}
diff --git a/rt/lio_listio64.c b/rt/lio_listio64.c
new file mode 100644
index 0000000000..b17e9edae2
--- /dev/null
+++ b/rt/lio_listio64.c
@@ -0,0 +1,66 @@
+/* Enqueue and list of read or write requests, 64bit offset version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <aio.h>
+#include <errno.h>
+#include <semaphore.h>
+
+#include "aio_misc.h"
+
+
+int
+lio_listio64 (mode, list, nent, sig)
+     int mode;
+     struct aiocb64 *const list[];
+     int nent;
+     struct sigevent *sig;
+{
+  int cnt;
+  int total = 0;
+  int result = 0;
+
+  /* Check arguments.  */
+  if (mode != LIO_WAIT && mode != LIO_NOWAIT)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  /* Request the semaphore.  */
+  sem_wait (&__aio_requests_sema);
+
+  /* Now we can enqueue all requests.  Since we already acquired the
+     semaphore the enqueue function need not do this.  */
+  for (cnt = 0; cnt < nent; ++cnt)
+    if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP)
+      if (__aio_enqueue_request ((aiocb_union *) list[cnt],
+				 list[cnt]->aio_lio_opcode | 128, 0) >= 0)
+	/* Successfully enqueued.  */
+	++total;
+      else
+	/* Signal that we've seen an error.  `errno' and the error code
+	   of the aiocb will tell more.  */
+	result = -1;
+
+  /* Release the semaphore.  */
+  sem_post (&__aio_requests_sema);
+
+  return result;
+}
diff --git a/shlib-versions b/shlib-versions
index d24a4b010c..3c221d7c99 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -87,3 +87,6 @@ alpha-.*-linux.*	libcrypt=1.1
 # The gross patch for programs assuming broken locale implementations.
 alpha-.*-linux.*	libBrokenLocale=1.1
 .*-.*-.*		libBrokenLocale=1
+
+# The real-time library from POSIX.1b.
+.*-.*-.*		librt=1
diff --git a/signal/Makefile b/signal/Makefile
index e35fb12345..29aeea5f2b 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -22,7 +22,7 @@
 subdir	:= signal
 
 headers	:= signal.h sys/signal.h bits/signum.h bits/sigcontext.h \
-	   bits/sigaction.h bits/sigset.h
+	   bits/sigaction.h bits/sigset.h bits/siginfo.h
 
 routines	:= signal raise killpg \
 		   sigaction sigprocmask kill \
@@ -32,11 +32,12 @@ routines	:= signal raise killpg \
 		   sigsetops sigempty sigfillset sigaddset sigdelset sigismem \
 		   sigreturn \
 		   siggetmask sysv_signal \
-		   sigisempty sigandset sigorset
+		   sigisempty sigandset sigorset \
+		   allocrtsig sigtimedwait sigwaitinfo sigqueue
 
 tests		:= tst-signal
 
-distribute	:= sigsetops.h
+distribute	:= sigsetops.h testrtsig.h
 
 
 include ../Rules
diff --git a/signal/allocrtsig.c b/signal/allocrtsig.c
new file mode 100644
index 0000000000..678bc8b17b
--- /dev/null
+++ b/signal/allocrtsig.c
@@ -0,0 +1,89 @@
+/* Handle real-time signal allocation.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <signal.h>
+
+/* In these variables we keep track of the used variables.  If the
+   platform does not support any real-time signals we will define the
+   values to some unreasonable value which will signal failing of all
+   the functions below.  */
+#ifndef __SIGRTMIN
+static int current_rtmin = -1;
+static int current_rtmax = -1;
+#else
+static int current_rtmin = __SIGRTMIN;
+static int current_rtmax = __SIGRTMAX;
+
+static int initialized;
+
+#include "testrtsig.h"
+
+static void
+init (void)
+{
+  if (!kernel_has_rtsig ())
+    {
+      current_rtmin = -1;
+      current_rtmax = -1;
+    }
+  initialized = 1;
+}
+#endif
+
+/* Return number of available real-time signal with highest priority.  */
+int
+__libc_current_sigrtmin (void)
+{
+#ifdef __SIGRTMIN
+  if (!initialized)
+    init ();
+#endif
+  return current_rtmin;
+}
+
+/* Return number of available real-time signal with lowest priority.  */
+int
+__libc_current_sigrtmax (void)
+{
+#ifdef __SIGRTMIN
+  if (!initialized)
+    init ();
+#endif
+  return current_rtmax;
+}
+
+/* Allocate real-time signal with highest/lowest available
+   priority.  Please note that we don't use a lock since we assume
+   this function to be called at program start.  */
+int
+__libc_allocate_rtsig (int high)
+{
+#ifndef __SIGRTMIN
+  return -1;
+#else
+  if (!initialized)
+    init ();
+  if (current_rtmin != -1 || current_rtmin > current_rtmax)
+    /* We don't have anymore signal available.  */
+    return -1;
+
+  return high ? current_rtmin++ : current_rtmax--;
+#endif
+}
diff --git a/signal/signal.h b/signal/signal.h
index 5fb4bc2a14..8691b6880e 100644
--- a/signal/signal.h
+++ b/signal/signal.h
@@ -172,6 +172,20 @@ typedef __sigset_t sigset_t;
 
 # ifdef _SIGNAL_H
 
+/* We need `struct timespec' later on.  */
+#  define __need_timespec
+#  include <time.h>
+
+/* Type for data associated with a signal.  */
+typedef union sigval
+  {
+    int sival_int;
+    void *sival_ptr;
+  } sigval_t;
+
+/* Get the `siginfo_t' type plus the needed symbols.  */
+# include <bits/siginfo.h>
+
 /* Clear all signals from SET.  */
 extern int sigemptyset __P ((sigset_t *__set));
 
@@ -229,6 +243,24 @@ extern int sigpending __P ((sigset_t *__set));
 extern int __sigwait __P ((__const sigset_t *__set, int *__sig));
 extern int sigwait __P ((__const sigset_t *__set, int *__sig));
 
+/* Select any of pending signals from SET and place information in INFO.  */
+extern int __sigwaitinfo __P ((__const sigset_t *__set, siginfo_t *__info));
+extern int sigwaitinfo __P ((__const sigset_t *__set, siginfo_t *__info));
+
+/* Select any of pending signals from SET and place information in INFO.
+   Wait the imte specified by TIMEOUT if no signal is pending.  */
+extern int __sigtimedwait __P ((__const sigset_t *__set, siginfo_t *__info,
+				__const struct timespec *__timeout));
+extern int sigtimedwait __P ((__const sigset_t *__set, siginfo_t *__info,
+			      __const struct timespec *__timeout));
+
+/* Send signal SIG to the process PID.  Associate data in VAL with the
+   signal.  */
+extern int __sigqueue __P ((__pid_t __pid, int __sig,
+			    __const union sigval __val));
+extern int sigqueue __P ((__pid_t __pid, int __sig,
+			  __const union sigval __val));
+
 # endif /* <signal.h> included.  */
 
 #endif /* Use POSIX.  */
@@ -313,6 +345,18 @@ extern int sigaltstack __P ((__const struct sigaltstack *__ss,
 
 #endif /* signal.h included and use BSD or X/Open Unix.  */
 
+
+/* The following functions are used internally in the C library and in
+   other code which need deep insights.  */
+
+/* Return number of available real-time signal with highest priority.  */
+extern int __libc_current_sigrtmin __P ((void));
+/* Return number of available real-time signal with lowest priority.  */
+extern int __libc_current_sigrtmax __P ((void));
+
+/* Allocate real-time signal with highest/lowest available priority.  */
+extern int __libc_allocate_rtsig __P ((int __high));
+
 __END_DECLS
 
 #endif /* signal.h  */
diff --git a/stdio-common/tmpfile64.c b/stdio-common/tmpfile64.c
index 67d4bd8291..5a6e3238fc 100644
--- a/stdio-common/tmpfile64.c
+++ b/stdio-common/tmpfile64.c
@@ -16,6 +16,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <errno.h>
 #include <stdio.h>
 
 
diff --git a/stdio/stdio.h b/stdio/stdio.h
index 80132879de..2631d83e43 100644
--- a/stdio/stdio.h
+++ b/stdio/stdio.h
@@ -161,7 +161,8 @@ extern char *__stdio_gen_tempname __P ((char *__buf, size_t __bufsize,
 					__const char *__pfx,
 					int __dir_search,
 					size_t *__lenptr,
-					FILE **__streamptr));
+					FILE **__streamptr,
+					int __large_file));
 
 
 /* Print out MESSAGE on the error output and abort.  */
@@ -297,6 +298,9 @@ extern int rename __P ((__const char *__old, __const char *__new));
 
 /* Create a temporary file and open it read/write.  */
 extern FILE *tmpfile __P ((void));
+#ifdef __USE_LARGEFILE64
+extern FILE *tmpfile64 __P ((void));
+#endif
 /* Generate a temporary filename.  */
 extern char *tmpnam __P ((char *__s));
 
diff --git a/string/string.h b/string/string.h
index 8bf4a87098..39d1d61193 100644
--- a/string/string.h
+++ b/string/string.h
@@ -263,6 +263,7 @@ extern char *strsep __P ((char **__stringp, __const char *__delim));
 
 #ifdef	__USE_GNU
 /* Compare S1 and S2 as strings holding name & indices/version numbers.  */
+extern int __strverscmp __P ((__const char *__s1, __const char *__s2));
 extern int strverscmp __P ((__const char *__s1, __const char *__s2));
 
 /* Return a string describing the meaning of the signal number in SIG.  */
diff --git a/string/strverscmp.c b/string/strverscmp.c
index 815073ecbf..39dfc61a9b 100644
--- a/string/strverscmp.c
+++ b/string/strverscmp.c
@@ -39,7 +39,7 @@
 */
 
 int
-strverscmp (s1, s2)
+__strverscmp (s1, s2)
      const char *s1;
      const char *s2;
 {
@@ -109,3 +109,4 @@ strverscmp (s1, s2)
       return state;
   }
 }
+weak_alias (__strverscmp, strverscmp)
diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S
index b027103d60..a2042f5543 100644
--- a/sysdeps/arm/__longjmp.S
+++ b/sysdeps/arm/__longjmp.S
@@ -18,6 +18,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <sysdep.h>
+#define _SETJMP_H
 #define _ASM
 #include <bits/setjmp.h>
 
@@ -32,6 +33,6 @@ ENTRY (__longjmp)
 	add	r2, r2, #48
 	lfmfd	f4, 4, [r2]
 #endif
-	
+
 	LOADREGS(ia, r2, {v1-v6, sl, fp, sp, pc})
 END (__longjmp)
diff --git a/sysdeps/arm/setjmp.S b/sysdeps/arm/setjmp.S
index 8f99e4fcb4..08cd0d254e 100644
--- a/sysdeps/arm/setjmp.S
+++ b/sysdeps/arm/setjmp.S
@@ -18,6 +18,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <sysdep.h>
+#define _SETJMP_H
 #define _ASM
 #include <bits/setjmp.h>
 
@@ -28,7 +29,7 @@ ENTRY (__sigsetjmp)
 	/* Save registers */
 #if __ARM_USES_FP
 	sfmea	f4, 4, [r0]!
-#endif	
+#endif
 	stmia	r0, {v1-v6, sl, fp, sp, lr}
 
 	/* Make a tail call to __sigjmp_save; it takes the same args.  */
diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile
index 2f6a8f4333..4d6c60447a 100644
--- a/sysdeps/generic/Makefile
+++ b/sysdeps/generic/Makefile
@@ -33,6 +33,7 @@ endif
 
 ifeq ($(subdir),stdio-common)
 ifneq ($(inhibit-siglist),yes)
+ifneq ($(cross-compiling),yes)
 ifeq	"$(filter %siglist.c,$(before-compile))" ""
 before-compile := $(before-compile) $(objpfx)siglist.c
 $(objpfx)siglist.c: $(objpfx)make_siglist
@@ -49,6 +50,7 @@ generated := $(generated) make_siglist siglist.c
 endif
 endif
 endif
+endif
 
 ifeq ($(subdir),string)
 CFLAGS-wordcopy.c += -Wno-uninitialized
diff --git a/sysdeps/generic/aio_sigqueue.c b/sysdeps/generic/aio_sigqueue.c
new file mode 100644
index 0000000000..0a871e24d9
--- /dev/null
+++ b/sysdeps/generic/aio_sigqueue.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <aio.h>
+#include <errno.h>
+#include <signal.h>
+
+#include "aio_misc.h"
+
+int
+__aio_sigqueue (int sig, const union sigval val)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+
+stub_warning (__aio_sigqueue)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/bits/confname.h b/sysdeps/generic/bits/confname.h
index 3991fb1df4..1b75d6e5b5 100644
--- a/sysdeps/generic/bits/confname.h
+++ b/sysdeps/generic/bits/confname.h
@@ -316,8 +316,17 @@ enum
 #define	_SC_NL_NMAX			_SC_NL_NMAX
     _SC_NL_SETMAX,
 #define	_SC_NL_SETMAX			_SC_NL_SETMAX
-    _SC_NL_TEXTMAX
+    _SC_NL_TEXTMAX,
 #define	_SC_NL_TEXTMAX			_SC_NL_TEXTMAX
+
+    _SC_XBS5_ILP32_OFF32,
+#define _SC_XBS5_ILP32_OFF32		_SC_XBS5_ILP32_OFF32
+    _SC_XBS5_ILP32_OFFBIG,
+#define _SC_XBS5_ILP32_OFFBIG		_SC_XBS5_ILP32_OFFBIG
+    _SC_XBS5_LP64_OFF64,
+#define _SC_XBS5_LP64_OFF64		_SC_XBS5_LP64_OFF64
+    _SC_XBS5_LPBIG_OFFBIG
+#define _SC_XBS5_LPBIG_OFFBIG		_SC_XBS5_LPBIG_OFFBIG
   };
 
 #if (defined __USE_POSIX2 || defined __USE_UNIX98 \
diff --git a/sysdeps/generic/bits/siginfo.h b/sysdeps/generic/bits/siginfo.h
new file mode 100644
index 0000000000..35d9d69892
--- /dev/null
+++ b/sysdeps/generic/bits/siginfo.h
@@ -0,0 +1,184 @@
+/* siginfo_t, sigevent and constants.  Stub version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SIGNAL_H
+# error "Never include this file directly.  Use <signal.h> instead"
+#endif
+
+typedef struct siginfo
+  {
+    int si_signo;		/* Signal number.  */
+    int si_errno;		/* If non-zero, an errno value associated with
+				   this signal, as defined in <errno.h>.  */
+    int si_code;		/* Signal code.  */
+    __pid_t si_pid;		/* Sending process ID.  */
+    __uid_t si_uid;		/* Real user ID of sending process.  */
+    void *si_addr;		/* Address of faulting instruction.  */
+    int si_status;		/* Exit value or signal.  */
+    long int si_band;		/* Band event for SIGPOLL.  */
+    union sigval si_value;	/* Signal value.  */
+  } siginfo_t;
+
+
+/* Values for `si_code'.  Positive values are reserved for kernel-generated
+   signals.  */
+enum
+{
+  SI_ASYNCIO = -4,		/* Sent by AIO completion.  */
+#define SI_ASYNCIO	SI_ASYNCIO
+  SI_MESGQ,			/* Sent by real time mesq state change.  */
+#define SI_MESGQ	SI_MESGQ
+  SI_TIMER,			/* Sent by timer expiration.  */
+#define SI_TIMER	SI_TIMER
+  SI_QUEUE,			/* Sent by sigqueue.  */
+#define SI_QUEUE	SI_QUEUE
+  SI_USER			/* Sent by kill, sigsend, raise.  */
+#define SI_USER		SI_USER
+};
+
+
+/* `si_code' values for SIGILL signal.  */
+enum
+{
+  ILL_ILLOPC = 1,		/* Illegal opcode.  */
+#define ILL_ILLOPC	ILL_ILLOPC
+  ILL_ILL_OPN,			/* Illegal operand.  */
+#define ILL_ILLOPN	ILL_ILLOPN
+  ILL_ILLADR,			/* Illegal addressing mode.  */
+#define ILL_ILLADR	ILL_ILLADR
+  ILL_ILLTRP,			/* Illegal trap. */
+#define ILL_ILLTRP	ILL_ILLTRP
+  ILL_PRVOPC,			/* Privileged opcode.  */
+#define ILL_PRVOPC	ILL_PRVOPC
+  ILL_PRVREG,			/* Privileged register.  */
+#define ILL_PRVREG	ILL_PRVREG
+  ILL_COPROC,			/* Coprocessor error.  */
+#define ILL_COPROC	ILL_COPROC
+  ILL_BADSTK			/* Internal stack error.  */
+#define ILL_BADSTK	ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal.  */
+enum
+{
+  FPE_INTDIV = 1,		/* Integer divide by zero.  */
+#define FPE_INTDIV	FPE_INTDIV
+  FPE_INTOVF,			/* Integer overflow.  */
+#define FPE_INTOVF	FPE_INTOVF
+  FPE_FLTDIV,			/* Floating point divide by zero.  */
+#define FPE_FLTDIV	FPE_FLTDIV
+  FPE_FLTOVF,			/* Floating point overflow.  */
+#define FPE_FLTOVF	FPE_FLTOVF
+  FPE_FLTUND,			/* Floating point underflow.  */
+#define FPE_FLTUND	FPE_FLTUND
+  FPE_FLTRES,			/* Floating point inexact result.  */
+#define FPE_FLTRES	FPE_FLTRES
+  FPE_FLTINV,			/* Floating point invalid operation.  */
+#define FPE_FLTINV	FPE_FLTINV
+  FPE_FLTSUB			/* Subscript out of range.  */
+#define FPE_FLTSUB	FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal.  */
+enum
+{
+  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
+#define SEGV_MAPERR	SEGV_MAPERR
+  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
+#define SEGV_ACCERR	SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal.  */
+enum
+{
+  BUS_ADRALN = 1,		/* Invalid address alignment.  */
+#define BUS_ADRALN	BUS_ADRALN
+  BUS_ADRERR,			/* Non-existant physical address.  */
+#define BUS_ADRERR	BUS_ADRERR
+  BUS_OBJERR			/* Object specific hardware error.  */
+#define BUS_OBJERR	BUS_OBJERR
+};
+
+/* `si_code' values for SIGTRAP signal.  */
+enum
+{
+  TRAP_BRKPT = 1,		/* Process breakpoint.  */
+#define TRAP_BRKPT	TRAP_BRKPT
+  TRAP_TRACE			/* Process trace trap.  */
+#define TRAP_TRACE	TRAP_TRACE
+};
+
+/* `si_code' values for SIGCHLD signal.  */
+enum
+{
+  CLD_EXITED = 1,		/* Child has exited.  */
+#define CLD_EXITED	CLD_EXITED
+  CLD_KILLED,			/* Child was killed.  */
+#define CLD_KILLED	CLD_KILLED
+  CLD_DUMPED,			/* Child terminated abnormally.  */
+#define CLD_DUMPED	CLD_DUMPED
+  CLD_TRAPPED,			/* Traced child has trapped.  */
+#define CLD_TRAPPED	CLD_TRAPPED
+  CLD_STOPPED,			/* Child has stopped.  */
+#define CLD_STOPPED	CLD_STOPPED
+  CLD_CONTINUED			/* Stopped child has continued.  */
+#define CLD_CONTINUED	CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal.  */
+enum
+{
+  POLL_IN = 1,			/* Data input available.  */
+#define POLL_IN		POLL_IN
+  POLL_OUT,			/* Output buffers available.  */
+#define POLL_OUT	POLL_OUT
+  POLL_MSG,			/* Input message available.   */
+#define POLL_MSG	POLL_MSG
+  POLL_ERR,			/* I/O error.  */
+#define POLL_ERR	POLL_ERR
+  POLL_PRI,			/* High priority input available.  */
+#define POLL_PRI	POLL_PRI
+  POLL_HUP			/* Device disconnected.  */
+#define POLL_HUP	POLL_HUP
+};
+
+
+/* Structure to transport application-defined values with signals.  */
+#define SIGEV_MAX_SIZE	64
+#define SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE / sizeof (int)) - 3)
+
+typedef struct sigevent
+  {
+    sigval_t sigev_value;
+    int sigev_signo;
+    int sigev_notify;
+    void (*sigev_notify_function) __P ((sigval_t)); /* Function to start.  */
+    void *sigev_notify_attributes;		    /* Really pthread_attr_t.*/
+  } sigevent_t;
+
+/* `sigev_notify' values.  */
+enum
+{
+  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
+#define SIGEV_SIGNAL	SIGEV_SIGNAL
+  SIGEV_NONE,			/* Other notification: meaningless.  */
+#define SIGEV_NONE	SIGEV_NONE
+  SIGEV_THREAD			/* Deliver via thread creation.  */
+#define SIGEV_THREAD	SIGEV_THREAD
+};
diff --git a/sysdeps/generic/bits/utsname.h b/sysdeps/generic/bits/utsname.h
index ea3f163cef..cd05db1438 100644
--- a/sysdeps/generic/bits/utsname.h
+++ b/sysdeps/generic/bits/utsname.h
@@ -16,7 +16,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#ifndef _UTSNAME_H
+#ifndef _SYS_UTSNAME_H
 # error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead."
 #endif
 
diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c
index 7ee3002314..b71ad54e55 100644
--- a/sysdeps/generic/dl-sysdep.c
+++ b/sysdeps/generic/dl-sysdep.c
@@ -40,6 +40,7 @@ extern void _end;
 extern void ENTRY_POINT (void);
 
 ElfW(Addr) _dl_base_addr;
+uid_t __libc_uid;
 int __libc_enable_secure;
 int __libc_multiple_libcs;	/* Defining this here avoids the inclusion
 				   of init-first.  */
@@ -130,7 +131,7 @@ _dl_sysdep_start (void **start_argptr,
   SEE (EUID, euid);
   SEE (EGID, egid);
 
-
+  __libc_uid = uid;
   __libc_enable_secure = uid != euid || gid != egid;
 
   if (_dl_pagesize == 0)
diff --git a/sysdeps/generic/enbl-secure.c b/sysdeps/generic/enbl-secure.c
index fdf6f154f6..8e1327c878 100644
--- a/sysdeps/generic/enbl-secure.c
+++ b/sysdeps/generic/enbl-secure.c
@@ -26,9 +26,13 @@
 /* Safest assumption, if somehow the initializer isn't run.  */
 int __libc_enable_secure = 1;
 
+/* We often need the UID.  */
+uid_t __libc_uid;
+
 void
 __libc_init_secure (void)
 {
-  __libc_enable_secure = (__geteuid () != __getuid () ||
-			  __getegid () != __getgid ());
+  __libc_uid == __getuid ();
+  __libc_enable_secure = (__geteuid () != __libc_uid
+			  || __getegid () != __getgid ());
 }
diff --git a/sysdeps/generic/sigqueue.c b/sysdeps/generic/sigqueue.c
new file mode 100644
index 0000000000..c6af1d7021
--- /dev/null
+++ b/sysdeps/generic/sigqueue.c
@@ -0,0 +1,32 @@
+/* Implementation of sigqueue function from POSIX.1b.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__sigqueue (pid_t pid, int sig, const union sigval val)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+weak_alias (__sigqueue, sigqueue)
+
+stub_warning (sigqueue)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/sigtimedwait.c b/sysdeps/generic/sigtimedwait.c
new file mode 100644
index 0000000000..4f9497794b
--- /dev/null
+++ b/sysdeps/generic/sigtimedwait.c
@@ -0,0 +1,33 @@
+/* Implementation of sigtimedwait function from POSIX.1b.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__sigtimedwait (const sigset_t *set, siginfo_t *info,
+		const struct timespec *timeout)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+weak_alias (__sigtimedwait, sigtimedwait)
+
+stub_warning (sigtimedwait)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/sigwaitinfo.c b/sysdeps/generic/sigwaitinfo.c
new file mode 100644
index 0000000000..49014e94b0
--- /dev/null
+++ b/sysdeps/generic/sigwaitinfo.c
@@ -0,0 +1,32 @@
+/* Implementation of sigwaitinfo function from POSIX.1b.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__sigwaitinfo (const sigset_t *set, siginfo_t *info)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+weak_alias (__sigwaitinfo, sigwaitinfo)
+
+stub_warning (sigwaitinfo)
+#include <stub-tag.h>
diff --git a/sysdeps/generic/testrtsig.h b/sysdeps/generic/testrtsig.h
new file mode 100644
index 0000000000..25eb488f84
--- /dev/null
+++ b/sysdeps/generic/testrtsig.h
@@ -0,0 +1,28 @@
+/* Test whether RT signals are really available.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <string.h>
+#include <sys/utsname.h>
+
+int
+kernel_has_rtsig (void)
+{
+  return 0;
+}
diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile
index b97f95f6a8..9860444b85 100644
--- a/sysdeps/i386/Makefile
+++ b/sysdeps/i386/Makefile
@@ -18,7 +18,3 @@ CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
 CFLAGS-dl-load.c += -Wno-unused
 CFLAGS-dl-reloc.c += -Wno-unused
 endif
-
-ifeq ($(subdir),math)
-CPPFLAGS += -D__LIBC_INTERNAL_MATH_INLINES
-endif
diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h
index 17b6b6c76b..68597c9c09 100644
--- a/sysdeps/i386/sys/ucontext.h
+++ b/sysdeps/i386/sys/ucontext.h
@@ -44,9 +44,9 @@ enum
 #define ES	ES
   DS,
 #define DS	DS
-  EDI
+  EDI,
 #define EDI	EDI
-  ESI
+  ESI,
 #define ESI	ESI
   EBP,
 #define EBP	EBP
diff --git a/sysdeps/libm-ieee754/s_csqrt.c b/sysdeps/libm-ieee754/s_csqrt.c
index c5c609bd8c..cda23c702d 100644
--- a/sysdeps/libm-ieee754/s_csqrt.c
+++ b/sysdeps/libm-ieee754/s_csqrt.c
@@ -84,6 +84,7 @@ __csqrt (__complex__ double x)
 	}
       else
 	{
+#if 0 /* FIXME: this is broken. */
 	  __complex__ double q;
 	  double t, r;
 
@@ -99,6 +100,15 @@ __csqrt (__complex__ double x)
 
 	  /* Heron iteration in complex arithmetic.  */
 	  res = 0.5 * (q + q / x);
+#else
+	  double d, imag;
+
+	  d = __ieee754_hypot (__real__ x, __imag__ x);
+	  imag = __ieee754_sqrt (0.5 * (d - __real__ x));
+
+	  __real__ res = __ieee754_sqrt (0.5 * (d + __real__ x));
+	  __imag__ res = __copysign (imag, __imag__ x);
+#endif
 	}
     }
 
diff --git a/sysdeps/libm-ieee754/s_csqrtf.c b/sysdeps/libm-ieee754/s_csqrtf.c
index 2289045cfd..5fdf2c1d66 100644
--- a/sysdeps/libm-ieee754/s_csqrtf.c
+++ b/sysdeps/libm-ieee754/s_csqrtf.c
@@ -84,6 +84,7 @@ __csqrtf (__complex__ float x)
 	}
       else
 	{
+#if 0 /* FIXME: this is broken. */
 	  __complex__ float q;
 	  float t, r;
 
@@ -99,6 +100,15 @@ __csqrtf (__complex__ float x)
 
 	  /* Heron iteration in complex arithmetic.  */
 	  res = 0.5 * (q + q / x);
+#else
+	  float d, imag;
+
+	  d = __ieee754_hypotf (__real__ x, __imag__ x);
+	  imag = __ieee754_sqrtf (0.5 * (d - __real__ x));
+
+	  __real__ res = __ieee754_sqrtf (0.5 * (d + __real__ x));
+	  __imag__ res = __copysignf (imag, __imag__ x);
+#endif
 	}
     }
 
diff --git a/sysdeps/libm-ieee754/s_csqrtl.c b/sysdeps/libm-ieee754/s_csqrtl.c
index 3de7310c73..b772709947 100644
--- a/sysdeps/libm-ieee754/s_csqrtl.c
+++ b/sysdeps/libm-ieee754/s_csqrtl.c
@@ -84,6 +84,7 @@ __csqrtl (__complex__ long double x)
 	}
       else
 	{
+#if 0 /* FIXME: this is broken. */
 	  __complex__ long double q;
 	  long double t, r;
 
@@ -99,6 +100,15 @@ __csqrtl (__complex__ long double x)
 
 	  /* Heron iteration in complex arithmetic.  */
 	  res = 0.5 * (q + q / x);
+#else
+	  long double d, imag;
+
+	  d = __ieee754_hypotl (__real__ x, __imag__ x);
+	  imag = __ieee754_sqrtl (0.5 * (d - __real__ x));
+
+	  __real__ res = __ieee754_sqrtl (0.5 * (d + __real__ x));
+	  __imag__ res = __copysignl (imag, __imag__ x);
+#endif
 	}
     }
 
diff --git a/sysdeps/m68k/fpu/e_acos.c b/sysdeps/m68k/fpu/e_acos.c
index 9c2d91f271..80803ff80f 100644
--- a/sysdeps/m68k/fpu/e_acos.c
+++ b/sysdeps/m68k/fpu/e_acos.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/e_atan2.c b/sysdeps/m68k/fpu/e_atan2.c
index d23d4f90d1..7b275b4048 100644
--- a/sysdeps/m68k/fpu/e_atan2.c
+++ b/sysdeps/m68k/fpu/e_atan2.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/e_fmod.c b/sysdeps/m68k/fpu/e_fmod.c
index 505650a531..9e59a43302 100644
--- a/sysdeps/m68k/fpu/e_fmod.c
+++ b/sysdeps/m68k/fpu/e_fmod.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/e_pow.c b/sysdeps/m68k/fpu/e_pow.c
index c36b64316e..ee95a39395 100644
--- a/sysdeps/m68k/fpu/e_pow.c
+++ b/sysdeps/m68k/fpu/e_pow.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/e_scalb.c b/sysdeps/m68k/fpu/e_scalb.c
index 93b44ff130..ef1724b036 100644
--- a/sysdeps/m68k/fpu/e_scalb.c
+++ b/sysdeps/m68k/fpu/e_scalb.c
@@ -17,7 +17,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef SUFF
diff --git a/sysdeps/m68k/fpu/k_cos.c b/sysdeps/m68k/fpu/k_cos.c
index 5b263ec6ae..85f744f984 100644
--- a/sysdeps/m68k/fpu/k_cos.c
+++ b/sysdeps/m68k/fpu/k_cos.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/k_sin.c b/sysdeps/m68k/fpu/k_sin.c
index 41de73fde7..05cdceedc8 100644
--- a/sysdeps/m68k/fpu/k_sin.c
+++ b/sysdeps/m68k/fpu/k_sin.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/k_tan.c b/sysdeps/m68k/fpu/k_tan.c
index 7f87e09e00..09e5ac83bc 100644
--- a/sysdeps/m68k/fpu/k_tan.c
+++ b/sysdeps/m68k/fpu/k_tan.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/s_atan.c b/sysdeps/m68k/fpu/s_atan.c
index e6b676ba58..29f2eca77d 100644
--- a/sysdeps/m68k/fpu/s_atan.c
+++ b/sysdeps/m68k/fpu/s_atan.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef FUNC
diff --git a/sysdeps/m68k/fpu/s_ccos.c b/sysdeps/m68k/fpu/s_ccos.c
index 095aa9803f..fbd5ef5388 100644
--- a/sysdeps/m68k/fpu/s_ccos.c
+++ b/sysdeps/m68k/fpu/s_ccos.c
@@ -18,7 +18,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <complex.h>
 #include <math.h>
 
diff --git a/sysdeps/m68k/fpu/s_ccosh.c b/sysdeps/m68k/fpu/s_ccosh.c
index 3d560b3093..af751430de 100644
--- a/sysdeps/m68k/fpu/s_ccosh.c
+++ b/sysdeps/m68k/fpu/s_ccosh.c
@@ -18,7 +18,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <complex.h>
 #include <math.h>
 
diff --git a/sysdeps/m68k/fpu/s_cexp.c b/sysdeps/m68k/fpu/s_cexp.c
index da28ebb4d3..fcf87ed687 100644
--- a/sysdeps/m68k/fpu/s_cexp.c
+++ b/sysdeps/m68k/fpu/s_cexp.c
@@ -18,7 +18,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <complex.h>
 #include <math.h>
 
diff --git a/sysdeps/m68k/fpu/s_csin.c b/sysdeps/m68k/fpu/s_csin.c
index ae456d3b91..72214c4cff 100644
--- a/sysdeps/m68k/fpu/s_csin.c
+++ b/sysdeps/m68k/fpu/s_csin.c
@@ -18,7 +18,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <complex.h>
 #include <math.h>
 
diff --git a/sysdeps/m68k/fpu/s_csinh.c b/sysdeps/m68k/fpu/s_csinh.c
index c95f9dc523..e829f4d3ae 100644
--- a/sysdeps/m68k/fpu/s_csinh.c
+++ b/sysdeps/m68k/fpu/s_csinh.c
@@ -18,7 +18,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <complex.h>
 #include <math.h>
 
diff --git a/sysdeps/m68k/fpu/s_frexp.c b/sysdeps/m68k/fpu/s_frexp.c
index 4280fcc50b..61e3298e97 100644
--- a/sysdeps/m68k/fpu/s_frexp.c
+++ b/sysdeps/m68k/fpu/s_frexp.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef FUNC
diff --git a/sysdeps/m68k/fpu/s_ilogb.c b/sysdeps/m68k/fpu/s_ilogb.c
index aebcaa16ba..ef90946f59 100644
--- a/sysdeps/m68k/fpu/s_ilogb.c
+++ b/sysdeps/m68k/fpu/s_ilogb.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef SUFF
diff --git a/sysdeps/m68k/fpu/s_isinf.c b/sysdeps/m68k/fpu/s_isinf.c
index d8cafdbb0c..03dc26dc60 100644
--- a/sysdeps/m68k/fpu/s_isinf.c
+++ b/sysdeps/m68k/fpu/s_isinf.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef FUNC
diff --git a/sysdeps/m68k/fpu/s_llrint.c b/sysdeps/m68k/fpu/s_llrint.c
index 37b6f63278..423939aa0b 100644
--- a/sysdeps/m68k/fpu/s_llrint.c
+++ b/sysdeps/m68k/fpu/s_llrint.c
@@ -19,7 +19,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/s_llrintf.c b/sysdeps/m68k/fpu/s_llrintf.c
index 4d06ae2651..0cd12c9920 100644
--- a/sysdeps/m68k/fpu/s_llrintf.c
+++ b/sysdeps/m68k/fpu/s_llrintf.c
@@ -19,7 +19,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/s_llrintl.c b/sysdeps/m68k/fpu/s_llrintl.c
index 14a815fd1a..6f63e0bcd1 100644
--- a/sysdeps/m68k/fpu/s_llrintl.c
+++ b/sysdeps/m68k/fpu/s_llrintl.c
@@ -19,7 +19,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 #include "math_private.h"
 
diff --git a/sysdeps/m68k/fpu/s_lrint.c b/sysdeps/m68k/fpu/s_lrint.c
index 7747057f1a..89e9dba9cf 100644
--- a/sysdeps/m68k/fpu/s_lrint.c
+++ b/sysdeps/m68k/fpu/s_lrint.c
@@ -19,7 +19,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef suffix
diff --git a/sysdeps/m68k/fpu/s_modf.c b/sysdeps/m68k/fpu/s_modf.c
index b9867df475..6c2449aa56 100644
--- a/sysdeps/m68k/fpu/s_modf.c
+++ b/sysdeps/m68k/fpu/s_modf.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef SUFF
diff --git a/sysdeps/m68k/fpu/s_remquo.c b/sysdeps/m68k/fpu/s_remquo.c
index 7607fee782..10be1aec6d 100644
--- a/sysdeps/m68k/fpu/s_remquo.c
+++ b/sysdeps/m68k/fpu/s_remquo.c
@@ -18,7 +18,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef SUFF
diff --git a/sysdeps/m68k/fpu/s_scalbn.c b/sysdeps/m68k/fpu/s_scalbn.c
index 12b737a5e9..c151b2a0ef 100644
--- a/sysdeps/m68k/fpu/s_scalbn.c
+++ b/sysdeps/m68k/fpu/s_scalbn.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #define scalbln __no_scalbln_decl
 #define scalblnf __no_scalblnf_decl
 #define scalblnl __no_scalblnl_decl
diff --git a/sysdeps/m68k/fpu/s_sincos.c b/sysdeps/m68k/fpu/s_sincos.c
index dda42e2775..8d84ece380 100644
--- a/sysdeps/m68k/fpu/s_sincos.c
+++ b/sysdeps/m68k/fpu/s_sincos.c
@@ -16,7 +16,6 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define __LIBC_INTERNAL_MATH_INLINES
 #include <math.h>
 
 #ifndef FUNC
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 88918c517f..befd1120b4 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -44,6 +44,7 @@ extern int _dl_argc;
 extern char **_dl_argv;
 extern char **_environ;
 
+uid_t __libc_uid;
 int __libc_enable_secure;
 
 struct hurd_startup_data *_dl_hurd_data;
@@ -106,6 +107,7 @@ _dl_sysdep_start (void **start_argptr,
       else
 	_dl_hurd_data = (void *) p;
 
+      __libc_uid = __getuid ();
       __libc_enable_secure = _dl_hurd_data->flags & EXEC_SECURE;
 
       if (_dl_hurd_data->flags & EXEC_STACK_ARGS &&
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index 340f8c641b..fa95317ec9 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -31,6 +31,12 @@ netinet/tcp.h
 netinet/udp.h
 netipx/ipx.h
 nfs/nfs.h
+rt_sigaction.c
+rt_sigprocmask.c
+rt_sigqueueinfo.c
+rt_sigreturn.c
+rt_sigsuspend.c
+rt_sigtimedwait.c
 scsi/sg.h
 sys/acct.h
 sys/debugreg.h
@@ -41,6 +47,7 @@ sys/kdaemon.h
 sys/klog.h
 sys/mount.h
 sys/mtio.h
+sys/pci.h
 sys/prctl.h
 sys/procfs.h
 sys/quota.h
@@ -50,6 +57,7 @@ sys/sysctl.h
 sys/sysinfo.h
 sys/sysmacros.h
 sys/timex.h
+sys/ultrasound.h
 sys/user.h
 sys/vt.h
 xstatconv.c
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 253bc26e94..ffea9ef4bb 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -16,7 +16,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h sys/mtio.h \
 		  sys/user.h sys/sysmacros.h sys/procfs.h sys/prctl.h \
 		  sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h \
 		  sys/quota.h sys/fsuid.h bits/mman.h \
-		  scsi/sg.h
+		  scsi/sg.h sys/pci.h sys/ultrasound.h
 
 install-others += $(inst_includedir)/bits/syscall.h
 
@@ -108,4 +108,10 @@ ifndef no_deps
 # Get the list of dependencies (probably /usr/include/linux/limits.h).
 -include $(common-objpfx)bits/stdio_lim.d
 endif
+
+ifeq ($(subdir),signal)
+sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait	\
+		   rt_sigqueueinfo rt_sigaction
+endif
+
 common-generated += bits/stdio_lim.h bits/stdio_lim.d
diff --git a/sysdeps/unix/sysv/linux/aio_sigqueue.c b/sysdeps/unix/sysv/linux/aio_sigqueue.c
new file mode 100644
index 0000000000..b962396291
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/aio_sigqueue.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <aio.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "aio_misc.h"
+
+extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
+
+/* These variables are used quite often in the libc code.  */
+extern pid_t __libc_pid;
+extern uid_t __libc_uid;
+
+
+/* Return any pending signal or wait for one for the given time.  */
+int
+__aio_sigqueue (sig, val)
+     int sig;
+     const union sigval val;
+{
+  siginfo_t info;
+
+  /* We must pass the information about the data in a siginfo_t value.  */
+  info.si_signo = sig;
+  info.si_errno = 0;
+  info.si_code = SI_ASYNCIO;
+
+  if (__libc_pid ==0xf00baa)
+    __libc_pid = __getpid ();
+  info.si_pid = __libc_pid;
+
+  info.si_uid = __libc_uid;
+
+  info.si_value = val;
+
+  return __syscall_rt_sigqueueinfo (__libc_pid, sig, &info);
+}
diff --git a/sysdeps/unix/sysv/linux/arm/bits/mman.h b/sysdeps/unix/sysv/linux/arm/bits/mman.h
new file mode 100644
index 0000000000..fcc0643290
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/bits/mman.h
@@ -0,0 +1,75 @@
+/* Definitions for POSIX memory map interface.  Linux/ARM version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_MMAN_H
+# error "Never include this file directly.  Use <sys/mman.h> instead"
+#endif
+
+/* The following definitions basically come from the kernel headers.
+   But the kernel header is not namespace clean.  */
+
+
+/* Protections are chosen from these bits, OR'd together.  The
+   implementation does not necessarily support PROT_EXEC or PROT_WRITE
+   without PROT_READ.  The only guarantees are that no writing will be
+   allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ	0x1		/* Page can be read.  */
+#define PROT_WRITE	0x2		/* Page can be written.  */
+#define PROT_EXEC	0x4		/* Page can be executed.  */
+#define PROT_NONE	0x0		/* Page can not be accessed.  */
+
+/* Sharing types (must choose one and only one of these).  */
+#define MAP_SHARED	0x01		/* Share changes.  */
+#define MAP_PRIVATE	0x02		/* Changes are private.  */
+#ifdef __USE_MISC
+# define MAP_TYPE	0x0f		/* Mask for type of mapping.  */
+#endif
+
+/* Other flags.  */
+#define MAP_FIXED	0x10		/* Interpret addr exactly.  */
+#ifdef __USE_MISC
+# define MAP_FILE	0
+# define MAP_ANONYMOUS	0x20		/* Don't use a file.  */
+# define MAP_ANON	MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific.  */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN	0x0100		/* Stack-like segment.  */
+# define MAP_DENYWRITE	0x0800		/* ETXTBSY */
+# define MAP_EXECUTABLE	0x1000		/* Mark it as an executable.  */
+# define MAP_LOCKED	0x2000		/* Lock the mapping.  */
+# define MAP_NORESERVE	0x4000		/* Don't check for reservations.  */
+#endif
+
+/* Flags to `msync'.  */
+#define MS_ASYNC	1		/* Sync memory asynchronously.  */
+#define MS_SYNC		4		/* Synchronous memory sync.  */
+#define MS_INVALIDATE	2		/* Invalidate the caches.  */
+
+/* Flags for `mlockall'.  */
+#define MCL_CURRENT	1		/* Lock all currently mapped pages.  */
+#define MCL_FUTURE	2		/* Lock all additions to address
+					   space.  */
+
+/* Flags for `mremap'.  */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE	1
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/local_lim.h b/sysdeps/unix/sysv/linux/bits/local_lim.h
index 7ce423061a..2674aa709e 100644
--- a/sysdeps/unix/sysv/linux/bits/local_lim.h
+++ b/sysdeps/unix/sysv/linux/bits/local_lim.h
@@ -1,5 +1,5 @@
 /* Minimum guaranteed maximum values for system limits.  Linux version.
-   Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,3 +19,7 @@
 
 /* The kernel sources contain a file with all the needed information.  */
 #include <linux/limits.h>
+
+/* Maximum amount by which a process can descrease its asynchronous I/O
+   priority level.  */
+#define AIO_PRIO_DELTA_MAX	20
diff --git a/sysdeps/unix/sysv/linux/bits/posix_opt.h b/sysdeps/unix/sysv/linux/bits/posix_opt.h
index e9f8b7f8f3..5ef6d0563d 100644
--- a/sysdeps/unix/sysv/linux/bits/posix_opt.h
+++ b/sysdeps/unix/sysv/linux/bits/posix_opt.h
@@ -1,5 +1,5 @@
 /* Define POSIX options for Linux.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -67,7 +67,13 @@
 /* Filenames are not silently truncated.  */
 #define	_POSIX_NO_TRUNC	1
 
+/* X/Open realtime support is available.  */
+#define _XOPEN_REALTIME	1
+
 /* XPG4.2 shared memory is supported.  */
 #define	_XOPEN_SHM	1
 
+/* Real-time signals are supported.  */
+#define _POSIX_REALTIME_SIGNALS	1
+
 #endif /* bits/posix_opt.h */
diff --git a/sysdeps/unix/sysv/linux/bits/sigaction.h b/sysdeps/unix/sysv/linux/bits/sigaction.h
index 1806bb2e92..b6637e5205 100644
--- a/sysdeps/unix/sysv/linux/bits/sigaction.h
+++ b/sysdeps/unix/sysv/linux/bits/sigaction.h
@@ -25,7 +25,16 @@
 struct sigaction
   {
     /* Signal handler.  */
-    __sighandler_t sa_handler;
+    union
+      {
+	/* Used if SA_SIGINFO is not set.  */
+	__sighandler_t sa_handler;
+	/* Used if SA_SIGINFO is set.  */
+	void (*sa_sigaction) __P ((int, siginfo_t *, void *));
+      }
+    __sigaction_handler;
+#define sa_handler	__sigaction_handler.sa_handler
+#define sa_sigaction	__sigaction_handler.sa_sigaction
 
     /* Additional set of signals to be blocked.  */
     __sigset_t sa_mask;
@@ -39,17 +48,22 @@ struct sigaction
 
 /* Bits in `sa_flags'.  */
 #define	SA_NOCLDSTOP  1		 /* Don't send SIGCHLD when children stop.  */
-#ifdef __USE_MISC
-# define SA_STACK     0x08000000 /* Use signal stack by using `sa_restorer'. */
+#define SA_SIGINFO    4		 /* Invoke signal-catching function with
+				    three arguments instead of one.  */
+#if defined __USE_UNIX98 || defined __USE_MISC
+# define SA_ONSTACK   0x08000000 /* Use signal stack by using `sa_restorer'. */
 # define SA_RESTART   0x10000000 /* Restart syscall on signal return.  */
-# define SA_INTERRUPT 0x20000000 /* Historical no-op.  */
 # define SA_NODEFER   0x40000000 /* Don't automatically block the signal when
 				    its handler is being executed.  */
 # define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler.  */
+#endif
+#ifdef __USE_MISC
+# define SA_INTERRUPT 0x20000000 /* Historical no-op.  */
 
 /* Some aliases for the SA_ constants.  */
 # define SA_NOMASK    SA_NODEFER
 # define SA_ONESHOT   SA_RESETHAND
+# define SA_STACK     SA_ONSTACK
 #endif
 
 /* Values for the HOW argument to `sigprocmask'.  */
diff --git a/sysdeps/unix/sysv/linux/bits/siginfo.h b/sysdeps/unix/sysv/linux/bits/siginfo.h
new file mode 100644
index 0000000000..42030abc4f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/siginfo.h
@@ -0,0 +1,257 @@
+/* siginfo_t, sigevent and constants.  Linux version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SIGNAL_H
+# error "Never include this file directly.  Use <signal.h> instead"
+#endif
+
+#define SI_MAX_SIZE     128
+#define SI_PAD_SIZE     ((SI_MAX_SIZE / sizeof (int)) - 3)
+
+typedef struct siginfo
+  {
+    int si_signo;		/* Signal number.  */
+    int si_errno;		/* If non-zero, an errno value associated with
+				   this signal, as defined in <errno.h>.  */
+    int si_code;		/* Signal code.  */
+
+    union
+      {
+	int _pad[SI_PAD_SIZE];
+
+	 /* kill().  */
+	struct
+	  {
+	    __pid_t si_pid;	/* Sending process ID.  */
+	    __uid_t si_uid;	/* Real user ID of sending process.  */
+	  } _kill;
+
+	/* POSIX.1b timers.  */
+	struct
+	  {
+	    unsigned int _timer1;
+	    unsigned int _timer2;
+	  } _timer;
+
+	/* POSIX.1b signals.  */
+	struct
+	  {
+	    __pid_t si_pid;	/* Sending process ID.  */
+	    __uid_t si_uid;	/* Real user ID of sending process.  */
+	    sigval_t si_sigval;	/* Signal value.  */
+	  } _rt;
+
+	/* SIGCHLD.  */
+	struct
+	  {
+	    __pid_t si_pid;	/* Which child.  */
+	    int si_status;	/* Exit value or signal.  */
+	    __clock_t si_utime;
+	    __clock_t si_stime;
+	  } _sigchld;
+
+	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
+	struct
+	  {
+	    void *si_addr;	/* Faulting insn/memory ref.  */
+	  } _sigfault;
+
+	/* SIGPOLL.  */
+	struct
+	  {
+	    int si_band;	/* Band event for SIGPOLL.  */
+	    int si_fd;
+	  } _sigpoll;
+      } _sifields;
+  } siginfo_t;
+
+
+/* X/Open requires some more fields with fixed names.  */
+#define si_pid		_sifields._kill.si_pid
+#define si_uid		_sifields._kill.si_uid
+#define si_status	_sifields._sigchld.si_status
+#define si_utime	_sifields._sigchld.si_utime
+#define si_stime	_sifields._sigchld.si_stime
+#define si_value	_sifields._rt.si_sigval
+#define si_int		_sifields._rt.si_sigval.sival_int
+#define si_ptr		_sifields._rt.si_sigval.sival_ptr
+#define si_addr		_sifields._sigfault.si_addr
+#define si_band		_sifields._sigpoll.si_band
+#define si_fd		_sifields._sigpoll.si_fd
+
+
+/* Values for `si_code'.  Positive values are reserved for kernel-generated
+   signals.  */
+enum
+{
+  SI_ASYNCIO = -4,		/* Sent by AIO completion.  */
+#define SI_ASYNCIO	SI_ASYNCIO
+  SI_MESGQ,			/* Sent by real time mesq state change.  */
+#define SI_MESGQ	SI_MESGQ
+  SI_TIMER,			/* Sent by timer expiration.  */
+#define SI_TIMER	SI_TIMER
+  SI_QUEUE,			/* Sent by sigqueue.  */
+#define SI_QUEUE	SI_QUEUE
+  SI_USER			/* Sent by kill, sigsend, raise.  */
+#define SI_USER		SI_USER
+};
+
+
+/* `si_code' values for SIGILL signal.  */
+enum
+{
+  ILL_ILLOPC = 1,		/* Illegal opcode.  */
+#define ILL_ILLOPC	ILL_ILLOPC
+  ILL_ILL_OPN,			/* Illegal operand.  */
+#define ILL_ILLOPN	ILL_ILLOPN
+  ILL_ILLADR,			/* Illegal addressing mode.  */
+#define ILL_ILLADR	ILL_ILLADR
+  ILL_ILLTRP,			/* Illegal trap. */
+#define ILL_ILLTRP	ILL_ILLTRP
+  ILL_PRVOPC,			/* Privileged opcode.  */
+#define ILL_PRVOPC	ILL_PRVOPC
+  ILL_PRVREG,			/* Privileged register.  */
+#define ILL_PRVREG	ILL_PRVREG
+  ILL_COPROC,			/* Coprocessor error.  */
+#define ILL_COPROC	ILL_COPROC
+  ILL_BADSTK			/* Internal stack error.  */
+#define ILL_BADSTK	ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal.  */
+enum
+{
+  FPE_INTDIV = 1,		/* Integer divide by zero.  */
+#define FPE_INTDIV	FPE_INTDIV
+  FPE_INTOVF,			/* Integer overflow.  */
+#define FPE_INTOVF	FPE_INTOVF
+  FPE_FLTDIV,			/* Floating point divide by zero.  */
+#define FPE_FLTDIV	FPE_FLTDIV
+  FPE_FLTOVF,			/* Floating point overflow.  */
+#define FPE_FLTOVF	FPE_FLTOVF
+  FPE_FLTUND,			/* Floating point underflow.  */
+#define FPE_FLTUND	FPE_FLTUND
+  FPE_FLTRES,			/* Floating point inexact result.  */
+#define FPE_FLTRES	FPE_FLTRES
+  FPE_FLTINV,			/* Floating point invalid operation.  */
+#define FPE_FLTINV	FPE_FLTINV
+  FPE_FLTSUB			/* Subscript out of range.  */
+#define FPE_FLTSUB	FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal.  */
+enum
+{
+  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
+#define SEGV_MAPERR	SEGV_MAPERR
+  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
+#define SEGV_ACCERR	SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal.  */
+enum
+{
+  BUS_ADRALN = 1,		/* Invalid address alignment.  */
+#define BUS_ADRALN	BUS_ADRALN
+  BUS_ADRERR,			/* Non-existant physical address.  */
+#define BUS_ADRERR	BUS_ADRERR
+  BUS_OBJERR			/* Object specific hardware error.  */
+#define BUS_OBJERR	BUS_OBJERR
+};
+
+/* `si_code' values for SIGTRAP signal.  */
+enum
+{
+  TRAP_BRKPT = 1,		/* Process breakpoint.  */
+#define TRAP_BRKPT	TRAP_BRKPT
+  TRAP_TRACE			/* Process trace trap.  */
+#define TRAP_TRACE	TRAP_TRACE
+};
+
+/* `si_code' values for SIGCHLD signal.  */
+enum
+{
+  CLD_EXITED = 1,		/* Child has exited.  */
+#define CLD_EXITED	CLD_EXITED
+  CLD_KILLED,			/* Child was killed.  */
+#define CLD_KILLED	CLD_KILLED
+  CLD_DUMPED,			/* Child terminated abnormally.  */
+#define CLD_DUMPED	CLD_DUMPED
+  CLD_TRAPPED,			/* Traced child has trapped.  */
+#define CLD_TRAPPED	CLD_TRAPPED
+  CLD_STOPPED,			/* Child has stopped.  */
+#define CLD_STOPPED	CLD_STOPPED
+  CLD_CONTINUED			/* Stopped child has continued.  */
+#define CLD_CONTINUED	CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal.  */
+enum
+{
+  POLL_IN = 1,			/* Data input available.  */
+#define POLL_IN		POLL_IN
+  POLL_OUT,			/* Output buffers available.  */
+#define POLL_OUT	POLL_OUT
+  POLL_MSG,			/* Input message available.   */
+#define POLL_MSG	POLL_MSG
+  POLL_ERR,			/* I/O error.  */
+#define POLL_ERR	POLL_ERR
+  POLL_PRI,			/* High priority input available.  */
+#define POLL_PRI	POLL_PRI
+  POLL_HUP			/* Device disconnected.  */
+#define POLL_HUP	POLL_HUP
+};
+
+
+/* Structure to transport application-defined values with signals.  */
+#define SIGEV_MAX_SIZE	64
+#define SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE / sizeof (int)) - 3)
+
+typedef struct sigevent
+  {
+    sigval_t sigev_value;
+    int sigev_signo;
+    int sigev_notify;
+
+    union
+      {
+	int _pad[SIGEV_PAD_SIZE];
+
+	struct
+	  {
+	    void (*_function) __P ((sigval_t));	/* Function to start.  */
+	    void *_attribute;			/* Really pthread_attr_t.  */
+	  } _sigev_thread;
+      } _sigev_un;
+  } sigevent_t;
+
+/* POSIX names to access some of the members.  */
+#define sigev_notify_function   _sigev_un._sigev_thread._function
+#define sigev_notify_attributes _sigev_un._sigev_thread._attribute
+
+/* `sigev_notify' values.  */
+enum
+{
+  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
+#define SIGEV_SIGNAL	SIGEV_SIGNAL
+  SIGEV_NONE,			/* Other notification: meaningless.  */
+#define SIGEV_NONE	SIGEV_NONE
+  SIGEV_THREAD			/* Deliver via thread creation.  */
+#define SIGEV_THREAD	SIGEV_THREAD
+};
diff --git a/sysdeps/unix/sysv/linux/bits/signum.h b/sysdeps/unix/sysv/linux/bits/signum.h
index d8a716f2e0..f625f468e9 100644
--- a/sysdeps/unix/sysv/linux/bits/signum.h
+++ b/sysdeps/unix/sysv/linux/bits/signum.h
@@ -1,5 +1,5 @@
 /* Signal number definitions.  Linux version.
-   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -20,9 +20,9 @@
 #ifdef	_SIGNAL_H
 
 /* Fake signal functions.  */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return.  */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action.  */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal.  */
+#define SIG_ERR	((__sighandler_t) -1)		/* Error return.  */
+#define SIG_DFL	((__sighandler_t) 0)		/* Default action.  */
+#define SIG_IGN	((__sighandler_t) 1)		/* Ignore signal.  */
 
 
 /* Signals.  */
@@ -42,7 +42,7 @@
 #define	SIGPIPE		13	/* Broken pipe (POSIX).  */
 #define	SIGALRM		14	/* Alarm clock (POSIX).  */
 #define	SIGTERM		15	/* Termination (ANSI).  */
-#define	SIGSTKFLT	16	/* ??? */
+#define	SIGSTKFLT	16	/* Stack fault.  */
 #define	SIGCLD		SIGCHLD	/* Same as SIGCHLD (System V).  */
 #define	SIGCHLD		17	/* Child status has changed (POSIX).  */
 #define	SIGCONT		18	/* Continue (POSIX).  */
@@ -61,6 +61,15 @@
 #define	SIGPWR		30	/* Power failure restart (System V).  */
 #define SIGUNUSED	31
 
-#define	_NSIG		32	/* Biggest signal number + 1.  */
+#define	_NSIG		64	/* Biggest signal number + 1
+				   (including real-time signals).  */
+
+#define SIGRTMIN        (__libc_current_sigrtmin ())
+#define SIGRTMAX        (__libc_current_sigrtmax ())
+
+/* These are the hard limits of the kernel.  These values should not be
+   used directly at user level.  */
+#define __SIGRTMIN	32
+#define __SIGRTMAX	(_NSIG - 1)
 
 #endif	/* <signal.h> included.  */
diff --git a/sysdeps/unix/sysv/linux/bits/sigset.h b/sysdeps/unix/sysv/linux/bits/sigset.h
index 741ff9ac9d..14f30cbfd8 100644
--- a/sysdeps/unix/sysv/linux/bits/sigset.h
+++ b/sysdeps/unix/sysv/linux/bits/sigset.h
@@ -18,13 +18,13 @@
    Boston, MA 02111-1307, USA.  */
 
 #ifndef	_SIGSET_H_types
-#define	_SIGSET_H_types	1
+# define _SIGSET_H_types	1
 
 typedef int __sig_atomic_t;
 
 /* A `sigset_t' has a bit for each signal.  */
 
-#define _SIGSET_NWORDS	(1024 / (8 * sizeof (unsigned long int)))
+# define _SIGSET_NWORDS	(1024 / (8 * sizeof (unsigned long int)))
 typedef struct
   {
     unsigned long int __val[_SIGSET_NWORDS];
@@ -39,44 +39,44 @@ typedef struct
    trouble can be caused by functions being defined (e.g., any global
    register vars declared later will cause compilation errors).  */
 
-#if !defined (_SIGSET_H_fns) && defined (_SIGNAL_H)
-#define _SIGSET_H_fns 1
+#if !defined _SIGSET_H_fns && defined _SIGNAL_H
+# define _SIGSET_H_fns 1
 
-#ifndef _EXTERN_INLINE
-#define _EXTERN_INLINE extern __inline
-#endif
+# ifndef _EXTERN_INLINE
+#  define _EXTERN_INLINE extern __inline
+# endif
 
 /* Return a mask that includes the bit for SIG only.  */
-#define __sigmask(sig) \
-  (((unsigned long) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
+# define __sigmask(sig) \
+  (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
 
 /* Return the word index for SIG.  */
-#define __sigword(sig)	(((sig) - 1) / (8 * sizeof (unsigned long int)))
+# define __sigword(sig)	(((sig) - 1) / (8 * sizeof (unsigned long int)))
 
-#if defined __GNUC__ && __GNUC__ >= 2
-# define __sigemptyset(set) \
+# if defined __GNUC__ && __GNUC__ >= 2
+#  define __sigemptyset(set) \
   (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
 		    sigset_t *__set = (set);				      \
 		    while (--__cnt >= 0) __set->__val[__cnt] = 0;	      \
 		    0; }))
-# define __sigfillset(set) \
+#  define __sigfillset(set) \
   (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
 		    sigset_t *__set = (set);				      \
 		    while (--__cnt >= 0) __set->__val[__cnt] = ~0UL;	      \
 		    0; }))
 
-# ifdef _GNU_SOURCE
+#  ifdef __USE_GNU
 /* The POSIX does not specify for handling the whole signal set in one
    command.  This is often wanted and so we define three more functions
    here.  */
-# define __sigisemptyset(set) \
+#   define __sigisemptyset(set) \
   (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
 		    const sigset_t *__set = (set);			      \
 		    int __ret = __set->__val[--__cnt];			      \
 		    while (!__ret && --__cnt >= 0)			      \
 			__ret = __set->__val[__cnt];			      \
 		    __ret == 0; }))
-# define __sigandset(dest, left, right) \
+#   define __sigandset(dest, left, right) \
   (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
 		    sigset_t *__dest = (dest);				      \
 		    const sigset_t *__left = (left);			      \
@@ -85,7 +85,7 @@ typedef struct
 		      __dest->__val[__cnt] = (__left->__val[__cnt]	      \
 					      & __right->__val[__cnt]);	      \
 		    0; }))
-# define __sigorset(dest, left, right) \
+#   define __sigorset(dest, left, right) \
   (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
 		    sigset_t *__dest = (dest);				      \
 		    const sigset_t *__left = (left);			      \
@@ -94,8 +94,8 @@ typedef struct
 		      __dest->__val[__cnt] = (__left->__val[__cnt]	      \
 					      | __right->__val[__cnt]);	      \
 		    0; }))
+#  endif
 # endif
-#endif
 
 /* These functions needn't check for a bogus signal number -- error
    checking is done in the non __ versions.  */
@@ -104,7 +104,7 @@ extern int __sigismember (__const __sigset_t *, int);
 extern int __sigaddset (__sigset_t *, int);
 extern int __sigdelset (__sigset_t *, int);
 
-#define __SIGSETFN(NAME, BODY, CONST)					      \
+# define __SIGSETFN(NAME, BODY, CONST)					      \
   _EXTERN_INLINE int							      \
   NAME (CONST __sigset_t *__set, int __sig)				      \
   {									      \
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
index 7f758a52a8..0aec95e219 100644
--- a/sysdeps/unix/sysv/linux/i386/clone.S
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -23,6 +23,7 @@
 #include <sysdep.h>
 #define _ERRNO_H	1
 #include <bits/errno.h>
+#include <asm-syntax.h>
 
 /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
 
@@ -63,6 +64,12 @@ ENTRY(__clone)
 thread_start:
 	subl	%ebp,%ebp	/* terminate the stack frame */
 	call	*%ebx
+#ifdef PIC
+	call	L(here)
+L(here):
+	popl	%ebx
+	addl	$_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ebx
+#endif
 	pushl	%eax
 	call	JUMPTARGET (_exit)
 
diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c
index 3f9d9463a0..99ed694f49 100644
--- a/sysdeps/unix/sysv/linux/i386/sigaction.c
+++ b/sysdeps/unix/sysv/linux/i386/sigaction.c
@@ -28,17 +28,48 @@
 #include <kernel_sigaction.h>
 
 
+extern int __syscall_rt_signal (int, const struct sigaction *,
+				struct sigaction *, size_t);
+
+/* The variable is shared between all wrappers around signal handling
+   functions which have RT equivalents.  It is defined in sigsuspend.c.  */
+extern int __libc_have_rt_sigs;
+
+
 /* If ACT is not NULL, change the action for SIG to *ACT.
    If OACT is not NULL, put the old action for SIG in *OACT.  */
 int
 __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
 {
-  struct kernel_sigaction k_newact, k_oldact;
+  struct old_kernel_sigaction k_newact, k_oldact;
   int result;
 
+  /* First try the RT signals.  */
+  if (__libc_have_rt_sigs)
+    {
+      struct sigaction nact;
+
+      nact.sa_handler = act->sa_handler;
+      memcpy (&nact.sa_mask, &act->sa_mask, sizeof (sigset_t));
+      nact.sa_flags = act->sa_flags;
+
+      nact.sa_restorer = ((act->sa_flags & SA_NOMASK)
+			  ? &&restore_nomask : &&restore);
+
+      /* XXX The size argument hopefully will have to be changed to the
+	 real size of the user-level sigset_t.  */
+      result = __syscall_rt_sigaction (sig, &nact, oact,
+				       _NSIG / (8 * sizeof (long int)));
+
+      if (result >= 0 || errno != ENOSYS)
+	return result;
+
+      __libc_have_rt_sigs = 0;
+    }
+
   if (act)
     {
-      k_newact.sa_handler = act->sa_handler;
+      k_newact.k_sa_handler = act->sa_handler;
       k_newact.sa_mask = act->sa_mask.__val[0];
       k_newact.sa_flags = act->sa_flags;
 
@@ -62,7 +93,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
 
   if (oact)
     {
-      oact->sa_handler = k_oldact.sa_handler;
+      oact->sa_handler = k_oldact.k_sa_handler;
       oact->sa_mask.__val[0] = k_oldact.sa_mask;
       oact->sa_flags = k_oldact.sa_flags;
       oact->sa_restorer = k_oldact.sa_restorer;
diff --git a/sysdeps/unix/sysv/linux/i386/sys/ucontext.h b/sysdeps/unix/sysv/linux/i386/sys/ucontext.h
new file mode 100644
index 0000000000..ccc32b661a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sys/ucontext.h
@@ -0,0 +1,106 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H	1
+
+#include <features.h>
+#include <signal.h>
+
+/* We need the signal context definitions even if they are not used
+   included in <signal.h>.  */
+#include <bits/sigcontext.h>
+
+
+/* Type for general register.  */
+typedef int greg_t;
+
+/* Number of general registers.  */
+#define NGREG	19
+
+/* Container for all general registers.  */
+typedef greg_t gregset_t[NGREG];
+
+/* Number of each register is the `gregset_t' array.  */
+enum
+{
+  GS = 0,
+#define GS	GS
+  FS,
+#define FS	FS
+  ES,
+#define ES	ES
+  DS,
+#define DS	DS
+  EDI,
+#define EDI	EDI
+  ESI,
+#define ESI	ESI
+  EBP,
+#define EBP	EBP
+  ESP,
+#define ESP	ESP
+  EBX,
+#define EBX	EBX
+  EDX,
+#define EDX	EDX
+  ECX,
+#define ECX	ECX
+  EAX,
+#define EAX	EAX
+  TRAPNO,
+#define TRAPNO	TRAPNO
+  ERR,
+#define ERR	ERR
+  EIP,
+#define EIP	EIP
+  CS,
+#define CS	CS
+  EFL,
+#define EFL	EFL
+  UESP,
+#define UESP	UESP
+  SS
+#define SS	SS
+};
+
+/* Structure to describe FPU registers.  */
+typedef struct _fpstate *fpregset_t;
+
+/* Context to describe whole processor state.  */
+typedef struct
+  {
+    gregset_t gregs;
+    /* Due to Linux's history we have to use a pointer here.  The SysV/i386
+       ABI requires a struct with the values.  */
+    fpregset_t fpregs;
+    unsigned long int oldmask;
+    unsigned long int cr2;
+  } mcontext_t;
+
+/* Userlevel context.  */
+typedef struct ucontext
+  {
+    unsigned long int uc_flags;
+    struct ucontext *uc_links;
+    stack_t uc_stack;
+    mcontext_t uc_mcontext;
+    __sigset_t uc_sigmask;
+  } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c
index cebb9c150a..505b8ddcfe 100644
--- a/sysdeps/unix/sysv/linux/init-first.c
+++ b/sysdeps/unix/sysv/linux/init-first.c
@@ -43,7 +43,7 @@ int __libc_argc;
 char **__libc_argv;
 
 /* We often need the PID.  Cache this value.  */
-pid_t __libc_pid;
+pid_t __libc_pid = 0xf00baa;
 
 
 static void
diff --git a/sysdeps/unix/sysv/linux/kernel_sigaction.h b/sysdeps/unix/sysv/linux/kernel_sigaction.h
index a058642d85..e3901cfe5c 100644
--- a/sysdeps/unix/sysv/linux/kernel_sigaction.h
+++ b/sysdeps/unix/sysv/linux/kernel_sigaction.h
@@ -2,8 +2,8 @@
 
 #define HAVE_SA_RESTORER
 
-struct kernel_sigaction {
-	__sighandler_t sa_handler;
+struct old_kernel_sigaction {
+	__sighandler_t k_sa_handler;
 	unsigned long sa_mask;
 	unsigned long sa_flags;
 	void (*sa_restorer) __P ((void));
diff --git a/sysdeps/unix/sysv/linux/netinet/ip.h b/sysdeps/unix/sysv/linux/netinet/ip.h
index bf4e01680b..cb27ebf8aa 100644
--- a/sysdeps/unix/sysv/linux/netinet/ip.h
+++ b/sysdeps/unix/sysv/linux/netinet/ip.h
@@ -31,13 +31,13 @@ struct timestamp
     u_int8_t len;
     u_int8_t ptr;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    u_int8_t flags:4;
-    u_int8_t overflow:4;
+    unsigned int flags:4;
+    unsigned int overflow:4;
 #elif __BYTE_ORDER == __BIG_ENDIAN
-    u_int8_t overflow:4;
-    u_int8_t flags:4;
+    unsigned int overflow:4;
+    unsigned int flags:4;
 #else
-#error	"Please fix <bits/endian.h>"
+# error	"Please fix <bits/endian.h>"
 #endif
     u_int32_t data[9];
   };
@@ -49,14 +49,14 @@ struct ip_options
     u_int8_t srr;
     u_int8_t rr;
     u_int8_t ts;
-    u_int8_t is_setbyuser:1;	/* Set by setsockopt?			*/
-    u_int8_t is_data:1;		/* Options in __data, rather than skb	*/
-    u_int8_t is_strictroute:1; /* Strict source route		*/
-    u_int8_t srr_is_hit:1;	/* Packet destination addr was our one	*/
-    u_int8_t is_changed:1;	/* IP checksum more not valid		*/
-    u_int8_t rr_needaddr:1;	/* Need to record addr of outgoing dev	*/
-    u_int8_t ts_needtime:1;	/* Need to record timestamp		*/
-    u_int8_t ts_needaddr:1;	/* Need to record addr of outgoing dev  */
+    unsigned int is_setbyuser:1;   /* Set by setsockopt?		  */
+    unsigned int is_data:1;	   /* Options in __data, rather than skb  */
+    unsigned int is_strictroute:1; /* Strict source route		  */
+    unsigned int srr_is_hit:1;	   /* Packet destination addr was our one */
+    unsigned int is_changed:1;	   /* IP checksum more not valid	  */
+    unsigned int rr_needaddr:1;	   /* Need to record addr of outgoing dev */
+    unsigned int ts_needtime:1;	   /* Need to record timestamp		  */
+    unsigned int ts_needaddr:1;	   /* Need to record addr of outgoing dev */
     u_int8_t router_alert;
     u_int8_t __pad1;
     u_int8_t __pad2;
@@ -66,13 +66,13 @@ struct ip_options
 struct iphdr
   {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    u_int8_t ihl:4;
-    u_int8_t version:4;
+    unsigned int ihl:4;
+    unsigned int version:4;
 #elif __BYTE_ORDER == __BIG_ENDIAN
-    u_int8_t	version:4;
-    u_int8_t ihl:4;
+    unsigned int version:4;
+    unsigned int ihl:4;
 #else
-#error	"Please fix <bits/endian.h>"
+# error	"Please fix <bits/endian.h>"
 #endif
     u_int8_t tos;
     u_int16_t tot_len;
@@ -133,12 +133,12 @@ struct iphdr
 struct ip
   {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    u_int8_t ip_hl:4;			/* header length */
-    u_int8_t ip_v:4;			/* version */
+    unsigned int ip_hl:4;		/* header length */
+    unsigned int ip_v:4;		/* version */
 #endif
 #if __BYTE_ORDER == __BIG_ENDIAN
-    u_int8_t ip_v:4;			/* version */
-    u_int8_t ip_hl:4;			/* header length */
+    unsigned int ip_v:4;		/* version */
+    unsigned int ip_hl:4;		/* header length */
 #endif
     u_int8_t ip_tos;			/* type of service */
     u_short ip_len;			/* total length */
@@ -163,12 +163,12 @@ struct ip_timestamp
     u_int8_t ipt_len;			/* size of structure (variable) */
     u_int8_t ipt_ptr;			/* index of current entry */
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    u_int8_t ipt_flg:4;			/* flags, see below */
-    u_int8_t ipt_oflw:4;		/* overflow counter */
+    unsigned int ipt_flg:4;		/* flags, see below */
+    unsigned int ipt_oflw:4;		/* overflow counter */
 #endif
 #if __BYTE_ORDER == __BIG_ENDIAN
-    u_int8_t ipt_oflw:4;		/* overflow counter */
-    u_int8_t ipt_flg:4;			/* flags, see below */
+    unsigned int ipt_oflw:4;		/* overflow counter */
+    unsigned int ipt_flg:4;		/* flags, see below */
 #endif
     u_int32_t data[9];
   };
diff --git a/sysdeps/unix/sysv/linux/rt_sigaction.c b/sysdeps/unix/sysv/linux/rt_sigaction.c
new file mode 100644
index 0000000000..77b5b101aa
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rt_sigaction.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__syscall_rt_sigaction (int sig, const struct sigaction *act,
+			struct sigaction *oact, size_t setsize)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/rt_sigprocmask.c b/sysdeps/unix/sysv/linux/rt_sigprocmask.c
new file mode 100644
index 0000000000..0ce2815780
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rt_sigprocmask.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__syscall_rt_sigprocmask (int how, const sigset *set, sigset_t *oset,
+			  size_t setsize)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/rt_sigqueueinfo.c b/sysdeps/unix/sysv/linux/rt_sigqueueinfo.c
new file mode 100644
index 0000000000..ff99e9e555
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rt_sigqueueinfo.c
@@ -0,0 +1,27 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__syscall_rt_sigqueueinfo (pid_t pid, int sig, siginfo_t *uinfo)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/rt_sigreturn.c b/sysdeps/unix/sysv/linux/rt_sigreturn.c
new file mode 100644
index 0000000000..2764309d0d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rt_sigreturn.c
@@ -0,0 +1,27 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__syscall_rt_sigreturn (struct sigcontext *ctx)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/rt_sigsuspend.c b/sysdeps/unix/sysv/linux/rt_sigsuspend.c
new file mode 100644
index 0000000000..59fb5c4bcd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rt_sigsuspend.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__syscall_rt_sigsuspend (const sigset *set, size_t setsize)
+{
+  if (set == NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  __set_errno (ENOSYS);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/rt_sigtimedwait.c b/sysdeps/unix/sysv/linux/rt_sigtimedwait.c
new file mode 100644
index 0000000000..4513026f44
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rt_sigtimedwait.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+
+int
+__syscall_rt_sigtimedwait (const sigset_t *set, siginfo_t *info,
+			   const struct timespec *timeout, size_t setsize)
+{
+  if (set == NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  __set_errno (ENOSYS);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/sigaction.c b/sysdeps/unix/sysv/linux/sigaction.c
index a7b3e07dae..161f1b0529 100644
--- a/sysdeps/unix/sysv/linux/sigaction.c
+++ b/sysdeps/unix/sysv/linux/sigaction.c
@@ -25,6 +25,13 @@
 
 extern int __syscall_sigaction (int, const struct kernel_sigaction *,
 				struct kernel_sigaction *);
+extern int __syscall_rt_signal (int, const struct sigaction *,
+				struct sigaction *, size_t);
+
+/* The variable is shared between all wrappers around signal handling
+   functions which have RT equivalents.  It is defined in sigsuspend.c.  */
+extern int __libc_have_rt_sigs;
+
 
 /* If ACT is not NULL, change the action for SIG to *ACT.
    If OACT is not NULL, put the old action for SIG in *OACT.  */
@@ -34,12 +41,26 @@ __sigaction (sig, act, oact)
      const struct sigaction *act;
      struct sigaction *oact;
 {
-  struct kernel_sigaction k_sigact, k_osigact;
+  struct old_kernel_sigaction k_sigact, k_osigact;
   int error;
 
+  /* First try the RT signals.  */
+  if (__libc_have_rt_sigs)
+    {
+      /* XXX The size argument hopefully will have to be changed to the
+	 real size of the user-level sigset_t.  */
+      int result = __syscall_rt_sigaction (sig, act, oact,
+					   _NSIG / (8 * sizeof (long int)));
+
+      if (result >= 0 || errno != ENOSYS)
+	return result;
+
+      __libc_have_rt_sigs = 0;
+    }
+
   if (act)
     {
-      k_sigact.sa_handler = act->sa_handler;
+      k_sigact.k_sa_handler = act->sa_handler;
       k_sigact.sa_mask = act->sa_mask.__val[0];
       k_sigact.sa_flags = act->sa_flags;
 #ifdef HAVE_SA_RESTORER
@@ -50,7 +71,7 @@ __sigaction (sig, act, oact)
 			       oact ? &k_osigact : 0);
   if (oact && error >= 0)
     {
-      oact->sa_handler = k_osigact.sa_handler;
+      oact->sa_handler = k_osigact.k_sa_handler;
       oact->sa_mask.__val[0] = k_osigact.sa_mask;
       oact->sa_flags = k_osigact.sa_flags;
 #ifdef HAVE_SA_RESTORER
diff --git a/sysdeps/unix/sysv/linux/sigpending.c b/sysdeps/unix/sysv/linux/sigpending.c
new file mode 100644
index 0000000000..7b26bfbf12
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigpending.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+extern int __syscall_sigpending (sigset_t *);
+extern int __syscall_rt_sigpending (sigset_t *, size_t);
+
+
+/* The variable is shared between all wrappers around signal handling
+   functions which have RT equivalents.  It is defined in sigsuspend.c.  */
+extern int __libc_have_rt_sigs;
+
+
+/* Change the set of blocked signals to SET,
+   wait until a signal arrives, and restore the set of blocked signals.  */
+int
+sigpending (set)
+     sigset_t *set;
+{
+  /* First try the RT signals.  */
+  if (__libc_have_rt_sigs)
+    {
+      /* XXX The size argument hopefully will have to be changed to the
+	 real size of the user-level sigset_t.  */
+      int result = __syscall_rt_sigpending (set,
+					    _NSIG / (8 * sizeof (long int)));
+
+      if (result >= 0 || errno != ENOSYS)
+	return result;
+
+      __libc_have_rt_sigs = 0;
+    }
+
+  return __syscall_sigpending (set);
+}
diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c
new file mode 100644
index 0000000000..f436ba8f2c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigprocmask.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+extern int __syscall_sigprocmask (int, const sigset_t *, sigset_t *);
+extern int __syscall_rt_sigprocmask (int, const sigset_t *, sigset_t *,
+				     size_t);
+
+/* The variable is shared between all wrappers around signal handling
+   functions which have RT equivalents.  It is defined in sigsuspend.c.  */
+extern int __libc_have_rt_sigs;
+
+
+/* Get and/or change the set of blocked signals.  */
+int
+__sigprocmask (how, set, oset)
+     int how;
+     const sigset_t *set;
+     sigset_t *oset;
+{
+  /* First try the RT signals.  */
+  if (__libc_have_rt_sigs)
+    {
+      /* XXX The size argument hopefully will have to be changed to the
+	 real size of the user-level sigset_t.  */
+      int result = __syscall_rt_sigprocmask (how, set, oset,
+					     _NSIG / (8 * sizeof (long int)));
+
+      if (result >= 0 || errno != ENOSYS)
+	return result;
+
+      __libc_have_rt_sigs = 0;
+    }
+
+  return __syscall_sigprocmask (how, set, oset);
+}
+weak_alias (__sigprocmask, sigprocmask)
diff --git a/sysdeps/unix/sysv/linux/sigqueue.c b/sysdeps/unix/sysv/linux/sigqueue.c
new file mode 100644
index 0000000000..a88cd88f66
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigqueue.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+#include <unistd.h>
+
+extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
+
+/* These variables are used quite often in the libc code.  */
+extern pid_t __libc_pid;
+extern uid_t __libc_uid;
+
+
+/* Return any pending signal or wait for one for the given time.  */
+int
+__sigqueue (pid, sig, val)
+     pid_t pid;
+     int sig;
+     const union sigval val;
+{
+  siginfo_t info;
+
+  /* We must pass the information about the data in a siginfo_t value.  */
+  info.si_signo = sig;
+  info.si_errno = 0;
+  info.si_code = SI_QUEUE;
+
+  if (__libc_pid ==0xf00baa)
+    __libc_pid = __getpid ();
+  info.si_pid = __libc_pid;
+
+  info.si_uid = __libc_uid;
+
+  info.si_value = val;
+
+  return __syscall_rt_sigqueueinfo (pid, sig, &info);
+}
+weak_alias (__sigwaitinfo, sigwaitinfo)
diff --git a/sysdeps/unix/sysv/linux/sigreturn.c b/sysdeps/unix/sysv/linux/sigreturn.c
new file mode 100644
index 0000000000..e57ac74212
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigreturn.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <signal.h>
+#include <sigcontext.h>
+#include <unistd.h>
+
+extern int __syscall_sigreturn (struct sigcontext *);
+extern int __syscall_rt_sigreturn (struct sigcontext *, size_t);
+
+/* The variable is shared between all wrappers around signal handling
+   functions which have RT equivalents.  It is defined in sigsuspend.c.  */
+extern int __libc_have_rt_sigs;
+
+
+/* Get and/or change the set of blocked signals.  */
+int
+__sigreturn (scp)
+     struct sigcontext *scp;
+{
+  /* First try the RT signals.  */
+  if (__libc_have_rt_sigs)
+    {
+      /* XXX The size argument hopefully will have to be changed to the
+	 real size of the user-level sigset_t.  */
+      int result = __syscall_rt_sigreturn (scp,
+					   _NSIG / (8 * sizeof (long int)));
+
+      if (result >= 0 || errno != ENOSYS)
+	return result;
+
+      __libc_have_rt_sigs = 0;
+    }
+
+  return __syscall_sigreturn (scp);
+}
+weak_alias (__sigprocmask, sigprocmask)
diff --git a/sysdeps/unix/sysv/linux/sigsuspend.c b/sysdeps/unix/sysv/linux/sigsuspend.c
index 723f7629ec..faea1c35e1 100644
--- a/sysdeps/unix/sysv/linux/sigsuspend.c
+++ b/sysdeps/unix/sysv/linux/sigsuspend.c
@@ -16,11 +16,18 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <errno.h>
 #include <signal.h>
-#include <stddef.h>
 #include <unistd.h>
 
 extern int __syscall_sigsuspend (int, unsigned long int, unsigned long int);
+extern int __syscall_rt_sigsuspend (sigset_t *, size_t);
+
+
+/* The variable is shared between all wrappers around signal handling
+   functions which have RT equivalents.  */
+int __libc_have_rt_sigs = 1;
+
 
 /* Change the set of blocked signals to SET,
    wait until a signal arrives, and restore the set of blocked signals.  */
@@ -28,10 +35,20 @@ int
 __sigsuspend (set)
      const sigset_t *set;
 {
-  /* XXX This will have to be changed once the kernel knows about
-     larger sigsets.  */
-  unsigned long int word = set->__val[0];
+  /* First try the RT signals.  */
+  if (__libc_have_rt_sigs)
+    {
+      /* XXX The size argument hopefully will have to be changed to the
+	 real size of the user-level sigset_t.  */
+      int result = __syscall_rt_sigsuspend (set,
+					    _NSIG / (8 * sizeof (long int)));
+
+      if (result >= 0 || errno != ENOSYS)
+	return result;
+
+      __libc_have_rt_sigs = 0;
+    }
 
-  return __syscall_sigsuspend (0, 0, word);
+  return __syscall_sigsuspend (0, 0, set->__val[0]);
 }
 weak_alias (__sigsuspend, sigsuspend)
diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
new file mode 100644
index 0000000000..b022ec35f7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+
+extern int __syscall_rt_sigtimedwait (const sigset_t *, siginfo_t *,
+				      const struct timespec *, size_t);
+
+
+/* Return any pending signal or wait for one for the given time.  */
+int
+__sigtimedwait (set, info, timeout)
+     const sigset_t *set;
+     siginfo_t *info;
+     const struct timespec *timeout;
+{
+  /* XXX The size argument hopefully will have to be changed to the
+     real size of the user-level sigset_t.  */
+  return __syscall_rt_sigtimedwait (set, info, timeout,
+				    _NSIG / (8 * sizeof (long int)));
+}
+weak_alias (__sigtimedwait, sigtimedwait)
diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c
new file mode 100644
index 0000000000..ac98fb46e0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+
+extern int __syscall_rt_sigtimedwait (const sigset_t *, siginfo_t *,
+				      const struct timespec *, size_t);
+
+
+/* Return any pending signal or wait for one for the given time.  */
+int
+__sigwaitinfo (set, info)
+     const sigset_t *set;
+     siginfo_t *info;
+{
+  /* XXX The size argument hopefully will have to be changed to the
+     real size of the user-level sigset_t.  */
+  return __syscall_rt_sigtimedwait (set, info, NULL,
+				    _NSIG / (8 * sizeof (long int)));
+}
+weak_alias (__sigwaitinfo, sigwaitinfo)
diff --git a/sysdeps/unix/sysv/linux/sys/pci.h b/sysdeps/unix/sysv/linux/sys/pci.h
new file mode 100644
index 0000000000..03d9b9a768
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/pci.h
@@ -0,0 +1,25 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_PCI_H
+#define _SYS_PCI_H	1
+
+/* We use the constants from the kernel.  */
+#include <asm/pci.h>
+
+#endif /* sys/pci.h */
diff --git a/sysdeps/unix/sysv/linux/sys/timex.h b/sysdeps/unix/sysv/linux/sys/timex.h
index 5e0f14cee7..3108ba43da 100644
--- a/sysdeps/unix/sysv/linux/sys/timex.h
+++ b/sysdeps/unix/sysv/linux/sys/timex.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -17,16 +17,16 @@
    Boston, MA 02111-1307, USA.  */
 
 #ifndef	_SYS_TIMEX_H
-
 #define	_SYS_TIMEX_H	1
-#include <features.h>
 
+#include <features.h>
 #include <sys/time.h>
 #include <linux/timex.h>
 
 __BEGIN_DECLS
 
 extern int __adjtimex __P ((struct timex *__ntx));
+extern int adjtimex __P ((struct timex *__ntx));
 
 __END_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/sys/ultrasound.h b/sysdeps/unix/sysv/linux/sys/ultrasound.h
new file mode 100644
index 0000000000..a65c385bc0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/ultrasound.h
@@ -0,0 +1 @@
+#include <linux/ultrasound.h>
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index a1fe445739..08dceca3f6 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -35,6 +35,13 @@ pipe		-	pipe		1	__pipe		pipe
 prctl		EXTRA	prctl		5	prctl
 query_module	EXTRA	query_module	5	query_module
 quotactl	EXTRA	quotactl	4	quotactl
+rt_sigaction	sigaction	rt_sigaction	4	__syscall_rt_sigaction
+rt_sigpending	sigpendding	rt_sigpending	2	__syscall_rt_sigpending
+rt_sigprocmask	sigprocmask	rt_sigprocmask	4	__syscall_rt_sigprocmask
+rt_sigqueueinfo	sigqueue	rt_sigqueueinfo	3	__syscall_rt_sigqueueinfo
+rt_sigreturn	sigreturn	rt_sigreturn	1	__syscall_rt_sigreturn
+rt_sigsuspend	sigsuspend	rt_sigsuspend	2	__syscall_rt_sigsuspend
+rt_sigtimedwait	sigtimedwait	rt_sigtimedwait	4	__syscall_rt_sigtimedwait
 s_getdents	EXTRA	getdents	3	__getdents
 s_getpriority	getpriority getpriority	2	__syscall_getpriority
 s_poll		poll	poll		3	__syscall_poll
@@ -43,6 +50,9 @@ s_ptrace	ptrace	ptrace		4	__syscall_ptrace
 s_pwrite64	EXTRA	pwrite		5	__syscall_pwrite64
 s_reboot	EXTRA	reboot		3	__syscall_reboot
 s_sigaction	sigaction sigaction	3	__syscall_sigaction
+s_sigpending	EXTRA	sigpending	1	__syscall_sigpending
+s_sigprocmask	EXTRA	sigprocmask	3	__syscall_sigprocmask
+s_sigreturn	sigreturn sigreturn	1	__syscall_sigreturn
 s_sigsuspend	sigsuspend sigsuspend	3	__syscall_sigsuspend
 s_sysctl	sysctl	_sysctl		1	__syscall__sysctl
 s_ustat		ustat	ustat		2	__syscall_ustat
@@ -60,9 +70,6 @@ setfsuid	EXTRA	setfsuid	1	setfsuid
 setpgid		-	setpgid		2	__setpgid	setpgid
 setresgid	EXTRA	setresgid	3	setresgid
 setresuid	EXTRA	setresuid	3	setresuid
-sigpending	-	sigpending	1	sigpending
-sigprocmask	-	sigprocmask	3	__sigprocmask	sigprocmask
-sigreturn	-	sigreturn	1	__sigreturn	sigreturn
 sys_fstat	fxstat	fstat		2	__syscall_fstat
 sys_lstat	lxstat	lstat		2	__syscall_lstat
 sys_mknod	xmknod	mknod		3	__syscall_mknod
diff --git a/sysdeps/unix/sysv/linux/testrtsig.h b/sysdeps/unix/sysv/linux/testrtsig.h
new file mode 100644
index 0000000000..7256d71227
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/testrtsig.h
@@ -0,0 +1,30 @@
+/* Test whether RT signals are really available.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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 <string.h>
+#include <sys/utsname.h>
+
+int
+kernel_has_rtsig (void)
+{
+  struct utsname name;
+
+  return uname (&name) < 0 || __strverscmp (name.release, "2.1.70") >= 0;
+}
diff --git a/sysdeps/wordsize-32/bits/environments.h b/sysdeps/wordsize-32/bits/environments.h
new file mode 100644
index 0000000000..40a53ab236
--- /dev/null
+++ b/sysdeps/wordsize-32/bits/environments.h
@@ -0,0 +1,32 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_ENVIRONMENTS_H
+#define _BITS_ENVIRONMENTS_H	1
+
+/* By default we have 32-bit wide `int', `long int', pointers and `off_t'.  */
+#define _XBS5_ILP32_OFF32	1
+
+/* We optionally provide an environment with the above size but an 64-bit
+   side `off_t'.  Therefore we don't define _XBS5_ILP32_OFFBIG.  */
+
+/* We can never provide environments with 64-bit wide pointers.  */
+#define _XBS5_LP64_OFF64	-1
+#define _XBS5_LPBIG_OFFBIG	-1
+
+#endif /* bits/environments.h */
diff --git a/sysdeps/wordsize-64/bits/environments.h b/sysdeps/wordsize-64/bits/environments.h
new file mode 100644
index 0000000000..af2d212618
--- /dev/null
+++ b/sysdeps/wordsize-64/bits/environments.h
@@ -0,0 +1,30 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_ENVIRONMENTS_H
+#define _BITS_ENVIRONMENTS_H	1
+
+/* We can never provide environments with 64-bit wide pointers.  */
+#define _XBS5_ILP32_OFF32	-1
+#define _XBS5_ILP32_OFFBIG	-1
+
+/* By default we have 64-bit wide `int', `long int', pointers and `off_t'.  */
+#define _XBS5_LP64_OFF32	1
+#define _XBS5_LPBIG_OFFBIG	1
+
+#endif /* bits/environments.h */