summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2023-01-30 21:44:10 +0000
committerPádraig Brady <P@draigBrady.com>2023-02-06 16:18:12 +0000
commitc0c63e9735908a9579f8735001957db6bd81afc3 (patch)
tree8e526079d53dd9f98965dc0e3a2fef26ea954811
parentead07bb3d461389bb52336109be7858458e49c38 (diff)
downloadcoreutils-c0c63e9735908a9579f8735001957db6bd81afc3.tar.gz
tail: fix support for -F with non seekable files
This was seen to be an issue when following a symlink that was being updated to point to different underlying devices. * src/tail.c (recheck): Guard the lseek() call to only be performed for regular files. * NEWS: Mention the bug fix.
-rw-r--r--NEWS4
-rw-r--r--src/tail.c3
2 files changed, 6 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 27334a595..eb8380e11 100644
--- a/NEWS
+++ b/NEWS
@@ -52,6 +52,10 @@ GNU coreutils NEWS -*- outline -*-
Previously it may have output 1 character too wide for certain widths.
[bug introduced in coreutils-5.3]
+ tail --follow=name works again with non seekable files. Previously it
+ exited with an "Illegal seek" error when such a file was replaced.
+ [bug introduced in fileutils-4.1.6]
+
`wc -c` will again efficiently determine the size of large files
on all systems. It no longer redundantly reads data from certain
sized files larger than SIZE_MAX.
diff --git a/src/tail.c b/src/tail.c
index 2244509dd..03061e8bf 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -1122,7 +1122,8 @@ recheck (struct File_spec *f, bool blocking)
{
/* Start at the beginning of the file. */
record_open_fd (f, fd, 0, &new_stats, (is_stdin ? -1 : blocking));
- xlseek (fd, 0, SEEK_SET, pretty_name (f));
+ if (S_ISREG (new_stats.st_mode))
+ xlseek (fd, 0, SEEK_SET, pretty_name (f));
}
}