mirror of
https://sourceware.org/git/glibc.git
synced 2025-05-30 04:04:54 +03:00
2002-10-25 Roland McGrath <roland@redhat.com>
* sysdeps/posix/sigvec.c [SA_RESETHAND]: Disable wrapper hacks and implement SV_RESETHAND by translating it to SA_RESETHAND.
This commit is contained in:
parent
584364156b
commit
04a08397d5
@ -23,7 +23,9 @@
|
|||||||
/* Include macros to convert between `sigset_t' and old-style mask. */
|
/* Include macros to convert between `sigset_t' and old-style mask. */
|
||||||
#include <sigset-cvt-mask.h>
|
#include <sigset-cvt-mask.h>
|
||||||
|
|
||||||
/* We use a wrapper handler to support SV_RESETHAND. */
|
#ifndef SA_RESETHAND
|
||||||
|
/* When sigaction lacks the extension bit for it,
|
||||||
|
we use a wrapper handler to support SV_RESETHAND. */
|
||||||
struct sigvec_wrapper_data
|
struct sigvec_wrapper_data
|
||||||
{
|
{
|
||||||
__sighandler_t sw_handler;
|
__sighandler_t sw_handler;
|
||||||
@ -33,6 +35,7 @@ struct sigvec_wrapper_data
|
|||||||
static void sigvec_wrapper_handler __P ((int sig));
|
static void sigvec_wrapper_handler __P ((int sig));
|
||||||
|
|
||||||
static struct sigvec_wrapper_data sigvec_wrapper_data[NSIG];
|
static struct sigvec_wrapper_data sigvec_wrapper_data[NSIG];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* If VEC is non-NULL, set the handler for SIG to the `sv_handler' member
|
/* If VEC is non-NULL, set the handler for SIG to the `sv_handler' member
|
||||||
@ -48,7 +51,9 @@ __sigvec (sig, vec, ovec)
|
|||||||
{
|
{
|
||||||
struct sigaction old;
|
struct sigaction old;
|
||||||
|
|
||||||
|
#ifndef SA_RESETHAND
|
||||||
if (vec == NULL || !(vec->sv_flags & SV_RESETHAND))
|
if (vec == NULL || !(vec->sv_flags & SV_RESETHAND))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
struct sigaction new, *n;
|
struct sigaction new, *n;
|
||||||
|
|
||||||
@ -77,6 +82,10 @@ __sigvec (sig, vec, ovec)
|
|||||||
#ifdef SA_RESTART
|
#ifdef SA_RESTART
|
||||||
if (!(sv_flags & SV_INTERRUPT))
|
if (!(sv_flags & SV_INTERRUPT))
|
||||||
sa_flags |= SA_RESTART;
|
sa_flags |= SA_RESTART;
|
||||||
|
#endif
|
||||||
|
#ifdef SA_RESETHAND
|
||||||
|
if (sv_flags & SV_RESETHAND)
|
||||||
|
sa_flags |= SA_RESETHAND;
|
||||||
#endif
|
#endif
|
||||||
n = &new;
|
n = &new;
|
||||||
new.sa_handler = handler;
|
new.sa_handler = handler;
|
||||||
@ -88,6 +97,7 @@ __sigvec (sig, vec, ovec)
|
|||||||
if (__sigaction (sig, n, &old) < 0)
|
if (__sigaction (sig, n, &old) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#ifndef SA_RESETHAND
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
__sighandler_t handler;
|
__sighandler_t handler;
|
||||||
@ -106,6 +116,7 @@ __sigvec (sig, vec, ovec)
|
|||||||
if (__sigaction (sig, &wrapper, &old) < 0)
|
if (__sigaction (sig, &wrapper, &old) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ovec != NULL)
|
if (ovec != NULL)
|
||||||
{
|
{
|
||||||
@ -117,12 +128,17 @@ __sigvec (sig, vec, ovec)
|
|||||||
handler = old.sa_handler;
|
handler = old.sa_handler;
|
||||||
sv_flags = 0;
|
sv_flags = 0;
|
||||||
sa_flags = old.sa_flags;
|
sa_flags = old.sa_flags;
|
||||||
|
#ifndef SA_RESETHAND
|
||||||
if (handler == sigvec_wrapper_handler)
|
if (handler == sigvec_wrapper_handler)
|
||||||
{
|
{
|
||||||
handler = sigvec_wrapper_data[sig].sw_handler;
|
handler = sigvec_wrapper_data[sig].sw_handler;
|
||||||
/* should we use data->sw_mask?? */
|
/* should we use data->sw_mask?? */
|
||||||
sv_flags |= SV_RESETHAND;
|
sv_flags |= SV_RESETHAND;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (sa_flags & SA_RESETHAND)
|
||||||
|
sv_flags |= SV_RESETHAND;
|
||||||
|
#endif
|
||||||
mask = sigset_get_old_mask (&old.sa_mask);
|
mask = sigset_get_old_mask (&old.sa_mask);
|
||||||
#ifdef SA_ONSTACK
|
#ifdef SA_ONSTACK
|
||||||
if (sa_flags & SA_ONSTACK)
|
if (sa_flags & SA_ONSTACK)
|
||||||
@ -142,7 +158,7 @@ __sigvec (sig, vec, ovec)
|
|||||||
|
|
||||||
weak_alias (__sigvec, sigvec)
|
weak_alias (__sigvec, sigvec)
|
||||||
|
|
||||||
|
#ifndef SA_RESETHAND
|
||||||
static void
|
static void
|
||||||
sigvec_wrapper_handler (sig)
|
sigvec_wrapper_handler (sig)
|
||||||
int sig;
|
int sig;
|
||||||
@ -163,3 +179,4 @@ sigvec_wrapper_handler (sig)
|
|||||||
|
|
||||||
(*handler) (sig);
|
(*handler) (sig);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user