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