1 /* protable signal() like */
2 
3 #include <signal.h>
4 
5 /* Portable signal() from R.Stevens,
6  * modified to reset the handler */
Signal(int signo,void (* func)(int))7 void (*Signal(int signo, void (*func)(int)))(int)
8 {
9 	struct sigaction act, oact;
10 
11 	act.sa_handler = func;
12 	sigemptyset(&act.sa_mask);
13 	act.sa_flags = 0; /* So if set SA_RESETHAND is cleared */
14 	if (signo == SIGALRM)
15 	{
16 #ifdef SA_INTERRUPT
17 		act.sa_flags |= SA_INTERRUPT;   /* SunOS 4.x */
18 #endif
19 	}
20 	else
21 	{
22 #ifdef SA_RESTART
23 		act.sa_flags |= SA_RESTART;     /* SVR4, 4.4BSD, Linux */
24 #endif
25 	}
26 	if (sigaction(signo, &act, &oact) == -1)
27 		return SIG_ERR;
28 	return (oact.sa_handler);
29 }
30