Annotation of researchv9/cmd/sh/fault.c, revision 1.1.1.1

1.1       root        1: /*     @(#)fault.c     1.5     */
                      2: /*
                      3:  * UNIX shell
                      4:  *
                      5:  * Bell Telephone Laboratories
                      6:  *
                      7:  */
                      8: 
                      9: #include       "defs.h"
                     10: 
                     11: extern int     done();
                     12: 
                     13: char   *trapcom[MAXTRAP];
                     14: BOOL   trapflg[MAXTRAP] =
                     15: {
                     16:        0,
                     17:        0,      /* hangup */
                     18:        0,      /* interrupt */
                     19:        0,      /* quit */
                     20:        0,      /* illegal instr */
                     21:        0,      /* trace trap */
                     22:        0,      /* IOT */
                     23:        0,      /* EMT */
                     24:        0,      /* float pt. exp */
                     25:        0,      /* kill */
                     26:        0,      /* bus error */
                     27:        0,      /* memory faults */
                     28:        0,      /* bad sys call */
                     29:        0,      /* bad pipe call */
                     30:        0,      /* alarm */
                     31:        0,      /* software termination */
                     32:        0,      /* unassigned */
                     33: #ifndef        SYSV
                     34:        0,      /* non-tty stop signal */
                     35:        0,      /* tty stop signal */
                     36:        0,      /* continue */
                     37:        0,      /* death of child */
                     38:        0,      /* tty input */
                     39:        0,      /* tty output */
                     40:        0,      /* lintrup (berkeley weirdness) */
                     41:        0,      /* exceeded cpu limit */
                     42:        0,      /* exceeded file limit */
                     43: #endif
                     44: };
                     45: 
                     46: int    (*(sigval[]))() = 
                     47: {
                     48:        0,
                     49:        done,
                     50:        fault,
                     51:        fault,
                     52: /* temporary hack */
                     53:        /*done,*/0,
                     54:        done,
                     55:        done,
                     56:        done,
                     57:        done,
                     58:        0,
                     59:        done,
                     60:        done,
                     61:        done,
                     62:        done,
                     63:        fault,
                     64:        fault,
                     65:        done,
                     66:        0,
                     67: #ifndef        SYSV
                     68:        0,
                     69:        0,
                     70:        0,
                     71:        0,
                     72:        0,
                     73:        0,
                     74:        0,
                     75:        0,
                     76:        0
                     77: #endif
                     78: };
                     79: 
                     80: /* ========    fault handling routines    ======== */
                     81: 
                     82: 
                     83: fault(sig)
                     84: register int   sig;
                     85: {
                     86:        register int    flag;
                     87: 
                     88:        signal(sig, fault);
                     89:        if (sig == SIGALRM)
                     90:        {
                     91:                if (flags & waiting)
                     92:                        done();
                     93:        }
                     94:        else
                     95:        {
                     96:                flag = (trapcom[sig] ? TRAPSET : SIGSET);
                     97:                trapnote |= flag;
                     98:                trapflg[sig] |= flag;
                     99:                if (sig == SIGINT)
                    100:                        wasintr++;
                    101:        }
                    102: }
                    103: 
                    104: stdsigs()
                    105: {
                    106:        setsig(SIGHUP);
                    107:        setsig(SIGINT);
                    108:        ignsig(SIGQUIT);
                    109:        setsig(SIGPIPE);
                    110:        setsig(SIGALRM);
                    111:        setsig(SIGTERM);
                    112: #ifndef        SYSV
                    113:        setsig(SIGSTOP);
                    114:        setsig(SIGTSTP);
                    115:        setsig(SIGCONT);
                    116:        setsig(SIGTTIN);
                    117:        setsig(SIGTTOU);
                    118:        setsig(SIGXCPU);
                    119:        setsig(SIGXFSZ);
                    120: #endif
                    121: }
                    122: 
                    123: ignsig(n)
                    124: {
                    125:        register int    s;
                    126: 
                    127:        if ((s = (signal(n, SIG_IGN) == SIG_IGN)) == 0)
                    128:        {
                    129:                trapflg[n] |= SIGMOD;
                    130:        }
                    131:        return(s);
                    132: }
                    133: 
                    134: getsig(n)
                    135: {
                    136:        register int    i;
                    137: 
                    138:        if (trapflg[i = n] & SIGMOD || ignsig(i) == 0)
                    139:                signal(i, fault);
                    140: }
                    141: 
                    142: 
                    143: setsig(n)
                    144: {
                    145:        register int    i;
                    146: 
                    147:        if (ignsig(i = n) == 0)
                    148:                signal(i, sigval[i]);
                    149: }
                    150: 
                    151: oldsigs()
                    152: {
                    153:        register int    i;
                    154:        register char   *t;
                    155: 
                    156:        i = MAXTRAP;
                    157:        while (i--)
                    158:        {
                    159:                t = trapcom[i];
                    160:                if (t == 0 || *t)
                    161:                        clrsig(i);
                    162:                trapflg[i] = 0;
                    163:        }
                    164:        trapnote = 0;
                    165: }
                    166: 
                    167: clrsig(i)
                    168: int    i;
                    169: {
                    170:        shfree(trapcom[i]);
                    171:        trapcom[i] = 0;
                    172:        if (trapflg[i] & SIGMOD)
                    173:        {
                    174:                trapflg[i] &= ~SIGMOD;
                    175:                signal(i, sigval[i]);
                    176:        }
                    177: }
                    178: 
                    179: /*
                    180:  * check for traps
                    181:  */
                    182: chktrap()
                    183: {
                    184:        register int    i = MAXTRAP;
                    185:        register char   *t;
                    186: 
                    187:        trapnote &= ~TRAPSET;
                    188:        while (--i)
                    189:        {
                    190:                if (trapflg[i] & TRAPSET)
                    191:                {
                    192:                        trapflg[i] &= ~TRAPSET;
                    193:                        if (t = trapcom[i])
                    194:                        {
                    195:                                int     savxit = exitval;
                    196: 
                    197:                                execexp(t, 0);
                    198:                                exitval = savxit;
                    199:                                exitset();
                    200:                        }
                    201:                }
                    202:        }
                    203: }

unix.superglobalmegacorp.com

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