libinetutils/setsig.c: Incomplete replacement code.

No error checking; unjustified assumption on recovery
of old signal mask; dropping of signal flags when
activating SA_RESTART.  All are portability issues.
This commit is contained in:
Mats Erik Andersson
2011-12-22 00:53:58 +01:00
parent 59fafc02de
commit 9476515fd3
2 changed files with 18 additions and 7 deletions

View File

@@ -1,3 +1,12 @@
2011-12-22 Mats Erik Andersson <gnu@gisladisker.se>
* libinetutils/setsig.c (setsig) [HAVE_SIGACTION]: New variable OSA.
Superpose SA_RESTART on SA_FLAGS, no replacement! Use OSA for old
signal mask in calling sigaction. Return SIG_ERR on error, or fetch
old signal handler from OSA upon success.
[HAVE_SIGVEC]: Likewise: New variable OSV. Use OSV in call to sigvec.
Return SIG_ERR on error, or old handler brought in from OSV.
2011-12-20 Mats Erik Andersson <gnu@gisladisker.se>
* src/rlogind.c (rlogind_auth) [IP_OPTIONS]: Abort connection as soon

View File

@@ -31,21 +31,23 @@ sighandler_t
setsig (int sig, sighandler_t handler)
{
#ifdef HAVE_SIGACTION
struct sigaction sa;
struct sigaction sa, osa;
sigemptyset (&sa.sa_mask);
# ifdef SA_RESTART
sa.sa_flags = SA_RESTART;
sa.sa_flags |= SA_RESTART;
# endif
sa.sa_handler = handler;
sigaction (sig, &sa, &sa);
return sa.sa_handler;
if (sigaction (sig, &sa, &osa) < 0)
return SIG_ERR;
return osa.sa_handler;
#else /* !HAVE_SIGACTION */
# ifdef HAVE_SIGVEC
struct sigvec sv;
struct sigvec sv, osv;
sigemptyset (&sv.sv_mask);
sv.sv_handler = handler;
sigvec (sig, &sv, &sv);
return sv.sv_handler;
if (sigvec (sig, &sv, &osv) < 0)
return SIG_ERR;
return osv.sv_handler;
# else /* !HAVE_SIGVEC */
return signal (sig, handler);
# endif /* HAVE_SIGVEC */