Index: jobs.c =================================================================== RCS file: /cvsroot/src/bin/sh/jobs.c,v retrieving revision 1.69 diff -u -u -r1.69 jobs.c --- jobs.c 18 Jun 2011 21:18:46 -0000 1.69 +++ jobs.c 12 Oct 2011 21:42:57 -0000 @@ -41,6 +41,7 @@ #endif #endif /* not lint */ +#include #include #include #include @@ -80,6 +81,7 @@ #include "memalloc.h" #include "error.h" #include "mystring.h" +#include "var.h" static struct job *jobtab; /* array of jobs */ @@ -952,6 +954,33 @@ jobs_invalid = 1; } +static void +setstatus(const struct job *jp) +{ + size_t len = jp->nprocs * 4; /* 3 digits plus space */ + char *t; + static char *text; + static size_t tlen; + + if (tlen < len) { + text = t = ckrealloc(text, len); + tlen = len; + } + + t = text; + for (int i = 0; i < jp->nprocs; i++) { + int l = snprintf(t, len, "%d ", WEXITSTATUS(jp->ps[i].status)); + t += l; + len -= l; + } + + if (t != text) + t[-1] = '\0'; + else + t[0] = '\0'; + setvar("PIPESTATUS", text, VNOFUNC); +} + /* * Wait for job to finish. * @@ -1020,8 +1049,10 @@ raise(SIGINT); } #endif - if (! JOBS || jp->state == JOBDONE) + if (! JOBS || jp->state == JOBDONE) { + setstatus(jp); freejob(jp); + } INTON; return st; } Index: var.c =================================================================== RCS file: /cvsroot/src/bin/sh/var.c,v retrieving revision 1.40 diff -u -u -r1.40 var.c --- var.c 18 Jun 2011 21:18:46 -0000 1.40 +++ var.c 12 Oct 2011 21:42:57 -0000 @@ -102,6 +102,7 @@ struct var vps4; struct var vvers; struct var voptind; +struct var vpipestatus; const struct varinit varinit[] = { #if ATTY @@ -133,6 +134,8 @@ #endif { &voptind, VSTRFIXED|VTEXTFIXED|VNOFUNC, "OPTIND=1", getoptsreset }, + { &vpipestatus, VSTRFIXED|VTEXTFIXED|VUNSET, "PIPESTATUS=", + NULL }, { NULL, 0, NULL, NULL } }; Index: var.h =================================================================== RCS file: /cvsroot/src/bin/sh/var.h,v retrieving revision 1.25 diff -u -u -r1.25 var.h --- var.h 18 Jun 2011 21:18:46 -0000 1.25 +++ var.h 12 Oct 2011 21:42:57 -0000 @@ -80,6 +80,7 @@ extern struct var vps1; extern struct var vps2; extern struct var vps4; +extern struct var vpipestatus; #ifndef SMALL extern struct var vterm; extern struct var vtermcap;