From 8bb0387553c0585d32264b5b5a51b92c97f7bb6f Mon Sep 17 00:00:00 2001
From: Laurent Bercot
Date: Sun, 20 Mar 2016 11:09:47 +0000
Subject: Add -px/-po support to forx (thanks Aranea); rc for 2.1.5.0
---
AUTHORS | 1 +
COPYING | 2 +-
doc/forx.html | 19 +++++++++++--------
doc/index.html | 4 ++--
doc/upgrade.html | 6 ++++++
package/info | 2 +-
src/execline/forx.c | 32 +++++++++++++++++++++++++++++---
7 files changed, 51 insertions(+), 15 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index 0ac10b7..b780d54 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -15,3 +15,4 @@ Thanks to:
Vallo Kallaste
Jorge Almeida
Olivier Brunel
+ Luis Ressel
diff --git a/COPYING b/COPYING
index a49b1ca..f496e31 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2015 Laurent Bercot
+Copyright (c) 2011-2016 Laurent Bercot
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
diff --git a/doc/forx.html b/doc/forx.html
index 8bc84b4..31804af 100644
--- a/doc/forx.html
+++ b/doc/forx.html
@@ -29,7 +29,7 @@
- forx [ -p | -o okcodes | -x breakcodes ] variable { args... } loop...
+ forx [ -p ] [ -o okcodes | -x breakcodes ] variable { args... } loop...
@@ -45,14 +45,9 @@ That block contains a list of args.
Options
- - -p : run in parallel. Do not wait for an instance of
-loop... to exit before spawning the next one. forx
-will still wait for all instances of loop to terminate before
-exiting, though.
- -o okcodes : okcodes must
-be a comma-separated list of exit codes. If the -p flag
-hasn't been given and loop exits with one of the codes in
-okcodes,
+be a comma-separated list of exit codes. If
+loop exits with one of the codes in okcodes,
forx will run the following instances of the loop, but if the exit code is
not listed in okcodes, forx will exit immediately with an
approximation of the same exit code.
@@ -60,6 +55,14 @@ not listed in okcodes, forx will exit immediately with an
option, but with inverted meaning - the listed exit codes are codes
that will make forx break the loop and exit, and the unlisted exit
codes will make it keep looping.
+ - -p : run in parallel. Do not wait for an instance of
+loop... to exit before spawning the next one. forx
+will still wait for all instances of loop to terminate before
+exiting 0. If the -o option has been given, forx
+will exit 0 if all of the exit codes are in the values listed in the okcodes
+list, else it will exit 1. If the -x option has been given,
+forx will exit 0 if none of the exit codes are in the values
+listed in the breakcodes list, else it will exit 1.
Notes
diff --git a/doc/index.html b/doc/index.html
index ed7ad02..1e13da5 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -51,7 +51,7 @@ shell's syntax, and has no security issues.
- A POSIX-compliant system with a standard C development environment
- GNU make, version 3.81 or later.
- skalibs version
-2.3.8.3 or later. It's a build-time requirement. It's also a run-time
+2.3.10.0 or later. It's a build-time requirement. It's also a run-time
requirement if you link against the shared version of the skalibs
library.
@@ -66,7 +66,7 @@ library.
Download
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 3d77796..7b51c28 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -18,6 +18,12 @@
What has changed in execline
+ in 2.1.5.0
+
+
+ - skalibs dependency bumped to 2.3.10.0
+
+
in 2.1.4.5
diff --git a/package/info b/package/info
index 0ca6d04..08e732d 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=execline
-version=2.1.4.5
+version=2.1.5.0
category=admin
package_macro_name=EXECLINE
diff --git a/src/execline/forx.c b/src/execline/forx.c
index ef08ab2..bae2f4b 100644
--- a/src/execline/forx.c
+++ b/src/execline/forx.c
@@ -11,16 +11,35 @@
#include
#include
-#define USAGE "forx [ -p | -o okcode,okcode,... | -x breakcode,breakcode,... ] var { values... } command..."
+#define USAGE "forx [ -p ] [ -o okcode,okcode,... | -x breakcode,breakcode,... ] var { values... } command..."
#define dieusage() strerr_dieusage(100, USAGE)
-static int isok (unsigned short *tab, unsigned int n, int code)
+static int isok (unsigned short const *tab, unsigned int n, int code)
{
register unsigned int i = 0 ;
for (; i < n ; i++) if ((unsigned short)code == tab[i]) break ;
return i < n ;
}
+static int waitn_code (unsigned short const *tab, unsigned int nbc, pid_t *pids, unsigned int n, int not)
+{
+ int ok = 1 ;
+ while (n)
+ {
+ int wstat ;
+ register unsigned int i = 0 ;
+ register pid_t pid = wait_nointr(&wstat) ;
+ if (pid < 0) return -1 ;
+ for (; i < n ; i++) if (pid == pids[i]) break ;
+ if (i < n)
+ {
+ if (not == isok(tab, nbc, wait_estatus(wstat))) ok = 0 ;
+ pids[i] = pids[--n] ;
+ }
+ }
+ return ok ;
+}
+
int main (int argc, char const **argv, char const *const *envp)
{
char const *x ;
@@ -55,6 +74,8 @@ int main (int argc, char const **argv, char const *const *envp)
if (argc < 2) dieusage() ;
x = argv[0] ; if (!*x) dieusage() ;
+ if (x[0] == EXECLINE_BLOCK_QUOTE_CHAR)
+ strerr_warnw3x("variable ", x, " starts with a block quoting character") ;
argv++ ; argc-- ;
argc1 = el_semicolon(argv) ;
if (argc1 >= argc) strerr_dief1x(100, "unterminated block") ;
@@ -89,8 +110,13 @@ int main (int argc, char const **argv, char const *const *envp)
return wait_estatus(wstat) ;
}
}
+
if (flagpar)
- if (!waitn(pids, argc1)) strerr_diefu1sys(111, "waitn") ;
+ {
+ register int r = waitn_code(okcodes, nbc, pids, argc1, not) ;
+ if (r < 0) strerr_diefu1sys(111, "waitn") ;
+ else if (!r) return 1 ;
+ }
}
return 0 ;
}
--
cgit v1.3.1