summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/if.html17
-rw-r--r--src/execline/if.c13
2 files changed, 17 insertions, 13 deletions
diff --git a/doc/if.html b/doc/if.html
index 700ee59..99be53e 100644
--- a/doc/if.html
+++ b/doc/if.html
@@ -38,19 +38,22 @@
then waits for it to complete. </li>
<li> If <em>prog1</em> crashes, <tt>if</tt> prints an error message
then exits 128 plus the number of the signal that killed <em>prog1</em>. </li>
- <li> If <em>prog1</em> exits a non-zero status,
-<tt>if</tt> exits 1.</li>
+ <li> If <em>prog1</em> exits with a non-zero code, <tt>if</tt> exits with an
+<a href="exitcodes.html">approximation</a> of that code. </li>
<li> Else <tt>if</tt> execs into <em>prog2</em>. </li>
</ul>
<h2> Options </h2>
<ul>
- <li> <tt>-X</tt>&nbsp;: treat a crash of <em>prog1</em> as a non-zero ("false") exit.
- <li> <tt>-n</tt>&nbsp;: negate the test (exit on true, exec into <em>prog2</em> on false) </li>
- <li> <tt>-x</tt>&nbsp;<em>exitcode</em>&nbsp;: exit <em>exitcode</em> instead of 1 if the test fails. </li>
- <li> <tt>-t</tt>&nbsp;: exit 0 instead of 1 if the test fails.
-This is equivalent to <tt>-x 0</tt>. </li>
+ <li> <tt>-X</tt>&nbsp;: treat a crash of <em>prog1</em> as a non-zero ("false") exit. This
+is mostly useful in combination with <tt>-n</tt>. </li>
+ <li> <tt>-n</tt>&nbsp;: negate the test. If <em>prog1</em> exits true, then <tt>if</tt> will
+exit 1; else it will exec into <em>prog2</em>. </li>
+ <li> <tt>-x</tt>&nbsp;<em>exitcode</em>&nbsp;: if <tt>if</tt> needs to exit, it will exit <em>exitcode</em>
+instead of whatever else it would have exited. </li>
+ <li> <tt>-t</tt>&nbsp;: if <tt>if</tt> needs to exit, it will exit 0. This is equivalent
+to <tt>-x 0</tt>. </li>
</ul>
<h2> Notes </h2>
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) ;
}