diff options
author | Roland McGrath <roland@gnu.org> | 2003-03-27 02:45:47 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2003-03-27 02:45:47 +0000 |
commit | 8eed661a56099ba0d4f2e03958ac921d1ca40194 (patch) | |
tree | fd5210d06aa5e159f87cb513c9a37805f5326086 /sysdeps/unix/sysv/linux/arm/sigaction.c | |
parent | 18ef464b2fd20dcfdb57e1ad8eb86a912c874538 (diff) | |
download | glibc-8eed661a56099ba0d4f2e03958ac921d1ca40194.tar glibc-8eed661a56099ba0d4f2e03958ac921d1ca40194.tar.gz glibc-8eed661a56099ba0d4f2e03958ac921d1ca40194.tar.bz2 glibc-8eed661a56099ba0d4f2e03958ac921d1ca40194.zip |
2003-03-27 Philip Blundell <philb@gnu.org>
* sysdeps/unix/sysv/linux/kernel-features.h
(__ASSUME_VFORK_SYSCALL): Define for kernel 2.4 on arm.
* sysdeps/unix/sysv/linux/arm/vfork.S: Elide compatibility code
when __ASSUME_VFORK_SYSCALL is defined.
* sysdeps/unix/sysv/linux/arm/mmap64.S: Likewise for
__ASSUME_MMAP2_SYSCALL.
* sysdeps/unix/sysv/linux/arm/sigaction.c: Likewise for
__ASSUME_REALTIME_SIGNALS.
Diffstat (limited to 'sysdeps/unix/sysv/linux/arm/sigaction.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/sigaction.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c index 46ff2b1599..82e22b679a 100644 --- a/sysdeps/unix/sysv/linux/arm/sigaction.c +++ b/sysdeps/unix/sysv/linux/arm/sigaction.c @@ -22,6 +22,7 @@ #include <sysdep.h> #include <sys/syscall.h> +#include <kernel-features.h> /* The difference here is that the sigaction structure used in the kernel is not the same as we use in the libc. Therefore we must @@ -60,15 +61,21 @@ __libc_sigaction (sig, act, oact) const struct sigaction *act; struct sigaction *oact; { +#ifndef __ASSUME_REALTIME_SIGNALS struct old_kernel_sigaction k_sigact, k_osigact; +#endif int result; #ifdef __NR_rt_sigaction /* First try the RT signals. */ +# ifndef __ASSUME_REALTIME_SIGNALS if (!__libc_missing_rt_sigs) +# endif { struct kernel_sigaction kact, koact; +# ifndef __ASSUME_REALTIME_SIGNALS int saved_errno = errno; +# endif if (act) { @@ -99,7 +106,9 @@ __libc_sigaction (sig, act, oact) act ? __ptrvalue (&kact) : NULL, oact ? __ptrvalue (&koact) : NULL, _NSIG / 8); +# ifndef __ASSUME_REALTIME_SIGNALS if (result >= 0 || errno != ENOSYS) +# endif { if (oact && result >= 0) { @@ -113,17 +122,20 @@ __libc_sigaction (sig, act, oact) return result; } +# ifndef __ASSUME_REALTIME_SIGNALS __set_errno (saved_errno); __libc_missing_rt_sigs = 1; +# endif } #endif +#ifndef __ASSUME_REALTIME_SIGNALS if (act) { 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 +# ifdef HAVE_SA_RESTORER /* See the comments above for why we test SA_ONSTACK. */ if (k_sigact.sa_flags & (SA_RESTORER | SA_ONSTACK)) k_sigact.sa_restorer = act->sa_restorer; @@ -132,7 +144,7 @@ __libc_sigaction (sig, act, oact) k_sigact.sa_restorer = choose_restorer (k_sigact.sa_flags); k_sigact.sa_flags |= SA_RESTORER; } -#endif +# endif } result = INLINE_SYSCALL (sigaction, 3, sig, act ? __ptrvalue (&k_sigact) : NULL, @@ -142,11 +154,12 @@ __libc_sigaction (sig, act, oact) 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 +# ifdef HAVE_SA_RESTORER oact->sa_restorer = k_osigact.sa_restorer; -#endif +# endif } return result; +#endif } libc_hidden_def (__libc_sigaction) |