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

version 1.3, 1999/02/28 21:31:50 version 1.8, 2000/07/20 14:17:55
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 133  static void segv_handler(int sig, siginf Line 165  static void segv_handler(int sig, siginf
 #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.8


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