# # include "../../ingres.h" # include "../../symbol.h" # include "../../pipes.h" # include "IIglobals.h" /* ** Exit ingres -- ** waits for the parser to return, ** catching all children's death till then ** or till an error return. ** In case wait(II) is interrupted while waiting, ** as evidenced by errno == 4, waiting will resume. ** */ IIexit() { register int ndx; register int pidptr; register int err; int status; int pidlist[10]; extern errno; /* perror(III) */ # ifdef xETR1 if (IIdebug) printf("IIexit\n"); # endif if (close(IIw_down) || close(IIr_down) || close(IIr_front)) IIsyserr("IIexit:cant't close"); pidptr = 0; err = 0; errno = 0; while ((ndx = wait(&status)) != IIingpid && (ndx != -1 || errno == 4)) { if (ndx == -1) { errno = 0; continue; } # ifdef xETR1 if (IIdebug) printf("caught pid %u death, stat %d, %d\n", ndx, status >> 8, status & 0177); # endif pidlist [pidptr++] = ndx; if ((status & 0177) != 0) { printf("%d: Abnormal Termination %d", ndx, status & 0177); if ((status & 0200) != 0) printf(" -- Core Dumped"); printf("\n"); err++; } } if (err) { printf("pid list:"); for (ndx = 0; ndx < pidptr; ndx++) printf(" %u", pidlist[ndx]); printf("\n"); } IIingpid = 0; }