Annotation of 43BSDTahoe/new/B/src/bint/b3sig.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: 
                      3: /*
                      4:   $Header: b3sig.c,v 1.4 85/08/27 10:56:21 timo Exp $
                      5: */
                      6: 
                      7: /*Handle interrupts and signals*/
                      8: 
                      9: #include "b.h"
                     10: #include "b0fea.h"
                     11: #include "b1obj.h"
                     12: #include "b0con.h"
                     13: #include "b3scr.h"
                     14: #include "b3err.h"
                     15: #include "b3env.h"
                     16: #ifdef SETJMP
                     17: #include <setjmp.h>
                     18: #endif
                     19: 
                     20: #ifdef SIGNAL
                     21: #include <signal.h>
                     22: #endif
                     23: 
                     24: /*The operating system provides a function signal(s,f)
                     25:   that associates function f with the signal s, and returns
                     26:   a pointer to the previous function associated with s.
                     27:   Then, when signal s occurs, f is called and the function associated with s
                     28:   may or may not be reset. Thus f may need to call signal(s,f) again to.
                     29:   The code here doesn't depend on either interpretation, always being explicit
                     30:   about which handler to use.
                     31: 
                     32:   There are two signals that can come from the user: quit and interrupt.
                     33:   Interrupt should just stop the interpreter and return to B command level;
                     34:   quit should stop the B system completely.
                     35:   All other signals are caused by errors (eg memory exhausted)
                     36:   or come from outside the program, and are therefore fatal.
                     37: 
                     38:   SIG_IGN is the system supplied routine to ignore a signal.
                     39:   SIG_DFL is the system supplied default for a signal.
                     40:   kill(getpid(), signal) kills the program according to 'signal'
                     41: 
                     42:   On BSD systems, SIGTSTP and other signals causing the process to be
                     43:   suspended, and SIGCONT and others that are ignored by default,
                     44:   must not be caught.  It is assumed that all these are defined
                     45:   when SIGTSTP is defined.
                     46: */
                     47: 
                     48: #ifdef SIGTSTP
                     49: Hidden bool must_handle(sig) int sig; {
                     50:        /* Shouldn't we enumerate the list of signals we *do* want to catch? */
                     51:        /* It seems that new signals are all of the type that should be
                     52:           ignored by most processes... */
                     53:        switch (sig) {
                     54:        case SIGURG:
                     55:        case SIGSTOP:
                     56:        case SIGTSTP:
                     57:        case SIGCONT:
                     58:        case SIGCHLD:
                     59:        case SIGTTIN:
                     60:        case SIGTTOU:
                     61:        case SIGIO:
                     62:                return No;
                     63:        default:
                     64:                return Yes;
                     65:        }
                     66: }
                     67: #else
                     68: #ifdef SIGCLD /* System V */
                     69: #define must_handle(sig) ((sig) != SIGCLD)
                     70: #else
                     71: #define must_handle(sig) Yes
                     72: #endif
                     73: #endif
                     74: 
                     75: #ifdef NOT_USED
                     76: Visible Procedure dump() {
                     77:        if (cntxt != In_prmnv) putprmnv();
                     78: #ifdef KILL
                     79:        signal(SIGQUIT, SIG_DFL);
                     80:        kill(getpid(), SIGQUIT);
                     81: #else
                     82:        exit(-1);
                     83: #endif
                     84: }
                     85: #endif NOT_USED
                     86: 
                     87: #ifdef SIGNAL
                     88: Hidden Procedure oops(sig, m) int sig; string m; {
                     89:        signal(sig, SIG_DFL); /* Don't call handler recursive -- just die... */
                     90: #ifdef sigmask /* 4.2 BSD */
                     91:        sigsetmask(0); /* Don't block signals in handler -- just die... */
                     92: #endif
                     93: #ifdef EXT_COMMAND
                     94:        e_done();
                     95: #endif
                     96:        fflush(stdout);
                     97:        fprintf(stdout, "*** Oops, %s\n", m);
                     98:        fflush(stdout);
                     99:        if (cntxt != In_prmnv) putprmnv();
                    100: #ifdef KILL
                    101:        kill(getpid(), sig);
                    102: #else
                    103:        exit(-1);
                    104: #endif
                    105: }
                    106: 
                    107: Hidden Procedure burp(sig) int sig; {
                    108:        oops(sig,
                    109:  "I feel suddenly (BURP!) indisposed. I'll call it a day. Sorry.");
                    110: }
                    111: 
                    112: Hidden Procedure aog(sig) int sig; {
                    113:        oops(sig,
                    114:  "an act of God has occurred compelling me to discontinue service.");
                    115: }
                    116: 
                    117: Hidden Procedure fpe_signal(sig) int sig; {
                    118:        signal(sig /* == SIGFPE*/, fpe_signal);
                    119:        syserr(MESS(3900, "unexpected arithmetic overflow"));
                    120: }
                    121: 
                    122: #ifdef SETJMP
                    123: extern bool awaiting_input;
                    124: extern jmp_buf read_interrupt;
                    125: #endif
                    126: 
                    127: Hidden Procedure intsig(sig) int sig; { /*sig==SIGINT*/
                    128:        signal(sig, SIG_IGN);
                    129:        int_signal();
                    130:        signal(sig, intsig);
                    131: #ifdef SETJMP
                    132:        if (awaiting_input) longjmp(read_interrupt, 1);
                    133: #endif
                    134: }
                    135: 
                    136: #ifdef INTEGRATION
                    137: 
                    138: Visible Procedure bint_interrupt() {
                    139:        signal(SIGINT, intsig);
                    140:        if (interrupted) intsig(SIGINT);
                    141: }
                    142: 
                    143: #endif
                    144: 
                    145: Hidden int(* setsig(sig, func))() int sig, (*func)(); {
                    146:        /*Set a signal, unless it's being ignored*/
                    147:        int (*f)()= signal(sig, SIG_IGN);
                    148:        if (f != SIG_IGN) signal(sig, func);
                    149:        return f;
                    150: }
                    151: #endif
                    152: 
                    153: Visible Procedure initsig() {
                    154: #ifdef SIGNAL
                    155:        int i;
                    156:        for (i = 1; i<=NSIG; ++i)
                    157:                if (must_handle(i)) VOID setsig(i, burp);
                    158: #ifndef INTEGRATION
                    159:        if (filtered) {
                    160:                VOID setsig(SIGINT,  SIG_IGN);
                    161:                VOID setsig(SIGTRAP, intsig);
                    162:        } else {
                    163:                VOID setsig(SIGINT,  intsig);
                    164:                VOID setsig(SIGTRAP, burp);
                    165:        }
                    166: #else
                    167:        VOID setsig(SIGINT,  intsig);
                    168: #endif
                    169:        VOID setsig(SIGQUIT, aog);
                    170:        VOID setsig(SIGTERM, aog);
                    171:        VOID setsig(SIGFPE,  fpe_signal);
                    172:        VOID setsig(SIGPIPE, bye);
                    173: #endif SIGNAL
                    174: }

unix.superglobalmegacorp.com

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