|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.