glibc/sysdeps/unix/sysv/linux/arm/sigaction.c

88 lines
2.6 KiB
C
Raw Normal View History

/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
1999-01-21 09:46:15 +00:00
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
2001-07-06 04:56:23 +00:00
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.
1999-01-21 09:46:15 +00:00
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
2001-07-06 04:56:23 +00:00
Lesser General Public License for more details.
1999-01-21 09:46:15 +00:00
2001-07-06 04:56:23 +00:00
You should have received a copy of the GNU Lesser General Public
2012-03-09 23:56:38 +00:00
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
1999-01-21 09:46:15 +00:00
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <sysdep.h>
#include <sys/syscall.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
translate it here. */
#include <kernel_sigaction.h>
#define SA_RESTORER 0x04000000
Remove ARM __ASSUME_SIGFRAME_V2. This patch removes ARM __ASSUME_SIGFRAME_V2 now that the 2.6.18-and-later signal frame layout can be assumed, renaming the affected functions accordingly now only one version of them is needed in glibc. (sigrestorer.S did not in fact include <kernel-features.h> and it appears that, unlike other such cases, it didn't get the header indirectly, so the v1 functions would have been compiled in even when sigaction.c didn't reference them.) (alpha and hppa also have architecture-specific __ASSUME_* macros that should now be removed: __ASSUME_FDATASYNC and __ASSUME_LWS_CAS respectively. I don't have any plans to do anything on that myself.) Tested on ARM. * sysdeps/unix/sysv/linux/arm/kernel-features.h (__ASSUME_SIGFRAME_V2): Remove macro. * sysdeps/unix/sysv/linux/arm/sigrestorer.S: Update comment. [!__ASSUME_SIGFRAME_V2]: Remove conditional code. (__default_sa_restorer_v2): Rename to __default_sa_restorer. (__default_rt_sa_restorer_v2): Rename to __default_rt_sa_restorer. * sysdeps/unix/sysv/linux/arm/sigaction.c (__default_sa_restorer): Declare as function. Remove conditional macro definitions. (__default_rt_sa_restorer): Likewise. (__default_sa_restorer_v1): Remove declaration. (__default_sa_restorer_v2): Likewise. (__default_rt_sa_restorer_v1): Likewise. (__default_rt_sa_restorer_v2): Likewise. * sysdeps/unix/sysv/linux/arm/Versions (GLIBC_PRIVATE): Remove __default_sa_restorer_v1, __default_rt_sa_restorer_v1, __default_sa_restorer_v2 and __default_rt_sa_restorer_v2.
2014-06-21 00:58:56 +00:00
extern void __default_sa_restorer (void);
extern void __default_rt_sa_restorer (void);
1999-01-21 09:46:15 +00:00
/* When RT signals are in use we need to use a different return stub. */
#define choose_restorer(flags) \
(flags & SA_SIGINFO) ? __default_rt_sa_restorer \
: __default_sa_restorer
1999-01-21 09:46:15 +00:00
/* 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
2000-07-07 00:47:05 +00:00
__libc_sigaction (sig, act, oact)
1999-01-21 09:46:15 +00:00
int sig;
const struct sigaction *act;
struct sigaction *oact;
{
int result;
struct kernel_sigaction kact, koact;
1999-01-21 09:46:15 +00:00
if (act)
{
kact.k_sa_handler = act->sa_handler;
memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
kact.sa_flags = act->sa_flags;
#ifdef HAVE_SA_RESTORER
if (kact.sa_flags & SA_RESTORER)
kact.sa_restorer = act->sa_restorer;
1999-01-21 09:46:15 +00:00
else
{
kact.sa_restorer = choose_restorer (kact.sa_flags);
kact.sa_flags |= SA_RESTORER;
1999-01-21 09:46:15 +00:00
}
#endif
1999-01-21 09:46:15 +00:00
}
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
result = INLINE_SYSCALL (rt_sigaction, 4, sig,
act ? &kact : NULL,
oact ? &koact : NULL, _NSIG / 8);
1999-01-21 09:46:15 +00:00
if (oact && result >= 0)
{
oact->sa_handler = koact.k_sa_handler;
memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t));
oact->sa_flags = koact.sa_flags;
#ifdef HAVE_SA_RESTORER
oact->sa_restorer = koact.sa_restorer;
#endif
1999-01-21 09:46:15 +00:00
}
return result;
}
libc_hidden_def (__libc_sigaction)
2014-07-07 16:28:38 +00:00
#include <nptl/sigaction.c>