cmd_t getresult( int fd, int show, int *result_argc, char ***result_argv) { cmd_t t; char *line; if((line = areads(fd)) == NULL) { if(errno) { error(_("reading result from %s: %s"), childstr(fd), strerror(errno)); /*NOTREACHED*/ } *result_argv = NULL; *result_argc = 0; /* EOF */ } else { *result_argv = split_quoted_strings(line); *result_argc = g_strv_length(*result_argv); } if(show) { g_printf(_("driver: result time %s from %s:"), walltime_str(curclock()), childstr(fd)); if(line) { g_printf(" %s", line); putchar('\n'); } else { g_printf(" (eof)\n"); } fflush(stdout); } amfree(line); if(*result_argc < 1) return BOGUS; for(t = (cmd_t)(BOGUS+1); t < LAST_TOK; t++) if(strcmp((*result_argv)[0], cmdstr[t]) == 0) return t; return BOGUS; }
int check_status( pid_t pid, amwait_t w, int mesgfd) { char *thiserr = NULL; char *str, *strX; int ret, sig, rc; str = childstr(pid); if(WIFSIGNALED(w)) { ret = 0; rc = sig = WTERMSIG(w); } else { sig = 0; rc = ret = WEXITSTATUS(w); } if(pid == indexpid) { /* * Treat an index failure (other than signal) as a "STRANGE" * rather than an error so the dump goes ahead and gets processed * but the failure is noted. */ if(ret != 0) { fdprintf(mesgfd, _("? index %s returned %d\n"), str, ret); rc = 0; } indexpid = -1; strX = "index"; } else if(pid == comppid) { /* * compress returns 2 sometimes, but it is ok. */ #ifndef HAVE_GZIP if(ret == 2) { rc = 0; } #endif comppid = -1; strX = "compress"; } else if(pid == dumppid && tarpid == -1) { /* * Ultrix dump returns 1 sometimes, but it is ok. */ #ifdef DUMP_RETURNS_1 if(ret == 1) { rc = 0; } #endif dumppid = -1; strX = "dump"; } else if(pid == tarpid) { if (ret == 1) { rc = 0; } /* * tar bitches about active filesystems, but we do not care. */ #ifdef IGNORE_TAR_ERRORS if(ret == 2) { rc = 0; } #endif dumppid = tarpid = -1; strX = "dump"; } else if(pid == application_api_pid) { strX = "Application"; } else { strX = "unknown"; } if(rc == 0) { return 0; /* normal exit */ } if(ret == 0) { thiserr = vstrallocf(_("%s (%d) %s got signal %d"), strX, (int)pid, str, sig); } else { thiserr = vstrallocf(_("%s (%d) %s returned %d"), strX, (int)pid, str, ret); } fdprintf(mesgfd, "? %s\n", thiserr); if(errorstr) { errorstr = newvstrallocf(errorstr, "%s, %s", errorstr, thiserr); amfree(thiserr); } else { errorstr = thiserr; thiserr = NULL; } return 1; }