summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2021-10-19 12:24:22 -0400
committerTavian Barnes <tavianator@tavianator.com>2021-10-19 12:28:17 -0400
commit9b50adaaaa4fedc8bda6fcf32595ecf7a682fa8b (patch)
tree3ed5f7cbdc1063b8e5c6d9f9a5ac5ea2542e1250
parentdceb5658eae528ae18dbd7d249ab4ca60b3958fe (diff)
downloadbfs-9b50adaaaa4fedc8bda6fcf32595ecf7a682fa8b.tar.xz
parse: Switch back to O_TRUNC from explicit ftruncate()
O_TRUNC is not equivalent to an unconditional ftruncate(), e.g. for device files. This reverts the behaviour change from 78944c81, which was never released and is not supported in other find implementations.
-rw-r--r--parse.c23
-rwxr-xr-xtests.sh24
2 files changed, 16 insertions, 31 deletions
diff --git a/parse.c b/parse.c
index c257f4e..aea7b4f 100644
--- a/parse.c
+++ b/parse.c
@@ -336,9 +336,8 @@ static int expr_open(struct parser_state *state, struct expr *expr, const char *
FILE *file = NULL;
CFILE *cfile = NULL;
- CFILE *dedup = NULL;
- file = xfopen(path, O_WRONLY | O_CREAT | O_CLOEXEC);
+ file = xfopen(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC);
if (!file) {
goto fail;
}
@@ -348,18 +347,12 @@ static int expr_open(struct parser_state *state, struct expr *expr, const char *
goto fail;
}
- dedup = bfs_ctx_dedup(ctx, cfile, path);
+ CFILE *dedup = bfs_ctx_dedup(ctx, cfile, path);
if (!dedup) {
goto fail;
}
- if (dedup == cfile) {
- // O_TRUNC was omitted above to avoid repeatedly truncating the same file, so do it
- // manually here
- if (ftruncate(fileno(file), 0) != 0) {
- goto fail;
- }
- } else {
+ if (dedup != cfile) {
cfclose(cfile);
}
@@ -368,12 +361,10 @@ static int expr_open(struct parser_state *state, struct expr *expr, const char *
fail:
parse_error(state, "${blu}%s${rs} ${bld}%s${rs}: %m.\n", expr->argv[0], path);
- if (!dedup) {
- if (cfile) {
- cfclose(cfile);
- } else if (file) {
- fclose(file);
- }
+ if (cfile) {
+ cfclose(cfile);
+ } else if (file) {
+ fclose(file);
}
return -1;
}
diff --git a/tests.sh b/tests.sh
index 2580d2f..c488aec 100755
--- a/tests.sh
+++ b/tests.sh
@@ -524,6 +524,7 @@ gnu_tests=(
test_fprint
test_fprint_duplicate
test_fprint_error
+ test_fprint_noerror
test_fprint_noarg
test_fprint_nonexistent
test_fprint_truncate
@@ -736,7 +737,6 @@ bfs_tests=(
test_execdir_plus
- test_fprint_append
test_fprint_duplicate_stdout
test_fprint_error_stdout
test_fprint_error_stderr
@@ -1796,20 +1796,6 @@ function test_fprint_truncate() {
fi
}
-function test_fprint_append() {
- rm -f scratch/test_fprint_append.out
-
- invoke_bfs basic -fprint scratch/test_fprint_append.out >>scratch/test_fprint_append.out
- invoke_bfs basic -fprint scratch/test_fprint_append.out >>scratch/test_fprint_append.out
- sort -o scratch/test_fprint_append.out scratch/test_fprint_append.out
-
- if [ "$UPDATE" ]; then
- cp {scratch,"$TESTS"}/test_fprint_append.out
- else
- diff -u {"$TESTS",scratch}/test_fprint_append.out
- fi
-}
-
function test_double_dash() {
cd basic
bfs_diff -- . -type f
@@ -2724,6 +2710,14 @@ function test_fprint_error() {
fi
}
+function test_fprint_noerror() {
+ # Regression test: /dev/full should not fail until actually written to
+
+ if [ -e /dev/full ]; then
+ invoke_bfs basic -false -fprint /dev/full
+ fi
+}
+
function test_fprint_error_stdout() {
if [ -e /dev/full ]; then
fail quiet invoke_bfs basic -maxdepth 0 -fprint /dev/full >/dev/full