diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
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; +} |