Update. cvs/libc-ud-971204
authorUlrich Drepper <drepper@redhat.com>
Thu, 4 Dec 1997 00:12:34 +0000 (00:12 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 4 Dec 1997 00:12:34 +0000 (00:12 +0000)
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.

128 files changed:
.cvsignore
BUGS
ChangeLog
FAQ
Makeconfig
Makefile
NEWS
bits/confname.h
bits/siginfo.h [new file with mode: 0644]
bits/utsname.h
elf/dl-profile.c
grp/initgroups.c
inet/arpa/inet.h
libc.map
math/Makefile
math/libm-test.c
posix/Makefile
posix/confstr.c
posix/getopt.c
posix/getopt_init.c
posix/sys/wait.h
posix/unistd.h
resolv/inet_addr.c
resolv/inet_neta.c
rt/Makefile [new file with mode: 0644]
rt/aio.h [new file with mode: 0644]
rt/aio_cancel.c [new file with mode: 0644]
rt/aio_error.c [new file with mode: 0644]
rt/aio_fsync.c [new file with mode: 0644]
rt/aio_misc.c [new file with mode: 0644]
rt/aio_misc.h [new file with mode: 0644]
rt/aio_read.c [new file with mode: 0644]
rt/aio_read64.c [new file with mode: 0644]
rt/aio_return.c [new file with mode: 0644]
rt/aio_suspend.c [new file with mode: 0644]
rt/aio_write.c [new file with mode: 0644]
rt/aio_write64.c [new file with mode: 0644]
rt/lio_listio.c [new file with mode: 0644]
rt/lio_listio64.c [new file with mode: 0644]
shlib-versions
signal/Makefile
signal/allocrtsig.c [new file with mode: 0644]
signal/signal.h
stdio-common/tmpfile64.c
stdio/stdio.h
string/string.h
string/strverscmp.c
sysdeps/arm/__longjmp.S
sysdeps/arm/setjmp.S
sysdeps/generic/Makefile
sysdeps/generic/aio_sigqueue.c [new file with mode: 0644]
sysdeps/generic/bits/confname.h
sysdeps/generic/bits/siginfo.h [new file with mode: 0644]
sysdeps/generic/bits/utsname.h
sysdeps/generic/dl-sysdep.c
sysdeps/generic/enbl-secure.c
sysdeps/generic/sigqueue.c [new file with mode: 0644]
sysdeps/generic/sigtimedwait.c [new file with mode: 0644]
sysdeps/generic/sigwaitinfo.c [new file with mode: 0644]
sysdeps/generic/testrtsig.h [new file with mode: 0644]
sysdeps/i386/Makefile
sysdeps/i386/sys/ucontext.h
sysdeps/libm-ieee754/s_csqrt.c
sysdeps/libm-ieee754/s_csqrtf.c
sysdeps/libm-ieee754/s_csqrtl.c
sysdeps/m68k/fpu/e_acos.c
sysdeps/m68k/fpu/e_atan2.c
sysdeps/m68k/fpu/e_fmod.c
sysdeps/m68k/fpu/e_pow.c
sysdeps/m68k/fpu/e_scalb.c
sysdeps/m68k/fpu/k_cos.c
sysdeps/m68k/fpu/k_sin.c
sysdeps/m68k/fpu/k_tan.c
sysdeps/m68k/fpu/s_atan.c
sysdeps/m68k/fpu/s_ccos.c
sysdeps/m68k/fpu/s_ccosh.c
sysdeps/m68k/fpu/s_cexp.c
sysdeps/m68k/fpu/s_csin.c
sysdeps/m68k/fpu/s_csinh.c
sysdeps/m68k/fpu/s_frexp.c
sysdeps/m68k/fpu/s_ilogb.c
sysdeps/m68k/fpu/s_isinf.c
sysdeps/m68k/fpu/s_llrint.c
sysdeps/m68k/fpu/s_llrintf.c
sysdeps/m68k/fpu/s_llrintl.c
sysdeps/m68k/fpu/s_lrint.c
sysdeps/m68k/fpu/s_modf.c
sysdeps/m68k/fpu/s_remquo.c
sysdeps/m68k/fpu/s_scalbn.c
sysdeps/m68k/fpu/s_sincos.c
sysdeps/mach/hurd/dl-sysdep.c
sysdeps/unix/sysv/linux/Dist
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/aio_sigqueue.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/arm/bits/mman.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/bits/local_lim.h
sysdeps/unix/sysv/linux/bits/posix_opt.h
sysdeps/unix/sysv/linux/bits/sigaction.h
sysdeps/unix/sysv/linux/bits/siginfo.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/bits/signum.h
sysdeps/unix/sysv/linux/bits/sigset.h
sysdeps/unix/sysv/linux/i386/clone.S
sysdeps/unix/sysv/linux/i386/sigaction.c
sysdeps/unix/sysv/linux/i386/sys/ucontext.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/init-first.c
sysdeps/unix/sysv/linux/kernel_sigaction.h
sysdeps/unix/sysv/linux/netinet/ip.h
sysdeps/unix/sysv/linux/rt_sigaction.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/rt_sigprocmask.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/rt_sigqueueinfo.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/rt_sigreturn.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/rt_sigsuspend.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/rt_sigtimedwait.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sigaction.c
sysdeps/unix/sysv/linux/sigpending.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sigprocmask.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sigqueue.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sigreturn.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sigsuspend.c
sysdeps/unix/sysv/linux/sigtimedwait.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sigwaitinfo.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sys/pci.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sys/timex.h
sysdeps/unix/sysv/linux/sys/ultrasound.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/syscalls.list
sysdeps/unix/sysv/linux/testrtsig.h [new file with mode: 0644]
sysdeps/wordsize-32/bits/environments.h [new file with mode: 0644]
sysdeps/wordsize-64/bits/environments.h [new file with mode: 0644]

index e724ae9d55023cd5760644ea4c615528937ad1a4..7654da865a566b1a21c92206e602d551dd886984 100644 (file)
@@ -20,7 +20,6 @@ docs
 
 crypt
 linuxthreads
-localedata
 secure_rpc
 
 aio
diff --git a/BUGS b/BUGS
index f4b60398ede4f29b622f37eabb36a671ecd007bb..3a0b52397b3648b03891b5296f40768cfa1b7a54 100644 (file)
--- 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.
 
index bd36132a93f668e8a996d4d43f03310c579b38ea..d26d6448f8c4c056ca5fb374361f4202d071ab93 100644 (file)
--- 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 c555488f4f006a3d941bf00f420c628ae0f20c42..38023476e8a83d9e773e6db616fb2db038bc8981 100644 (file)
--- 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().
index ba777880bfb95c63f4058424ec16b0c73b640e88..4d816a0815da8fff3d4783fc7043d9f4963c3b7e 100644 (file)
@@ -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
index 559c968858781b67cd39da5bbd4c489db962953b..90ba29b76d2e75cf899b6b85ecf7c09e9bc0ed95 100644 (file)
--- 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 f616e82fda8aa39421ac6d43fa42220376bf91ec..71159014b036db15537f72c1ded91b8b5ef8387d 100644 (file)
--- 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.
 \f
 Version 2.0.5
 
index 3991fb1df4f9f2b81f8666e8fc1d3faf789bd558..1b75d6e5b527ce12c4f8a704ea74327ff5186dfa 100644 (file)
@@ -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 (file)
index 0000000..35d9d69
--- /dev/null
@@ -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
+};
index ea3f163cefbc2fc4ece681a6ced5c6b4a81c9a47..cd05db1438d0780bc3b80982d9bd8af2b62a4e62 100644 (file)
@@ -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
 
