[git commit] xargs: support -a FILE

Denys Vlasenko vda.linux at googlemail.com
Tue Aug 29 19:05:40 UTC 2017


commit: https://git.busybox.net/busybox/commit/?id=f8ee849ecd42fa11da6c5f381ad83594840b3cca
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

The GNU-specific option -a lets xargs read the arguments from a file
rather than from stdin.

This is particularly convenient when debugging in gdb interactively,
and it might be of more general use.

function                                             old     new   delta
xargs_main                                           788     823     +35
packed_usage                                       31683   31671     -12

Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 findutils/xargs.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/findutils/xargs.c b/findutils/xargs.c
index 77e01ef..acee031 100644
--- a/findutils/xargs.c
+++ b/findutils/xargs.c
@@ -64,6 +64,11 @@
 //config:	bool "Enable -P N: processes to run in parallel"
 //config:	default y
 //config:	depends on XARGS
+//config:
+//config:config FEATURE_XARGS_SUPPORT_ARGS_FILE
+//config:	bool "Enable -a FILE: use FILE instead of stdin"
+//config:	default y
+//config:	depends on XARGS
 
 //applet:IF_XARGS(APPLET_NOEXEC(xargs, xargs, BB_DIR_USR_BIN, BB_SUID_DROP, xargs))
 
@@ -517,6 +522,9 @@ static int xargs_ask_confirmation(void)
 //usage:	IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(
 //usage:     "\n	-0	Input is separated by NUL characters"
 //usage:	)
+//usage:	IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(
+//usage:     "\n	-a FILE	Read from FILE instead of stdin"
+//usage:	)
 //usage:     "\n	-t	Print the command on stderr before execution"
 //usage:     "\n	-e[STR]	STR stops input processing"
 //usage:     "\n	-n N	Pass no more than N args to PROG"
@@ -565,7 +573,8 @@ enum {
 	IF_FEATURE_XARGS_SUPPORT_TERMOPT(     "x") \
 	IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(   "0") \
 	IF_FEATURE_XARGS_SUPPORT_REPL_STR(    "I:i::") \
-	IF_FEATURE_XARGS_SUPPORT_PARALLEL(    "P:+")
+	IF_FEATURE_XARGS_SUPPORT_PARALLEL(    "P:+") \
+	IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(   "a:")
 
 int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int xargs_main(int argc UNUSED_PARAM, char **argv)
@@ -584,6 +593,7 @@ int xargs_main(int argc UNUSED_PARAM, char **argv)
 #else
 #define read_args process_stdin
 #endif
+	IF_FEATURE_XARGS_SUPPORT_PARALLEL(char *opt_a = NULL;)
 
 	INIT_G();
 
@@ -592,6 +602,7 @@ int xargs_main(int argc UNUSED_PARAM, char **argv)
 		&max_args, &max_chars, &G.eof_str, &G.eof_str
 		IF_FEATURE_XARGS_SUPPORT_REPL_STR(, &G.repl_str, &G.repl_str)
 		IF_FEATURE_XARGS_SUPPORT_PARALLEL(, &G.max_procs)
+		IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(, &opt_a)
 	);
 
 #if ENABLE_FEATURE_XARGS_SUPPORT_PARALLEL
@@ -599,6 +610,11 @@ int xargs_main(int argc UNUSED_PARAM, char **argv)
 		G.max_procs = 100; /* let's not go crazy high */
 #endif
 
+#if ENABLE_FEATURE_XARGS_SUPPORT_ARGS_FILE
+	if (opt_a)
+		xmove_fd(xopen(opt_a, O_RDONLY), 0);
+#endif
+
 	/* -E ""? You may wonder why not just omit -E?
 	 * This is used for portability:
 	 * old xargs was using "_" as default for -E / -e */


More information about the busybox-cvs mailing list