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

Siglist defined in line 24; used 3 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 987
Valid CSS Valid XHTML 1.0 Strict