home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / sh / fault.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-12  |  1.3 KB  |  110 lines

  1. #
  2. /*
  3.  * UNIX shell
  4.  *
  5.  * S. R. Bourne
  6.  * Bell Telephone Laboratories
  7.  *
  8.  */
  9.  
  10. #include    "defs.h"
  11.  
  12.  
  13. STRING        trapcom[MAXTRAP];
  14. BOOL        trapflg[MAXTRAP];
  15.  
  16. /* ========    fault handling routines       ======== */
  17.  
  18.  
  19. VOID    fault(sig)
  20.     REG INT        sig;
  21. {
  22.     REG INT        flag;
  23.  
  24.     signal(sig,fault);
  25.     IF sig==MEMF
  26.     THEN    IF setbrk(brkincr) == -1
  27.         THEN    error(nospace);
  28.         FI
  29.     ELIF sig==ALARM
  30.     THEN    IF flags&waiting
  31.         THEN    done();
  32.         FI
  33.     ELSE    flag = (trapcom[sig] ? TRAPSET : SIGSET);
  34.         trapnote |= flag;
  35.         trapflg[sig] |= flag;
  36.     FI
  37. }
  38.  
  39. stdsigs()
  40. {
  41.     ignsig(QUIT);
  42.     getsig(INTR);
  43.     getsig(MEMF);
  44.     getsig(ALARM);
  45. }
  46.  
  47. ignsig(n)
  48. {
  49.     REG INT        s, i;
  50.  
  51.     IF (s=signal(i=n,1)&01)==0
  52.     THEN    trapflg[i] |= SIGMOD;
  53.     FI
  54.     return(s);
  55. }
  56.  
  57. getsig(n)
  58. {
  59.     REG INT        i;
  60.  
  61.     IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0
  62.     THEN    signal(i,fault);
  63.     FI
  64. }
  65.  
  66. oldsigs()
  67. {
  68.     REG INT        i;
  69.     REG STRING    t;
  70.  
  71.     i=MAXTRAP;
  72.     WHILE i--
  73.     DO  t=trapcom[i];
  74.         IF t==0 ORF *t
  75.         THEN clrsig(i);
  76.         FI
  77.         trapflg[i]=0;
  78.     OD
  79.     trapnote=0;
  80. }
  81.  
  82. clrsig(i)
  83.     INT        i;
  84. {
  85.     free(trapcom[i]); trapcom[i]=0;
  86.     IF trapflg[i]&SIGMOD
  87.     THEN    signal(i,fault);
  88.         trapflg[i] &= ~SIGMOD;
  89.     FI
  90. }
  91.  
  92. chktrap()
  93. {
  94.     /* check for traps */
  95.     REG INT        i=MAXTRAP;
  96.     REG STRING    t;
  97.  
  98.     trapnote &= ~TRAPSET;
  99.     WHILE --i
  100.     DO IF trapflg[i]&TRAPSET
  101.        THEN trapflg[i] &= ~TRAPSET;
  102.         IF t=trapcom[i]
  103.         THEN    INT    savxit=exitval;
  104.             execexp(t,0);
  105.             exitval=savxit; exitset();
  106.         FI
  107.        FI
  108.     OD
  109. }
  110.