|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
2: /* $Header: b2sig.c,v 1.1 84/06/28 00:49:19 timo Exp $ */
3:
4: /*Handle interrupts and signals*/
5: #include "b.h"
6: #include "b1obj.h"
7: #include "b0con.h"
8: #include "b2scr.h"
9: #include <signal.h>
10: #include "b2err.h"
11: #include "b2env.h"
12:
13: /*The operating system provides a function signal(s,f)
14: that associates function f with the signal s, and returns
15: a pointer to the previous function associated with s.
16: Then, when signal s occurs, f is called and the function associated with s
17: may or may not be reset. Thus f may need to call signal(s,f) again to.
18: The code here doesn't depend on either interpretation, always being explicit
19: about which handler to use.
20:
21: There are two signals that can come from the user: quit and interrupt.
22: Interrupt should just stop the interpreter and return to B command level;
23: quit should stop the B system completely and produce a dump.
24: All other signals are caused by errors (eg memory exhausted)
25: or come from outside the program, and are therefore fatal.
26:
27: SIG_IGN is the system supplied routine to ignore a signal.
28: SIG_DFL is the system supplied default for a signal.
29: kill(getpid(), signal) kills the program according to 'signal'
30: */
31:
32: Visible Procedure dump() {
33: signal(SIGQUIT, SIG_DFL);
34: kill(getpid(), SIGQUIT);
35: }
36:
37: Hidden Procedure oops(sig, m) int sig; string m; {
38: fflush(stdout);
39: fprintf(stdout, "*** Oops, %s\n", m);
40: fflush(stdout);
41: if (cntxt != In_prmnv) putprmnv();
42: signal(sig, SIG_DFL);
43: kill(getpid(), sig);
44: }
45:
46: Hidden Procedure burp(sig) int sig; {
47: oops(sig,
48: "I feel suddenly (BURP!) indisposed. I'll call it a day. Sorry.");
49: }
50:
51: Hidden Procedure aog(sig) int sig; {
52: oops(sig,
53: "an act of God has occurred compelling me to discontinue service.");
54: }
55:
56: Hidden Procedure fpe_signal(sig) int sig; {
57: signal(sig /* == SIGFPE*/, fpe_signal);
58: error("arithmetic overflow");
59: }
60:
61: Hidden Procedure intsig(sig) int sig; { /*sig==SIGINT*/
62: signal(sig, SIG_IGN);
63: int_signal(No);
64: }
65:
66: Visible Procedure accept_int() {
67: signal(SIGINT, intsig);
68: }
69:
70: int (*si)(), (*sq)();
71: bool sawi= No, sawq= No;
72:
73: Hidden Procedure signote(sig) int sig; {
74: /*Note but otherwise ignore a quit or interrupt*/
75: signal(sig, signote);
76: fprintf(stderr, "*** Just a moment\n");
77: if (sig == SIGINT) sawi= Yes;
78: else if (sig == SIGQUIT) sawq= Yes;
79: }
80:
81: Hidden int(* setsig(sig, func))() int sig, (*func)(); {
82: /*Set a signal, unless it's being ignored*/
83: int (*f)()= signal(sig, SIG_IGN);
84: if (f != SIG_IGN) signal(sig, func);
85: return f;
86: }
87:
88: Visible Procedure ignsigs() {
89: /*Henceforth only note quits and interrupts*/
90: si= setsig(filtered ? SIGTRAP : SIGINT, signote);
91: sq= setsig(SIGQUIT, signote);
92: }
93:
94: Visible Procedure re_sigs() {
95: /*Start processing quits and interrupts again*/
96: signal(filtered ? SIGTRAP : SIGINT, si);
97: signal(SIGQUIT, sq);
98: if (sawi) {
99: sawi= sawq= No;
100: if (si != SIG_IGN && si != SIG_DFL) (*si)(filtered ? SIGTRAP : SIGINT);
101: } else if (sawq) {
102: sawq= No;
103: if (sq != SIG_IGN && sq != SIG_DFL) (*sq)(SIGQUIT);
104: }
105: }
106:
107: Visible Procedure inisigs() {
108: if (filtered) {
109: VOID setsig(SIGINT, SIG_IGN);
110: VOID setsig(SIGTRAP, intsig);
111: }
112: else {
113: VOID setsig(SIGINT, intsig);
114: VOID setsig(SIGTRAP, burp);
115: }
116: VOID setsig(SIGQUIT, aog);
117: VOID setsig(SIGILL, burp);
118: VOID setsig(SIGIOT, burp);
119: VOID setsig(SIGEMT, burp);
120: VOID setsig(SIGFPE, fpe_signal);
121: VOID setsig(SIGBUS, burp);
122: VOID setsig(SIGSEGV, burp);
123: VOID setsig(SIGSYS, burp);
124: VOID setsig(SIGPIPE, aog);
125: VOID setsig(SIGALRM, burp);
126: VOID setsig(SIGTERM, burp);
127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.