diff options
-rw-r--r-- | src/tail.c | 55 | ||||
-rwxr-xr-x | tests/tail-2/F-vs-missing.sh | 2 | ||||
-rwxr-xr-x | tests/tail-2/F-vs-rename.sh | 2 |
3 files changed, 27 insertions, 32 deletions
diff --git a/src/tail.c b/src/tail.c index 4d6b28a19..c062d403f 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1019,42 +1019,37 @@ recheck (struct File_spec *f, bool blocking) assert (f->fd == -1); error (0, 0, _("%s has become accessible"), quote (pretty_name (f))); } + else if (f->fd == -1) + { + /* A new file even when inodes haven't changed as <dev,inode> + pairs can be reused, and we know the file was missing + on the previous iteration. Note this also means the file + is redisplayed in --follow=name mode if renamed away from + and back to a monitored name. */ + new_file = true; + + error (0, 0, + _("%s has appeared; following new file"), + quote (pretty_name (f))); + } else if (f->ino != new_stats.st_ino || f->dev != new_stats.st_dev) { + /* File has been replaced (e.g., via log rotation) -- + tail the new one. */ new_file = true; - if (f->fd == -1) - { - error (0, 0, - _("%s has appeared; following new file"), - quote (pretty_name (f))); - } - else - { - /* Close the old one. */ - close_fd (f->fd, pretty_name (f)); - - /* File has been replaced (e.g., via log rotation) -- - tail the new one. */ - error (0, 0, - _("%s has been replaced; following new file"), - quote (pretty_name (f))); - } + + error (0, 0, + _("%s has been replaced; following new file"), + quote (pretty_name (f))); + + /* Close the old one. */ + close_fd (f->fd, pretty_name (f)); + } else { - if (f->fd == -1) - { - /* This happens when one iteration finds the file missing, - then the preceding <dev,inode> pair is reused as the - file is recreated. Note this also means the file is redisplayed - in --follow=name mode if renamed away from and back to - a monitored name. */ - new_file = true; - } - else - { - close_fd (fd, pretty_name (f)); - } + /* No changes detected, so close new fd. */ + close_fd (fd, pretty_name (f)); } /* FIXME: When a log is rotated, daemons tend to log to the diff --git a/tests/tail-2/F-vs-missing.sh b/tests/tail-2/F-vs-missing.sh index be20ee3b8..54fe30a88 100755 --- a/tests/tail-2/F-vs-missing.sh +++ b/tests/tail-2/F-vs-missing.sh @@ -48,7 +48,7 @@ for mode in '' '---disable-inotify'; do (cd missing && echo x > file) || framework_failure_ # Wait up to 12.7s for this to appear in the output: - # "tail: '...' has appeared; following end of new file" + # "tail: '...' has appeared; following new file" tail_re='has appeared' retry_delay_ check_tail_output .1 7 || { echo "$0: file: unexpected delay?"; cat out; fail=1; } diff --git a/tests/tail-2/F-vs-rename.sh b/tests/tail-2/F-vs-rename.sh index ee61a548b..06733fb41 100755 --- a/tests/tail-2/F-vs-rename.sh +++ b/tests/tail-2/F-vs-rename.sh @@ -53,7 +53,7 @@ for mode in '' '---disable-inotify'; do echo x > a # Wait up to 12.7s for this to appear in the output: - # "tail: '...' has appeared; following end of new file" + # "tail: '...' has appeared; following new file" tail_re='has appeared' retry_delay_ check_tail_output .1 7 || { echo "$0: a: unexpected delay?"; cat out; fail=1; } |