delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/1996/04/05/05:04:25

Date: Fri, 5 Apr 1996 12:00:49 +0200 (IST)
From: Eli Zaretskii <eliz AT is DOT elta DOT co DOT il>
To: djgpp-workers AT delorie DOT com
Subject: `sigaction' disables signal handlers
Message-Id: <Pine.SUN.3.91.960405115446.20066U-100000@is>
Mime-Version: 1.0

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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019