Annotation of 3BSD/cmd/sh/fault.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

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