aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-12-04 00:12:34 +0000
committerUlrich Drepper <drepper@redhat.com>1997-12-04 00:12:34 +0000
commitcbdee2790df9dac548fb3157cfaf7aceb0f40034 (patch)
tree566a6db9f880efdd95cb05a92d37a4c7ef6b8092 /sysdeps/unix/sysv
parent04be94a87d0a74c022490db7f4f926253f0d69d3 (diff)
downloadglibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.tar
glibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.tar.gz
glibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.tar.bz2
glibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.zip
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.
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/Dist8
-rw-r--r--sysdeps/unix/sysv/linux/Makefile8
-rw-r--r--sysdeps/unix/sysv/linux/aio_sigqueue.c54
-rw-r--r--sysdeps/unix/sysv/linux/arm/bits/mman.h75
-rw-r--r--sysdeps/unix/sysv/linux/bits/local_lim.h6
-rw-r--r--sysdeps/unix/sysv/linux/bits/posix_opt.h8
-rw-r--r--sysdeps/unix/sysv/linux/bits/sigaction.h22
-rw-r--r--sysdeps/unix/sysv/linux/bits/siginfo.h257
-rw-r--r--sysdeps/unix/sysv/linux/bits/signum.h21
-rw-r--r--sysdeps/unix/sysv/linux/bits/sigset.h38
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S7
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigaction.c37
-rw-r--r--sysdeps/unix/sysv/linux/i386/sys/ucontext.h106
-rw-r--r--sysdeps/unix/sysv/linux/init-first.c2
-rw-r--r--sysdeps/unix/sysv/linux/kernel_sigaction.h4
-rw-r--r--sysdeps/unix/sysv/linux/netinet/ip.h52
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigaction.c28
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigprocmask.c28
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigqueueinfo.c27
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigreturn.c27
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigsuspend.c33
-rw-r--r--sysdeps/unix/sysv/linux/rt_sigtimedwait.c34
-rw-r--r--sysdeps/unix/sysv/linux/sigaction.c27
-rw-r--r--sysdeps/unix/sysv/linux/sigpending.c53
-rw-r--r--sysdeps/unix/sysv/linux/sigprocmask.c55
-rw-r--r--sysdeps/unix/sysv/linux/sigqueue.c53
-rw-r--r--sysdeps/unix/sysv/linux/sigreturn.c53
-rw-r--r--sysdeps/unix/sysv/linux/sigsuspend.c27
-rw-r--r--sysdeps/unix/sysv/linux/sigtimedwait.c37
-rw-r--r--sysdeps/unix/sysv/linux/sigwaitinfo.c36
-rw-r--r--sysdeps/unix/sysv/linux/sys/pci.h25
-rw-r--r--sysdeps/unix/sysv/linux/sys/timex.h6
-rw-r--r--sysdeps/unix/sysv/linux/sys/ultrasound.h1
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list13
-rw-r--r--sysdeps/unix/sysv/linux/testrtsig.h30
35 files changed, 1220 insertions, 78 deletions
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;
+}