home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * SIGNAL.C
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <errno.h>
-
- static void SigIgn(int);
- static void SigBye(int);
-
- extern void (*_SigIntFunc)(int); /* see amiga/chkabort.c */
-
- /*
- * Note: SIGINT is special
- */
-
- static __sigfunc Sigs[32] = {
- SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
- SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
- SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
- SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn
- };
-
- __sigfunc
- signal(signo, func)
- int signo;
- __sigfunc func;
- {
- __sigfunc old;
-
- if (signo < 0 || signo > 31) {
- errno = EINVAL;
- return(SIG_ERR);
- }
- old = Sigs[signo];
-
- switch(func) {
- case SIG_DFL:
- if (signo == SIGINT) {
- _SigIntFunc = NULL;
- Sigs[signo] = SigBye;
- } else {
- Sigs[signo] = SigIgn;
- }
- break;
- case SIG_IGN:
- if (signo == SIGINT)
- _SigIntFunc = SigIgn;
- Sigs[signo] = SigIgn;
- break;
- default:
- if (signo == SIGINT)
- _SigIntFunc = func;
- Sigs[signo] = func;
- break;
- }
- return(old);
- }
-
- int
- raise(signo)
- int signo;
- {
- __sigfunc func;
-
- if (signo < 0 || signo > 31) {
- errno = EINVAL;
- return(-1);
- }
- func = Sigs[signo];
- signal(signo, SIG_DFL);
-
- (*func)(signo);
- return(0);
- }
-
- static void
- SigIgn(signo)
- {
- }
-
- static void
- SigBye(signo)
- {
- exit(EXIT_FAILURE);
- }
-