Diff for /gforth/engine/signals.c between versions 1.3 and 1.10

version 1.3, 1999/02/28 21:31:50 version 1.10, 2000/09/23 15:06:08
Line 1 Line 1
 /* signal handling  /* signal handling
   
   Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 47 Line 47
 UCell cols=DEFAULTCOLS;  UCell cols=DEFAULTCOLS;
 UCell rows=DEFAULTROWS;  UCell rows=DEFAULTROWS;
   
   #ifndef SA_NODEFER
   #define SA_NODEFER 0
   /* systems that don't have SA_NODEFER hopefully don't block anyway */
   #endif
   
   #ifdef SA_SIGINFO
   void install_signal_handler(int sig, void (*handler)(int, siginfo_t *, void *))
        /* installs three-argument signal handler for sig */
   {
     struct sigaction action;
   
     action.sa_sigaction=handler;
     sigemptyset(&action.sa_mask);
     action.sa_flags=SA_RESTART|SA_NODEFER|SA_SIGINFO; /* pass siginfo */
     sigaction(sig, &action, NULL);
   }
   #endif
   
   typedef void Sigfunc(int);
   
   Sigfunc *bsd_signal(int signo, Sigfunc *func)
   {
     struct sigaction act, oact;
   
     act.sa_handler=func;
     sigemptyset(&act.sa_mask);
     act.sa_flags=SA_NODEFER;
     if (sigaction(signo,&act,&oact) < 0)
       return SIG_ERR;
     else
       return oact.sa_handler;
   }
   
 static void  static void
 graceful_exit (int sig)  graceful_exit (int sig)
Line 131  static void segv_handler(int sig, siginf Line 163  static void segv_handler(int sig, siginf
 #endif /* defined(SA_SIGINFO) */  #endif /* defined(SA_SIGINFO) */
   
 #ifdef SIGCONT  #ifdef SIGCONT
 static void termprep (int sig)  static void termprep(int sig)
 {  {
   signal(sig,termprep);    bsd_signal(sig,termprep);
   terminal_prepped=0;    terminal_prepped=0;
 }  }
 #endif  #endif
Line 165  void get_winsize() Line 197  void get_winsize()
 #ifdef SIGWINCH  #ifdef SIGWINCH
 static void change_winsize(int sig)  static void change_winsize(int sig)
 {  {
   signal(sig,change_winsize);    /* signal(sig,change_winsize); should not be necessary with bsd_signal */
 #ifdef TIOCGWINSZ  #ifdef TIOCGWINSZ
   get_winsize();    get_winsize();
 #endif  #endif
 }  }
 #endif  #endif
   
   
 #ifdef SA_SIGINFO  
 void install_signal_handler(int sig, void (*handler)(int, siginfo_t *, void *))  
      /* installs three-argument signal handler for sig */  
 {  
   struct sigaction action;  
   
   action.sa_sigaction=handler;  
   sigemptyset(&action.sa_mask);  
   action.sa_flags=SA_RESTART|SA_SIGINFO; /* pass siginfo */  
   sigaction(sig, &action, NULL);  
 }  
 #endif  
   
 void install_signal_handlers(void)  void install_signal_handlers(void)
 {  {
   
Line 319  void install_signal_handlers(void) Line 337  void install_signal_handlers(void)
 #endif  #endif
   };    };
   static short sigs_to_quit [] = {    static short sigs_to_quit [] = {
 #ifdef SIGHUP  
     SIGHUP,  
 #endif  
 #ifdef SIGQUIT  #ifdef SIGQUIT
     SIGQUIT,      SIGQUIT,
 #endif  #endif
   #ifdef SIGHUP
       SIGHUP,
   #endif
 #ifdef SIGABRT  #ifdef SIGABRT
     SIGABRT,      SIGABRT,
 #endif  #endif
Line 344  void install_signal_handlers(void) Line 362  void install_signal_handlers(void)
     signal (sigs_to_ignore [i], SIG_IGN);      signal (sigs_to_ignore [i], SIG_IGN);
 */  */
   for (i = 0; i < DIM (sigs_to_throw); i++)    for (i = 0; i < DIM (sigs_to_throw); i++)
     signal(sigs_to_throw[i], throw_handler);      bsd_signal(sigs_to_throw[i], throw_handler);
   for (i = 0; i < DIM (sigs_to_quit); i++)    for (i = 0; i < DIM (sigs_to_quit); i++)
     signal (sigs_to_quit [i], graceful_exit);      bsd_signal(sigs_to_quit [i], graceful_exit);
 #ifdef SA_SIGINFO  #ifdef SA_SIGINFO
   install_signal_handler(SIGFPE, fpe_handler);    install_signal_handler(SIGFPE, fpe_handler);
   install_signal_handler(SIGSEGV, segv_handler);    install_signal_handler(SIGSEGV, segv_handler);
 #endif  #endif
 #ifdef SIGCONT  #ifdef SIGCONT
     signal (SIGCONT, termprep);      bsd_signal(SIGCONT, termprep);
 #endif  #endif
 #ifdef SIGWINCH  #ifdef SIGWINCH
     signal (SIGWINCH, change_winsize);      bsd_signal(SIGWINCH, change_winsize);
 #endif  #endif
 }  }

Removed from v.1.3  
changed lines
  Added in v.1.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>