diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2021-02-02 16:59:14 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2021-02-02 16:59:14 +0000 |
commit | f9b855a56b13708e2224efa54060b90539406383 (patch) | |
tree | 5d1b8d20bc152e5d76521fe5eaf455233045f3fa /src | |
parent | 631f809ce4a14ec6f1af5118b99adc514be7db60 (diff) | |
download | execline-f9b855a56b13708e2224efa54060b90539406383.tar.xz |
Make if propagate failure code
Diffstat (limited to 'src')
-rw-r--r-- | src/execline/if.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/execline/if.c b/src/execline/if.c index a37ecbc..8820dfa 100644 --- a/src/execline/if.c +++ b/src/execline/if.c @@ -11,12 +11,13 @@ #include <execline/execline.h> #define USAGE "if [ -n ] [ -X ] [ -t | -x exitcode ] { command... }" +#define dieusage() strerr_dieusage(100, USAGE) ; int main (int argc, char const **argv, char const *const *envp) { int argc1, wstat ; pid_t pid ; - int not = 0, flagnormalcrash = 0 ; + int not = 0, fixed = 0, flagnormalcrash = 0 ; unsigned short e = 1 ; PROG = "if" ; { @@ -27,11 +28,11 @@ int main (int argc, char const **argv, char const *const *envp) if (opt == -1) break ; switch (opt) { - case 'n' : not = 1 ; break ; + case 'n' : not = 1 ; fixed = 1 ; break ; case 'X' : flagnormalcrash = 1 ; break ; - case 't' : e = 0 ; break ; - case 'x' : if (ushort_scan(l.arg, &e)) break ; - default : strerr_dieusage(100, USAGE) ; + case 't' : e = 0 ; fixed = 1 ; break ; + case 'x' : if (!ushort_scan(l.arg, &e)) dieusage() ; fixed = 1 ; break ; + default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; @@ -49,6 +50,6 @@ int main (int argc, char const **argv, char const *const *envp) fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ; strerr_dief2x(128 + WTERMSIG(wstat), "child crashed with signal ", fmt) ; } - if (not == !wait_estatus(wstat)) return e ; + if (not == !wait_estatus(wstat)) return fixed ? e : wait_estatus(wstat) ; xexec0_e(argv+argc1+1, envp) ; } |