Annotation of researchv8dc/cmd/sh/fault.oc, 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,      /* non-tty stop signal */
                     33:        0,      /* tty stop signal */
                     34:        0,      /* continue */
                     35:        0,      /* death of child */
                     36:        0,      /* tty input */
                     37:        0,      /* tty output */
                     38:        0,      /* lintrup (berkeley weirdness) */
                     39:        0,      /* exceeded cpu limit */
                     40:        0,      /* exceeded file limit */
                     41: };
                     42: 
                     43: int    (*(sigval[]))() = 
                     44: {
                     45:        0,
                     46:        done,
                     47:        fault,
                     48:        fault,
                     49: /* temporary hack */
                     50:        /*done,*/0,
                     51:        done,
                     52:        done,
                     53:        done,
                     54:        done,
                     55:        0,
                     56:        done,
                     57:        done,
                     58:        done,
                     59:        done,
                     60:        fault,
                     61:        fault,
                     62:        done,
                     63:        done,
                     64:        done,
                     65:        done,
                     66:        done,
                     67:        done,
                     68:        done,
                     69:        done,
                     70:        done,
                     71:        done
                     72: };
                     73: 
                     74: /* ========    fault handling routines    ======== */
                     75: 
                     76: 
                     77: fault(sig)
                     78: register int   sig;
                     79: {
                     80:        register int    flag;
                     81: 
                     82:        signal(sig, fault);
                     83:        if (sig == SIGSEGV)
                     84:        {
                     85:                if (setbrk(brkincr) == -1)
                     86:                        error(nospace);
                     87:        }
                     88:        else if (sig == SIGALRM)
                     89:        {
                     90:                if (flags & waiting)
                     91:                        done();
                     92:        }
                     93:        else
                     94:        {
                     95:                flag = (trapcom[sig] ? TRAPSET : SIGSET);
                     96:                trapnote |= flag;
                     97:                trapflg[sig] |= flag;
                     98:                if (sig == SIGINT)
                     99:                        wasintr++;
                    100:        }
                    101: }
                    102: 
                    103: stdsigs()
                    104: {
                    105:        setsig(SIGHUP);
                    106:        setsig(SIGINT);
                    107:        ignsig(SIGQUIT);
                    108:        setsig(SIGILL);
                    109:        setsig(SIGTRAP);
                    110:        setsig(SIGIOT);
                    111:        setsig(SIGEMT);
                    112:        setsig(SIGFPE);
                    113:        setsig(SIGBUS);
                    114:        signal(SIGSEGV, fault);
                    115:        setsig(SIGSYS);
                    116:        setsig(SIGPIPE);
                    117:        setsig(SIGALRM);
                    118:        setsig(SIGTERM);
                    119:        setsig(SIGSTOP);
                    120:        setsig(SIGTSTP);
                    121:        setsig(SIGCONT);
                    122:        setsig(SIGTTIN);
                    123:        setsig(SIGTTOU);
                    124:        setsig(SIGXCPU);
                    125:        setsig(SIGXFSZ);
                    126: }
                    127: 
                    128: ignsig(n)
                    129: {
                    130:        register int    s, i;
                    131: 
                    132:        if ((i = n) == SIGSEGV)
                    133:        {
                    134:                clrsig(i);
                    135:                failed(badtrap, "cannot trap 11");
                    136:        }
                    137:        else if ((s = (signal(i, SIG_IGN) == SIG_IGN)) == 0)
                    138:        {
                    139:                trapflg[i] |= SIGMOD;
                    140:        }
                    141:        return(s);
                    142: }
                    143: 
                    144: getsig(n)
                    145: {
                    146:        register int    i;
                    147: 
                    148:        if (trapflg[i = n] & SIGMOD || ignsig(i) == 0)
                    149:                signal(i, fault);
                    150: }
                    151: 
                    152: 
                    153: setsig(n)
                    154: {
                    155:        register int    i;
                    156: 
                    157:        if (ignsig(i = n) == 0)
                    158:                signal(i, sigval[i]);
                    159: }
                    160: 
                    161: oldsigs()
                    162: {
                    163:        register int    i;
                    164:        register char   *t;
                    165: 
                    166:        i = MAXTRAP;
                    167:        while (i--)
                    168:        {
                    169:                t = trapcom[i];
                    170:                if (t == 0 || *t)
                    171:                        clrsig(i);
                    172:                trapflg[i] = 0;
                    173:        }
                    174:        trapnote = 0;
                    175: }
                    176: 
                    177: clrsig(i)
                    178: int    i;
                    179: {
                    180:        free(trapcom[i]);
                    181:        trapcom[i] = 0;
                    182:        if (trapflg[i] & SIGMOD)
                    183:        {
                    184:                trapflg[i] &= ~SIGMOD;
                    185:                signal(i, sigval[i]);
                    186:        }
                    187: }
                    188: 
                    189: /*
                    190:  * check for traps
                    191:  */
                    192: chktrap()
                    193: {
                    194:        register int    i = MAXTRAP;
                    195:        register char   *t;
                    196: 
                    197:        trapnote &= ~TRAPSET;
                    198:        while (--i)
                    199:        {
                    200:                if (trapflg[i] & TRAPSET)
                    201:                {
                    202:                        trapflg[i] &= ~TRAPSET;
                    203:                        if (t = trapcom[i])
                    204:                        {
                    205:                                int     savxit = exitval;
                    206: 
                    207:                                execexp(t, 0);
                    208:                                exitval = savxit;
                    209:                                exitset();
                    210:                        }
                    211:                }
                    212:        }
                    213: }

unix.superglobalmegacorp.com

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