summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/execline/if.c13
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) ;
}