|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)main.c 5.2 6/26/85
7: */
8: #include <stdio.h>
9: #include <signal.h>
10: #include "../libI77/fiodefs.h"
11:
12: int xargc;
13: char **xargv;
14:
15: main(argc, argv, arge)
16: int argc;
17: char **argv;
18: char **arge;
19: {
20: int sigdie();
21: long int (*sigf)();
22: int signum;
23:
24: xargc = argc;
25: xargv = argv;
26:
27: for (signum=1; signum<=16; signum++)
28: {
29: if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
30: }
31:
32: #ifdef pdp11
33: ldfps(01200); /* detect overflow as an exception */
34: #endif
35:
36: f_init();
37: MAIN_();
38: f_exit();
39: return 0;
40: }
41:
42: struct action {
43: char *mesg;
44: int core;
45: } sig_act[16] = {
46: {"Hangup", 0}, /* SIGHUP */
47: {"Interrupt!", 0}, /* SIGINT */
48: {"Quit!", 1}, /* SIGQUIT */
49: {"Illegal ", 1}, /* SIGILL */
50: {"Trace Trap", 1}, /* SIGTRAP */
51: {"IOT Trap", 1}, /* SIGIOT */
52: {"EMT Trap", 1}, /* SIGEMT */
53: {"Arithmetic Exception", 1}, /* SIGFPE */
54: { 0, 0}, /* SIGKILL */
55: {"Bus error", 1}, /* SIGBUS */
56: {"Segmentation violation", 1}, /* SIGSEGV */
57: {"Sys arg", 1}, /* SIGSYS */
58: {"Open pipe", 0}, /* SIGPIPE */
59: {"Alarm", 0}, /* SIGALRM */
60: {"Terminated", 0}, /* SIGTERM */
61: {"Sig 16", 0}, /* unassigned */
62: };
63:
64: struct action act_fpe[] = {
65: {"Integer overflow", 1},
66: {"Integer divide by 0", 1},
67: {"Floating point overflow trap", 1},
68: {"Floating divide by zero trap", 1},
69: {"Floating point underflow trap", 1},
70: {"Decimal overflow", 1},
71: {"Subscript range", 1},
72: {"Floating point overflow", 0},
73: {"Floating divide by zero", 0},
74: {"Floating point underflow", 0},
75: };
76:
77: struct action act_ill[] = {
78: {"addr mode", 1},
79: {"instruction", 1},
80: {"operand", 0},
81: };
82:
83: #if vax
84: sigdie(s, t, sc)
85: int s; int t; struct sigcontext *sc;
86:
87: #else pdp11
88: sigdie(s, t, pc)
89: int s; int t; long pc;
90:
91: #endif
92: {
93: extern unit units[];
94: register struct action *act = &sig_act[s-1];
95: /* print error message, then flush buffers */
96:
97: if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
98: signal(s, SIG_IGN); /* don't allow it again */
99: else
100: signal(s, SIG_DFL); /* shouldn't happen again, but ... */
101:
102: if (act->mesg)
103: {
104: fprintf(units[STDERR].ufd, "*** %s", act->mesg);
105: if (s == SIGFPE)
106: {
107: if (t >= 1 && t <= 10)
108: fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
109: else
110: fprintf(units[STDERR].ufd, ": Type=%d?", t);
111: }
112: else if (s == SIGILL)
113: {
114: if (t == 4) t = 2; /* 4.0bsd botch */
115: if (t >= 0 && t <= 2)
116: fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
117: else
118: fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
119: }
120: putc('\n', units[STDERR].ufd);
121: }
122: f77_abort( s, act->core );
123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.