Annotation of 43BSD/contrib/nntp/rrn/final.c, revision 1.1.1.1

1.1       root        1: /* $Header: final.c,v 4.3 85/05/01 11:38:08 lwall Exp $
                      2:  *
                      3:  * $Log:       final.c,v $
                      4:  * Revision 4.3  85/05/01  11:38:08  lwall
                      5:  * Baseline for release with 4.3bsd.
                      6:  * 
                      7:  */
                      8: 
                      9: #include "EXTERN.h"
                     10: #include "common.h"
                     11: #include "util.h"
                     12: #include "term.h"
                     13: #include "ng.h"
                     14: #include "init.h"
                     15: #include "bits.h"
                     16: #include "last.h"
                     17: #include "rcstuff.h"
                     18: #include "ngdata.h"
                     19: #include "INTERN.h"
                     20: #include "final.h"
                     21: 
                     22: void
                     23: final_init()
                     24: {
                     25: #ifdef SIGTSTP
                     26:     sigset(SIGTSTP, stop_catcher);     /* job control signals */
                     27:     sigset(SIGCONT, cont_catcher);     /* job control signals */
                     28: #endif
                     29: 
                     30:     sigset(SIGINT, int_catcher);       /* always catch interrupts */
                     31:     sigset(SIGHUP, sig_catcher);       /* and hangups */
                     32: #ifndef lint
                     33:     sigignore(SIGEMT);
                     34: #endif lint
                     35: 
                     36:     sigset(SIGILL, sig_catcher);
                     37:     sigset(SIGTRAP, sig_catcher);
                     38:     sigset(SIGFPE, sig_catcher);
                     39:     sigset(SIGBUS, sig_catcher);
                     40:     sigset(SIGSEGV, sig_catcher);
                     41:     sigset(SIGSYS, sig_catcher);
                     42:     sigset(SIGTERM, sig_catcher);
                     43: #ifdef SIGXCPU
                     44:     sigset(SIGXCPU, sig_catcher);
                     45: #endif
                     46: #ifdef SIGXFSZ
                     47:     sigset(SIGXFSZ, sig_catcher);
                     48: #endif
                     49: }
                     50: 
                     51: void                                   /* very much void */
                     52: finalize(status)
                     53: int status;
                     54: {
                     55:     if (bizarre)
                     56:        resetty();
                     57:     UNLINK(lockname);
                     58: #ifdef SERVER
                     59:     UNLINK(active_name);
                     60: #endif
                     61:     if (status < 0) {
                     62:        chdir("/usr/tmp");
                     63:        sigset(SIGILL,SIG_DFL);
                     64:        abort();
                     65:     }
                     66:     exit(status);
                     67: }
                     68: 
                     69: /* come here on interrupt */
                     70: 
                     71: int
                     72: int_catcher()
                     73: {
                     74:     sigset(SIGINT,int_catcher);
                     75: #ifdef DEBUGGING
                     76:     if (debug)
                     77:        write(2,"int_catcher\n",12);
                     78: #endif
                     79:     if (!waiting) {
                     80:        if (int_count) {                /* was there already an interrupt? */
                     81:            write(2,"\nBye-bye.\n",10);
                     82:            sig_catcher(0);             /* emulate the other signals */
                     83:        }
                     84:        int_count++;
                     85:     }
                     86: }
                     87: 
                     88: /* come here on signal other than interrupt, stop, or cont */
                     89: 
                     90: int
                     91: sig_catcher(signo)
                     92: {
                     93: #ifdef VERBOSE
                     94:     static char *signame[] = {
                     95:        "",
                     96:        "HUP",
                     97:        "INT",
                     98:        "QUIT",
                     99:        "ILL",
                    100:        "TRAP",
                    101:        "IOT",
                    102:        "EMT",
                    103:        "FPE",
                    104:        "KILL",
                    105:        "BUS",
                    106:        "SEGV",
                    107:        "SYS",
                    108:        "PIPE",
                    109:        "ALRM",
                    110:        "TERM",
                    111:        "???"
                    112: #ifdef SIGTSTP
                    113:        ,"STOP",
                    114:        "TSTP",
                    115:        "CONT",
                    116:        "CHLD",
                    117:        "TTIN",
                    118:        "TTOU",
                    119:        "TINT",
                    120:        "XCPU",
                    121:        "XFSZ"
                    122: #ifdef SIGPROF
                    123:        ,"VTALARM",
                    124:        "PROF"
                    125: #endif
                    126: #endif
                    127:        };
                    128: #endif
                    129: 
                    130: #ifdef SIGTTOU
                    131: #ifndef lint
                    132:     sigignore(SIGTTOU);
                    133: #endif lint
                    134: #endif
                    135: #ifdef DEBUGGING
                    136:     if (debug) {
                    137:        printf("\nSIG%s--.newsrc not restored in debug\n",signame[signo]);
                    138:        finalize(-1);
                    139:     }
                    140: #endif
                    141:     if (panic)
                    142:        abort();
                    143:     (void) sigset(SIGILL,SIG_DFL);
                    144:     panic = TRUE;                      /* disable terminal I/O */
                    145:     if (doing_ng) {                    /* need we reconstitute rc line? */
                    146:        yankback();
                    147:        restore_ng();                   /* then do so (hope this works) */
                    148:     }
                    149:     doing_ng = FALSE;
                    150:     if (rc_changed)                    /* need we write .newsrc out? */
                    151:        write_rc();                     /* then do so */
                    152:     rc_changed = FALSE;
                    153:     if (signo != SIGHUP)
                    154: #ifdef VERBOSE
                    155:        IF(verbose)
                    156:            printf("\nCaught %s%s--.newsrc restored\n",
                    157:                signo ? "a SIG" : "an internal error", signame[signo]);
                    158:        ELSE
                    159: #endif
                    160: #ifdef TERSE
                    161:            printf("\nSignal %d--bye bye\n",signo);
                    162: #endif
                    163:     switch (signo) {
                    164:     case SIGBUS:
                    165:     case SIGILL:
                    166:     case SIGSEGV:
                    167:        finalize(-signo);
                    168:     }
                    169:     finalize(1);                               /* and blow up */
                    170: }
                    171: 
                    172: #ifdef SIGTSTP
                    173: /* come here on stop signal */
                    174: 
                    175: int
                    176: stop_catcher()
                    177: {
                    178:     if (!waiting) {
                    179:        checkpoint_rc();                /* good chance of crash while stopped */
                    180:        resetty();                      /* this is the point of all this */
                    181: #ifdef DEBUGGING
                    182:        if (debug)
                    183:            write(2,"stop_catcher\n",13);
                    184: #endif
                    185:        sigset(SIGTSTP,SIG_DFL);        /* enable stop */
                    186: #ifdef BSD42
                    187:        sigsetmask(sigblock(0) & ~(1 << (SIGTSTP-1)));
                    188: #endif
                    189:        kill(0,SIGTSTP);                /* and do the stop */
                    190:     }
                    191:     sigset(SIGTSTP,stop_catcher);      /* unenable the stop */
                    192: }
                    193: 
                    194: /* come here on cont signal */
                    195: 
                    196: int
                    197: cont_catcher()
                    198: {
                    199:     sigset(SIGCONT,cont_catcher);
                    200:     savetty();
                    201: #ifdef MAILCALL;
                    202:     mailcount = 0;                     /* force recheck */
                    203: #endif
                    204:     if (!panic) {
                    205:        if (!waiting) {
                    206: #ifdef DEBUGGING
                    207:            if (debug)
                    208:                write(2,"cont_catcher\n",13);
                    209: #endif
                    210:            noecho();                   /* set no echo */
                    211:            crmode();                   /* set cbreak mode */
                    212:            forceme("\f");              /* cause a refresh */
                    213:                                        /* (defined only if TIOCSTI defined) */
                    214:        }
                    215:     }
                    216: }
                    217: #endif
                    218: 

unix.superglobalmegacorp.com

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