1: # include "monitor.h"
2: # include <ingres.h>
3: # include <aux.h>
4: # include <signal.h>
5: # include <sccs.h>
6:
7: SCCSID(@(#)quit.c 8.2 1/17/85)
8:
9:
10:
11: /*
12: ** QUIT INGRES
13: **
14: ** This routine starts the death of the other processes. It
15: ** then prints out the logout message, and then waits for the
16: ** rest of the system to die. Note, however, that no relations
17: ** are removed; this must be done using the PURGE command.
18: **
19: ** Trace Flags:
20: ** 35
21: */
22:
23: /* list of fatal signals */
24: char *Siglist[] =
25: {
26: "Signal 0",
27: "hangup",
28: "interrupt",
29: "quit",
30: "illegal instruction",
31: "trace trap",
32: "IOT",
33: "EMT",
34: "floating point exception",
35: "killed",
36: "bus error",
37: "segmentation violation",
38: "bad system call",
39: "broken pipe",
40: "alarm",
41: };
42:
43: quit()
44: {
45: register int ndx;
46: register int pidptr;
47: register int err;
48: char buf[100];
49: int status;
50: int pidlist[50];
51: extern int (*ExitFn)();
52: extern exit();
53: extern int sys_nerr;
54: extern char *sys_errlist[];
55: char indexx[0400];
56: extern char SysIdent[];
57:
58: # ifdef xMTR1
59: if (tTf(35, -1))
60: printf("entered quit\n");
61: # endif
62:
63: /* INTERCEPT ALL FURTHER INTERRUPTS */
64: signal(SIGINT, SIG_IGN);
65: signal(SIGQUIT, SIG_IGN);
66: ExitFn = exit;
67:
68: cm_close();
69:
70: # ifdef xMTR3
71: if (tTf(35, 2))
72: printf("unlinking %s\n", Qbname);
73: # endif
74:
75: /* REMOVE THE QUERY-BUFFER FILE */
76: fclose(Qryiop);
77: unlink(Qbname);
78: if (Trapfile != NULL)
79: fclose(Trapfile);
80: pidptr = 0;
81: err = 0;
82:
83: /* clear out the system error index table */
84: for (ndx = 0; ndx < 0400; ndx++)
85: indexx[ndx] = 0;
86:
87: /* wait for all process to terminate */
88: while ((ndx = wait(&status)) != -1)
89: {
90: # ifdef xMTR2
91: if (tTf(35, 5))
92: printf("quit: pid %u: %d/%d\n",
93: ndx, status >> 8, status & 0177);
94: # endif
95: pidlist[pidptr++] = ndx;
96: if ((status & 0177) != 0)
97: {
98: printf("%d: ", ndx);
99: ndx = status & 0177;
100: if (ndx > sizeof Siglist / sizeof Siglist[0])
101: printf("Abnormal Termination %d", ndx);
102: else
103: printf("%s", Siglist[ndx]);
104: if ((status & 0200) != 0)
105: printf(" -- Core Dumped");
106: printf("\n");
107: err++;
108: indexx[I1MASK - ndx]++;
109: }
110: else
111: {
112: indexx[(status >> 8) & I1MASK]++;
113: }
114: }
115: if (err)
116: {
117: printf("pid list:");
118: for (ndx = 0; ndx < pidptr; ndx++)
119: printf(" %u", pidlist[ndx]);
120: printf("\n");
121: }
122:
123: /* print index of system errors */
124: err = 0;
125: for (ndx = 1; ndx <= I1MASK; ndx++)
126: {
127: if (indexx[ndx] == 0)
128: continue;
129: if (ndx <= sys_nerr)
130: {
131: if (err == 0)
132: printf("\nUNIX error dictionary:\n");
133: printf("%3d: %s\n", ndx, sys_errlist[ndx]);
134: }
135: if (err == 0)
136: err = ndx;
137: }
138: if (err > 0 && err <= sys_nerr)
139: printf("\n");
140:
141: /* PRINT LOGOUT CUE ? */
142: if (Nodayfile >= 0)
143: {
144: time(buf);
145: printf("%s logout\n%s", SysIdent, ctime(buf));
146: if (getuser(Usercode, buf) == 0)
147: {
148: for (ndx = 0; buf[ndx]; ndx++)
149: if (buf[ndx] == ':')
150: break;
151: buf[ndx] = 0;
152: printf("goodbye %s ", buf);
153: }
154: else
155: printf("goodbye ");
156: printf("-- come again\n");
157: }
158: # ifdef xMTR1
159: if (tTf(35, 3))
160: printf("quit: exit(%d)\n", err);
161: # endif
162: exit(err);
163: }
Defined functions
quit
defined in line
43; used 5 times
Defined variables