index f67b5d08b539b7b5a3b12f239e41006eb449ec1b..40c475730792033ef4109ad3256ca9099c446365 100644 (file)
@@ -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
index a659f0d3ae478409672594371476485476577d5b..2ca90ab18d1d269ab37d0cfca1dbd7ee61c3f37e 100644 (file)
@@ -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
    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 ();
 
index d89612f4f98f36b9d334e163b2da06babce4e3aa..e34c4726ab52a1573931fdb4cc4e0913b042f87a 100644 (file)
@@ -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));
index 81954cbb4981807c2aa9308e9e1174dccbb89f09..a4b880b52b43e91f88960875deb32ebc93c174e1 100644 (file)
--- 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;
index 174170d99d7ecfa7b1bbd403d00891288c488742..d52de78c3dda4c67442036beb516859a29d6f04b 100644 (file)
@@ -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)
index a4b31a69293a4a8d7dad8535bc1f39d6e4c83e4a..c9b3b4d06e387520dabc2955e321a5b5bfbbaab5 100644 (file)
 
 /* "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));
 }
 
 
index b7050867e42205f024ac22f18daf6e0a4b435fa8..3fbacdc9184370b94b918d96a6258e4478c5b438 100644 (file)
@@ -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
index 3fabf1a883bdc798b0bb4fb949b645a8fd811f0b..c2b12dfd337179d3cd990ff3b529fc277a8b1ff5 100644 (file)
@@ -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:
index 83111213851c977ba2608c10a4ed47ccc167274c..31999258284fd93c36790315559376fc9bfffb1e 100644 (file)
 #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.  */
