--- gforth/engine/signals.c 1999/02/28 21:31:50 1.3 +++ gforth/engine/signals.c 2000/07/20 14:07:37 1.7 @@ -47,6 +47,38 @@ UCell cols=DEFAULTCOLS; UCell rows=DEFAULTROWS; +#ifndef SA_NODEFER +#define SA_NODEDER 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 graceful_exit (int sig) @@ -133,7 +165,7 @@ static void segv_handler(int sig, siginf #ifdef SIGCONT static void termprep (int sig) { - signal(sig,termprep); + bsd_signal(sig,termprep); terminal_prepped=0; } #endif @@ -165,27 +197,13 @@ void get_winsize() #ifdef SIGWINCH static void change_winsize(int sig) { - signal(sig,change_winsize); + /* signal(sig,change_winsize); should not be necessary with bsd_signal */ #ifdef TIOCGWINSZ get_winsize(); #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) { @@ -319,12 +337,12 @@ void install_signal_handlers(void) #endif }; static short sigs_to_quit [] = { -#ifdef SIGHUP - SIGHUP, -#endif #ifdef SIGQUIT SIGQUIT, #endif +#ifdef SIGHUP + SIGHUP, +#endif #ifdef SIGABRT SIGABRT, #endif @@ -344,17 +362,17 @@ void install_signal_handlers(void) signal (sigs_to_ignore [i], SIG_IGN); */ 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++) - signal (sigs_to_quit [i], graceful_exit); + bsd_signal(sigs_to_quit [i], graceful_exit); #ifdef SA_SIGINFO install_signal_handler(SIGFPE, fpe_handler); install_signal_handler(SIGSEGV, segv_handler); #endif #ifdef SIGCONT - signal (SIGCONT, termprep); + bsd_signal(SIGCONT, termprep); #endif #ifdef SIGWINCH - signal (SIGWINCH, change_winsize); + bsd_signal(SIGWINCH, change_winsize); #endif }