diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-12-04 00:12:34 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-12-04 00:12:34 +0000 |
commit | cbdee2790df9dac548fb3157cfaf7aceb0f40034 (patch) | |
tree | 566a6db9f880efdd95cb05a92d37a4c7ef6b8092 /sysdeps | |
parent | 04be94a87d0a74c022490db7f4f926253f0d69d3 (diff) | |
download | glibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.zip glibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.tar.gz glibc-cbdee2790df9dac548fb3157cfaf7aceb0f40034.tar.bz2 |
Update.cvs/libc-ud-971204
1997-12-03 23:50 Ulrich Drepper <drepper@cygnus.com>
* Makeconfig: Add shared-thread-library variable.
* math/Makfile (CPPFLAGS): Add -D__LIBC_INTERNAL_MATH_INLINES.
* sysdeps/i386/Makefile: Don't define ___LIBC_INTERNAL_MATH_INLINES
here.
* sysdeps/m68k/fpu/e_acos.c: Likewise.
* sysdeps/m68k/fpu/e_atan2.c: Likewise.
* sysdeps/m68k/fpu/e_fmod.c: Likewise.
* sysdeps/m68k/fpu/e_pow.c: Likewise.
* sysdeps/m68k/fpu/e_scalb.c: Likewise.
* sysdeps/m68k/fpu/k_cos.c: Likewise.
* sysdeps/m68k/fpu/k_sin.c: Likewise.
* sysdeps/m68k/fpu/k_tan.c: Likewise.
* sysdeps/m68k/fpu/s_atan.c: Likewise.
* sysdeps/m68k/fpu/s_ccos.c: Likewise.
* sysdeps/m68k/fpu/s_ccosh.c: Likewise.
* sysdeps/m68k/fpu/s_cexp.c: Likewise.
* sysdeps/m68k/fpu/s_csin.c: Likewise.
* sysdeps/m68k/fpu/s_csinh.c: Likewise.
* sysdeps/m68k/fpu/s_frexp.c: Likewise.
* sysdeps/m68k/fpu/s_ilogb.c: Likewise.
* sysdeps/m68k/fpu/s_isinf.c: Likewise.
* sysdeps/m68k/fpu/s_llrint.c: Likewise.
* sysdeps/m68k/fpu/s_llrintf.c: Likewise.
* sysdeps/m68k/fpu/s_llrintl.c: Likewise.
* sysdeps/m68k/fpu/s_lrint.c: Likewise.
* sysdeps/m68k/fpu/s_modf.c: Likewise.
* sysdeps/m68k/fpu/s_remquo.c: Likewise.
* sysdeps/m68k/fpu/s_scalbn.c: Likewise.
* sysdeps/m68k/fpu/s_sincos.c: Likewise.
* libc.map: Add __libc_current_sigrtmin, __libc_current_sigrtmax,
__libc_allocate_rtsig, sigqueue, sigtimedwait, sigwaitinfo.
* signal/Makefile (headers): Add bits/siginfo.h.
(routines): Add allocrtsig, sigtimedwait, sigwaitinfo, sigqueue.
(distribute): Add testrtsig.h.
* signal/allocrtsig.c: New file.
* signal/signal.h: Define `union sigval'. Include <bits/siginfo.h>.
Declare sigwaitinfo, sigtimedwait, sigqueue, __libc_current_sigrtmin,
__libc_current_sigrtmax.
* sysdeps/generic/sigqueue.c: New file.
* sysdeps/generic/sigtimedwait.c: New file.
* sysdeps/generic/sigwaitinfo.c: New file.
* sysdeps/generic/testrtsig.h: New file.
* sysdeps/generic/bits/siginfo.h: New file.
* sysdeps/unix/sysv/linux/bits/siginfo.h: New file.
* sysdeps/unix/sysv/linux/kernel_sigaction.h: Define struct as
old_kernel_sigaction and rename sa_handler member to k_sa_handler.
* sysdeps/unix/sysv/linux/rt_sigaction.c: New file.
* sysdeps/unix/sysv/linux/rt_sigprocmask.c: New file.
* sysdeps/unix/sysv/linux/rt_sigqueueinfo.c: New file.
* sysdeps/unix/sysv/linux/rt_sigreturn.c: New file.
* sysdeps/unix/sysv/linux/rt_sigsuspend.c: New file.
* sysdeps/unix/sysv/linux/rt_sigtimedwait.c: New file.
* sysdeps/unix/sysv/linux/sigpending.c: New file.
* sysdeps/unix/sysv/linux/sigprocmask.c: New file.
* sysdeps/unix/sysv/linux/sigqueue.c: New file.
* sysdeps/unix/sysv/linux/sigreturn.c: New file.
* sysdeps/unix/sysv/linux/sigtimedwait.c: New file.
* sysdeps/unix/sysv/linux/sigwaitinfo.c: New file.
* sysdeps/unix/sysv/linux/testrtsig.h: New file.
* sysdeps/unix/sysv/linux/sigsuspend.c: Update for AIO.
* sysdeps/unix/sysv/linux/syscalls.list: Update for AIO.
* sysdeps/unix/sysv/linux/sigaction.c: Update for AIO.
* sysdeps/unix/sysv/linux/bits/local_lim.h: Define AIO_PRIO_DELTA_MAX.
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _XOPEN_REALTIME
and _POSIX_REALTIME_SIGNALS.
* sysdeps/unix/sysv/linux/bits/sigaction.h: Update for AIO.
* sysdeps/unix/sysv/linux/bits/signum.h: Define SIGRTMIN/MAX and
update _NSIG.
* sysdeps/unix/sysv/linux/i386/sigaction.c: Update for AIO.
* sysdeps/unix/sysv/linux/i386/sys/ucontext.h: Linux/i386 specific
definitions.
* Makefile (subdirs): Add rt.
* shlib-versions: Add entry for librt.
* rt/Makefile: New file.
* rt/aio.h: New file.
* rt/aio_cancel.c: New file.
* rt/aio_error.c: New file.
* rt/aio_fsync.c: New file.
* rt/aio_misc.c: New file.
* rt/aio_misc.h: New file.
* rt/aio_read.c: New file.
* rt/aio_read64.c: New file.
* rt/aio_return.c: New file.
* rt/aio_suspend.c: New file.
* rt/aio_write.c: New file.
* rt/aio_write64.c: New file.
* rt/lio_listio.c: New file.
* rt/lio_listio64.c: New file.
* sysdeps/generic/aio_sigqueue.c: New file.
* sysdeps/unix/sysv/linux/aio_sigqueue.c: New file.
* sysdeps/unix/sysv/linux/Dist: Add new files
* sysdeps/unix/sysv/linux/Makefile [$(subdir)=signal]
(sysdep_routines): Add rt_sigsuspend, rt_sigprocmask, rt_sigtimedwait,
rt_sigqueueinfo, rt_sigaction.
* posix/Makefile (headers): Add bits/environments.h.
* posix/confstr.c: Correctly handle _CS_XBS5_ILP32_OFFBIG_CFLAGS
and _CS_LFS_CFLAGS on 64bit platforms.
* posix/unistd.h: Define _XOPEN_LEGACY. Explain _XOPEN_REALTIME
and _XOPEN_REALTIME_THREADS. Include bits/environments.h.
* sysdeps/generic/bits/confname.h: Define _SC_* constants for
compilation modules.
* sysdeps/wordsize-32/bits/environments.h: New file.
* sysdeps/wordsize-64/bits/environments.h: New file.
* posix/getopt.c: Remove declaration of getpid and __libc_pid.
* posix/getopt_init.c: Test for value 0xf00baa of uninitialized
__libc_pid.
* sysdeps/unix/sysv/linux/init-first.c: Initialize __libc_pid to
0xf00baa.
* string/string.h: Add declaration of __strverscmp.
* string/strverscmp.c: Rename function ot __strverscmp and make old
name weak alias.
* sysdeps/generic/dl-sysdep.c: Declare and define __libc_uid.
* sysdeps/generic/enbl-secure.c: Likewise.
* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
* sysdeps/unix/sysv/linux/bits/sigset.h: Pretty print.
* sysdeps/unix/sysv/linux/sys/pci.h: New file.
1997-12-03 Ulrich Drepper <drepper@cygnus.com>
* posix/sys/wait.h: Use __transparent_union__ instead of
transparent_union. Reported by Roland McGrath.
1997-12-03 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* resolv/inet_neta.c (inet_neta): Change type of first parameter
to u_int32_t. Suggested by John Lavagnino <John_Lavagnino@Brown.edu>
[PR libc/366].
* resolv/inet_addr.c (inet_addr): Change return type to u_int32_t.
* inet/arpa/inet.h: Change types of inet_neta and inet_addr.
1997-12-03 20:40 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* grp/initgroups.c: Increase buffer if it is too small.
1997-12-03 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/netinet/ip.h: Don't use u_int8_t for bit
fields, this is no ISO C. Reported by Andreas Jaeger.
1997-12-03 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* sysdeps/i386/sys/ucontext.h (enum): Add missing commata.
1997-12-03 08:58 Philip Blundell <pb@nexus.co.uk>
* sysdeps/generic/bits/utsname.h: <sys/utsname.h> defines
_SYS_UTSNAME_H not _UTSNAME_H.
1997-11-28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* elf/dl-profile.c (_dl_start_profile): Avoid overflow when
computing s_scale.
1997-11-29 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/libm-ieee754/s_csqrt.c: Use different formula for now.
* sysdeps/libm-ieee754/s_csqrtf.c: Likewise.
* sysdeps/libm-ieee754/s_csqrtl.c: Likewise.
* math/libm-test.c (csqrt_test): Add testcase.
1997-12-03 15:44 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/sys/ultrasound.h: New file.
* sysdeps/unix/sysv/linux/sys/Dist: Add it.
* sysdeps/unix/sysv/linux/sys/Makefile [$(subdir)=misc]: Likewise.
1997-11-30 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/sys/timex.h: Fix declaration.
1997-12-01 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* math/libm-test.c (acos_test): Add more tests.
(asin_test): Likewise.
(atan_test): Likewise.
(exp_test): Likewise.
(sin_test): Likewise.
(sqrt_test): Likewise.
(cpow_test): Likewise.
(csqrt_test): Likewise.
(cexp_test): Correct typo in gcc version test.
1997-12-02 17:14 Philip Blundell <pb@nexus.co.uk>
* sysdeps/arm/__longjmp.S: Define _SETJMP_H before including
<bits/setjmp.h>.
* sysdeps/arm/setjmp.S: Likewise.
* sysdeps/unix/sysv/linux/arm/bits/mman.h: New file.
1997-12-02 18:07 Philip Blundell <pb@nexus.co.uk>
* stdio/stdio.h: Add prototype for tmpfile64().
1997-12-02 17:47 Philip Blundell <pb@nexus.co.uk>
* stdio/stdio.h (__stdio_gen_tempname): Add extra argument to
prototype to keep in step with libio version.
* stdio-common/tmpfile64.c: Include <errno.h> for ENOSYS.
1997-12-02 17:41 Philip Blundell <pb@nexus.co.uk>
* sysdeps/generic/Makefile: Don't try to use make_siglist if
cross-compiling.
1997-12-02 01:18 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/i386/clone.S: When cloned process returns
load GOT ptr before jumping to _exit.
Reported by Xavier Leroy.
Diffstat (limited to 'sysdeps')
81 files changed, 1683 insertions, 116 deletions
diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S index b027103..a2042f5 100644 --- a/sysdeps/arm/__longjmp.S +++ b/sysdeps/arm/__longjmp.S @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include <sysdep.h> +#define _SETJMP_H #define _ASM #include <bits/setjmp.h> @@ -32,6 +33,6 @@ ENTRY (__longjmp) add r2, r2, #48 lfmfd f4, 4, [r2] #endif - + LOADREGS(ia, r2, {v1-v6, sl, fp, sp, pc}) END (__longjmp) diff --git a/sysdeps/arm/setjmp.S b/sysdeps/arm/setjmp.S index 8f99e4f..08cd0d2 100644 --- a/sysdeps/arm/setjmp.S +++ b/sysdeps/arm/setjmp.S @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include <sysdep.h> +#define _SETJMP_H #define _ASM #include <bits/setjmp.h> @@ -28,7 +29,7 @@ ENTRY (__sigsetjmp) /* Save registers */ #if __ARM_USES_FP sfmea f4, 4, [r0]! -#endif +#endif stmia r0, {v1-v6, sl, fp, sp, lr} /* Make a tail call to __sigjmp_save; it takes the same args. */ diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile index 2f6a8f4..4d6c604 100644 --- a/sysdeps/generic/Makefile +++ b/sysdeps/generic/Makefile @@ -33,6 +33,7 @@ endif ifeq ($(subdir),stdio-common) ifneq ($(inhibit-siglist),yes) +ifneq ($(cross-compiling),yes) ifeq "$(filter %siglist.c,$(before-compile))" "" before-compile := $(before-compile) $(objpfx)siglist.c $(objpfx)siglist.c: $(objpfx)make_siglist @@ -49,6 +50,7 @@ generated := $(generated) make_siglist siglist.c endif endif endif +endif ifeq ($(subdir),string) CFLAGS-wordcopy.c += -Wno-uninitialized diff --git a/sysdeps/generic/aio_sigqueue.c b/sysdeps/generic/aio_sigqueue.c new file mode 100644 index 0000000..0a871e2 --- /dev/null +++ b/sysdeps/generic/aio_sigqueue.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <aio.h> +#include <errno.h> +#include <signal.h> + +#include "aio_misc.h" + +int +__aio_sigqueue (int sig, const union sigval val) +{ + __set_errno (ENOSYS); + return -1; +} + +stub_warning (__aio_sigqueue) +#include <stub-tag.h> diff --git a/sysdeps/generic/bits/confname.h b/sysdeps/generic/bits/confname.h index 3991fb1..1b75d6e 100644 --- a/sysdeps/generic/bits/confname.h +++ b/sysdeps/generic/bits/confname.h @@ -316,8 +316,17 @@ enum #define _SC_NL_NMAX _SC_NL_NMAX _SC_NL_SETMAX, #define _SC_NL_SETMAX _SC_NL_SETMAX - _SC_NL_TEXTMAX + _SC_NL_TEXTMAX, #define _SC_NL_TEXTMAX _SC_NL_TEXTMAX + + _SC_XBS5_ILP32_OFF32, +#define _SC_XBS5_ILP32_OFF32 _SC_XBS5_ILP32_OFF32 + _SC_XBS5_ILP32_OFFBIG, +#define _SC_XBS5_ILP32_OFFBIG _SC_XBS5_ILP32_OFFBIG + _SC_XBS5_LP64_OFF64, +#define _SC_XBS5_LP64_OFF64 _SC_XBS5_LP64_OFF64 + _SC_XBS5_LPBIG_OFFBIG +#define _SC_XBS5_LPBIG_OFFBIG _SC_XBS5_LPBIG_OFFBIG }; #if (defined __USE_POSIX2 || defined __USE_UNIX98 \ diff --git a/sysdeps/generic/bits/siginfo.h b/sysdeps/generic/bits/siginfo.h new file mode 100644 index 0000000..35d9d69 --- /dev/null +++ b/sysdeps/generic/bits/siginfo.h @@ -0,0 +1,184 @@ +/* siginfo_t, sigevent and constants. Stub version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SIGNAL_H +# error "Never include this file directly. Use <signal.h> instead" +#endif + +typedef struct siginfo + { + int si_signo; /* Signal number. */ + int si_errno; /* If non-zero, an errno value associated with + this signal, as defined in <errno.h>. */ + int si_code; /* Signal code. */ + __pid_t si_pid; /* Sending process ID. */ + __uid_t si_uid; /* Real user ID of sending process. */ + void *si_addr; /* Address of faulting instruction. */ + int si_status; /* Exit value or signal. */ + long int si_band; /* Band event for SIGPOLL. */ + union sigval si_value; /* Signal value. */ + } siginfo_t; + + +/* Values for `si_code'. Positive values are reserved for kernel-generated + signals. */ +enum +{ + SI_ASYNCIO = -4, /* Sent by AIO completion. */ +#define SI_ASYNCIO SI_ASYNCIO + SI_MESGQ, /* Sent by real time mesq state change. */ +#define SI_MESGQ SI_MESGQ + SI_TIMER, /* Sent by timer expiration. */ +#define SI_TIMER SI_TIMER + SI_QUEUE, /* Sent by sigqueue. */ +#define SI_QUEUE SI_QUEUE + SI_USER /* Sent by kill, sigsend, raise. */ +#define SI_USER SI_USER +}; + + +/* `si_code' values for SIGILL signal. */ +enum +{ + ILL_ILLOPC = 1, /* Illegal opcode. */ +#define ILL_ILLOPC ILL_ILLOPC + ILL_ILL_OPN, /* Illegal operand. */ +#define ILL_ILLOPN ILL_ILLOPN + ILL_ILLADR, /* Illegal addressing mode. */ +#define ILL_ILLADR ILL_ILLADR + ILL_ILLTRP, /* Illegal trap. */ +#define ILL_ILLTRP ILL_ILLTRP + ILL_PRVOPC, /* Privileged opcode. */ +#define ILL_PRVOPC ILL_PRVOPC + ILL_PRVREG, /* Privileged register. */ +#define ILL_PRVREG ILL_PRVREG + ILL_COPROC, /* Coprocessor error. */ +#define ILL_COPROC ILL_COPROC + ILL_BADSTK /* Internal stack error. */ +#define ILL_BADSTK ILL_BADSTK +}; + +/* `si_code' values for SIGFPE signal. */ +enum +{ + FPE_INTDIV = 1, /* Integer divide by zero. */ +#define FPE_INTDIV FPE_INTDIV + FPE_INTOVF, /* Integer overflow. */ +#define FPE_INTOVF FPE_INTOVF + FPE_FLTDIV, /* Floating point divide by zero. */ +#define FPE_FLTDIV FPE_FLTDIV + FPE_FLTOVF, /* Floating point overflow. */ +#define FPE_FLTOVF FPE_FLTOVF + FPE_FLTUND, /* Floating point underflow. */ +#define FPE_FLTUND FPE_FLTUND + FPE_FLTRES, /* Floating point inexact result. */ +#define FPE_FLTRES FPE_FLTRES + FPE_FLTINV, /* Floating point invalid operation. */ +#define FPE_FLTINV FPE_FLTINV + FPE_FLTSUB /* Subscript out of range. */ +#define FPE_FLTSUB FPE_FLTSUB +}; + +/* `si_code' values for SIGSEGV signal. */ +enum +{ + SEGV_MAPERR = 1, /* Address not mapped to object. */ +#define SEGV_MAPERR SEGV_MAPERR + SEGV_ACCERR /* Invalid permissions for mapped object. */ +#define SEGV_ACCERR SEGV_ACCERR +}; + +/* `si_code' values for SIGBUS signal. */ +enum +{ + BUS_ADRALN = 1, /* Invalid address alignment. */ +#define BUS_ADRALN BUS_ADRALN + BUS_ADRERR, /* Non-existant physical address. */ +#define BUS_ADRERR BUS_ADRERR + BUS_OBJERR /* Object specific hardware error. */ +#define BUS_OBJERR BUS_OBJERR +}; + +/* `si_code' values for SIGTRAP signal. */ +enum +{ + TRAP_BRKPT = 1, /* Process breakpoint. */ +#define TRAP_BRKPT TRAP_BRKPT + TRAP_TRACE /* Process trace trap. */ +#define TRAP_TRACE TRAP_TRACE +}; + +/* `si_code' values for SIGCHLD signal. */ +enum +{ + CLD_EXITED = 1, /* Child has exited. */ +#define CLD_EXITED CLD_EXITED + CLD_KILLED, /* Child was killed. */ +#define CLD_KILLED CLD_KILLED + CLD_DUMPED, /* Child terminated abnormally. */ +#define CLD_DUMPED CLD_DUMPED + CLD_TRAPPED, /* Traced child has trapped. */ +#define CLD_TRAPPED CLD_TRAPPED + CLD_STOPPED, /* Child has stopped. */ +#define CLD_STOPPED CLD_STOPPED + CLD_CONTINUED /* Stopped child has continued. */ +#define CLD_CONTINUED CLD_CONTINUED +}; + +/* `si_code' values for SIGPOLL signal. */ +enum +{ + POLL_IN = 1, /* Data input available. */ +#define POLL_IN POLL_IN + POLL_OUT, /* Output buffers available. */ +#define POLL_OUT POLL_OUT + POLL_MSG, /* Input message available. */ +#define POLL_MSG POLL_MSG + POLL_ERR, /* I/O error. */ +#define POLL_ERR POLL_ERR + POLL_PRI, /* High priority input available. */ +#define POLL_PRI POLL_PRI + POLL_HUP /* Device disconnected. */ +#define POLL_HUP POLL_HUP +}; + + +/* Structure to transport application-defined values with signals. */ +#define SIGEV_MAX_SIZE 64 +#define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE / sizeof (int)) - 3) + +typedef struct sigevent + { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + void (*sigev_notify_function) __P ((sigval_t)); /* Function to start. */ + void *sigev_notify_attributes; /* Really pthread_attr_t.*/ + } sigevent_t; + +/* `sigev_notify' values. */ +enum +{ + SIGEV_SIGNAL = 0, /* Notify via signal. */ +#define SIGEV_SIGNAL SIGEV_SIGNAL + SIGEV_NONE, /* Other notification: meaningless. */ +#define SIGEV_NONE SIGEV_NONE + SIGEV_THREAD /* Deliver via thread creation. */ +#define SIGEV_THREAD SIGEV_THREAD +}; diff --git a/sysdeps/generic/bits/utsname.h b/sysdeps/generic/bits/utsname.h index ea3f163..cd05db1 100644 --- a/sysdeps/generic/bits/utsname.h +++ b/sysdeps/generic/bits/utsname.h @@ -16,7 +16,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _UTSNAME_H +#ifndef _SYS_UTSNAME_H # error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead." #endif diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c index 7ee3002..b71ad54 100644 --- a/sysdeps/generic/dl-sysdep.c +++ b/sysdeps/generic/dl-sysdep.c @@ -40,6 +40,7 @@ extern void _end; extern void ENTRY_POINT (void); ElfW(Addr) _dl_base_addr; +uid_t __libc_uid; int __libc_enable_secure; int __libc_multiple_libcs; /* Defining this here avoids the inclusion of init-first. */ @@ -130,7 +131,7 @@ _dl_sysdep_start (void **start_argptr, SEE (EUID, euid); SEE (EGID, egid); - + __libc_uid = uid; __libc_enable_secure = uid != euid || gid != egid; if (_dl_pagesize == 0) diff --git a/sysdeps/generic/enbl-secure.c b/sysdeps/generic/enbl-secure.c index fdf6f15..8e1327c 100644 --- a/sysdeps/generic/enbl-secure.c +++ b/sysdeps/generic/enbl-secure.c @@ -26,9 +26,13 @@ /* Safest assumption, if somehow the initializer isn't run. */ int __libc_enable_secure = 1; +/* We often need the UID. */ +uid_t __libc_uid; + void __libc_init_secure (void) { - __libc_enable_secure = (__geteuid () != __getuid () || - __getegid () != __getgid ()); + __libc_uid == __getuid (); + __libc_enable_secure = (__geteuid () != __libc_uid + || __getegid () != __getgid ()); } diff --git a/sysdeps/generic/sigqueue.c b/sysdeps/generic/sigqueue.c new file mode 100644 index 0000000..c6af1d7 --- /dev/null +++ b/sysdeps/generic/sigqueue.c @@ -0,0 +1,32 @@ +/* Implementation of sigqueue function from POSIX.1b. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <signal.h> + +int +__sigqueue (pid_t pid, int sig, const union sigval val) +{ + __set_errno (ENOSYS); + return -1; +} +weak_alias (__sigqueue, sigqueue) + +stub_warning (sigqueue) +#include <stub-tag.h> diff --git a/sysdeps/generic/sigtimedwait.c b/sysdeps/generic/sigtimedwait.c new file mode 100644 index 0000000..4f94977 --- /dev/null +++ b/sysdeps/generic/sigtimedwait.c @@ -0,0 +1,33 @@ +/* Implementation of sigtimedwait function from POSIX.1b. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <signal.h> + +int +__sigtimedwait (const sigset_t *set, siginfo_t *info, + const struct timespec *timeout) +{ + __set_errno (ENOSYS); + return -1; +} +weak_alias (__sigtimedwait, sigtimedwait) + +stub_warning (sigtimedwait) +#include <stub-tag.h> diff --git a/sysdeps/generic/sigwaitinfo.c b/sysdeps/generic/sigwaitinfo.c new file mode 100644 index 0000000..49014e9 --- /dev/null +++ b/sysdeps/generic/sigwaitinfo.c @@ -0,0 +1,32 @@ +/* Implementation of sigwaitinfo function from POSIX.1b. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <signal.h> + +int +__sigwaitinfo (const sigset_t *set, siginfo_t *info) +{ + __set_errno (ENOSYS); + return -1; +} +weak_alias (__sigwaitinfo, sigwaitinfo) + +stub_warning (sigwaitinfo) +#include <stub-tag.h> diff --git a/sysdeps/generic/testrtsig.h b/sysdeps/generic/testrtsig.h new file mode 100644 index 0000000..25eb488 --- /dev/null +++ b/sysdeps/generic/testrtsig.h @@ -0,0 +1,28 @@ +/* Test whether RT signals are really available. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <string.h> +#include <sys/utsname.h> + +int +kernel_has_rtsig (void) +{ + return 0; +} diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile index b97f95f..9860444 100644 --- a/sysdeps/i386/Makefile +++ b/sysdeps/i386/Makefile @@ -18,7 +18,3 @@ CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused CFLAGS-dl-load.c += -Wno-unused CFLAGS-dl-reloc.c += -Wno-unused endif - -ifeq ($(subdir),math) -CPPFLAGS += -D__LIBC_INTERNAL_MATH_INLINES -endif diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h index 17b6b6c..68597c9 100644 --- a/sysdeps/i386/sys/ucontext.h +++ b/sysdeps/i386/sys/ucontext.h @@ -44,9 +44,9 @@ enum #define ES ES DS, #define DS DS - EDI + EDI, #define EDI EDI - ESI + ESI, #define ESI ESI EBP, #define EBP EBP diff --git a/sysdeps/libm-ieee754/s_csqrt.c b/sysdeps/libm-ieee754/s_csqrt.c index c5c609b..cda23c7 100644 --- a/sysdeps/libm-ieee754/s_csqrt.c +++ b/sysdeps/libm-ieee754/s_csqrt.c @@ -84,6 +84,7 @@ __csqrt (__complex__ double x) } else { +#if 0 /* FIXME: this is broken. */ __complex__ double q; double t, r; @@ -99,6 +100,15 @@ __csqrt (__complex__ double x) /* Heron iteration in complex arithmetic. */ res = 0.5 * (q + q / x); +#else + double d, imag; + + d = __ieee754_hypot (__real__ x, __imag__ x); + imag = __ieee754_sqrt (0.5 * (d - __real__ x)); + + __real__ res = __ieee754_sqrt (0.5 * (d + __real__ x)); + __imag__ res = __copysign (imag, __imag__ x); +#endif } } diff --git a/sysdeps/libm-ieee754/s_csqrtf.c b/sysdeps/libm-ieee754/s_csqrtf.c index 2289045..5fdf2c1 100644 --- a/sysdeps/libm-ieee754/s_csqrtf.c +++ b/sysdeps/libm-ieee754/s_csqrtf.c @@ -84,6 +84,7 @@ __csqrtf (__complex__ float x) } else { +#if 0 /* FIXME: this is broken. */ __complex__ float q; float t, r; @@ -99,6 +100,15 @@ __csqrtf (__complex__ float x) /* Heron iteration in complex arithmetic. */ res = 0.5 * (q + q / x); +#else + float d, imag; + + d = __ieee754_hypotf (__real__ x, __imag__ x); + imag = __ieee754_sqrtf (0.5 * (d - __real__ x)); + + __real__ res = __ieee754_sqrtf (0.5 * (d + __real__ x)); + __imag__ res = __copysignf (imag, __imag__ x); +#endif } } diff --git a/sysdeps/libm-ieee754/s_csqrtl.c b/sysdeps/libm-ieee754/s_csqrtl.c index 3de7310..b772709 100644 --- a/sysdeps/libm-ieee754/s_csqrtl.c +++ b/sysdeps/libm-ieee754/s_csqrtl.c @@ -84,6 +84,7 @@ __csqrtl (__complex__ long double x) } else { +#if 0 /* FIXME: this is broken. */ __complex__ long double q; long double t, r; @@ -99,6 +100,15 @@ __csqrtl (__complex__ long double x) /* Heron iteration in complex arithmetic. */ res = 0.5 * (q + q / x); +#else + long double d, imag; + + d = __ieee754_hypotl (__real__ x, __imag__ x); + imag = __ieee754_sqrtl (0.5 * (d - __real__ x)); + + __real__ res = __ieee754_sqrtl (0.5 * (d + __real__ x)); + __imag__ res = __copysignl (imag, __imag__ x); +#endif } } diff --git a/sysdeps/m68k/fpu/e_acos.c b/sysdeps/m68k/fpu/e_acos.c index 9c2d91f..80803ff 100644 --- a/sysdeps/m68k/fpu/e_acos.c +++ b/sysdeps/m68k/fpu/e_acos.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/e_atan2.c b/sysdeps/m68k/fpu/e_atan2.c index d23d4f9..7b275b4 100644 --- a/sysdeps/m68k/fpu/e_atan2.c +++ b/sysdeps/m68k/fpu/e_atan2.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/e_fmod.c b/sysdeps/m68k/fpu/e_fmod.c index 505650a..9e59a43 100644 --- a/sysdeps/m68k/fpu/e_fmod.c +++ b/sysdeps/m68k/fpu/e_fmod.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/e_pow.c b/sysdeps/m68k/fpu/e_pow.c index c36b643..ee95a39 100644 --- a/sysdeps/m68k/fpu/e_pow.c +++ b/sysdeps/m68k/fpu/e_pow.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/e_scalb.c b/sysdeps/m68k/fpu/e_scalb.c index 93b44ff..ef1724b 100644 --- a/sysdeps/m68k/fpu/e_scalb.c +++ b/sysdeps/m68k/fpu/e_scalb.c @@ -17,7 +17,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef SUFF diff --git a/sysdeps/m68k/fpu/k_cos.c b/sysdeps/m68k/fpu/k_cos.c index 5b263ec..85f744f 100644 --- a/sysdeps/m68k/fpu/k_cos.c +++ b/sysdeps/m68k/fpu/k_cos.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/k_sin.c b/sysdeps/m68k/fpu/k_sin.c index 41de73f..05cdcee 100644 --- a/sysdeps/m68k/fpu/k_sin.c +++ b/sysdeps/m68k/fpu/k_sin.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/k_tan.c b/sysdeps/m68k/fpu/k_tan.c index 7f87e09..09e5ac8 100644 --- a/sysdeps/m68k/fpu/k_tan.c +++ b/sysdeps/m68k/fpu/k_tan.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/s_atan.c b/sysdeps/m68k/fpu/s_atan.c index e6b676b..29f2eca 100644 --- a/sysdeps/m68k/fpu/s_atan.c +++ b/sysdeps/m68k/fpu/s_atan.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef FUNC diff --git a/sysdeps/m68k/fpu/s_ccos.c b/sysdeps/m68k/fpu/s_ccos.c index 095aa98..fbd5ef5 100644 --- a/sysdeps/m68k/fpu/s_ccos.c +++ b/sysdeps/m68k/fpu/s_ccos.c @@ -18,7 +18,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <complex.h> #include <math.h> diff --git a/sysdeps/m68k/fpu/s_ccosh.c b/sysdeps/m68k/fpu/s_ccosh.c index 3d560b3..af75143 100644 --- a/sysdeps/m68k/fpu/s_ccosh.c +++ b/sysdeps/m68k/fpu/s_ccosh.c @@ -18,7 +18,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <complex.h> #include <math.h> diff --git a/sysdeps/m68k/fpu/s_cexp.c b/sysdeps/m68k/fpu/s_cexp.c index da28ebb..fcf87ed 100644 --- a/sysdeps/m68k/fpu/s_cexp.c +++ b/sysdeps/m68k/fpu/s_cexp.c @@ -18,7 +18,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <complex.h> #include <math.h> diff --git a/sysdeps/m68k/fpu/s_csin.c b/sysdeps/m68k/fpu/s_csin.c index ae456d3..72214c4 100644 --- a/sysdeps/m68k/fpu/s_csin.c +++ b/sysdeps/m68k/fpu/s_csin.c @@ -18,7 +18,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <complex.h> #include <math.h> diff --git a/sysdeps/m68k/fpu/s_csinh.c b/sysdeps/m68k/fpu/s_csinh.c index c95f9dc..e829f4d 100644 --- a/sysdeps/m68k/fpu/s_csinh.c +++ b/sysdeps/m68k/fpu/s_csinh.c @@ -18,7 +18,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <complex.h> #include <math.h> diff --git a/sysdeps/m68k/fpu/s_frexp.c b/sysdeps/m68k/fpu/s_frexp.c index 4280fcc..61e3298 100644 --- a/sysdeps/m68k/fpu/s_frexp.c +++ b/sysdeps/m68k/fpu/s_frexp.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef FUNC diff --git a/sysdeps/m68k/fpu/s_ilogb.c b/sysdeps/m68k/fpu/s_ilogb.c index aebcaa1..ef90946 100644 --- a/sysdeps/m68k/fpu/s_ilogb.c +++ b/sysdeps/m68k/fpu/s_ilogb.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef SUFF diff --git a/sysdeps/m68k/fpu/s_isinf.c b/sysdeps/m68k/fpu/s_isinf.c index d8cafdb..03dc26d 100644 --- a/sysdeps/m68k/fpu/s_isinf.c +++ b/sysdeps/m68k/fpu/s_isinf.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef FUNC diff --git a/sysdeps/m68k/fpu/s_llrint.c b/sysdeps/m68k/fpu/s_llrint.c index 37b6f63..423939a 100644 --- a/sysdeps/m68k/fpu/s_llrint.c +++ b/sysdeps/m68k/fpu/s_llrint.c @@ -19,7 +19,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/s_llrintf.c b/sysdeps/m68k/fpu/s_llrintf.c index 4d06ae2..0cd12c9 100644 --- a/sysdeps/m68k/fpu/s_llrintf.c +++ b/sysdeps/m68k/fpu/s_llrintf.c @@ -19,7 +19,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/s_llrintl.c b/sysdeps/m68k/fpu/s_llrintl.c index 14a815f..6f63e0b 100644 --- a/sysdeps/m68k/fpu/s_llrintl.c +++ b/sysdeps/m68k/fpu/s_llrintl.c @@ -19,7 +19,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #include "math_private.h" diff --git a/sysdeps/m68k/fpu/s_lrint.c b/sysdeps/m68k/fpu/s_lrint.c index 7747057..89e9dba 100644 --- a/sysdeps/m68k/fpu/s_lrint.c +++ b/sysdeps/m68k/fpu/s_lrint.c @@ -19,7 +19,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef suffix diff --git a/sysdeps/m68k/fpu/s_modf.c b/sysdeps/m68k/fpu/s_modf.c index b9867df..6c2449a 100644 --- a/sysdeps/m68k/fpu/s_modf.c +++ b/sysdeps/m68k/fpu/s_modf.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef SUFF diff --git a/sysdeps/m68k/fpu/s_remquo.c b/sysdeps/m68k/fpu/s_remquo.c index 7607fee..10be1ae 100644 --- a/sysdeps/m68k/fpu/s_remquo.c +++ b/sysdeps/m68k/fpu/s_remquo.c @@ -18,7 +18,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef SUFF diff --git a/sysdeps/m68k/fpu/s_scalbn.c b/sysdeps/m68k/fpu/s_scalbn.c index 12b737a..c151b2a 100644 --- a/sysdeps/m68k/fpu/s_scalbn.c +++ b/sysdeps/m68k/fpu/s_scalbn.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #define scalbln __no_scalbln_decl #define scalblnf __no_scalblnf_decl #define scalblnl __no_scalblnl_decl diff --git a/sysdeps/m68k/fpu/s_sincos.c b/sysdeps/m68k/fpu/s_sincos.c index dda42e2..8d84ece 100644 --- a/sysdeps/m68k/fpu/s_sincos.c +++ b/sysdeps/m68k/fpu/s_sincos.c @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define __LIBC_INTERNAL_MATH_INLINES #include <math.h> #ifndef FUNC diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c index 88918c5..befd112 100644 --- a/sysdeps/mach/hurd/dl-sysdep.c +++ b/sysdeps/mach/hurd/dl-sysdep.c @@ -44,6 +44,7 @@ extern int _dl_argc; extern char **_dl_argv; extern char **_environ; +uid_t __libc_uid; int __libc_enable_secure; struct hurd_startup_data *_dl_hurd_data; @@ -106,6 +107,7 @@ _dl_sysdep_start (void **start_argptr, else _dl_hurd_data = (void *) p; + __libc_uid = __getuid (); __libc_enable_secure = _dl_hurd_data->flags & EXEC_SECURE; if (_dl_hurd_data->flags & EXEC_STACK_ARGS && diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index 340f8c6..fa95317 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 253bc26..ffea9ef 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 0000000..b962396 --- /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 0000000..fcc0643 --- /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 7ce4230..2674aa7 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 e9f8b7f..5ef6d05 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 1806bb2..b6637e5 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 0000000..42030ab --- /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 d8a716f..f625f46 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 741ff9a..14f30cb 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 7f758a5..0aec95e 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 3f9d946..99ed694 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 0000000..ccc32b6 --- /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 cebb9c1..505b8dd 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 a058642..e3901cf 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 bf4e016..cb27ebf 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 0000000..77b5b10 --- /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 0000000..0ce2815 --- /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 0000000..ff99e9e --- /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 0000000..2764309 --- /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 0000000..59fb5c4 --- /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 0000000..4513026 --- /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 a7b3e07..161f1b0 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 0000000..7b26bfb --- /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 0000000..f436ba8 --- /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 0000000..a88cd88 --- /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 0000000..e57ac74 --- /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 723f762..faea1c3 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 0000000..b022ec3 --- /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 0000000..ac98fb4 --- /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 0000000..03d9b9a --- /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 5e0f14c..3108ba4 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 0000000..a65c385 --- /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 a1fe445..08dceca 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 0000000..7256d71 --- /dev/null +++ b/sysdeps/unix/sysv/linux/testrtsig.h @@ -0,0 +1,30 @@ +/* Test whether RT signals are really available. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <string.h> +#include <sys/utsname.h> + +int +kernel_has_rtsig (void) +{ + struct utsname name; + + return uname (&name) < 0 || __strverscmp (name.release, "2.1.70") >= 0; +} diff --git a/sysdeps/wordsize-32/bits/environments.h b/sysdeps/wordsize-32/bits/environments.h new file mode 100644 index 0000000..40a53ab --- /dev/null +++ b/sysdeps/wordsize-32/bits/environments.h @@ -0,0 +1,32 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_ENVIRONMENTS_H +#define _BITS_ENVIRONMENTS_H 1 + +/* By default we have 32-bit wide `int', `long int', pointers and `off_t'. */ +#define _XBS5_ILP32_OFF32 1 + +/* We optionally provide an environment with the above size but an 64-bit + side `off_t'. Therefore we don't define _XBS5_ILP32_OFFBIG. */ + +/* We can never provide environments with 64-bit wide pointers. */ +#define _XBS5_LP64_OFF64 -1 +#define _XBS5_LPBIG_OFFBIG -1 + +#endif /* bits/environments.h */ diff --git a/sysdeps/wordsize-64/bits/environments.h b/sysdeps/wordsize-64/bits/environments.h new file mode 100644 index 0000000..af2d212 --- /dev/null +++ b/sysdeps/wordsize-64/bits/environments.h @@ -0,0 +1,30 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_ENVIRONMENTS_H +#define _BITS_ENVIRONMENTS_H 1 + +/* We can never provide environments with 64-bit wide pointers. */ +#define _XBS5_ILP32_OFF32 -1 +#define _XBS5_ILP32_OFFBIG -1 + +/* By default we have 64-bit wide `int', `long int', pointers and `off_t'. */ +#define _XBS5_LP64_OFF32 1 +#define _XBS5_LPBIG_OFFBIG 1 + +#endif /* bits/environments.h */ |