find: exit code fixes for find -exec

function                                             old     new   delta
func_exec                                            127     100     -27

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2014-06-19 11:32:11 +02:00
parent 14158b4127
commit 6be3a5242c
2 changed files with 36 additions and 9 deletions

View File

@ -634,6 +634,7 @@ static int do_exec(action_exec *ap, const char *fileName)
} else { } else {
int j = 0; int j = 0;
while (ap->filelist[j]) { while (ap->filelist[j]) {
/* 2nd arg here should be ap->subst_count[i], but it is always 1: */
*pp++ = xmalloc_substitute_string(arg, 1, "{}", ap->filelist[j]); *pp++ = xmalloc_substitute_string(arg, 1, "{}", ap->filelist[j]);
free(ap->filelist[j]); free(ap->filelist[j]);
j++; j++;
@ -669,16 +670,16 @@ ACTF(exec)
{ {
# if ENABLE_FEATURE_FIND_EXEC_PLUS # if ENABLE_FEATURE_FIND_EXEC_PLUS
if (ap->filelist) { if (ap->filelist) {
int rc = 0; int rc;
/* If we have lots of files already, exec the command */
if (ap->file_len >= 32*1024)
rc = do_exec(ap, NULL);
ap->file_len += strlen(fileName) + sizeof(char*) + 1;
ap->filelist = xrealloc_vector(ap->filelist, 8, ap->filelist_idx); ap->filelist = xrealloc_vector(ap->filelist, 8, ap->filelist_idx);
ap->filelist[ap->filelist_idx++] = xstrdup(fileName); ap->filelist[ap->filelist_idx++] = xstrdup(fileName);
return rc == 0; /* return 1 if exitcode 0 */ ap->file_len += strlen(fileName) + sizeof(char*) + 1;
/* If we have lots of files already, exec the command */
rc = 1;
if (ap->file_len >= 32*1024)
rc = do_exec(ap, NULL);
return rc;
} }
# endif # endif
return do_exec(ap, fileName); return do_exec(ap, fileName);
@ -698,8 +699,8 @@ static int flush_exec_plus(void)
# if ENABLE_FEATURE_FIND_NOT # if ENABLE_FEATURE_FIND_NOT
if (ap->invert) rc = !rc; if (ap->invert) rc = !rc;
# endif # endif
if (rc) if (rc == 0)
return rc; return 1;
} }
} }
} }

View File

@ -15,6 +15,32 @@ testing "find -type f" \
"./testfile\n" \ "./testfile\n" \
"" "" "" ""
optional FEATURE_FIND_EXEC
testing "find -exec exitcode 1" \
"cd find.tempdir && find testfile -exec true {} \; 2>&1; echo \$?" \
"0\n" \
"" ""
SKIP=
optional FEATURE_FIND_EXEC_PLUS
testing "find -exec exitcode 2" \
"cd find.tempdir && find testfile -exec true {} + 2>&1; echo \$?" \
"0\n" \
"" ""
SKIP=
# Surprisingly, "-exec false ;" results in exitcode 0! "-exec false +" is different!!!
optional FEATURE_FIND_EXEC
testing "find -exec exitcode 3" \
"cd find.tempdir && find testfile -exec false {} \; 2>&1; echo \$?" \
"0\n" \
"" ""
SKIP=
optional FEATURE_FIND_EXEC_PLUS
testing "find -exec exitcode 4" \
"cd find.tempdir && find testfile -exec false {} + 2>&1; echo \$?" \
"1\n" \
"" ""
SKIP=
# testing "description" "command" "result" "infile" "stdin" # testing "description" "command" "result" "infile" "stdin"
rm -rf find.tempdir rm -rf find.tempdir