summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2014-06-19 11:32:11 +0200
committerDenys Vlasenko2014-06-19 11:32:11 +0200
commit6be3a5242ce4855734a4cdd5770b6ea7adaf2b3d (patch)
treee4903316cbaaaeb7cb0a4396daacb3ec1ff8e467
parent14158b4127dba30466c50147b868a6a89702960b (diff)
downloadbusybox-6be3a5242ce4855734a4cdd5770b6ea7adaf2b3d.zip
busybox-6be3a5242ce4855734a4cdd5770b6ea7adaf2b3d.tar.gz
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>
-rw-r--r--findutils/find.c17
-rwxr-xr-xtestsuite/find.tests26
2 files changed, 35 insertions, 8 deletions
diff --git a/findutils/find.c b/findutils/find.c
index 8ac3da7..493f72e 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -634,6 +634,7 @@ static int do_exec(action_exec *ap, const char *fileName)
} else {
int j = 0;
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]);
free(ap->filelist[j]);
j++;
@@ -669,16 +670,16 @@ ACTF(exec)
{
# if ENABLE_FEATURE_FIND_EXEC_PLUS
if (ap->filelist) {
- int rc = 0;
+ int rc;
+ ap->filelist = xrealloc_vector(ap->filelist, 8, ap->filelist_idx);
+ ap->filelist[ap->filelist_idx++] = xstrdup(fileName);
+ 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);
-
- ap->file_len += strlen(fileName) + sizeof(char*) + 1;
- ap->filelist = xrealloc_vector(ap->filelist, 8, ap->filelist_idx);
- ap->filelist[ap->filelist_idx++] = xstrdup(fileName);
- return rc == 0; /* return 1 if exitcode 0 */
+ return rc;
}
# endif
return do_exec(ap, fileName);
@@ -698,8 +699,8 @@ static int flush_exec_plus(void)
# if ENABLE_FEATURE_FIND_NOT
if (ap->invert) rc = !rc;
# endif
- if (rc)
- return rc;
+ if (rc == 0)
+ return 1;
}
}
}
diff --git a/testsuite/find.tests b/testsuite/find.tests
index 345d1e8..f041106 100755
--- a/testsuite/find.tests
+++ b/testsuite/find.tests
@@ -15,6 +15,32 @@ testing "find -type f" \
"./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"
rm -rf find.tempdir