index 02165ee733b806f8ed3f227e08fd67a4c87569a4..6619f2522b6262e718f8a2a04eb018d71e6aeaf8 100644 (file)
@@ -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.  */
index bc2298f667edb26893b41540569872a8bfa17763..4774885ecf7489b8c733b038794578a0ed501789 100644 (file)
@@ -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
 
index f14e02d02b7a5c3ef3d2ebd7e153475502690d9c..2fbdae5652b2eb21f87cc2442f1b9b32fd734057 100644 (file)
@@ -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.  */
index 3452672a0a776e92b1237aaa295181052718c4c1..7e38af223f3cf9f1fca5ef0505e6a654f55fc2da 100644 (file)
@@ -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;
 {
index 324c01b696c43410ac10b3351b6516383e0438b8..5633ed124f606c4f1c390e3ed251c1e86fa3ab96 100644 (file)
@@ -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 (file)
index 0000000..4eb9dfc
--- /dev/null
@@ -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 (file)
index 0000000..561776c
--- /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 (file)
index 0000000..f2d9389
--- /dev/null
@@ -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 (file)
index 0000000..a051e94
--- /dev/null
@@ -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 (file)
index 0000000..6daaca1
--- /dev/null
@@ -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 (file)
index 0000000..e4bb12c
--- /dev/null
@@ -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 (file)
index 0000000..c2eb9fc
--- /dev/null
@@ -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 (file)
index 0000000..8286ba9
--- /dev/null
@@ -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 (file)
index 0000000..bf808fb
--- /dev/null
@@ -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 (file)
index 0000000..304e1c9
--- /dev/null
@@ -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 (file)
index 0000000..75bf9ba
--- /dev/null
@@ -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 (file)
index 0000000..80b827c
--- /dev/null
@@ -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 (file)
index 0000000..477ce2c
--- /dev/null
@@ -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 (file)
index 0000000..73df5c2
--- /dev/null
@@ -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 (file)
index 0000000..b17e9ed
--- /dev/null
@@ -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;
+}
index d24a4b010c83a2e16f0ebb546075001a83888f90..3c221d7c99a0cee644f3acf1d21b7d0c8a907aef 100644 (file)
@@ -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
index e35fb12345f74f12457869ed347d81a5483941d2..29aeea5f2b56c480a6aa62cb9da0a4ab85048b58 100644 (file)
@@ -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 (file)
index 0000000..678bc8b
--- /dev/null
@@ -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
+}
index 5fb4bc2a1421ba37807d29da9c9c76bdb49ea337..8691b6880e736e31c81e038b06950bd1a5eef241 100644 (file)
@@ -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  */
index 67d4bd829101cfd305f53d733d84ab445f4c071a..5a6e3238fc786a75a79be595550f84679017ebfa 100644 (file)
@@ -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>
 
 
index 80132879de723572ccbf76cf6c699403a8e884f9..2631d83e43c057422fe1cf183f764014fb143768 100644 (file)
@@ -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));
 
