diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | src/tail.c | 2 | ||||
-rwxr-xr-x | tests/tail-2/assert-2.sh | 2 | ||||
-rwxr-xr-x | tests/tail-2/retry.sh | 24 |
4 files changed, 27 insertions, 5 deletions
@@ -63,6 +63,10 @@ GNU coreutils NEWS -*- outline -*- Previously truncation was ignored thus not outputting new data in the file. [bug introduced in coreutils-5.3.0] + tail -f will no longer continually try to open inaccessible files, + only doing so if --retry is specified. + [This bug was present in "the beginning".] + yes now handles short writes, rather than assuming all writes complete. [bug introduced in coreutils-8.24] diff --git a/src/tail.c b/src/tail.c index 66aad5b78..193e4fd7d 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1909,7 +1909,7 @@ tail_file (struct File_spec *f, uintmax_t n_units) { f->fd = -1; f->errnum = errno; - f->ignore = false; + f->ignore = ! reopen_inaccessible_files; f->ino = 0; f->dev = 0; } diff --git a/tests/tail-2/assert-2.sh b/tests/tail-2/assert-2.sh index 79d4254cc..03ba8e2e6 100755 --- a/tests/tail-2/assert-2.sh +++ b/tests/tail-2/assert-2.sh @@ -38,7 +38,7 @@ for mode in '' '---disable-inotify'; do rm -f a foo out touch a || framework_failure_ - tail $mode --follow=name $fastpoll a foo > out 2>&1 & pid=$! + tail $mode $fastpoll -F a foo > out 2>&1 & pid=$! # Wait up to 12.7s for tail to start. echo x > a || framework_failure_ diff --git a/tests/tail-2/retry.sh b/tests/tail-2/retry.sh index 858909f65..782992356 100755 --- a/tests/tail-2/retry.sh +++ b/tests/tail-2/retry.sh @@ -51,7 +51,7 @@ grep -F 'tail: warning: --retry ignored' out || { cat out; fail=1; } # === Test: # The same with a missing file: expect error message and exit 1. -tail --retry missing > out 2>&1 && fail=1 +returns_ 1 tail --retry missing > out 2>&1 || fail=1 [ "$(countlines_)" = 2 ] || { cat out; fail=1; } grep -F 'tail: warning: --retry ignored' out || { cat out; fail=1; } @@ -123,17 +123,35 @@ grep -F 'no files remaining' out || { fail=1; cat out; } rm -fd missing out || framework_failure_ # === Test: +# Ensure that --follow=descriptor (without --retry) does *not* try +# to open a file after an initial fail, even when there are other +# tailable files. This was an issue in <= 8.25. +touch existing || framework_failure_ +tail $mode $fastpoll --follow=descriptor missing existing >out 2>&1 & pid=$! +retry_delay_ wait4lines_ .1 6 2 || { cat out; fail=1; } +[ "$(countlines_)" = 2 ] || { fail=1; cat out; } +grep -F 'cannot open' out || { fail=1; cat out; } +echo "Y" > missing || framework_failure_ +echo "X" > existing || framework_failure_ +retry_delay_ wait4lines_ .1 6 3 || { cat out; fail=1; } +[ "$(countlines_)" = 3 ] || { fail=1; cat out; } +grep '^X$' out || { fail=1; cat out; } +grep '^Y$' out && { fail=1; cat out; } +cleanup_ +rm -f missing out existing || framework_failure_ + +# === Test: # Ensure that --follow=descriptor (without --retry) does *not wait* for the # file to appear. Expect 2 lines in the output file ("cannot open" + # "no files remaining") and exit status 1. -tail $mode --follow=descriptor missing >out 2>&1 && fail=1 +returns_ 1 tail $mode --follow=descriptor missing >out 2>&1 || fail=1 [ "$(countlines_)" = 2 ] || { fail=1; cat out; } grep -F 'cannot open' out || { fail=1; cat out; } grep -F 'no files remaining' out || { fail=1; cat out; } # === Test: # Likewise for --follow=name (without --retry). -tail $mode --follow=name missing >out 2>&1 && fail=1 +returns_ 1 tail $mode --follow=name missing >out 2>&1 || fail=1 [ "$(countlines_)" = 2 ] || { fail=1; cat out; } grep -F 'cannot open' out || { fail=1; cat out; } grep -F 'no files remaining' out || { fail=1; cat out; } |