|
|
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.3 11/3/86
7: */
8: #include <stdio.h>
9: #include <signal.h>
10: #include "../libI77/fiodefs.h"
11:
12: extern int errno;
13: char *getenv();
14: int xargc;
15: char **xargv;
16:
17: main(argc, argv, arge)
18: int argc;
19: char **argv;
20: char **arge;
21: {
22: int sigdie();
23: long int (*sigf)();
24: int signum;
25:
26: xargc = argc;
27: xargv = argv;
28:
29: for (signum=1; signum<=16; signum++)
30: {
31: if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf);
32: }
33:
34: #ifdef pdp11
35: ldfps(01200); /* detect overflow as an exception */
36: #endif
37:
38: f_init();
39: MAIN_();
40: f_exit();
41: return 0;
42: }
43:
44: struct action {
45: char *mesg;
46: int core;
47: } sig_act[16] = {
48: {"Hangup", 0}, /* SIGHUP */
49: {"Interrupt!", 0}, /* SIGINT */
50: {"Quit!", 1}, /* SIGQUIT */
51: {"Illegal ", 1}, /* SIGILL */
52: {"Trace Trap", 1}, /* SIGTRAP */
53: {"IOT Trap", 1}, /* SIGIOT */
54: {"EMT Trap", 1}, /* SIGEMT */
55: {"Arithmetic Exception", 1}, /* SIGFPE */
56: { 0, 0}, /* SIGKILL */
57: {"Bus error", 1}, /* SIGBUS */
58: {"Segmentation violation", 1}, /* SIGSEGV */
59: {"Sys arg", 1}, /* SIGSYS */
60: {"Open pipe", 0}, /* SIGPIPE */
61: {"Alarm", 0}, /* SIGALRM */
62: {"Terminated", 0}, /* SIGTERM */
63: {"Sig 16", 0}, /* unassigned */
64: };
65:
66: #ifdef tahoe
67: /* The following arrays are defined & used assuming that signal codes are
68: 1 to 5 for SIGFPE, and 0 to 3 for SIGILL.
69: Actually ILL_ALIGN_FAULT=14, and is mapped to 3. */
70:
71: #define N_ACT_ILL 4 /* number of entries in act_ill[] */
72: #define N_ACT_FPE 5 /* number of entries in act_fpe[] */
73: #define ILL_ALIGN_FAULT 14
74:
75: struct action act_fpe[] = {
76: {"Integer overflow", 1},
77: {"Integer divide by 0", 1},
78: {"Floating divide by zero", 1},
79: {"Floating point overflow", 1},
80: {"Floating point underflow", 1},
81: };
82:
83: #else vax || pdp11
84:
85: struct action act_fpe[] = {
86: {"Integer overflow", 1},
87: {"Integer divide by 0", 1},
88: {"Floating point overflow trap", 1},
89: {"Floating divide by zero trap", 1},
90: {"Floating point underflow trap", 1},
91: {"Decimal overflow", 1},
92: {"Subscript range", 1},
93: {"Floating point overflow", 0},
94: {"Floating divide by zero", 0},
95: {"Floating point underflow", 0},
96: };
97: #endif vax || pdp11
98:
99: struct action act_ill[] = {
100: {"addr mode", 1},
101: {"instruction", 1},
102: {"operand", 0},
103: #ifdef tahoe
104: {"alignment", 1},
105: #endif tahoe
106: };
107:
108: #if (defined(vax) || defined(tahoe))
109: sigdie(s, t, sc)
110: int s; int t; struct sigcontext *sc;
111:
112: #else pdp11
113:
114: sigdie(s, t, pc)
115: int s; int t; long pc;
116:
117: #endif pdp11
118: {
119: extern unit units[];
120: register struct action *act = &sig_act[s-1];
121: /* print error message, then flush buffers */
122:
123: if (s == SIGHUP || s == SIGINT || s == SIGQUIT)
124: signal(s, SIG_IGN); /* don't allow it again */
125: else
126: signal(s, SIG_DFL); /* shouldn't happen again, but ... */
127:
128: if (act->mesg)
129: {
130: fprintf(units[STDERR].ufd, "*** %s", act->mesg);
131: if (s == SIGFPE)
132: {
133: #ifndef tahoe
134: if (t >= 1 && t <= 10)
135: #else tahoe
136: if ((t-1) >= 0 && t < N_ACT_FPE)
137: #endif tahoe
138: fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg);
139: else
140: fprintf(units[STDERR].ufd, ": Type=%d?", t);
141: }
142: else if (s == SIGILL)
143: {
144: #ifndef tahoe
145: if (t == 4) t = 2; /* 4.0bsd botch */
146: if (t >= 0 && t <= 2)
147: #else tahoe
148: if (t == ILL_ALIGN_FAULT) /* ILL_ALIGN_FAULT maps to last
149: t = N_ACT_ILL-1; entry in act_ill[] */
150: if (t >= 0 && t < N_ACT_ILL)
151: #endif tahoe
152: fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg);
153: else
154: fprintf(units[STDERR].ufd, "compat mode: Code=%d", t);
155: }
156: putc('\n', units[STDERR].ufd);
157: }
158: f77_abort( s, act->core );
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.