index 8bf4a870982fe8912ff531b7d8564b3eb86d9364..39d1d61193d788749e2738d414a2f15671aed482 100644 (file)
@@ -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.  */
index 815073ecbf1453fd36835cbd6c2a37be8a898ea0..39dfc61a9bedb1368168abfc809af222e8342de5 100644 (file)
@@ -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)
index b027103d605ccf0676158a5af6703d17a3018f27..a2042f554303c7aa92208caec95a78d84b6c7712 100644 (file)
@@ -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)
index 8f99e4fcb430f36ace6529793cd4ba6d24f5ef18..08cd0d254e784bea26684ac342740bd420f1e34a 100644 (file)
@@ -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.  */
index 2f6a8f4333d41973782d4f6e451804ce075861cd..4d6c60447a9da51269715edd915affdc5a77a59e 100644 (file)
@@ -33,6 +33,7 @@ endif
 \f
 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 (file)
index 0000000..0a871e2
--- /dev/null
@@ -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>
index 3991fb1df4f9f2b81f8666e8fc1d3faf789bd558..1b75d6e5b527ce12c4f8a704ea74327ff5186dfa 100644 (file)
@@ -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 (file)
index 0000000..35d9d69
--- /dev/null
@@ -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
+};
index ea3f163cefbc2fc4ece681a6ced5c6b4a81c9a47..cd05db1438d0780bc3b80982d9bd8af2b62a4e62 100644 (file)
@@ -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
 
