Mail Archives: djgpp-workers/1996/04/05/05:04:25
The current version of `sigaction' causes signal handlers to be disabled
after a program saves and restores them. That's because it always returns
SIG_DFL for any signal, even if a handler has been installed. (It even
says ``FIXME'' there, which is what I do below.) The patches below also
make `sigaction' return error indication whenever it should. (Anybody who
is using Emacs compiled under v2.0, should install this patch, or else all
the signals will kill Emacs after the first time you shell to DOS.)
*** posix/signal/sigactio.c~0 Sun Apr 2 01:11:10 1995
--- posix/signal/sigactio.c Thu Apr 4 19:50:18 1996
***************
*** 1,19 ****
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <signal.h>
int
sigaction(int _sig, const struct sigaction *_act, struct sigaction *_oact)
{
if (_oact)
{
/* FIXME */
! _oact->sa_handler = SIG_DFL;
! sigemptyset(&_oact->sa_mask);
_oact->sa_flags = 0;
}
if (_act)
{
! signal(_sig, _act->sa_handler);
}
! return 0;
}
--- 1,35 ----
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <signal.h>
+ #include <errno.h>
int
sigaction(int _sig, const struct sigaction *_act, struct sigaction *_oact)
{
+ int retval = 0;
+
if (_oact)
{
+ void (*installed_sig)(int) = signal (_sig, SIG_IGN);
+
/* FIXME */
! if (installed_sig == SIG_ERR)
! {
! retval = -1;
! errno = EINVAL;
! }
! else
! signal (_sig, installed_sig);
! _oact->sa_handler = installed_sig;
! retval = sigemptyset(&_oact->sa_mask);
_oact->sa_flags = 0;
}
if (_act)
{
! if (signal(_sig, _act->sa_handler) == SIG_ERR)
! {
! retval = -1;
! errno = EINVAL;
! }
}
! return retval;
}
- Raw text -