X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/164be8e5e8b40ce4572281be26d423a9c9d595f3..94187a80bd60baab4b9c4b949ad820d730578123:/sbr/pidstatus.c diff --git a/sbr/pidstatus.c b/sbr/pidstatus.c index 7da78ace..1800ccd9 100644 --- a/sbr/pidstatus.c +++ b/sbr/pidstatus.c @@ -1,6 +1,4 @@ - -/* - * pidstatus.c -- report child's status +/* pidstatus.c -- report child's status * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -10,52 +8,69 @@ #include /* - * auto-generated header + * Return 0 if the command exited with an exit code of zero, a nonzero code + * otherwise. + * + * Print out an appropriate status message we didn't exit with an exit code + * of zero. */ -#include - -#ifndef WTERMSIG -# define WTERMSIG(s) ((int)((s) & 0x7F)) -#endif - -#ifndef WCOREDUMP -# define WCOREDUMP(s) ((s) & 0x80) -#endif int pidstatus (int status, FILE *fp, char *cp) { - int signum; - -/* - * I have no idea what this is for (rc) - * so I'm commenting it out for right now. - * - * if ((status & 0xff00) == 0xff00) - * return status; - */ + char *mesg; + int num; + bool lookup; + char *signame; - /* If child process returned normally */ if (WIFEXITED(status)) { - if ((signum = WEXITSTATUS(status))) { + status = WEXITSTATUS(status); + if (status) { if (cp) fprintf (fp, "%s: ", cp); - fprintf (fp, "exit %d\n", signum); - } - } else if (WIFSIGNALED(status)) { - /* If child process terminated due to receipt of a signal */ - signum = WTERMSIG(status); - if (signum != SIGINT) { - if (cp) - fprintf (fp, "%s: ", cp); - fprintf (fp, "signal %d", signum); - if (signum >= 0 && signum < sizeof(sigmsg) && sigmsg[signum] != NULL) - fprintf (fp, " (%s%s)\n", sigmsg[signum], - WCOREDUMP(status) ? ", core dumped" : ""); - else - fprintf (fp, "%s\n", WCOREDUMP(status) ? " (core dumped)" : ""); + fprintf(fp, "exited %d\n", status); } + return status; + } + + if (WIFSIGNALED(status)) { + mesg = "signalled"; + num = WTERMSIG(status); + if (num == SIGINT) + return status; + lookup = true; + } else if (WIFSTOPPED(status)) { + mesg = "stopped"; + num = WSTOPSIG(status); + lookup = true; + } else if (WIFCONTINUED(status)) { + mesg = "continued"; + num = -1; + lookup = false; + } else { + mesg = "bizarre wait(2) status"; + num = status; + lookup = false; + } + + if (cp) + fprintf(fp, "%s: ", cp); + fputs(mesg, fp); + + if (num != -1) { + fprintf(fp, " %#x", num); + if (lookup) { + errno = 0; + signame = strsignal(num); + if (errno) + signame = "invalid"; + putc(' ', fp); + fputs(signame, fp); + } } + if (WCOREDUMP(status)) + fputs(", core dumped", fp); + putc('\n', fp); return status; }