index 7ee3002314a86ba61bab824137f18992139f8fb8..b71ad54e55da793b9056ac139915ba7248e4a557 100644 (file)
@@ -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)
index fdf6f154f6663902446c729c610960b386729230..8e1327c878c4b7a858abb49cb5c4070a7573d820 100644 (file)
 /* 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 (file)
index 0000000..c6af1d7
--- /dev/null
@@ -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 (file)
index 0000000..4f94977
--- /dev/null
@@ -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 (file)
index 0000000..49014e9
--- /dev/null
@@ -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 (file)
index 0000000..25eb488
--- /dev/null
@@ -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;
+}
index b97f95f6a83683a1fb1fc38ec599944272c5fe6a..9860444b8547effdc5c3e753c7285759a0e6538d 100644 (file)
@@ -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
index 17b6b6c76bb8382c882c7312100f1826709cb13b..68597c9c09e77c342c4133f4f60be8641578c965 100644 (file)
@@ -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
index c5c609bd8c09d44fee88e41d7ed203418f099b3f..cda23c702d7f7e5e9bee457195c27b46e7af92fb 100644 (file)
@@ -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
        }
     }
 
index 2289045cfdce689f710fe5b73372941216ec3177..5fdf2c1d6604823a3fb39ecc3d8eb3f6273763d0 100644 (file)
@@ -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
        }
     }
 
index 3de7310c73d76f2ed56eeeee54770e2f971bfe80..b7727099475801b94e852d353458bfbb0a6cca45 100644 (file)
@@ -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
        }
     }
 
index 9c2d91f27144682039d9b1f7cdae1d2bc662d3e0..80803ff80f33cedd54a5045727d41394a92e6c3f 100644 (file)
@@ -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"
 
index d23d4f90d1d53175552c012f02db50b831fb0def..7b275b4048fe07d549c744b23bbc3e12b3e01a8c 100644 (file)
@@ -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"
 
index 505650a531400c2a84d6d8ef0510bc7f845e5fae..9e59a433024a32ca7f7c0764ce1ae321413107bc 100644 (file)
@@ -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"
 
index c36b64316ed516ffc2d975d8c912932e96e3eeca..ee95a393950926d6f0ad8e2703a42761a124f43f 100644 (file)
@@ -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"
 
index 93b44ff1309dd2c899090444b53d9e8952335a2a..ef1724b036a1f3fd111c2709dc54623c430ad917 100644 (file)
@@ -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
index 5b263ec6ae80a36d228eb3418efd64526f33cfae..85f744f984bc119060110a2d7a1b06732fb3945f 100644 (file)
@@ -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"
 
index 41de73fde7068087b77040a20c102ff708735e6c..05cdceedc8545fa40fa52e7efcc0a48cb81d2001 100644 (file)
@@ -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"
 
index 7f87e09e002036724fd36f77736b648478d47982..09e5ac83bcf0fc7acc17a161e6ae7ccd90b44371 100644 (file)
@@ -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"
 
index e6b676ba58491815753f1457a92b17ecd96da86e..29f2eca77d9d8d72dfaf32ed6ef9674caafb25e0 100644 (file)
@@ -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
index 095aa9803fd4943c5778d06b09d81b327f035a45..fbd5ef53888dd5e810caa7b3b70fcf98f704b2c3 100644 (file)
@@ -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>
 
index 3d560b30936ad975f3e3256c8e9b108ce404f9e3..af751430de123288fe014f9f637ac4e37c779146 100644 (file)
@@ -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>
 
index da28ebb4d3335b0725682919bf4408892dfc8ba0..fcf87ed687cee981be35d05dd22bbc62a19389b8 100644 (file)
@@ -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>
 
index ae456d3b912c4caf1b5b8c0529c47ba3009444a5..72214c4cffeba3647e58939751b136a1f364253e 100644 (file)
@@ -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>
 
index c95f9dc523c7085855e45636cfd831d797ab65e3..e829f4d3aee18a0f3e7c1da0e1f35ab84c3243c4 100644 (file)
@@ -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>
 
index 4280fcc50bfbdd45103e20cbd4e78c8bd12741c0..61e3298e976afeff43c5cbc4f45ce70af7a3adad 100644 (file)
@@ -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
index aebcaa16ba0c6609017b9a350410d467e4107050..ef90946f599fec18c1034b73ae460387e3d97cf1 100644 (file)
@@ -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
index d8cafdbb0ce819efbb2b2288a7edfe200f13962f..03dc26dc609804aa3130e35ea9aa7414ddee4cab 100644 (file)
@@ -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
index 37b6f63278e16c2084ba27f953e6dc14b79c05c6..423939aa0b6d93377f1f2887cf78dc9c5022f55f 100644 (file)
@@ -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"
 
index 4d06ae2651621c02cc4203671a59ed3fa50ac3d9..0cd12c9920cb1d88d489b392739b8e7d8837275d 100644 (file)
@@ -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"
 
index 14a815fd1a8a33ae844e02ed0f9e9faefcc42c6c..6f63e0bcd145ee09445d5f18525efd1cb40ad9b4 100644 (file)
@@ -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"
 
index 7747057f1a3a80c0603f9f0e50b335d45f648b14..89e9dba9cf6953532d5c9698892d396dfe951308 100644 (file)
@@ -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
index b9867df47547ceb200ae1d11ae606abf16e3ff04..6c2449aa567d563a5e26fc3bc1fe6336fdcdf60c 100644 (file)
@@ -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
index 7607fee78225782ffcea3e71bdec189d6ae16f22..10be1aec6d9a77e8ee1bacf2587a8674f4b950fa 100644 (file)
@@ -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
index 12b737a5e9f2a0e1a041186e276ae10fda473e33..c151b2a0efdc7a3fd6af34d0d098bb923bcd4655 100644 (file)
@@ -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
index dda42e277563d5f2f21f69dd60a963c23168e24d..8d84ece380d3a8f625d08556506d66b88eba6bcb 100644 (file)
@@ -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
index 88918c517f85d2c0c5756c34ccd7cfbeea70a558..befd1120b490921bc98bc02baeb2428342db6e0a 100644 (file)
@@ -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 &&
index 340f8c641be825cd257035b12a714dacb46f9da5..fa95317ec96043a73e194ae49980e3caf7c43f16 100644 (file)
@@ -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
index 253bc26e9489958df8e6155dad260e70c0f6d8c5..ffea9ef4bb0fca87815e4bbec09628183c462a50 100644 (file)
@@ -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 (file)
index 0000000..b962396
--- /dev/null
@@ -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 (file)
index 0000000..fcc0643
--- /dev/null
@@ -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
index 7ce423061ac9780a39db677302b7233f6a787abc..2674aa709e5e745b5615bc76ae4e0ceb4979b367 100644 (file)
@@ -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
index e9f8b7f8f36ebf0f5275f89f76f8b777001ef2c6..5ef6d0563d5583651d6ace41df872a12178f2d89 100644 (file)
@@ -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
 /* 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 */
