home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 4 / AUCD4.iso / acorn / riscos / riscix / bootstrap_ / GMA-ports / ksh-alpha_ / ksh-alpha.t / ksh-alpha / trap.c < prev    next >
C/C++ Source or Header  |  1989-03-11  |  3KB  |  141 lines

  1. /*
  2.  * signal handling
  3.  */
  4.  
  5. static char *RCSid = "$Header: trap.c,v 3.1 88/11/03 09:18:00 egisin Exp $";
  6.  
  7. #include <stddef.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <signal.h>
  11. #include <setjmp.h>
  12. #include "sh.h"
  13.  
  14. Trap sigtraps [SIGNALS] = {
  15.     {0,    "EXIT", "Signal 0"}, /* todo: belongs in e.loc->exit */
  16.     {SIGHUP, "HUP", "Hangup"},
  17.     {SIGINT, "INT", "Interrupt"},
  18.     {SIGQUIT, "QUIT", "Quit"},
  19.     {SIGILL, "ILL", "Illegal instruction"},
  20.     {SIGTRAP, "TRAP", "Trace trap"},
  21.     {SIGIOT, "IOT", "Abort"},
  22.     {SIGEMT, "EMT", "EMT trap"},
  23.     {SIGFPE, "FPE", "Floating exception"},
  24.     {SIGKILL, "KILL", "Killed"},
  25.     {SIGBUS, "BUS", "Bus error"},
  26.     {SIGSEGV, "SEGV", "Memory fault"},
  27.     {SIGSYS, "SYS", "Bad system call"},
  28.     {SIGPIPE, "PIPE", "Broken pipe"},
  29.     {SIGALRM, "ALRM", "Alarm clock"},
  30.     {SIGTERM, "TERM", "Terminated"},
  31. #if JOBS            /* todo: need to be more portable */
  32.     {SIGURG, "URG", "Urgent condition"}, /* BSDism */
  33.     {SIGSTOP, "STOP", "Stop (signal)"},
  34.     {SIGTSTP, "TSTP", "Stop"},
  35.     {SIGCONT, "CONT", "Continue"},
  36.     {SIGCHLD, "CHLD", "Waiting children"},
  37.     {SIGTTIN, "TTIN", "Stop (tty input)"},
  38.     {SIGTTOU, "TTOU", "Stop (tty output)"},
  39. #endif
  40. };
  41.  
  42. Trap *
  43. gettrap(name)
  44.     char *name;
  45. {
  46.     int i;
  47.     register Trap *p;
  48.  
  49.     if (digit(*name)) {
  50.         i = getn(name);
  51.         return (0 <= i && i < SIGNALS) ? &sigtraps[getn(name)] : NULL;
  52.     }
  53. #if 0
  54.     if (strcmp("ERR", name) == 0)
  55.         return &e.loc->err;
  56.     if (strcmp("EXIT", name) == 0)
  57.         return &e.loc->exit;
  58. #endif
  59.     for (p = sigtraps, i = SIGNALS; --i >= 0; p++)
  60.         if (strcmp(p->name, name) == 0)
  61.             return p;
  62.     return NULL;
  63. }
  64.  
  65. /*
  66.  * trap signal handler
  67.  */
  68. void
  69. trapsig(i)
  70.     int i;
  71. {
  72.     trap = sigtraps[i].set = 1;
  73.     if (i == SIGINT && e.type == E_PARSE)
  74.         /* dangerous but necessary to deal with BSD silly signals */
  75.         longjmp(e.jbuf, 1);
  76.     (void) signal(i, trapsig); /* todo: use sigact */
  77. }
  78.  
  79. /*
  80.  * run any pending traps
  81.  */
  82. runtraps()
  83. {
  84.     int i;
  85.     register Trap *p;
  86.  
  87.     for (p = sigtraps, i = SIGNALS; --i >= 0; p++)
  88.         if (p->set)
  89.             runtrap(p);
  90.     trap = 0;
  91. }
  92.  
  93. runtrap(p)
  94.     Trap *p;
  95. {
  96.     char *trapstr;
  97.  
  98.     p->set = 0;
  99.     if ((trapstr = p->trap) == NULL)
  100.         if (p->signal == SIGINT)
  101.             unwind();    /* return to shell() */
  102.         else
  103.             return;
  104.     if (p->signal == 0)    /* ??? */
  105.         p->trap = 0;
  106.     command(trapstr);
  107. }
  108.  
  109. /* restore signals for children */
  110. cleartraps()
  111. {
  112.     int i;
  113.     register Trap *p;
  114.  
  115.     for (i = SIGNALS, p = sigtraps; --i >= 0; p++) {
  116.         p->set = 0;
  117.         if (p->ourtrap && signal(p->signal, SIG_IGN) != SIG_IGN)
  118.             (void) signal(p->signal, SIG_DFL);
  119.     }
  120. }
  121.  
  122. ignoresig(i)
  123.     int i;
  124. {
  125.     if (signal(i, SIG_IGN) != SIG_IGN)
  126.         sigtraps[i].sig_dfl = 1;
  127. }
  128.  
  129. restoresigs()
  130. {
  131.     int i;
  132.     register Trap *p;
  133.  
  134.     for (p = sigtraps, i = SIGNALS; --i >= 0; p++)
  135.         if (p->sig_dfl) {
  136.             p->sig_dfl = 0;
  137.             (void) signal(p->signal, SIG_DFL);
  138.         }
  139. }
  140.  
  141.