1*10546Sdlw /* 2*10546Sdlw * "@(#)signal_.c 1.1" 3*10546Sdlw * 4*10546Sdlw * change the action for a specified signal 5*10546Sdlw * 6*10546Sdlw * calling sequence: 7*10546Sdlw * integer cursig, signal, savsig 8*10546Sdlw * external proc 9*10546Sdlw * cursig = signal(signum, proc, flag) 10*10546Sdlw * where: 11*10546Sdlw * 'cursig' will receive the current value of signal(2) 12*10546Sdlw * 'signum' must be in the range 0 <= signum <= 16 13*10546Sdlw * 14*10546Sdlw * If 'flag' is negative, 'proc' must be an external proceedure name. 15*10546Sdlw * 16*10546Sdlw * If 'flag' is 0 or positive, it will be passed to signal(2) as the 17*10546Sdlw * signal action flag. 0 resets the default action; 1 sets 'ignore'. 18*10546Sdlw * 'flag' may be the value returned from a previous call to signal. 19*10546Sdlw * 20*10546Sdlw * This routine arranges to trap user specified signals so that it can 21*10546Sdlw * pass the signum fortran style - by address. (boo) 22*10546Sdlw */ 23*10546Sdlw 24*10546Sdlw #include "../libI77/f_errno.h" 25*10546Sdlw 26*10546Sdlw static int (*dispatch[17])(); 27*10546Sdlw int (*signal())(); 28*10546Sdlw int sig_trap(); 29*10546Sdlw 30*10546Sdlw long signal_(sigp, procp, flag) 31*10546Sdlw long *sigp, *flag; 32*10546Sdlw int (*procp)(); 33*10546Sdlw { 34*10546Sdlw int (*oldsig)(); 35*10546Sdlw int (*oldispatch)(); 36*10546Sdlw 37*10546Sdlw oldispatch = dispatch[*sigp]; 38*10546Sdlw 39*10546Sdlw if (*sigp < 0 || *sigp > 16) 40*10546Sdlw return(-((long)(errno=F_ERARG))); 41*10546Sdlw 42*10546Sdlw if (*flag < 0) /* function address passed */ 43*10546Sdlw { 44*10546Sdlw dispatch[*sigp] = procp; 45*10546Sdlw oldsig = signal((int)*sigp, sig_trap); 46*10546Sdlw } 47*10546Sdlw 48*10546Sdlw else /* integer value passed */ 49*10546Sdlw oldsig = signal((int)*sigp, (int)*flag); 50*10546Sdlw 51*10546Sdlw if (oldsig == sig_trap) 52*10546Sdlw return((long)oldispatch); 53*10546Sdlw return((long)oldsig); 54*10546Sdlw } 55*10546Sdlw 56*10546Sdlw sig_trap(sn) 57*10546Sdlw int sn; 58*10546Sdlw { 59*10546Sdlw long lsn = (long)sn; 60*10546Sdlw return((*dispatch[sn])(&lsn)); 61*10546Sdlw } 62