index 1806bb2e92545ca917b57270add7fea1e31c2b48..b6637e5205efb51cfdea4eb63aae07fd6737f7ba 100644 (file)
 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 (file)
index 0000000..42030ab
--- /dev/null
@@ -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
+};
index d8a716f2e0f0cc9fc3c36a84b6f2be9fd5e2c1bf..f625f468e95868d4b557dee2554f0212646c2f66 100644 (file)
@@ -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).  */
 #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.  */
index 741ff9ac9d9e847be3a06fd34d963d2abea85cfa..14f30cbfd8f8788f9487c74f70a2b04ca3984e60 100644 (file)
    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)                                  \
   {                                                                          \
index 7f758a52a8fb5e575a396487a8fae3e2ee771eda..0aec95e219b2d9526e1b377f4c551cbbf4458c14 100644 (file)
@@ -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)
 
index 3f9d9463a0adc86c1a2a2894dc5b444a2719516f..99ed694f499bb6a9cb1aafe17869f548f315b6bc 100644 (file)
 #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 (file)
index 0000000..ccc32b6
--- /dev/null
@@ -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 */
index cebb9c150a7df24ca767dfe4cbd4d17174618e41..505b8ddcfef627f9b2dfbb5bbbdd3d5d16fd7828 100644 (file)
@@ -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
index a058642d85181d892b76e3203f481cdb89a998f6..e3901cfe5c72aba4128d3238232c7d00f72260f9 100644 (file)
@@ -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));
index bf4e01680b4ece68fb52efa5b2d1cd53aeb10f29..cb27ebf8aa5c033c03d09d7763f1db73867cf050 100644 (file)
@@ -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 (file)
index 0000000..77b5b10
--- /dev/null
@@ -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 (file)
index 0000000..0ce2815
--- /dev/null
@@ -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 (file)
index 0000000..ff99e9e
--- /dev/null
@@ -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 (file)
index 0000000..2764309
--- /dev/null
@@ -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 (file)
index 0000000..59fb5c4
--- /dev/null
@@ -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 (file)
index 0000000..4513026
--- /dev/null
@@ -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;
+}
index a7b3e07daefa9163d3883f856bd38f35b54b7391..161f1b0529c912834d21ef305cdb0dbfc7755cfe 100644 (file)
 
 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 (file)
index 0000000..7b26bfb
--- /dev/null
@@ -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 (file)
index 0000000..f436ba8
--- /dev/null
@@ -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 (file)
index 0000000..a88cd88
--- /dev/null
@@ -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 (file)
index 0000000..e57ac74
--- /dev/null
@@ -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)
index 723f7629ec527d980b576118baa124d612f61512..faea1c35e14b30afbfc77cf5c0004ed5973cbf57 100644 (file)
    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 (file)
index 0000000..b022ec3
--- /dev/null
@@ -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 (file)
index 0000000..ac98fb4
--- /dev/null
@@ -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 (file)
index 0000000..03d9b9a
--- /dev/null
@@ -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 */
index 5e0f14cee7c7cfcbb1b69092dd21c72339652f1b..3108ba43dad97fda464d5150cb00add9aa35d3bc 100644 (file)
@@ -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
    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 (file)
index 0000000..a65c385
--- /dev/null
@@ -0,0 +1 @@
+#include <linux/ultrasound.h>
index a1fe44573906b1cadd6e8ca3607319e9cf6dd69d..08dceca3f622fa52ecc5ab72b7c24659f9cc2500 100644 (file)
@@ -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 (file)
index 0000000..7256d71
--- /dev/null
@@ -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 (file)
index 0000000..40a53ab
--- /dev/null
@@ -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 (file)
index 0000000..af2d212
--- /dev/null
@@ -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 */