find: add rudimentary support for -exec {} +
function old new delta parse_params 1421 1414 -7 Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
ee06264a29
commit
a61ff51b49
@ -748,13 +748,13 @@ static action*** parse_params(char **argv)
|
|||||||
|
|
||||||
/* This is the only place in busybox where we use nested function.
|
/* This is the only place in busybox where we use nested function.
|
||||||
* So far more standard alternatives were bigger. */
|
* So far more standard alternatives were bigger. */
|
||||||
/* Suppress a warning "func without a prototype" */
|
/* Auto decl suppresses "func without a prototype" warning: */
|
||||||
auto action* alloc_action(int sizeof_struct, action_fp f);
|
auto action* alloc_action(int sizeof_struct, action_fp f);
|
||||||
action* alloc_action(int sizeof_struct, action_fp f)
|
action* alloc_action(int sizeof_struct, action_fp f)
|
||||||
{
|
{
|
||||||
action *ap;
|
action *ap;
|
||||||
appp[cur_group] = xrealloc(appp[cur_group], (cur_action+2) * sizeof(*appp));
|
appp[cur_group] = xrealloc(appp[cur_group], (cur_action+2) * sizeof(*appp));
|
||||||
appp[cur_group][cur_action++] = ap = xmalloc(sizeof_struct);
|
appp[cur_group][cur_action++] = ap = xzalloc(sizeof_struct);
|
||||||
appp[cur_group][cur_action] = NULL;
|
appp[cur_group][cur_action] = NULL;
|
||||||
ap->f = f;
|
ap->f = f;
|
||||||
IF_FEATURE_FIND_NOT( ap->invert = invert_flag; )
|
IF_FEATURE_FIND_NOT( ap->invert = invert_flag; )
|
||||||
@ -854,16 +854,20 @@ static action*** parse_params(char **argv)
|
|||||||
IF_FEATURE_FIND_NOT( invert_flag = 0; )
|
IF_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||||
ap = ALLOC_ACTION(exec);
|
ap = ALLOC_ACTION(exec);
|
||||||
ap->exec_argv = ++argv; /* first arg after -exec */
|
ap->exec_argv = ++argv; /* first arg after -exec */
|
||||||
ap->exec_argc = 0;
|
/*ap->exec_argc = 0; - ALLOC_ACTION did it */
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!*argv) /* did not see ';' or '+' until end */
|
if (!*argv) /* did not see ';' or '+' until end */
|
||||||
bb_error_msg_and_die(bb_msg_requires_arg, "-exec");
|
bb_error_msg_and_die(bb_msg_requires_arg, "-exec");
|
||||||
if (LONE_CHAR(argv[0], ';'))
|
// find -exec echo Foo ">{}<" ";"
|
||||||
|
// executes "echo Foo <filename>",
|
||||||
|
// find -exec echo Foo ">{}<" "+"
|
||||||
|
// executes "echo Foo <filename1> <filename2> <filename3>...".
|
||||||
|
// TODO (so far we treat "+" just like ";")
|
||||||
|
if ((argv[0][0] == ';' || argv[0][0] == '+')
|
||||||
|
&& argv[0][1] == '\0'
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
//TODO: implement {} + (like xargs)
|
}
|
||||||
// See:
|
|
||||||
// find findutils/ -exec echo ">"{}"<" \;
|
|
||||||
// find findutils/ -exec echo ">"{}"<" +
|
|
||||||
argv++;
|
argv++;
|
||||||
ap->exec_argc++;
|
ap->exec_argc++;
|
||||||
}
|
}
|
||||||
@ -936,7 +940,7 @@ static action*** parse_params(char **argv)
|
|||||||
ap = ALLOC_ACTION(perm);
|
ap = ALLOC_ACTION(perm);
|
||||||
ap->perm_char = arg1[0];
|
ap->perm_char = arg1[0];
|
||||||
arg1 = plus_minus_num(arg1);
|
arg1 = plus_minus_num(arg1);
|
||||||
ap->perm_mask = 0;
|
/*ap->perm_mask = 0; - ALLOC_ACTION did it */
|
||||||
if (!bb_parse_mode(arg1, &ap->perm_mask))
|
if (!bb_parse_mode(arg1, &ap->perm_mask))
|
||||||
bb_error_msg_and_die("invalid mode '%s'", arg1);
|
bb_error_msg_and_die("invalid mode '%s'", arg1);
|
||||||
}
|
}
|
||||||
@ -1022,7 +1026,7 @@ static action*** parse_params(char **argv)
|
|||||||
else if (parm == PARM_context) {
|
else if (parm == PARM_context) {
|
||||||
action_context *ap;
|
action_context *ap;
|
||||||
ap = ALLOC_ACTION(context);
|
ap = ALLOC_ACTION(context);
|
||||||
ap->context = NULL;
|
/*ap->context = NULL; - ALLOC_ACTION did it */
|
||||||
/* SELinux headers erroneously declare non-const parameter */
|
/* SELinux headers erroneously declare non-const parameter */
|
||||||
if (selinux_raw_to_trans_context((char*)arg1, &ap->context))
|
if (selinux_raw_to_trans_context((char*)arg1, &ap->context))
|
||||||
bb_simple_perror_msg(arg1);
|
bb_simple_perror_msg(arg1);
|
||||||
|
Loading…
Reference in New Issue
Block a user