Annotation of coherent/d/bin/sh/trap.c, revision 1.1

1.1     ! root        1: #include "sh.h"
        !             2: #include <signal.h>
        !             3: 
        !             4: /*
        !             5:  * Interrupt flags.
        !             6:  */
        !             7: int    intflag = 0;
        !             8: int    realint = 0;
        !             9: int    norecur = 0;
        !            10: 
        !            11: /*
        !            12:  * Trap storage area.
        !            13:  */
        !            14: typedef struct {
        !            15:        int     t_cnt;          /* Signal received */
        !            16:        int     (*t_set)();     /* Current action */
        !            17:        int     (*t_def)();     /* Default action */
        !            18:        char    *t_act;         /* Action to take */
        !            19: } TRAP;
        !            20: 
        !            21: TRAP trap[NSIG+1];
        !            22: 
        !            23: /*
        !            24:  * Set default traps for various contexts.
        !            25:  */
        !            26: dflttrp(context)
        !            27: register int context;
        !            28: {
        !            29:        extern int sigintr();
        !            30:        register int sig;
        !            31: 
        !            32:        switch (context) {
        !            33:        case IRDY:      /* Trap initialisation */
        !            34:                for (sig=0; sig<=NSIG; sig+=1)
        !            35:                        deftrp(sig, signal(sig, SIG_IGN));
        !            36:                if (iflag) {
        !            37:                        signal(SIGINT, sigintr);
        !            38:                        signal(SIGTERM, SIG_IGN);
        !            39:                }
        !            40: #ifndef DEBUG
        !            41:                signal(SIGQUIT, SIG_IGN);
        !            42: #endif
        !            43:                break;
        !            44:        case IBACK:     /* Background initialisation */
        !            45:                deftrp(SIGINT, SIG_IGN);
        !            46:                deftrp(SIGQUIT, SIG_IGN);
        !            47:                break;
        !            48:        case IFORK:     /* Sub-shell initialization */
        !            49:                signal(SIGINT, trap[SIGINT].t_set);
        !            50:                signal(SIGTERM, trap[SIGTERM].t_set);
        !            51:                break;
        !            52:        case ICMD:      /* Command execution initialisation */
        !            53:                signal(SIGQUIT, trap[SIGQUIT].t_set);
        !            54:                break;
        !            55:        }
        !            56: }
        !            57: 
        !            58: deftrp(sig, def)
        !            59: register int sig;
        !            60: register int (*def)();
        !            61: {
        !            62:        signal(sig, def);
        !            63:        trap[sig].t_cnt = 0;
        !            64:        trap[sig].t_set = def;
        !            65:        trap[sig].t_def = def;
        !            66:        sfree(trap[sig].t_act);
        !            67:        trap[sig].t_act = NULL;
        !            68: }
        !            69: 
        !            70: 
        !            71: /*
        !            72:  * Show the contents of traps.
        !            73:  */
        !            74: telltrp()
        !            75: {
        !            76:        register int sig;
        !            77:        register int (*act)();
        !            78:        register char *what;
        !            79: 
        !            80:        if ((what=trap[0].t_act) != NULL)
        !            81:                prints("0=exit: %s\n", what);
        !            82:        for (sig=1; sig<=NSIG; sig+=1) {
        !            83:                act = trap[sig].t_set;
        !            84:                if (act==SIG_IGN)
        !            85:                        what = "ignored";
        !            86:                else if (act==sigintr)
        !            87:                        what = trap[sig].t_act;
        !            88:                else
        !            89:                        what = NULL;
        !            90:                if (what)
        !            91:                        prints("%d=%s: %s\n", sig, signame[sig], what);
        !            92:        }
        !            93:        return (0);
        !            94: }
        !            95: 
        !            96: /*
        !            97:  * Set a trap.
        !            98:  */
        !            99: setstrp(sig, actp)
        !           100: register int sig;
        !           101: register char *actp;
        !           102: {
        !           103:        int spc;
        !           104: 
        !           105:        if (sig < 0 || sig > NSIG) {
        !           106:                printe("Bad trap: %d", sig);
        !           107:                return (1);
        !           108:        }
        !           109:        spc = (iflag && (sig==SIGINT||sig==SIGTERM)) || sig==SIGQUIT;
        !           110:        sfree(trap[sig].t_act);
        !           111:        trap[sig].t_act = NULL;
        !           112:        if (actp==NULL) {
        !           113:                if (! spc)
        !           114:                        signal(sig, trap[sig].t_def);
        !           115:                trap[sig].t_set = trap[sig].t_def;
        !           116:        } else if (*actp=='\0') {
        !           117:                if (! spc)
        !           118:                        signal(sig, SIG_IGN);
        !           119:                trap[sig].t_set = SIG_IGN;
        !           120:        } else if (trap[sig].t_def == SIG_IGN) {
        !           121:                ;
        !           122:        } else {
        !           123:                trap[sig].t_act = duplstr(actp, 1);
        !           124:                if (! spc)
        !           125:                        signal(sig, sigintr);
        !           126:                trap[sig].t_set = sigintr;
        !           127:        }
        !           128:        return (0);
        !           129: }
        !           130: 
        !           131: /*
        !           132:  * Execute a trap action.
        !           133:  */
        !           134: /*
        !           135:  * Interrupt routine.
        !           136:  */
        !           137: sigintr(sig)
        !           138: register int sig;
        !           139: {
        !           140:        signal(sig, sigintr);
        !           141:        intflag += 1;
        !           142:        trap[sig].t_cnt += 1;
        !           143:        if (sig==SIGINT && iflag) {
        !           144:                noeflag += 1;
        !           145:                realint += 1;
        !           146:        }
        !           147: }
        !           148: 
        !           149: /*
        !           150:  * Recover from an interrupt.
        !           151:  */
        !           152: recover(context)
        !           153: {
        !           154:        register int sig;
        !           155:        register char *actp;
        !           156: 
        !           157:        if ( ! intflag || norecur)
        !           158:                return (1);
        !           159:        norecur++;
        !           160:        realint = realint && iflag;     /* iflag may have been cleared */
        !           161:        switch (context) {
        !           162:        case IPROF:
        !           163:                exit(0377);
        !           164:        case IRDY:
        !           165:        case ICMD:
        !           166:                break;
        !           167:        case ILEX:
        !           168:        case IEVAL:
        !           169:                norecur = 0;
        !           170:                return ( ! realint);
        !           171:        }
        !           172:        for (sig = 0; sig <= NSIG; sig += 1) {
        !           173:                if (trap[sig].t_cnt) {
        !           174:                        trap[sig].t_cnt = 0;
        !           175:                        if (actp = trap[sig].t_act) {
        !           176: #if    0
        !           177:                                trap[sig].t_act = NULL;
        !           178:                                session(SARGS, actp);
        !           179:                                trap[sig].t_act = actp;
        !           180:                                setstrp(sig, NULL);
        !           181: #else
        !           182:                                session(SARGS, actp);
        !           183: #endif
        !           184:                        } else if (sig==SIGINT) {
        !           185:                                if (! realint)
        !           186:                                        kill(getpid(), SIGINT);
        !           187:                        }
        !           188:                }
        !           189:        }
        !           190:        intflag = 0;
        !           191:        norecur = 0;
        !           192:        if (realint) {
        !           193:                noeflag = 0;
        !           194:                realint = 0;
        !           195:                reset(RINT);
        !           196:                NOTREACHED;
        !           197:        }
        !           198:        return (1);
        !           199: }

unix.superglobalmegacorp.com

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