* [PATCH roland/sigvec] Remove sigvec.
@ 2014-10-03 22:44 Roland McGrath
2014-10-04 0:57 ` Paul Eggert
2014-10-06 9:44 ` Florian Weimer
0 siblings, 2 replies; 9+ messages in thread
From: Roland McGrath @ 2014-10-03 22:44 UTC (permalink / raw)
To: GNU C. Library
This removes the ancient sigvec function, which became obsolete in 1988 and
has probably not actually been used anywhere since a few years thereafter.
There are plenty more obsolete interfaces we should remove. To go
whole-hog on that, we should probably figure out a more conservative
procedure of staged deprecation (announcement and comple-time warnings in
one release, actual removal in the next). I'm not bothering with that for
sigvec because I think it's implausible that anything is really still using
this interface by now (and also because I'm lazy).
Does anybody see any reason to be more properly conservative about removing
sigvec? I'll wait for an ACK from a tastemaker before I commit, not just
an interval of silence like we sometimes do. Of course, if there is
anything wrong with the concrete details of the change, you should tell me
that too.
The signal/sigvec.c diff looks large, but actually there is not much real
change there. It's just that I moved sysdeps/posix/sigvec.c to signal/
first. There is no reason to bother with the old stub code for the ABI
compatibility code. Every existing configuration uses the sysdeps/posix
version already, and future configurations won't need the ABI compat.
Builds and passes check-abi on x86_64-linux-gnu.
Thanks,
Roland
2014-10-03 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.
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,11 @@ Version 2.21
* The following bugs are resolved with this release:
6652, 14171, 17266, 17363, 17370, 17371, 17411.
+
+* 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.
\f
Version 2.20
--- a/include/signal.h
+++ b/include/signal.h
@@ -40,8 +40,6 @@ extern int __sigtimedwait (const sigset_t *__set, siginfo_t *__info,
libc_hidden_proto (__sigtimedwait)
extern int __sigqueue (__pid_t __pid, int __sig,
const union sigval __val);
-extern int __sigvec (int __sig, const struct sigvec *__vec,
- struct sigvec *__ovec);
extern int __sigreturn (struct sigcontext *__scp);
extern int __sigaltstack (const struct sigaltstack *__ss,
struct sigaltstack *__oss);
--- a/manual/signal.texi
+++ b/manual/signal.texi
@@ -3306,101 +3306,15 @@ BSD Unix.
There are many similarities between the BSD and POSIX signal handling
facilities, because the POSIX facilities were inspired by the BSD
facilities. Besides having different names for all the functions to
-avoid conflicts, the main differences between the two are:
-
-@itemize @bullet
-@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
+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
+@code{sigset_t} object.
The BSD facilities are declared in @file{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 BSD
-@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
+@comment XPG
@deftypefun int siginterrupt (int @var{signum}, int @var{failflag})
@safety{@prelim{}@mtunsafe{@mtasuconst{:@mtssigintr{}}}@asunsafe{}@acunsafe{@acucorrupt{}}}
@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}.
@end deftypefun
-@node Blocking in BSD
-@subsection BSD Functions for Blocking Signals
-
@comment signal.h
@comment BSD
@deftypefn Macro int sigmask (int @var{signum})
--- a/signal/Versions
+++ b/signal/Versions
@@ -49,4 +49,6 @@ libc {
# Needed to provide a pointer to the XPG sigpause function.
__xpg_sigpause;
}
+ GLIBC_2.21 {
+ }
}
--- a/signal/signal.h
+++ b/signal/signal.h
@@ -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];
-/* 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. */
# include <bits/sigcontext.h>
--- a/signal/sigvec.c
+++ b/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.
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
<http://www.gnu.org/licenses/>. */
-#include <signal.h>
-#include <errno.h>
+#include <shlib-compat.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
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,
it is filled in with the old information for SIG. */
int
-__sigvec (sig, vec, ovec)
+__sigvec (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;
+}
+
+compat_symbol (libc, __sigvec, sigvec, GLIBC_2_0);
+
+# ifndef SA_RESETHAND
+static void
+sigvec_wrapper_handler (sig)
int sig;
- const struct sigvec *vec;
- struct sigvec *ovec;
{
- __set_errno (ENOSYS);
- return -1;
+ 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);
}
-stub_warning (sigvec)
+# endif /* No SA_RESETHAND. */
-weak_alias (__sigvec, sigvec)
+#endif /* SHLIB_COMPAT */
--- a/sysdeps/posix/sigvec.c
+++ /dev/null
@@ -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
--- a/sysdeps/unix/bsd/sigvec.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/posix/sigvec.c>
--- a/sysdeps/unix/bsd/syscalls.list
+++ b/sysdeps/unix/bsd/syscalls.list
@@ -12,5 +12,4 @@ setlogin - setlogin 2 setlogin
sigaltstack - sigaltstack 2 __sigaltstack sigaltstack
sigpause - sigpause 1 __sigpause sigpause
sigstack - sigstack 2 sigstack
-sigvec - sigvec 3 __sigvec sigvec
wait4 - wait4 4 __wait4 wait4
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-10-03 22:44 [PATCH roland/sigvec] Remove sigvec Roland McGrath
@ 2014-10-04 0:57 ` Paul Eggert
2014-10-06 9:44 ` Florian Weimer
1 sibling, 0 replies; 9+ messages in thread
From: Paul Eggert @ 2014-10-04 0:57 UTC (permalink / raw)
To: Roland McGrath, GNU C. Library
Roland McGrath wrote:
> Does anybody see any reason to be more properly conservative about removing
> sigvec?
I don't. For what it's worth, the last mention of sigvec I can see in the Emacs
source code is dated 1986. Something about a Gould implementation, in assembly
language.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-10-03 22:44 [PATCH roland/sigvec] Remove sigvec Roland McGrath
2014-10-04 0:57 ` Paul Eggert
@ 2014-10-06 9:44 ` Florian Weimer
2014-10-09 19:33 ` Roland McGrath
1 sibling, 1 reply; 9+ messages in thread
From: Florian Weimer @ 2014-10-06 9:44 UTC (permalink / raw)
To: Roland McGrath, GNU C. Library
On 10/04/2014 12:44 AM, Roland McGrath wrote:
> This removes the ancient sigvec function, which became obsolete in 1988 and
> has probably not actually been used anywhere since a few years thereafter.
> There are plenty more obsolete interfaces we should remove. To go
> whole-hog on that, we should probably figure out a more conservative
> procedure of staged deprecation (announcement and comple-time warnings in
> one release, actual removal in the next). I'm not bothering with that for
> sigvec because I think it's implausible that anything is really still using
> this interface by now (and also because I'm lazy).
Uhm, the current lv package in Fedora and Debian uses it:
#ifdef HAVE_SIGVEC
struct sigvec sigVec;
sigVec.sv_handler = WindowChangeHandler;
sigVec.sv_mask = sigmask( SIGWINCH );
sigVec.sv_flags = SV_INTERRUPT;
sigvec( SIGWINCH, &sigVec, NULL );
sigVec.sv_handler = InterruptHandler;
sigVec.sv_mask = sigmask( SIGINT );
sigVec.sv_flags = SV_INTERRUPT;
sigvec( SIGINT, &sigVec, NULL );
#else
# ifdef SIGWINCH
signal( SIGWINCH, WindowChangeHandler );
# endif
signal( SIGINT, InterruptHandler );
#endif /* HAVE_SIGVEC */
HAVE_SIGVEC is true, and the first conditional is active.
--
Florian Weimer / Red Hat Product Security
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-10-06 9:44 ` Florian Weimer
@ 2014-10-09 19:33 ` Roland McGrath
2014-10-13 8:59 ` Florian Weimer
0 siblings, 1 reply; 9+ messages in thread
From: Roland McGrath @ 2014-10-09 19:33 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C. Library
> Uhm, the current lv package in Fedora and Debian uses it:
Indeed. Surprising. The use of SV_INTERRUPT means it would actually
change the behavior to simply start failing that configure check and use
plain signal instead of sigvec. (signal by default is equivalent to
sigaction using SA_RESTART; SV_INTERRUPT is the inverse of SA_RESTART.)
It's of course a simple 5-minute job to convert any old use of sigvec to
use sigaction instead. I did it for lv and the patch is below. Would you
like to take care of sending that to the lv maintainer and/or using it in
the Fedora package?
This is a case where the plain removal of sigvec would not have broken the
package's build and would instead have subtly changed the behavior of the
program. So it certainly seems like a red flag. But I'm not sure that a
staged deprecation plan would do any better on that score. There would be
compile-time warnings about using a deprecated interface, but that would
not have broken the package's build either. Perhaps distros will (should?
do?) build with -Werror=deprecated-declarations specifically to ensure such
things get caught.
Do you think we should do a staged deprecation for sigvec instead?
Thanks,
Roland
--- ./src/configure.in.~1~ 2004-01-04 22:35:44.000000000 -0800
+++ ./src/configure.in 2014-10-09 11:14:47.782210631 -0700
@@ -34,7 +34,7 @@ AC_CHECK_HEADERS(fcntl.h sys/ioctl.h sys
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
-AC_CHECK_FUNCS(sigvec tgetnum setlocale)
+AC_CHECK_FUNCS(sigaction tgetnum setlocale)
AC_FUNC_GETPGRP
AC_PROG_GCC_TRADITIONAL
AC_TYPE_SIGNAL
--- ./src/console.c.~1~ 2004-01-04 23:27:46.000000000 -0800
+++ ./src/console.c 2014-10-09 11:16:59.627943378 -0700
@@ -158,9 +158,9 @@ private RETSIGTYPE InterruptHandler( int
{
kb_interrupted = TRUE;
-#ifndef HAVE_SIGVEC
+#ifndef HAVE_SIGACTION
signal( SIGINT, InterruptHandler );
-#endif /* HAVE_SIGVEC */
+#endif /* HAVE_SIGACTION */
}
public void ConsoleEnableInterrupt()
@@ -235,9 +235,9 @@ private RETSIGTYPE WindowChangeHandler(
ConsoleGetWindowSize();
-#ifndef HAVE_SIGVEC
+#ifndef HAVE_SIGACTION
signal( SIGWINCH, WindowChangeHandler );
-#endif /* HAVE_SIGVEC */
+#endif /* HAVE_SIGACTION */
}
#endif /* UNIX */
@@ -388,24 +388,24 @@ public void ConsoleSetUp()
signal( SIGINT, InterruptIgnoreHandler );
#endif /* MSDOS */
-#ifdef HAVE_SIGVEC
- struct sigvec sigVec;
+#ifdef HAVE_SIGACTION
+ struct sigaction sa;
- sigVec.sv_handler = WindowChangeHandler;
- sigVec.sv_mask = sigmask( SIGWINCH );
- sigVec.sv_flags = SV_INTERRUPT;
- sigvec( SIGWINCH, &sigVec, NULL );
-
- sigVec.sv_handler = InterruptHandler;
- sigVec.sv_mask = sigmask( SIGINT );
- sigVec.sv_flags = SV_INTERRUPT;
- sigvec( SIGINT, &sigVec, NULL );
+ sa.sa_handler = WindowChangeHandler;
+ sigemptyset( &sa.sa_mask );
+ sa.sa_flags = 0; /* No SA_RESTART means interrupt syscalls. */
+ sigaction( SIGWINCH, &sa, NULL );
+
+ sa.sa_handler = InterruptHandler;
+ sigemptyset( &sa.sa_mask );
+ sa.sa_flags = 0; /* No SA_RESTART means interrupt syscalls. */
+ sigaction( SIGINT, &sa, NULL );
#else
# ifdef SIGWINCH
signal( SIGWINCH, WindowChangeHandler );
# endif
signal( SIGINT, InterruptHandler );
-#endif /* HAVE_SIGVEC */
+#endif /* HAVE_SIGACTION */
#ifdef UNIX
#ifdef HAVE_TERMIOS_H
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-10-09 19:33 ` Roland McGrath
@ 2014-10-13 8:59 ` Florian Weimer
2014-10-13 20:24 ` Roland McGrath
0 siblings, 1 reply; 9+ messages in thread
From: Florian Weimer @ 2014-10-13 8:59 UTC (permalink / raw)
To: Roland McGrath; +Cc: GNU C. Library
On 10/09/2014 09:33 PM, Roland McGrath wrote:
>> Uhm, the current lv package in Fedora and Debian uses it:
>
> Indeed. Surprising. The use of SV_INTERRUPT means it would actually
> change the behavior to simply start failing that configure check and use
> plain signal instead of sigvec. (signal by default is equivalent to
> sigaction using SA_RESTART; SV_INTERRUPT is the inverse of SA_RESTART.)
>
> It's of course a simple 5-minute job to convert any old use of sigvec to
> use sigaction instead. I did it for lv and the patch is below. Would you
> like to take care of sending that to the lv maintainer and/or using it in
> the Fedora package?
I've submitted your patch to Fedora:
<https://bugzilla.redhat.com/show_bug.cgi?id=1151982>
> Do you think we should do a staged deprecation for sigvec instead?
Probably not, especially since we aren't actually removing sigvec as
such (the subject got me worried for a moment).
--
Florian Weimer / Red Hat Product Security
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-10-13 8:59 ` Florian Weimer
@ 2014-10-13 20:24 ` Roland McGrath
2014-11-14 12:34 ` Florian Weimer
0 siblings, 1 reply; 9+ messages in thread
From: Roland McGrath @ 2014-10-13 20:24 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C. Library
> I've submitted your patch to Fedora:
>
> <https://bugzilla.redhat.com/show_bug.cgi?id=1151982>
Thanks.
> > Do you think we should do a staged deprecation for sigvec instead?
>
> Probably not, especially since we aren't actually removing sigvec as
> such (the subject got me worried for a moment).
We are indeed removing sigvec from the API.
Of course we are not breaking ABI compatibility; that goes without saying.
Thanks,
Roland
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-10-13 20:24 ` Roland McGrath
@ 2014-11-14 12:34 ` Florian Weimer
2014-11-14 19:07 ` Roland McGrath
0 siblings, 1 reply; 9+ messages in thread
From: Florian Weimer @ 2014-11-14 12:34 UTC (permalink / raw)
To: Roland McGrath; +Cc: GNU C. Library
On 10/13/2014 10:24 PM, Roland McGrath wrote:
>> I've submitted your patch to Fedora:
>>
>> <https://bugzilla.redhat.com/show_bug.cgi?id=1151982>
>
> Thanks.
Also reported to Debian
<https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=769546>
>>> Do you think we should do a staged deprecation for sigvec instead?
>>
>> Probably not, especially since we aren't actually removing sigvec as
>> such (the subject got me worried for a moment).
>
> We are indeed removing sigvec from the API.
> Of course we are not breaking ABI compatibility; that goes without saying.
For the record, I think this change can go ahead.
--
Florian Weimer / Red Hat Product Security
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-11-14 12:34 ` Florian Weimer
@ 2014-11-14 19:07 ` Roland McGrath
2014-11-17 7:53 ` Stefan Liebler
0 siblings, 1 reply; 9+ messages in thread
From: Roland McGrath @ 2014-11-14 19:07 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C. Library
Committed. check-abi passes and there are no changes to generated code
except for the static sigvec.o going away.
Thanks,
Roland
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH roland/sigvec] Remove sigvec.
2014-11-14 19:07 ` Roland McGrath
@ 2014-11-17 7:53 ` Stefan Liebler
0 siblings, 0 replies; 9+ messages in thread
From: Stefan Liebler @ 2014-11-17 7:53 UTC (permalink / raw)
To: libc-alpha
Hi,
make install fails due:
LANGUAGE=C LC_ALL=C makeinfo -P build-dir/manual/
--output=build-dir/manual/libc.info libc.texinfo
src-dir/manual//signal.texi:2142: Cross reference to nonexistent node
`BSD Handler' (perhaps incorrect sectioning?).
makeinfo: Removing output file `build-dir/manual/libc.info' due to
errors; use --force to preserve.
Bye Stefan
On 11/14/2014 08:07 PM, Roland McGrath wrote:
> Committed. check-abi passes and there are no changes to generated code
> except for the static sigvec.o going away.
>
> Thanks,
> Roland
>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-11-17 7:53 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-03 22:44 [PATCH roland/sigvec] Remove sigvec Roland McGrath
2014-10-04 0:57 ` Paul Eggert
2014-10-06 9:44 ` Florian Weimer
2014-10-09 19:33 ` Roland McGrath
2014-10-13 8:59 ` Florian Weimer
2014-10-13 20:24 ` Roland McGrath
2014-11-14 12:34 ` Florian Weimer
2014-11-14 19:07 ` Roland McGrath
2014-11-17 7:53 ` Stefan Liebler
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).