123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* $Id$ */
- #include <signal.h>
- typedef void (*callvec)() ;
- static callvec vector[16] = {
- SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL,
- SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL, SIG_DFL
- } ;
- static char mapvec[] = {
- 0, /* EARRAY */
- 0, /* ERANGE */
- 0, /* ESET */
- 0, /* EIOVFL */
- SIGFPE, /* EFOVFL */
- SIGFPE, /* EFUNDFL */
- 0, /* EIDIVZ */
- SIGFPE, /* EFDIVZ */
- 0, /* EIUND, already ignored */
- SIGFPE, /* EFUND */
- 0, /* ECONV */
- 0, /* 11 */
- 0, /* 12 */
- 0, /* 13 */
- 0, /* 14 */
- 0, /* 15 */
- SIGSEGV, /* ESTACK */
- SIGSEGV, /* EHEAP */
- 0, /* EILLINS */
- 0, /* EODDZ */
- 0, /* ECASE */
- SIGSEGV, /* EBADMEM */
- SIGBUS, /* EBADPTR */
- 0, /* EBADPC */
- 0, /* EBADLAE */
- SIGSYS, /* EBADMON */
- 0, /* EBADLIN */
- 0, /* EBADGTO */
- } ;
- #define VECBASE 128
- static firsttime = 1 ;
- static int catchtrp() ;
- static int procesig() ;
- callvec signal(sig,func) int sig ; callvec func ; {
- register index, i ;
- callvec prev ;
- index= sig-1 ;
- if ( index<0 || index>=(sizeof vector/sizeof vector[0]) ) {
- return (callvec) -1 ;
- }
- if ( firsttime ) {
- firsttime= 0 ;
- _setsig(catchtrp) ;
- }
- prev= vector[index] ;
- if ( prev!=func ) {
- register int mapval ;
- vector[index]= func ;
- if ( func==SIG_IGN ) {
- mapval= -3;
- } else if ( func==SIG_DFL ) {
- mapval= -2;
- } else {
- mapval=VECBASE+sig;
- }
- if ( sigtrp(mapval,sig)== -1 ) return (callvec) -1;
- }
- return prev ;
- }
- static int catchtrp(trapno) int trapno ; {
- if ( trapno>VECBASE &&
- trapno<=VECBASE + (sizeof vector/sizeof vector[0]) ) {
- return procesig(trapno-VECBASE) ;
- }
- if ( trapno>=0 && trapno< (sizeof mapvec/sizeof mapvec[0]) &&
- mapvec[trapno] ) {
- return procesig(mapvec[trapno]) ;
- }
- return 0 ; /* Failed to handle the trap */
- }
- static int procesig(sig) int sig ; {
- register index ;
- callvec trf ;
- index= sig-1 ;
- trf= vector[index] ;
- if ( trf==SIG_IGN ) return 1 ;
- if ( sig!=SIGILL && sig!=SIGTRAP ) vector[index]= SIG_IGN ;
- if ( trf==SIG_DFL ) return 0 ;
- (*trf)(sig) ;
- return 1 ;
- }
|