static void plProcWait(struct plProc* proc) /* wait for a process in a pipeline */ { if (waitpid(proc->pid, &proc->status, 0) < 0) errnoAbort("process lost for: \"%s\" in pipeline \"%s\"", joinCmd(proc->cmd), proc->pl->procName); if (WIFSIGNALED(proc->status)) errAbort("process terminated on signal %d: \"%s\" in pipeline \"%s\"", WTERMSIG(proc->status), joinCmd(proc->cmd), proc->pl->procName); assert(WIFEXITED(proc->status)); if ((WEXITSTATUS(proc->status) != 0) && !(proc->pl->options & pipelineNoAbort)) errAbort("process exited with %d: \"%s\" in pipeline \"%s\"", WEXITSTATUS(proc->status), joinCmd(proc->cmd), proc->pl->procName); proc->pid = -1; }
static void plProcHandleSignaled(struct plProc* proc, int status) /* handle one of the processes terminating on a signal */ { assert(WIFSIGNALED(proc->status)); if (!((WTERMSIG(proc->status) == SIGPIPE) && (proc->pl->options & pipelineSigpipe))) { errAbort("process terminated on signal %d: \"%s\" in pipeline \"%s\"", WTERMSIG(proc->status), joinCmd(proc->cmd), proc->pl->procName); } }
static void plProcHandleExited(struct plProc* proc, int status) /* handle one of the processes terminating on an exit */ { assert(WIFEXITED(proc->status)); if (WEXITSTATUS(proc->status) != 0) { // only print an error message if aborting if (!(proc->pl->options & pipelineNoAbort)) fprintf(stderr, "process exited with %d: \"%s\" in pipeline \"%s\"\n", WEXITSTATUS(proc->status), joinCmd(proc->cmd), proc->pl->procName); exit(WEXITSTATUS(proc->status)); // pass back exit code } }