Annotation of 43BSD/bin/sh/fault.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.