* xargs is described in the Single Unix Specification v3 at
* http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html
*/
-
//config:config XARGS
//config: bool "xargs (6.7 kb)"
//config: default y
#define INIT_G() do { \
setup_common_bufsiz(); \
G.eof_str = NULL; /* need to clear by hand because we are NOEXEC applet */ \
+ G.idx = 0; \
IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.repl_str = "{}";) \
IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.eol_ch = '\n';) \
} while (0)
static void store_param(char *s)
{
/* Grow by 256 elements at once */
- if (!(G.idx & 0xff)) { /* G.idx == N*256 */
+ if (!(G.idx & 0xff)) { /* G.idx == N*256? */
/* Enlarge, make G.args[(N+1)*256 - 1] last valid idx */
G.args = xrealloc(G.args, sizeof(G.args[0]) * (G.idx + 0x100));
}
IF_FEATURE_XARGS_SUPPORT_REPL_STR( "I:i::")
int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int xargs_main(int argc, char **argv)
+int xargs_main(int argc UNUSED_PARAM, char **argv)
{
+ int initial_idx;
int i;
int child_error = 0;
char *max_args;
}
argv += optind;
- argc -= optind;
+ //argc -= optind;
if (!argv[0]) {
/* default behavior is to echo all the filenames */
*--argv = (char*)"echo";
- argc++;
+ //argc++;
}
/*
*/
G.args = NULL;
G.argv = argv;
- argc = 0;
read_args = process_stdin_with_replace;
/* Make -I imply -r. GNU findutils seems to do the same: */
/* (otherwise "echo -n | xargs -I% echo %" would SEGV) */
} else
#endif
{
- /* Allocate pointers for execvp.
+ /* Store the command to be executed, part 1.
* We can statically allocate (argc + n_max_arg + 1) elements
* and do not bother with resizing args[], but on 64-bit machines
* this results in args[] vector which is ~8 times bigger
* than n_max_chars! That is, with n_max_chars == 20k,
* args[] will take 160k (!), which will most likely be
* almost entirely unused.
- *
- * See store_param() for matching 256-step growth logic
*/
- G.args = xmalloc(sizeof(G.args[0]) * ((argc + 0xff) & ~0xff));
- /* Store the command to be executed, part 1 */
for (i = 0; argv[i]; i++)
- G.args[i] = argv[i];
+ store_param(argv[i]);
}
+ initial_idx = G.idx;
while (1) {
char *rem;
- G.idx = argc;
+ G.idx = initial_idx;
rem = read_args(n_max_chars, n_max_arg, buf);
store_param(NULL);
- if (!G.args[argc]) {
+ if (!G.args[initial_idx]) { /* not even one ARG was added? */
if (*rem != '\0')
bb_error_msg_and_die("argument line too long");
if (opt & OPT_NO_EMPTY)