home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 387b.lha / dice_v2.02 / lib / signal / signal.c
Encoding:
C/C++ Source or Header  |  1990-05-30  |  1.4 KB  |  90 lines

  1.  
  2. /*
  3.  *  SIGNAL.C
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <signal.h>
  9. #include <errno.h>
  10.  
  11. static void SigIgn(int);
  12. static void SigBye(int);
  13.  
  14. extern void (*_SigIntFunc)(int);    /*  see amiga/chkabort.c    */
  15.  
  16. /*
  17.  *  Note: SIGINT is special
  18.  */
  19.  
  20. static __sigfunc Sigs[32] = {
  21.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
  22.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
  23.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
  24.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn
  25. };
  26.  
  27. __sigfunc
  28. signal(signo, func)
  29. int signo;
  30. __sigfunc func;
  31. {
  32.     __sigfunc old;
  33.  
  34.     if (signo < 0 || signo > 31) {
  35.     errno = EINVAL;
  36.     return(SIG_ERR);
  37.     }
  38.     old = Sigs[signo];
  39.  
  40.     switch(func) {
  41.     case SIG_DFL:
  42.     if (signo == SIGINT) {
  43.         _SigIntFunc = NULL;
  44.         Sigs[signo] = SigBye;
  45.     } else {
  46.         Sigs[signo] = SigIgn;
  47.     }
  48.     break;
  49.     case SIG_IGN:
  50.     if (signo == SIGINT)
  51.         _SigIntFunc = SigIgn;
  52.     Sigs[signo] = SigIgn;
  53.     break;
  54.     default:
  55.     if (signo == SIGINT)
  56.         _SigIntFunc = func;
  57.     Sigs[signo] = func;
  58.     break;
  59.     }
  60.     return(old);
  61. }
  62.  
  63. int
  64. raise(signo)
  65. int signo;
  66. {
  67.     __sigfunc func;
  68.  
  69.     if (signo < 0 || signo > 31) {
  70.     errno = EINVAL;
  71.     return(-1);
  72.     }
  73.     func = Sigs[signo];
  74.     signal(signo, SIG_DFL);
  75.  
  76.     (*func)(signo);
  77.     return(0);
  78. }
  79.  
  80. static void
  81. SigIgn(signo)
  82. {
  83. }
  84.  
  85. static void
  86. SigBye(signo)
  87. {
  88.     exit(EXIT_FAILURE);
  89. }
  90.