void fixerror(void) { didfds = 0; /* Forget about 0,1,2 */ /* * Go away if -e or we are a child shell */ if (!exitset || exiterr || child) xexit(1); /* * Reset the state of the input. This buffered seek to end of file will * also clear the while/foreach stack. */ btoeof(); setcopy(STRstatus, STR1, VAR_READWRITE);/*FIXRESET*/ #ifdef BSDJOBS if (tpgrp > 0) (void) tcsetpgrp(FSHTTY, tpgrp); #endif }
/* * Print the error with the given id. * * Special ids: * ERR_SILENT: Print nothing. * ERR_OLD: Print the previously set error if one was there. * otherwise return. * ERR_NAME: If this bit is set, print the name of the function * in bname * * This routine always resets or exits. The flag haderr * is set so the routine who catches the unwind can propogate * it if they want. * * Note that any open files at the point of error will eventually * be closed in the routine process in sh.c which is the only * place error unwinds are ever caught. */ void stderror(int id, ...) { va_list va; Char **v; int flags; flags = id & ERR_FLAGS; id &= ~ERR_FLAGS; if ((flags & ERR_OLD) && seterr == NULL) abort(); if (id < 0 || id > (int)(sizeof(errorlist) / sizeof(errorlist[0]))) id = ERR_INVALID; (void)fflush(cshout); (void)fflush(csherr); haderr = 1; /* Now to diagnostic output */ timflg = 0; /* This isn't otherwise reset */ if (!(flags & ERR_SILENT)) { if (flags & ERR_NAME) (void)fprintf(csherr, "%s: ", bname); if ((flags & ERR_OLD)) /* Old error. */ (void)fprintf(csherr, "%s.\n", seterr); else { va_start(va, id); (void)vfprintf(csherr, errorlist[id], va); va_end(va); (void)fprintf(csherr, ".\n"); } } if (seterr) { xfree((ptr_t) seterr); seterr = NULL; } if ((v = pargv) != NULL) pargv = 0, blkfree(v); if ((v = gargv) != NULL) gargv = 0, blkfree(v); (void)fflush(cshout); (void)fflush(csherr); didfds = 0; /* Forget about 0,1,2 */ /* * Go away if -e or we are a child shell */ if (exiterr || child) xexit(1); /* * Reset the state of the input. This buffered seek to end of file will * also clear the while/foreach stack. */ btoeof(); set(STRstatus, Strsave(STR1)); if (tpgrp > 0) (void)tcsetpgrp(FSHTTY, tpgrp); reset(); /* Unwind */ }