xref: /csrg-svn/usr.bin/f77/libF77/signal_.c (revision 10546)
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