diff options
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 22 | ||||
-rw-r--r-- | newlib/libc/sys/linux/Makefile.am | 6 | ||||
-rw-r--r-- | newlib/libc/sys/linux/Makefile.in | 25 | ||||
-rw-r--r-- | newlib/libc/sys/linux/machine/i386/Makefile.am | 2 | ||||
-rw-r--r-- | newlib/libc/sys/linux/machine/i386/Makefile.in | 7 | ||||
-rw-r--r-- | newlib/libc/sys/linux/sig.c | 83 | ||||
-rw-r--r-- | newlib/libc/sys/linux/sigaction.c | 2 | ||||
-rw-r--r-- | newlib/libc/sys/linux/signal.c | 135 | ||||
-rw-r--r-- | newlib/libc/sys/linux/sigset.c (renamed from newlib/libc/sys/linux/machine/i386/sigset.c) | 13 | ||||
-rw-r--r-- | newlib/libc/sys/linux/sys/signal.h | 10 | ||||
-rw-r--r-- | newlib/libc/unix/sigset.c | 2 |
11 files changed, 196 insertions, 111 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 1b888fb36..91dcb7a5d 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,25 @@ +2002-05-31 Jeff Johnston <jjohnstn@redhat.com> + + * libc/sys/linux/Makefile.am: Add sig.c and sigaction.c. Also + make siglist.inc dependent on sig.c instead of signal.c. + * libc/sys/linux/Makefile.in: Regenerated. + * libc/sys/linux/sig.c: Rename from signal.c and change code to + use NSIG instead of _NSIG. + * libc/sys/linux/sigaction.c: New file. + * libc/sys/linux/signal.c: Changed to be linux signal() function + so as to override regular newlib default signal.c. + * libc/sys/linux/linuxthreads/config.h: Add __ASSUME_REALTIME_SIGNALS + definition. + * libc/sys/linux/linuxthreads/testrtsig.h: New file. + * libc/sys/linux/machine/i386/Makefile.am: Remove sigset.c. + * libc/sys/linux/machine/i386/Makefile.in: Regenerated. + * libc/sys/linux/machine/i386/sigset.c: Moved to linux main directory. + * libc/sys/linux/sigset.c: Moved from machine/i386 directory. + * libc/sys/linux/sys/signal.h: Redefine NSIG to _NSIG and override + default linux sigset_t typedef by defining it equal to __sigset_t. + * libc/unix/sigset.c: Add check so code isn't compiled on systems + with a sigset_t that isn't implemented with a single int. + 2002-05-30 Jeff Johnston <jjohnstn@redhat.com> * libc/sys/linux/Makefile.am: Add support for new files. diff --git a/newlib/libc/sys/linux/Makefile.am b/newlib/libc/sys/linux/Makefile.am index ce08ba569..f2c4baee6 100644 --- a/newlib/libc/sys/linux/Makefile.am +++ b/newlib/libc/sys/linux/Makefile.am @@ -13,8 +13,8 @@ LIB_SOURCES = \ brk.c cfspeed.c flockfile.c funlockfile.c gethostname.c getoptlong.c \ getreent.c ids.c inode.c io.c io64.c linux.c mmap.c \ pread.c pread64.c process.c pwrite.c pwrite64.c raise.c realpath.c \ - rename.c resource.c sched.c select.c seteuid.c shm_open.c \ - shm_unlink.c sigaction.c sigqueue.c signal.c siglongjmp.c sigwait.c \ + rename.c resource.c sched.c select.c seteuid.c shm_open.c shm_unlink.c \ + sig.c sigaction.c sigqueue.c signal.c siglongjmp.c sigset.c sigwait.c \ socket.c sleep.c stack.c sysconf.c sysctl.c systat.c system.c \ tcdrain.c tcsendbrk.c termios.c time.c usleep.c wait.c @@ -62,7 +62,7 @@ crt0.o: machine/crt0.o machine/crt0.o: ; @true -signal.$(oext): siglist.inc +sig.$(oext): siglist.inc siglist.inc: $(AWK) '/#define.SIG.*[1-9][0-9]*/ { n[$$3] = $$2 } \ diff --git a/newlib/libc/sys/linux/Makefile.in b/newlib/libc/sys/linux/Makefile.in index 81bd8242a..b89d6734b 100644 --- a/newlib/libc/sys/linux/Makefile.in +++ b/newlib/libc/sys/linux/Makefile.in @@ -104,8 +104,8 @@ LIB_SOURCES = \ brk.c cfspeed.c flockfile.c funlockfile.c gethostname.c getoptlong.c \ getreent.c ids.c inode.c io.c io64.c linux.c mmap.c \ pread.c pread64.c process.c pwrite.c pwrite64.c raise.c realpath.c \ - rename.c resource.c sched.c select.c seteuid.c shm_open.c \ - shm_unlink.c sigaction.c sigqueue.c signal.c siglongjmp.c sigwait.c \ + rename.c resource.c sched.c select.c seteuid.c shm_open.c shm_unlink.c \ + sig.c sigaction.c sigqueue.c signal.c siglongjmp.c sigset.c sigwait.c \ socket.c sleep.c stack.c sysconf.c sysctl.c systat.c system.c \ tcdrain.c tcsendbrk.c termios.c time.c usleep.c wait.c @@ -142,11 +142,11 @@ LIBS = @LIBS@ @USE_LIBTOOL_FALSE@ids.o inode.o io.o io64.o linux.o mmap.o pread.o \ @USE_LIBTOOL_FALSE@pread64.o process.o pwrite.o pwrite64.o raise.o \ @USE_LIBTOOL_FALSE@realpath.o rename.o resource.o sched.o select.o \ -@USE_LIBTOOL_FALSE@seteuid.o shm_open.o shm_unlink.o sigaction.o \ -@USE_LIBTOOL_FALSE@sigqueue.o signal.o siglongjmp.o sigwait.o socket.o \ -@USE_LIBTOOL_FALSE@sleep.o stack.o sysconf.o sysctl.o systat.o system.o \ -@USE_LIBTOOL_FALSE@tcdrain.o tcsendbrk.o termios.o time.o usleep.o \ -@USE_LIBTOOL_FALSE@wait.o +@USE_LIBTOOL_FALSE@seteuid.o shm_open.o shm_unlink.o sig.o sigaction.o \ +@USE_LIBTOOL_FALSE@sigqueue.o signal.o siglongjmp.o sigset.o sigwait.o \ +@USE_LIBTOOL_FALSE@socket.o sleep.o stack.o sysconf.o sysctl.o systat.o \ +@USE_LIBTOOL_FALSE@system.o tcdrain.o tcsendbrk.o termios.o time.o \ +@USE_LIBTOOL_FALSE@usleep.o wait.o LTLIBRARIES = $(noinst_LTLIBRARIES) @USE_LIBTOOL_TRUE@liblinux_la_DEPENDENCIES = @@ -156,10 +156,11 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) @USE_LIBTOOL_TRUE@mmap.lo pread.lo pread64.lo process.lo pwrite.lo \ @USE_LIBTOOL_TRUE@pwrite64.lo raise.lo realpath.lo rename.lo \ @USE_LIBTOOL_TRUE@resource.lo sched.lo select.lo seteuid.lo shm_open.lo \ -@USE_LIBTOOL_TRUE@shm_unlink.lo sigaction.lo sigqueue.lo signal.lo \ -@USE_LIBTOOL_TRUE@siglongjmp.lo sigwait.lo socket.lo sleep.lo stack.lo \ -@USE_LIBTOOL_TRUE@sysconf.lo sysctl.lo systat.lo system.lo tcdrain.lo \ -@USE_LIBTOOL_TRUE@tcsendbrk.lo termios.lo time.lo usleep.lo wait.lo +@USE_LIBTOOL_TRUE@shm_unlink.lo sig.lo sigaction.lo sigqueue.lo \ +@USE_LIBTOOL_TRUE@signal.lo siglongjmp.lo sigset.lo sigwait.lo \ +@USE_LIBTOOL_TRUE@socket.lo sleep.lo stack.lo sysconf.lo sysctl.lo \ +@USE_LIBTOOL_TRUE@systat.lo system.lo tcdrain.lo tcsendbrk.lo \ +@USE_LIBTOOL_TRUE@termios.lo time.lo usleep.lo wait.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -519,7 +520,7 @@ crt0.o: machine/crt0.o machine/crt0.o: ; @true -signal.$(oext): siglist.inc +sig.$(oext): siglist.inc siglist.inc: $(AWK) '/#define.SIG.*[1-9][0-9]*/ { n[$$3] = $$2 } \ diff --git a/newlib/libc/sys/linux/machine/i386/Makefile.am b/newlib/libc/sys/linux/machine/i386/Makefile.am index dbf819cca..596ff3e71 100644 --- a/newlib/libc/sys/linux/machine/i386/Makefile.am +++ b/newlib/libc/sys/linux/machine/i386/Makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) -LIB_SOURCES = setjmp.S sigaction.c sigset.c +LIB_SOURCES = setjmp.S sigaction.c liblinuxi386_la_LDFLAGS = -Xcompiler -nostdlib diff --git a/newlib/libc/sys/linux/machine/i386/Makefile.in b/newlib/libc/sys/linux/machine/i386/Makefile.in index cfbb3ccf6..c5dd46939 100644 --- a/newlib/libc/sys/linux/machine/i386/Makefile.in +++ b/newlib/libc/sys/linux/machine/i386/Makefile.in @@ -92,7 +92,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) -LIB_SOURCES = setjmp.S sigaction.c sigset.c +LIB_SOURCES = setjmp.S sigaction.c liblinuxi386_la_LDFLAGS = -Xcompiler -nostdlib @@ -116,12 +116,11 @@ DEFS = @DEFS@ -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LIBS = @LIBS@ lib_a_LIBADD = -@USE_LIBTOOL_FALSE@lib_a_OBJECTS = setjmp.o sigaction.o sigset.o +@USE_LIBTOOL_FALSE@lib_a_OBJECTS = setjmp.o sigaction.o LTLIBRARIES = $(noinst_LTLIBRARIES) liblinuxi386_la_LIBADD = -@USE_LIBTOOL_TRUE@liblinuxi386_la_OBJECTS = setjmp.lo sigaction.lo \ -@USE_LIBTOOL_TRUE@sigset.lo +@USE_LIBTOOL_TRUE@liblinuxi386_la_OBJECTS = setjmp.lo sigaction.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) diff --git a/newlib/libc/sys/linux/sig.c b/newlib/libc/sys/linux/sig.c new file mode 100644 index 000000000..d083b1744 --- /dev/null +++ b/newlib/libc/sys/linux/sig.c @@ -0,0 +1,83 @@ +/* libc/sys/linux/signal.c - Signal handling functions */ + +/* Written 2000 by Werner Almesberger */ + + +#include <signal.h> +#include <unistd.h> +#include <sys/types.h> +#include <machine/syscall.h> + +/* avoid name space pollution */ +#define __NR___sgetmask __NR_sgetmask +#define __NR___ssetmask __NR_ssetmask +#define __NR___rt_sigtimedwait __NR_rt_sigtimedwait +#define __NR___rt_sigpending __NR_rt_sigpending +#define __NR___rt_sigprocmask __NR_rt_sigprocmask +#define __NR___rt_sigsuspend __NR_rt_sigsuspend + +_syscall2(int,kill,pid_t,pid,int,sig) +_syscall2(__sighandler_t,signal,int,signum,__sighandler_t,handler) +_syscall0(int,pause) +_syscall1(unsigned int,alarm,unsigned int,seconds) + +static _syscall0(int,__sgetmask) +static _syscall1(int,__ssetmask,int,newmask) +static _syscall2(int,__rt_sigpending,sigset_t *,set,size_t,size) +static _syscall4(int,__rt_sigprocmask,int,how,const sigset_t *,set,sigset_t *,oldset,size_t,size) +static _syscall2(int,__rt_sigsuspend,const sigset_t *,mask,size_t,size) +static _syscall4(int,__rt_sigtimedwait,const sigset_t *,set,siginfo_t *,info,struct timespec *,timeout,size_t,size) + +int __sigsuspend (const sigset_t *mask) +{ + return __rt_sigsuspend(mask, NSIG/8); +} +weak_alias(__sigsuspend,sigsuspend) + +int sigsetmask(int newmask) /* BSD */ +{ + return __ssetmask(newmask); +} + +int sigmask(int signum) /* BSD */ +{ + return 1 << signum; +} + +int sigblock(int mask) /* BSD */ +{ + return __ssetmask(mask | __sgetmask()); +} + +int __libc_raise(int sig) +{ + return kill(getpid(),sig); +} +weak_alias(__libc_raise,raise) + +int __sigpending(sigset_t *set) +{ + return __rt_sigpending(set, NSIG/8); +} +weak_alias(__sigpending,sigpending) + +int __sigprocmask (int how,const sigset_t *set,sigset_t *oldset) +{ + return __rt_sigprocmask(how, set, oldset, NSIG/8); +} +weak_alias(__sigprocmask,sigprocmask) + +int sigtimedwait(const sigset_t *set, siginfo_t *info, + struct timespec *timeout) +{ + return __rt_sigtimedwait(set, info, timeout, NSIG/8); +} + +int sigwaitinfo(const sigset_t *set, siginfo_t *info) +{ + return __rt_sigtimedwait(set, info, NULL, NSIG/8); +} + +const char *const sys_siglist[] = { +#include "siglist.inc" +}; diff --git a/newlib/libc/sys/linux/sigaction.c b/newlib/libc/sys/linux/sigaction.c index a70950276..6ee3fa2cb 100644 --- a/newlib/libc/sys/linux/sigaction.c +++ b/newlib/libc/sys/linux/sigaction.c @@ -60,7 +60,7 @@ __libc_sigaction (sig, act, oact) real size of the user-level sigset_t. */ result = __rt_sigaction (sig, act ? (&kact) : NULL, - oact ? (&koact) : NULL, _NSIG / 8); + oact ? (&koact) : NULL, NSIG / 8); if (oact && result >= 0) { diff --git a/newlib/libc/sys/linux/signal.c b/newlib/libc/sys/linux/signal.c index 1affe6f24..b43cd778c 100644 --- a/newlib/libc/sys/linux/signal.c +++ b/newlib/libc/sys/linux/signal.c @@ -1,83 +1,54 @@ -/* libc/sys/linux/signal.c - Signal handling functions */ - -/* Written 2000 by Werner Almesberger */ - - +/* BSD-like signal function. + Copyright (C) 1991, 1992, 1996, 1997, 2000 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; 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> -#include <sys/types.h> -#include <machine/syscall.h> - -/* avoid name space pollution */ -#define __NR___sgetmask __NR_sgetmask -#define __NR___ssetmask __NR_ssetmask -#define __NR___rt_sigtimedwait __NR_rt_sigtimedwait -#define __NR___rt_sigpending __NR_rt_sigpending -#define __NR___rt_sigprocmask __NR_rt_sigprocmask -#define __NR___rt_sigsuspend __NR_rt_sigsuspend - -_syscall2(int,kill,pid_t,pid,int,sig) -_syscall2(__sighandler_t,signal,int,signum,__sighandler_t,handler) -_syscall0(int,pause) -_syscall1(unsigned int,alarm,unsigned int,seconds) - -static _syscall0(int,__sgetmask) -static _syscall1(int,__ssetmask,int,newmask) -static _syscall2(int,__rt_sigpending,sigset_t *,set,size_t,size) -static _syscall4(int,__rt_sigprocmask,int,how,const sigset_t *,set,sigset_t *,oldset,size_t,size) -static _syscall2(int,__rt_sigsuspend,const sigset_t *,mask,size_t,size) -static _syscall4(int,__rt_sigtimedwait,const sigset_t *,set,siginfo_t *,info,struct timespec *,timeout,size_t,size) - -int __sigsuspend (const sigset_t *mask) -{ - return __rt_sigsuspend(mask, _NSIG/8); -} -weak_alias(__sigsuspend,sigsuspend) - -int sigsetmask(int newmask) /* BSD */ -{ - return __ssetmask(newmask); -} - -int sigmask(int signum) /* BSD */ -{ - return 1 << signum; -} - -int sigblock(int mask) /* BSD */ -{ - return __ssetmask(mask | __sgetmask()); -} - -int __libc_raise(int sig) -{ - return kill(getpid(),sig); -} -weak_alias(__libc_raise,raise) - -int __sigpending(sigset_t *set) -{ - return __rt_sigpending(set, _NSIG/8); -} -weak_alias(__sigpending,sigpending) - -int __sigprocmask (int how,const sigset_t *set,sigset_t *oldset) -{ - return __rt_sigprocmask(how, set, oldset, _NSIG/8); -} -weak_alias(__sigprocmask,sigprocmask) - -int sigtimedwait(const sigset_t *set, siginfo_t *info, - struct timespec *timeout) -{ - return __rt_sigtimedwait(set, info, timeout, _NSIG/8); -} - -int sigwaitinfo(const sigset_t *set, siginfo_t *info) -{ - return __rt_sigtimedwait(set, info, NULL, _NSIG/8); -} - -const char *const sys_siglist[] = { -#include "siglist.inc" -}; +#include <machine/weakalias.h> + +sigset_t _sigintr; /* Set by siginterrupt. */ + +/* Set the handler for the signal SIG to HANDLER, + returning the old handler, or SIG_ERR on error. */ +__sighandler_t +__bsd_signal (sig, handler) + int sig; + __sighandler_t handler; +{ + struct sigaction act, oact; + + /* Check signal extents to protect __sigismember. */ + if (handler == SIG_ERR || sig < 1 || sig >= NSIG) + { + errno = (EINVAL); + return SIG_ERR; + } + + act.sa_handler = handler; + if (sigemptyset (&act.sa_mask) < 0 + || sigaddset (&act.sa_mask, sig) < 0) + return SIG_ERR; + act.sa_flags = sigismember (&_sigintr, sig) ? 0 : SA_RESTART; + if (sigaction (sig, &act, &oact) < 0) + return SIG_ERR; + + return oact.sa_handler; +} +weak_alias (__bsd_signal, bsd_signal) +weak_alias (__bsd_signal, signal) +weak_alias (__bsd_signal, ssignal) diff --git a/newlib/libc/sys/linux/machine/i386/sigset.c b/newlib/libc/sys/linux/sigset.c index 4a53fda8a..b6f2d79e5 100644 --- a/newlib/libc/sys/linux/machine/i386/sigset.c +++ b/newlib/libc/sys/linux/sigset.c @@ -12,6 +12,7 @@ #include <bits/sigset.h> #include <errno.h> #include <string.h> +#include <machine/weakalias.h> int sigaddset (sigset_t *set, const int signo) @@ -25,8 +26,8 @@ sigaddset (sigset_t *set, const int signo) return -1; } - index = (signo - 1) / 32; - mask = 1 << ((signo - 1) % 32); + index = (signo - 1) / (8 * sizeof(long)); + mask = 1 << ((signo - 1) % (8 * sizeof(long))); st->__val[index] |= mask; return 0; @@ -46,8 +47,8 @@ sigdelset (sigset_t *set, const int signo) return -1; } - index = (signo - 1) / 32; - mask = 1 << ((signo - 1) % 32); + index = (signo - 1) / (8 * sizeof(long)); + mask = 1 << ((signo - 1) % (8 * sizeof(long))); st->__val[index] &= ~mask; return 0; @@ -89,8 +90,8 @@ sigismember (const sigset_t *set, int signo) return -1; } - index = (signo - 1) / 32; - mask = 1 << ((signo - 1) % 32); + index = (signo - 1) / (8 * sizeof(long)); + mask = 1 << ((signo - 1) % (8 * sizeof(long))); return (st->__val[index] & mask) != 0; } diff --git a/newlib/libc/sys/linux/sys/signal.h b/newlib/libc/sys/linux/sys/signal.h index 95b561d41..3367ca8b7 100644 --- a/newlib/libc/sys/linux/sys/signal.h +++ b/newlib/libc/sys/linux/sys/signal.h @@ -5,13 +5,21 @@ #ifndef _SYS_SIGNAL_H #define _SYS_SIGNAL_H +#define _SIGNAL_H #include <sys/types.h> #include <linux/signal.h> #include <bits/sigset.h> -#define _SIGNAL_H #include <bits/signum.h> +/* we want RT signals so we must override the definition of sigset_t + and NSIG */ + +#undef NSIG +#define NSIG _NSIG +#undef sigset_t +#define sigset_t __sigset_t + /* --- include/signal.h thinks it knows better :-( --- */ #undef SIG_DFL diff --git a/newlib/libc/unix/sigset.c b/newlib/libc/unix/sigset.c index ecb3d0800..cd73a78c8 100644 --- a/newlib/libc/unix/sigset.c +++ b/newlib/libc/unix/sigset.c @@ -1,7 +1,7 @@ #include <signal.h> #include <errno.h> -#ifdef SIG_SETMASK /* easier than trying to remove from Makefile */ +#if defined(SIG_SETMASK) && NSIG <= 32 /* easier than trying to remove from Makefile */ #undef sigemptyset int |