ash: implement set -o pipefail (conditional on bash compat). +39 bytes

Signed-off-by: Michael Abbott <michael@araneidae.co.uk>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Michael Abbott 2009-12-04 23:03:29 +01:00 committed by Denys Vlasenko
parent 285ad155c4
commit 359da5e3be

View File

@ -101,6 +101,9 @@ static const char *const optletters_optnames[] = {
"b" "notify",
"u" "nounset",
"\0" "vi",
#if ENABLE_ASH_BASH_COMPAT
"\0" "pipefail"
#endif
#if DEBUG
,"\0" "nolog"
,"\0" "debug"
@ -178,9 +181,14 @@ struct globals_misc {
#define bflag optlist[11]
#define uflag optlist[12]
#define viflag optlist[13]
#if ENABLE_ASH_BASH_COMPAT
# define pipefail optlist[14]
#else
# define pipefail 0
#endif
#if DEBUG
#define nolog optlist[14]
#define debug optlist[15]
# define nolog optlist[14 + ENABLE_ASH_BASH_COMPAT]
# define debug optlist[15 + ENABLE_ASH_BASH_COMPAT]
#endif
/* trap handler commands */
@ -3999,13 +4007,23 @@ jobscmd(int argc UNUSED_PARAM, char **argv)
}
#endif /* JOBS */
/* Called only on finished or stopped jobs (no members are running) */
static int
getstatus(struct job *job)
{
int status;
int retval;
struct procstat *ps;
/* Fetch last member's status */
ps = job->ps + job->nprocs - 1;
status = ps->ps_status;
if (pipefail) {
/* "set -o pipefail" mode: use last _nonzero_ status */
while (status == 0 && --ps >= job->ps)
status = ps->ps_status;
}
status = job->ps[job->nprocs - 1].ps_status;
retval = WEXITSTATUS(status);
if (!WIFEXITED(status)) {
#if JOBS