about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS3
-rw-r--r--doc/s6-test.html7
-rw-r--r--src/skaembutils/s6-test.c19
3 files changed, 19 insertions, 10 deletions
diff --git a/AUTHORS b/AUTHORS
index d2df44b..10b43e0 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,6 +1,9 @@
 Main author:
   Laurent Bercot <ska-skaware@skarnet.org>
 
+Contributors:
+  Luis Ressel <aranea@aixah.de>
+
 Thanks to:
   Dan J. Bernstein <djb@cr.yp.to>
   Jean Marot <jean.marot@salle-s.org>
diff --git a/doc/s6-test.html b/doc/s6-test.html
index d256cdf..6b48d42 100644
--- a/doc/s6-test.html
+++ b/doc/s6-test.html
@@ -50,5 +50,12 @@ program; however, if your arguments never start with a backslash, it exhibits th
 exact same behaviour.
 </p>
 
+<h2> Non-standard expressions </h2>
+
+<ul>
+ <li> <tt>-v&nbsp;<em>VAR</em></tt>&nbsp;: tests whether the
+<em>VAR</em> variable is defined in the current environment. </li>
+</ul>
+
 </body>
 </html>
diff --git a/src/skaembutils/s6-test.c b/src/skaembutils/s6-test.c
index 9ee11e0..36b7b15 100644
--- a/src/skaembutils/s6-test.c
+++ b/src/skaembutils/s6-test.c
@@ -7,9 +7,10 @@
 #include <skalibs/bytestr.h>
 #include <skalibs/fmtscan.h>
 #include <skalibs/strerr2.h>
+#include <skalibs/env.h>
 #include <skalibs/djbunix.h>
 
-#define USAGE "s6-test expression  or  [ expression ]"
+#define USAGE "s6-test expression...  or  [ expression... ]"
 
 enum opnum
 {
@@ -276,16 +277,16 @@ static unsigned int parse (struct node *tree, unsigned int n)
   return stack[1] ;
 }
 
-static int run (struct node const *tree, unsigned int root, char const *const *envp)
+static int run (struct node const *tree, unsigned int root)
 {
   switch (tree[root].op)
   {
     case T_NOT :
-      return !run(tree, tree[root].arg1, envp) ;
+      return !run(tree, tree[root].arg1) ;
     case T_AND :
-      return run(tree, tree[root].arg1, envp) && run(tree, tree[root].arg2, envp) ;
+      return run(tree, tree[root].arg1) && run(tree, tree[root].arg2) ;
     case T_OR :
-      return run(tree, tree[root].arg1, envp) || run(tree, tree[root].arg2, envp) ;
+      return run(tree, tree[root].arg1) || run(tree, tree[root].arg2) ;
     case T_EXIST :
     {
       struct stat st ;
@@ -492,9 +493,7 @@ static int run (struct node const *tree, unsigned int root, char const *const *e
       return n1 <= n2 ;
     }
     case T_ENV :
-    {
-      return env_get2(envp, tree[tree[root].arg1].data) ? 1 : 0 ;
-    }
+      return !!env_get(tree[tree[root].arg1].data) ;
     default:
       strerr_dief1x(111, "operation not implemented") ;
   }
@@ -503,7 +502,7 @@ errorint:
   strerr_dief2x(100, tree[root].data, " requires integer arguments") ;
 }
 
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
 {
   PROG = "s6-test" ;
   if (argc <= 1) return 1 ;
@@ -516,6 +515,6 @@ int main (int argc, char const *const *argv, char const *const *envp)
         n-- ;
       else strerr_dief1x(100, "parse error: missing closing bracket") ;
     }
-    return !run(tree, parse(tree, n), envp) ;
+    return !run(tree, parse(tree, n)) ;
   }
 }