This is usig.c in view mode; [Download] [Up]
/* Copyright (C) 1994 W. Schelter This file is part of GNU Common Lisp, herein referred to as GCL GCL is free software; you can redistribute it and/or modify it under the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by the Free Software Foundation; either version 2, or (at your option) any later version. GCL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with GCL; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef IN_UNIXINT #include "include.h" #include <signal.h> #endif #include "usig.h" EXTER char signals_handled[6]; void gcl_signal(signo,handler) int signo; void (*handler)(); { char *p = signals_handled; while (*p) { if (*p==signo) {our_signal_handler[signo] = handler; handler = main_signal_handler; break; } p++;} { #ifdef HAVE_SIGACTION struct sigaction action; action.sa_handler = handler; /* action.sa_flags = SA_RESTART | ((signo == SIGSEGV || signo == SIGBUS) ? SV_ONSTACK : 0) */ action.sa_flags = SA_RESTART | ((signo == SIGSEGV || signo == SIGBUS) ? SV_ONSTACK : 0) #ifdef SA_SIGINFO | SA_SIGINFO #endif ; sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask,signo); sigaction(signo,&action,0); #else #ifdef HAVE_SIGVEC struct sigvec vec; vec.sv_handler = handler; vec.sv_flags = (signo == SIGSEGV || signo == SIGBUS ? SV_ONSTACK : 0); vec.sv_mask = sigmask(signo); sigvec(signo,&vec,0); #else signal(signo,handler); #endif #endif } } /* remove the signal n from the signal mask */ unblock_signals(n,m) { int current_mask; int result; #ifdef SIG_UNBLOCK_SIGNALS SIG_UNBLOCK_SIGNALS(result,n,n); #else #ifdef HAVE_SIGACTION /* posix */ { sigset_t set,oset; sigemptyset(&set); sigaddset(&set,n); sigaddset(&set,m); sigprocmask(SIG_UNBLOCK,&set,&oset); result =((sigismember(&oset,n) ? signal_mask(n) : 0) |(sigismember(&oset,m) ? signal_mask(m) : 0)); } #else current_mask = sigblock(0); sigsetmask(~(sigmask(m)) & ~(sigmask(n)) & current_mask); result = (current_mask & sigmask(m) ? signal_mask(m) : 0) | (current_mask & sigmask(n) ? signal_mask(n) : 0); #endif #endif return result; } unblock_sigusr_sigio() { int current_mask; #ifdef HAVE_SIGACTION /* posix */ { sigset_t set; sigemptyset(&set); sigaddset(&set,SIGUSR1); sigaddset(&set,SIGIO); sigprocmask( SIG_UNBLOCK,&set,0); } #else current_mask = sigblock(0); return sigsetmask(~(sigmask(SIGIO))&~(sigmask(SIGUSR1)) & current_mask); #endif } void sigfpe() { gcl_signal(SIGFPE, sigfpe); FEerror("Floating-point exception.", 0); } sigpipe() { gcl_signal(SIGPIPE, sigpipe); perror(""); FEerror("Broken pipe", 0); } void sigint() { unblock_signals(SIGINT,SIGINT); terminal_interrupt(1); } void sigalrm() { unblock_signals(SIGALRM,SIGALRM); raise_pending_signals(sig_try_to_delay); } DEFVAR("*INTERRUPT-ENABLE*",sSAinterrupt_enableA,SI,sLt,""); DEF_ORDINARY("SIGUSR1-INTERRUPT",sSsigusr1_interrupt,SI,""); DEF_ORDINARY("SIGIO-INTERRUPT",sSsigio_interrupt,SI,""); void sigusr1() {ifuncall1(sSsigusr1_interrupt,Cnil);} void sigio() {ifuncall1(sSsigio_interrupt,Cnil);} void install_default_signals() { gcl_signal(SIGFPE, sigfpe); gcl_signal(SIGPIPE, sigpipe); gcl_signal(SIGINT, sigint); gcl_signal(SIGUSR1, sigusr1); gcl_signal(SIGIO, sigio); gcl_signal(SIGALRM, sigalrm); /*install_segmentation_catcher(); */ signals_allowed = sig_normal; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.