delorie.com/djgpp/bugs/show.cgi   search  
Bug 000071

When Created: 04/05/1996 04:49:27
Against DJGPP version: 2.00
By whom: eliz@is.elta.co.il
Abstract: sigaction returns SIG_DFL for signals with installed handler
Programs that use POSIX signals, call `sigaction' to install a new
handler and/or report and old one.  The current version of this
function in the library always report the old handler as SIG_DFL,
even if a handler has been installed.  So if a program disables and
then re-enables signal catching by saving and restoring the handlers,
after the first such fragment, all the saved/restored handlers are
returned to the default handling.
The function also always reports success, even if an illegal signal
number is passed.

Solution added: 04/05/1996 04:55:14
By whom: eliz@is.elta.co.il
Apply this patch to src/libc/posix/signal/sigactio.c:

*** 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;
  }

Fixed in version 2.01 on 06/13/1996 00:43:34
By whom: dj@delorie.com



  webmaster     delorie software   privacy  
  Copyright 2010   by DJ Delorie     Updated Jul 2010