mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 22:10:13 +00:00
Remove sigvec.
This commit is contained in:
parent
5ae4fe60e6
commit
0781a7772a
22
ChangeLog
22
ChangeLog
@ -1,3 +1,25 @@
|
|||||||
|
2014-11-14 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
|
* signal/signal.h [__USE_MISC]
|
||||||
|
(struct sigvec): Remove type.
|
||||||
|
(SV_ONSTACK, SV_INTERRUPT, SV_RESETHAND): Remove macros.
|
||||||
|
(sigvec): Remove declaration.
|
||||||
|
* sysdeps/posix/sigvec.c: Moved ...
|
||||||
|
* signal/sigvec.c: ... here, replacing old file.
|
||||||
|
(struct sigvec): New type, copied from old signal.h definition.
|
||||||
|
(SV_ONSTACK, SV_INTERRUPT, SV_RESETHAND): New macros, likewise copied.
|
||||||
|
(__sigvec): Convert definition to prototype.
|
||||||
|
(sigvec): Replace weak_alias with compat_symbol.
|
||||||
|
* signal/Versions (libc: GLIBC_2.21): New version set.
|
||||||
|
* include/signal.h: Remove __sigvec declaration.
|
||||||
|
* sysdeps/unix/bsd/sigvec.c: Remove file.
|
||||||
|
* sysdeps/unix/bsd/syscalls.list: Remove sigvec.
|
||||||
|
* manual/signal.texi (BSD Handler): Remove subsection.
|
||||||
|
Move siginterrupt up to ...
|
||||||
|
(BSD Signal Handling): ... here. Mark it as XPG rather than BSD.
|
||||||
|
(Blocking in BSD): Fold subsection into its parent.
|
||||||
|
* NEWS: Mention sigvec removal.
|
||||||
|
|
||||||
2014-11-14 Joseph Myers <joseph@codesourcery.com>
|
2014-11-14 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* sysdeps/x86_64/fpu/dla.h [__FMA4__ && __GNUC_PREREQ (4, 6)]
|
* sysdeps/x86_64/fpu/dla.h [__FMA4__ && __GNUC_PREREQ (4, 6)]
|
||||||
|
5
NEWS
5
NEWS
@ -19,6 +19,11 @@ Version 2.21
|
|||||||
still be used to compile programs using the GNU C Library.
|
still be used to compile programs using the GNU C Library.
|
||||||
|
|
||||||
* New locales: tu_IN, bh_IN.
|
* New locales: tu_IN, bh_IN.
|
||||||
|
|
||||||
|
* The obsolete sigvec function has been removed. This was the original
|
||||||
|
4.2BSD interface that inspired the POSIX.1 sigaction interface, which
|
||||||
|
programs have been using instead for about 25 years. Of course, ABI
|
||||||
|
compatibility for old binaries using sigvec remains intact.
|
||||||
|
|
||||||
Version 2.20
|
Version 2.20
|
||||||
|
|
||||||
|
@ -41,8 +41,6 @@ extern int __sigtimedwait (const sigset_t *__set, siginfo_t *__info,
|
|||||||
libc_hidden_proto (__sigtimedwait)
|
libc_hidden_proto (__sigtimedwait)
|
||||||
extern int __sigqueue (__pid_t __pid, int __sig,
|
extern int __sigqueue (__pid_t __pid, int __sig,
|
||||||
const union sigval __val);
|
const union sigval __val);
|
||||||
extern int __sigvec (int __sig, const struct sigvec *__vec,
|
|
||||||
struct sigvec *__ovec);
|
|
||||||
extern int __sigreturn (struct sigcontext *__scp);
|
extern int __sigreturn (struct sigcontext *__scp);
|
||||||
extern int __sigaltstack (const struct sigaltstack *__ss,
|
extern int __sigaltstack (const struct sigaltstack *__ss,
|
||||||
struct sigaltstack *__oss);
|
struct sigaltstack *__oss);
|
||||||
|
@ -3306,101 +3306,15 @@ BSD Unix.
|
|||||||
There are many similarities between the BSD and POSIX signal handling
|
There are many similarities between the BSD and POSIX signal handling
|
||||||
facilities, because the POSIX facilities were inspired by the BSD
|
facilities, because the POSIX facilities were inspired by the BSD
|
||||||
facilities. Besides having different names for all the functions to
|
facilities. Besides having different names for all the functions to
|
||||||
avoid conflicts, the main differences between the two are:
|
avoid conflicts, the main difference between the two is that BSD Unix
|
||||||
|
represents signal masks as an @code{int} bit mask, rather than as a
|
||||||
@itemize @bullet
|
@code{sigset_t} object.
|
||||||
@item
|
|
||||||
BSD Unix represents signal masks as an @code{int} bit mask, rather than
|
|
||||||
as a @code{sigset_t} object.
|
|
||||||
|
|
||||||
@item
|
|
||||||
The BSD facilities use a different default for whether an interrupted
|
|
||||||
primitive should fail or resume. The POSIX facilities make system
|
|
||||||
calls fail unless you specify that they should resume. With the BSD
|
|
||||||
facility, the default is to make system calls resume unless you say they
|
|
||||||
should fail. @xref{Interrupted Primitives}.
|
|
||||||
@end itemize
|
|
||||||
|
|
||||||
The BSD facilities are declared in @file{signal.h}.
|
The BSD facilities are declared in @file{signal.h}.
|
||||||
@pindex signal.h
|
@pindex signal.h
|
||||||
|
|
||||||
@menu
|
|
||||||
* BSD Handler:: BSD Function to Establish a Handler.
|
|
||||||
* Blocking in BSD:: BSD Functions for Blocking Signals.
|
|
||||||
@end menu
|
|
||||||
|
|
||||||
@node BSD Handler
|
|
||||||
@subsection BSD Function to Establish a Handler
|
|
||||||
|
|
||||||
@comment signal.h
|
@comment signal.h
|
||||||
@comment BSD
|
@comment XPG
|
||||||
@deftp {Data Type} {struct sigvec}
|
|
||||||
This data type is the BSD equivalent of @code{struct sigaction}
|
|
||||||
(@pxref{Advanced Signal Handling}); it is used to specify signal actions
|
|
||||||
to the @code{sigvec} function. It contains the following members:
|
|
||||||
|
|
||||||
@table @code
|
|
||||||
@item sighandler_t sv_handler
|
|
||||||
This is the handler function.
|
|
||||||
|
|
||||||
@item int sv_mask
|
|
||||||
This is the mask of additional signals to be blocked while the handler
|
|
||||||
function is being called.
|
|
||||||
|
|
||||||
@item int sv_flags
|
|
||||||
This is a bit mask used to specify various flags which affect the
|
|
||||||
behavior of the signal. You can also refer to this field as
|
|
||||||
@code{sv_onstack}.
|
|
||||||
@end table
|
|
||||||
@end deftp
|
|
||||||
|
|
||||||
These symbolic constants can be used to provide values for the
|
|
||||||
@code{sv_flags} field of a @code{sigvec} structure. This field is a bit
|
|
||||||
mask value, so you bitwise-OR the flags of interest to you together.
|
|
||||||
|
|
||||||
@comment signal.h
|
|
||||||
@comment BSD
|
|
||||||
@deftypevr Macro int SV_ONSTACK
|
|
||||||
If this bit is set in the @code{sv_flags} field of a @code{sigvec}
|
|
||||||
structure, it means to use the signal stack when delivering the signal.
|
|
||||||
@end deftypevr
|
|
||||||
|
|
||||||
@comment signal.h
|
|
||||||
@comment BSD
|
|
||||||
@deftypevr Macro int SV_INTERRUPT
|
|
||||||
If this bit is set in the @code{sv_flags} field of a @code{sigvec}
|
|
||||||
structure, it means that system calls interrupted by this kind of signal
|
|
||||||
should not be restarted if the handler returns; instead, the system
|
|
||||||
calls should return with a @code{EINTR} error status. @xref{Interrupted
|
|
||||||
Primitives}.
|
|
||||||
@end deftypevr
|
|
||||||
|
|
||||||
@comment signal.h
|
|
||||||
@comment Sun
|
|
||||||
@deftypevr Macro int SV_RESETHAND
|
|
||||||
If this bit is set in the @code{sv_flags} field of a @code{sigvec}
|
|
||||||
structure, it means to reset the action for the signal back to
|
|
||||||
@code{SIG_DFL} when the signal is received.
|
|
||||||
@end deftypevr
|
|
||||||
|
|
||||||
@comment signal.h
|
|
||||||
@comment BSD
|
|
||||||
@deftypefun int sigvec (int @var{signum}, const struct sigvec *@var{action}, struct sigvec *@var{old-action})
|
|
||||||
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
|
|
||||||
@c This is mostly a safe wrapper for sigaction. The exception are
|
|
||||||
@c systems that lack SA_RESETHAND, in which a signal handler wrapper is
|
|
||||||
@c used that calls sigaction to reset the handler before calling the
|
|
||||||
@c user-supplied handler; it's unlikely that this emulation is used
|
|
||||||
@c anywhere, for user-supplied flags and mask don't seem to be used
|
|
||||||
@c the way one would expect.
|
|
||||||
This function is the equivalent of @code{sigaction} (@pxref{Advanced Signal
|
|
||||||
Handling}); it installs the action @var{action} for the signal @var{signum},
|
|
||||||
returning information about the previous action in effect for that signal
|
|
||||||
in @var{old-action}.
|
|
||||||
@end deftypefun
|
|
||||||
|
|
||||||
@comment signal.h
|
|
||||||
@comment BSD
|
|
||||||
@deftypefun int siginterrupt (int @var{signum}, int @var{failflag})
|
@deftypefun int siginterrupt (int @var{signum}, int @var{failflag})
|
||||||
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtssigintr{}}}@asunsafe{}@acunsafe{@acucorrupt{}}}
|
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtssigintr{}}}@asunsafe{}@acunsafe{@acucorrupt{}}}
|
||||||
@c This calls sigaction twice, once to get the current sigaction for the
|
@c This calls sigaction twice, once to get the current sigaction for the
|
||||||
@ -3417,9 +3331,6 @@ true, handling @var{signum} causes these primitives to fail with error
|
|||||||
code @code{EINTR}. @xref{Interrupted Primitives}.
|
code @code{EINTR}. @xref{Interrupted Primitives}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@node Blocking in BSD
|
|
||||||
@subsection BSD Functions for Blocking Signals
|
|
||||||
|
|
||||||
@comment signal.h
|
@comment signal.h
|
||||||
@comment BSD
|
@comment BSD
|
||||||
@deftypefn Macro int sigmask (int @var{signum})
|
@deftypefn Macro int sigmask (int @var{signum})
|
||||||
|
@ -49,4 +49,6 @@ libc {
|
|||||||
# Needed to provide a pointer to the XPG sigpause function.
|
# Needed to provide a pointer to the XPG sigpause function.
|
||||||
__xpg_sigpause;
|
__xpg_sigpause;
|
||||||
}
|
}
|
||||||
|
GLIBC_2.21 {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -303,30 +303,6 @@ extern int sigqueue (__pid_t __pid, int __sig, const union sigval __val)
|
|||||||
extern const char *const _sys_siglist[_NSIG];
|
extern const char *const _sys_siglist[_NSIG];
|
||||||
extern const char *const sys_siglist[_NSIG];
|
extern const char *const sys_siglist[_NSIG];
|
||||||
|
|
||||||
/* Structure passed to `sigvec'. */
|
|
||||||
struct sigvec
|
|
||||||
{
|
|
||||||
__sighandler_t sv_handler; /* Signal handler. */
|
|
||||||
int sv_mask; /* Mask of signals to be blocked. */
|
|
||||||
|
|
||||||
int sv_flags; /* Flags (see below). */
|
|
||||||
# define sv_onstack sv_flags /* 4.2 BSD compatibility. */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Bits in `sv_flags'. */
|
|
||||||
# define SV_ONSTACK (1 << 0)/* Take the signal on the signal stack. */
|
|
||||||
# define SV_INTERRUPT (1 << 1)/* Do not restart system calls. */
|
|
||||||
# define SV_RESETHAND (1 << 2)/* Reset handler to SIG_DFL on receipt. */
|
|
||||||
|
|
||||||
|
|
||||||
/* If VEC is non-NULL, set the handler for SIG to the `sv_handler' member
|
|
||||||
of VEC. The signals in `sv_mask' will be blocked while the handler runs.
|
|
||||||
If the SV_RESETHAND bit is set in `sv_flags', the handler for SIG will be
|
|
||||||
reset to SIG_DFL before `sv_handler' is entered. If OVEC is non-NULL,
|
|
||||||
it is filled in with the old information for SIG. */
|
|
||||||
extern int sigvec (int __sig, const struct sigvec *__vec,
|
|
||||||
struct sigvec *__ovec) __THROW;
|
|
||||||
|
|
||||||
|
|
||||||
/* Get machine-dependent `struct sigcontext' and signal subcodes. */
|
/* Get machine-dependent `struct sigcontext' and signal subcodes. */
|
||||||
# include <bits/sigcontext.h>
|
# include <bits/sigcontext.h>
|
||||||
|
190
signal/sigvec.c
190
signal/sigvec.c
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
|
/* ABI compatibility for obsolete sigvec function from 4.2BSD.
|
||||||
|
Copyright (C) 1991-2014 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -15,8 +16,47 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <signal.h>
|
#include <shlib-compat.h>
|
||||||
#include <errno.h>
|
|
||||||
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_21)
|
||||||
|
|
||||||
|
# include <signal.h>
|
||||||
|
# include <errno.h>
|
||||||
|
# include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* These are the struct sigvec and SV_* bit definitions that
|
||||||
|
used to be in <signal.h>. The whole interface now exists
|
||||||
|
solely for ABI compatibility, so it can just be here. */
|
||||||
|
struct sigvec
|
||||||
|
{
|
||||||
|
__sighandler_t sv_handler; /* Signal handler. */
|
||||||
|
int sv_mask; /* Mask of signals to be blocked. */
|
||||||
|
|
||||||
|
int sv_flags; /* Flags (see below). */
|
||||||
|
};
|
||||||
|
# define SV_ONSTACK (1 << 0)/* Take the signal on the signal stack. */
|
||||||
|
# define SV_INTERRUPT (1 << 1)/* Do not restart system calls. */
|
||||||
|
# define SV_RESETHAND (1 << 2)/* Reset handler to SIG_DFL on receipt. */
|
||||||
|
|
||||||
|
|
||||||
|
/* Include macros to convert between `sigset_t' and old-style mask. */
|
||||||
|
# include <sigset-cvt-mask.h>
|
||||||
|
|
||||||
|
# ifndef SA_RESETHAND
|
||||||
|
/* When sigaction lacks the extension bit for it,
|
||||||
|
we use a wrapper handler to support SV_RESETHAND. */
|
||||||
|
struct sigvec_wrapper_data
|
||||||
|
{
|
||||||
|
__sighandler_t sw_handler;
|
||||||
|
unsigned int sw_mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void sigvec_wrapper_handler (int sig) __THROW;
|
||||||
|
|
||||||
|
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
|
||||||
of VEC. The signals in `sv_mask' will be blocked while the handler runs.
|
of VEC. The signals in `sv_mask' will be blocked while the handler runs.
|
||||||
@ -24,14 +64,140 @@
|
|||||||
reset to SIG_DFL before `sv_handler' is entered. If OVEC is non-NULL,
|
reset to SIG_DFL before `sv_handler' is entered. If OVEC is non-NULL,
|
||||||
it is filled in with the old information for SIG. */
|
it is filled in with the old information for SIG. */
|
||||||
int
|
int
|
||||||
__sigvec (sig, vec, ovec)
|
__sigvec (int sig,
|
||||||
int sig;
|
const struct sigvec *vec,
|
||||||
const struct sigvec *vec;
|
struct sigvec *ovec)
|
||||||
struct sigvec *ovec;
|
|
||||||
{
|
{
|
||||||
__set_errno (ENOSYS);
|
struct sigaction old;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
stub_warning (sigvec)
|
|
||||||
|
|
||||||
weak_alias (__sigvec, sigvec)
|
# ifndef SA_RESETHAND
|
||||||
|
if (vec == NULL || !(vec->sv_flags & SV_RESETHAND))
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
struct sigaction new, *n;
|
||||||
|
|
||||||
|
if (vec == NULL)
|
||||||
|
n = NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__sighandler_t handler;
|
||||||
|
unsigned int mask;
|
||||||
|
unsigned int sv_flags;
|
||||||
|
unsigned int sa_flags;
|
||||||
|
|
||||||
|
handler = vec->sv_handler;
|
||||||
|
mask = vec->sv_mask;
|
||||||
|
sv_flags = vec->sv_flags;
|
||||||
|
sa_flags = 0;
|
||||||
|
if (sv_flags & SV_ONSTACK)
|
||||||
|
{
|
||||||
|
# ifdef SA_ONSTACK
|
||||||
|
sa_flags |= SA_ONSTACK;
|
||||||
|
# else
|
||||||
|
__set_errno (ENOSYS);
|
||||||
|
return -1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
# ifdef SA_RESTART
|
||||||
|
if (!(sv_flags & SV_INTERRUPT))
|
||||||
|
sa_flags |= SA_RESTART;
|
||||||
|
# endif
|
||||||
|
# ifdef SA_RESETHAND
|
||||||
|
if (sv_flags & SV_RESETHAND)
|
||||||
|
sa_flags |= SA_RESETHAND;
|
||||||
|
# endif
|
||||||
|
n = &new;
|
||||||
|
new.sa_handler = handler;
|
||||||
|
if (sigset_set_old_mask (&new.sa_mask, mask) < 0)
|
||||||
|
return -1;
|
||||||
|
new.sa_flags = sa_flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (__sigaction (sig, n, &old) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
# ifndef SA_RESETHAND
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__sighandler_t handler;
|
||||||
|
unsigned int mask;
|
||||||
|
struct sigvec_wrapper_data *data;
|
||||||
|
struct sigaction wrapper;
|
||||||
|
|
||||||
|
handler = vec->sv_handler;
|
||||||
|
mask = (unsigned int)vec->sv_mask;
|
||||||
|
data = &sigvec_wrapper_data[sig];
|
||||||
|
wrapper.sa_handler = sigvec_wrapper_handler;
|
||||||
|
/* FIXME: should we set wrapper.sa_mask, wrapper.sa_flags?? */
|
||||||
|
data->sw_handler = handler;
|
||||||
|
data->sw_mask = mask;
|
||||||
|
|
||||||
|
if (__sigaction (sig, &wrapper, &old) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if (ovec != NULL)
|
||||||
|
{
|
||||||
|
__sighandler_t handler;
|
||||||
|
unsigned int sv_flags;
|
||||||
|
unsigned int sa_flags;
|
||||||
|
unsigned int mask;
|
||||||
|
|
||||||
|
handler = old.sa_handler;
|
||||||
|
sv_flags = 0;
|
||||||
|
sa_flags = old.sa_flags;
|
||||||
|
# ifndef SA_RESETHAND
|
||||||
|
if (handler == sigvec_wrapper_handler)
|
||||||
|
{
|
||||||
|
handler = sigvec_wrapper_data[sig].sw_handler;
|
||||||
|
/* should we use data->sw_mask?? */
|
||||||
|
sv_flags |= SV_RESETHAND;
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
if (sa_flags & SA_RESETHAND)
|
||||||
|
sv_flags |= SV_RESETHAND;
|
||||||
|
# endif
|
||||||
|
mask = sigset_get_old_mask (&old.sa_mask);
|
||||||
|
# ifdef SA_ONSTACK
|
||||||
|
if (sa_flags & SA_ONSTACK)
|
||||||
|
sv_flags |= SV_ONSTACK;
|
||||||
|
# endif
|
||||||
|
# ifdef SA_RESTART
|
||||||
|
if (!(sa_flags & SA_RESTART))
|
||||||
|
# endif
|
||||||
|
sv_flags |= SV_INTERRUPT;
|
||||||
|
ovec->sv_handler = handler;
|
||||||
|
ovec->sv_mask = (int)mask;
|
||||||
|
ovec->sv_flags = (int)sv_flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
compat_symbol (libc, __sigvec, sigvec, GLIBC_2_0);
|
||||||
|
|
||||||
|
# ifndef SA_RESETHAND
|
||||||
|
static void
|
||||||
|
sigvec_wrapper_handler (sig)
|
||||||
|
int sig;
|
||||||
|
{
|
||||||
|
struct sigvec_wrapper_data *data;
|
||||||
|
struct sigaction act;
|
||||||
|
int save;
|
||||||
|
__sighandler_t handler;
|
||||||
|
|
||||||
|
data = &sigvec_wrapper_data[sig];
|
||||||
|
act.sa_handler = SIG_DFL;
|
||||||
|
act.sa_flags = 0;
|
||||||
|
sigset_set_old_mask (&act.sa_mask, data->sw_mask);
|
||||||
|
handler = data->sw_handler;
|
||||||
|
save = errno;
|
||||||
|
(void) __sigaction (sig, &act, (struct sigaction *) NULL);
|
||||||
|
__set_errno (save);
|
||||||
|
|
||||||
|
(*handler) (sig);
|
||||||
|
}
|
||||||
|
# endif /* No SA_RESETHAND. */
|
||||||
|
|
||||||
|
#endif /* SHLIB_COMPAT */
|
||||||
|
@ -1,181 +0,0 @@
|
|||||||
/* Copyright (C) 1991-2014 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, see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
/* Include macros to convert between `sigset_t' and old-style mask. */
|
|
||||||
#include <sigset-cvt-mask.h>
|
|
||||||
|
|
||||||
#ifndef SA_RESETHAND
|
|
||||||
/* When sigaction lacks the extension bit for it,
|
|
||||||
we use a wrapper handler to support SV_RESETHAND. */
|
|
||||||
struct sigvec_wrapper_data
|
|
||||||
{
|
|
||||||
__sighandler_t sw_handler;
|
|
||||||
unsigned int sw_mask;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void sigvec_wrapper_handler (int sig) __THROW;
|
|
||||||
|
|
||||||
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
|
|
||||||
of VEC. The signals in `sv_mask' will be blocked while the handler runs.
|
|
||||||
If the SV_RESETHAND bit is set in `sv_flags', the handler for SIG will be
|
|
||||||
reset to SIG_DFL before `sv_handler' is entered. If OVEC is non-NULL,
|
|
||||||
it is filled in with the old information for SIG. */
|
|
||||||
int
|
|
||||||
__sigvec (sig, vec, ovec)
|
|
||||||
int sig;
|
|
||||||
const struct sigvec *vec;
|
|
||||||
struct sigvec *ovec;
|
|
||||||
{
|
|
||||||
struct sigaction old;
|
|
||||||
|
|
||||||
#ifndef SA_RESETHAND
|
|
||||||
if (vec == NULL || !(vec->sv_flags & SV_RESETHAND))
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
struct sigaction new, *n;
|
|
||||||
|
|
||||||
if (vec == NULL)
|
|
||||||
n = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__sighandler_t handler;
|
|
||||||
unsigned int mask;
|
|
||||||
unsigned int sv_flags;
|
|
||||||
unsigned int sa_flags;
|
|
||||||
|
|
||||||
handler = vec->sv_handler;
|
|
||||||
mask = vec->sv_mask;
|
|
||||||
sv_flags = vec->sv_flags;
|
|
||||||
sa_flags = 0;
|
|
||||||
if (sv_flags & SV_ONSTACK)
|
|
||||||
{
|
|
||||||
#ifdef SA_ONSTACK
|
|
||||||
sa_flags |= SA_ONSTACK;
|
|
||||||
#else
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef SA_RESTART
|
|
||||||
if (!(sv_flags & SV_INTERRUPT))
|
|
||||||
sa_flags |= SA_RESTART;
|
|
||||||
#endif
|
|
||||||
#ifdef SA_RESETHAND
|
|
||||||
if (sv_flags & SV_RESETHAND)
|
|
||||||
sa_flags |= SA_RESETHAND;
|
|
||||||
#endif
|
|
||||||
n = &new;
|
|
||||||
new.sa_handler = handler;
|
|
||||||
if (sigset_set_old_mask (&new.sa_mask, mask) < 0)
|
|
||||||
return -1;
|
|
||||||
new.sa_flags = sa_flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__sigaction (sig, n, &old) < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#ifndef SA_RESETHAND
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__sighandler_t handler;
|
|
||||||
unsigned int mask;
|
|
||||||
struct sigvec_wrapper_data *data;
|
|
||||||
struct sigaction wrapper;
|
|
||||||
|
|
||||||
handler = vec->sv_handler;
|
|
||||||
mask = (unsigned int)vec->sv_mask;
|
|
||||||
data = &sigvec_wrapper_data[sig];
|
|
||||||
wrapper.sa_handler = sigvec_wrapper_handler;
|
|
||||||
/* FIXME: should we set wrapper.sa_mask, wrapper.sa_flags?? */
|
|
||||||
data->sw_handler = handler;
|
|
||||||
data->sw_mask = mask;
|
|
||||||
|
|
||||||
if (__sigaction (sig, &wrapper, &old) < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ovec != NULL)
|
|
||||||
{
|
|
||||||
__sighandler_t handler;
|
|
||||||
unsigned int sv_flags;
|
|
||||||
unsigned int sa_flags;
|
|
||||||
unsigned int mask;
|
|
||||||
|
|
||||||
handler = old.sa_handler;
|
|
||||||
sv_flags = 0;
|
|
||||||
sa_flags = old.sa_flags;
|
|
||||||
#ifndef SA_RESETHAND
|
|
||||||
if (handler == sigvec_wrapper_handler)
|
|
||||||
{
|
|
||||||
handler = sigvec_wrapper_data[sig].sw_handler;
|
|
||||||
/* should we use data->sw_mask?? */
|
|
||||||
sv_flags |= SV_RESETHAND;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (sa_flags & SA_RESETHAND)
|
|
||||||
sv_flags |= SV_RESETHAND;
|
|
||||||
#endif
|
|
||||||
mask = sigset_get_old_mask (&old.sa_mask);
|
|
||||||
#ifdef SA_ONSTACK
|
|
||||||
if (sa_flags & SA_ONSTACK)
|
|
||||||
sv_flags |= SV_ONSTACK;
|
|
||||||
#endif
|
|
||||||
#ifdef SA_RESTART
|
|
||||||
if (!(sa_flags & SA_RESTART))
|
|
||||||
#endif
|
|
||||||
sv_flags |= SV_INTERRUPT;
|
|
||||||
ovec->sv_handler = handler;
|
|
||||||
ovec->sv_mask = (int)mask;
|
|
||||||
ovec->sv_flags = (int)sv_flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
weak_alias (__sigvec, sigvec)
|
|
||||||
|
|
||||||
#ifndef SA_RESETHAND
|
|
||||||
static void
|
|
||||||
sigvec_wrapper_handler (sig)
|
|
||||||
int sig;
|
|
||||||
{
|
|
||||||
struct sigvec_wrapper_data *data;
|
|
||||||
struct sigaction act;
|
|
||||||
int save;
|
|
||||||
__sighandler_t handler;
|
|
||||||
|
|
||||||
data = &sigvec_wrapper_data[sig];
|
|
||||||
act.sa_handler = SIG_DFL;
|
|
||||||
act.sa_flags = 0;
|
|
||||||
sigset_set_old_mask (&act.sa_mask, data->sw_mask);
|
|
||||||
handler = data->sw_handler;
|
|
||||||
save = errno;
|
|
||||||
(void) __sigaction (sig, &act, (struct sigaction *) NULL);
|
|
||||||
__set_errno (save);
|
|
||||||
|
|
||||||
(*handler) (sig);
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -1 +0,0 @@
|
|||||||
#include <sysdeps/posix/sigvec.c>
|
|
@ -12,5 +12,4 @@ setlogin - setlogin 2 setlogin
|
|||||||
sigaltstack - sigaltstack 2 __sigaltstack sigaltstack
|
sigaltstack - sigaltstack 2 __sigaltstack sigaltstack
|
||||||
sigpause - sigpause 1 __sigpause sigpause
|
sigpause - sigpause 1 __sigpause sigpause
|
||||||
sigstack - sigstack 2 sigstack
|
sigstack - sigstack 2 sigstack
|
||||||
sigvec - sigvec 3 __sigvec sigvec
|
|
||||||
wait4 - wait4 4 __wait4 wait4
|
wait4 - wait4 4 __wait4 wait4
|
||||||
|
Loading…
Reference in New Issue
Block a user