home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / RICO / C / LIBSOURCE / SIGNAL / signal.c < prev    next >
Text File  |  2009-11-06  |  2KB  |  106 lines

  1.  
  2. /* OS9 signal facility */
  3.  
  4. #include <signal.h>
  5.  
  6. #define    FALSE        0
  7. #define    TRUE        1
  8. #define    BADSIGNAL    -1
  9.  
  10. #define    FIRSTSIG    0
  11. #define    LASTSIG        3
  12. /* Traps are negative */
  13. #define    FIRSTTRAP    -9
  14. #define    LASTTRAP    -1
  15.  
  16. #define    ADDRESS    unsigned long
  17. typedef /* void */ int (* handler_func)();
  18.  
  19. extern int intercept_traps(),intercept();
  20.  
  21. static handler_func signal_table[] = {    SIG_DFL,SIG_DFL,SIG_DFL,SIG_DFL };
  22. static handler_func trap_table[] = {    SIG_DFL,SIG_DFL,SIG_DFL,SIG_DFL,
  23.                                         SIG_DFL,SIG_DFL,SIG_DFL,SIG_DFL,
  24.                                         SIG_DFL };
  25. static int signal_flag_table[] = {        FALSE,FALSE,FALSE,FALSE };
  26. static int trap_flag_table[] = {        FALSE,FALSE,FALSE,FALSE,FALSE,
  27.                                         FALSE,FALSE,FALSE,FALSE };
  28.  
  29. static int signal_handler(sig)
  30. int sig;
  31. {
  32.     if ((sig >= FIRSTSIG)&&(sig <= LASTSIG))
  33.     {
  34.         if (signal_flag_table[sig] == FALSE)
  35.         {
  36.             /* Legal signal */
  37.             switch ((ADDRESS)(signal_table[sig]))
  38.             {
  39.                 case SIG_DFL:
  40.                     /* Default is abort */
  41.                     exit(sig);
  42.                     break;
  43.                 case SIG_IGN:
  44.                     /* Ignore */
  45.                     break;
  46.                 default:
  47.                     /* Set flag */
  48.                     signal_flag_table[sig] = TRUE;
  49.                        signal_table[sig](sig);
  50.                     /* Clear flag */
  51.                     signal_flag_table[sig] = FALSE;
  52.                     break;
  53.             }
  54.         }
  55.     } else
  56.     {
  57.         /* Unknown signal, abort */
  58.         exit(sig);
  59.     }
  60. }
  61.  
  62. static short intercept_installed = FALSE;
  63. static short traps_installed = FALSE;
  64.  
  65. handler_func signal(sig,func)
  66. int sig;
  67. handler_func func;
  68. {
  69.     handler_func oldfunc;
  70.     int error;
  71.  
  72.     if ((sig >= FIRSTSIG)&&(sig <= LASTSIG))
  73.     {
  74.         /* Install signal handler */
  75.         oldfunc = signal_table[sig];
  76.         signal_table[sig] = func;
  77.         signal_flag_table[sig] = FALSE;
  78.     } else
  79.     if ((sig >= FIRSTTRAP)&&(sig <= LASTTRAP))
  80.     {
  81.         /* Install trap handler, note : traps are negative offsets ! */
  82.         sig = -sig-1;
  83.         oldfunc = trap_table[sig];
  84.         trap_table[sig] = func;
  85.         trap_flag_table[sig] = FALSE;
  86.     } else
  87.     {
  88.         /* Unknown signal or trap, report error */
  89.         return BADSIGNAL;
  90.     }
  91.     if (!intercept_installed)
  92.     {
  93.         intercept(signal_handler);
  94.         intercept_installed = TRUE;
  95.     }
  96.     if (!traps_installed)
  97.     {
  98.         if (error = intercept_traps(trap_table,trap_flag_table))
  99.             exit(error);
  100.         traps_installed = TRUE;
  101.     }
  102.     return oldfunc;
  103. }
  104.  
  105.  
  106.