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