diff options
author | Pádraig Brady <P@draigBrady.com> | 2016-01-19 13:22:42 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2016-01-19 14:07:10 +0000 |
commit | dbff2508b85baf12d5e2eee4134eb17be69fdca9 (patch) | |
tree | dd7ef8381e0a9e95558b3095e6ba8a8a7d22df58 /src | |
parent | 6e2208e07a3b9db8147ec9de5cdf466a5540c8f7 (diff) | |
download | coreutils-dbff2508b85baf12d5e2eee4134eb17be69fdca9.tar.xz |
tail: disable inotify with only non existent files
tests/tail-2/F-headers.sh and test/tail-2/retry.sh fail on
on remote file systems due to tail going into inotify mode
due to not being able to determine the remoteness of the
non existent files.
* src/tail.c (any_non_remote_file): A new function used
to disable inotify when there are no open files, as
we can't determine remoteness in that case.
* NEWS: Mention the bug fix.
Diffstat (limited to 'src')
-rw-r--r-- | src/tail.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/tail.c b/src/tail.c index 781adf200..2a72a93f0 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1270,6 +1270,20 @@ any_remote_file (const struct File_spec *f, size_t n_files) return false; } +/* Return true if any of the N_FILES files in F is non remote, i.e., has + an open file descriptor and is not on a network file system. */ + +static bool +any_non_remote_file (const struct File_spec *f, size_t n_files) +{ + size_t i; + + for (i = 0; i < n_files; i++) + if (0 <= f[i].fd && ! f[i].remote) + return true; + return false; +} + /* Return true if any of the N_FILES files in F is a symlink. Note we don't worry about the edge case where "-" exists, since that will have the same consequences for inotify, @@ -2313,6 +2327,11 @@ main (int argc, char **argv) in this case because it would miss any updates to the file that were not initiated from the local system. + any_non_remote_file() checks if the user has specified any + files that don't reside on remote file systems. inotify is not used + if there are no open files, as we can't determine if those file + will be on a remote file system. + any_symlinks() checks if the user has specified any symbolic links. inotify is not used in this case because it returns updated _targets_ which would not match the specified names. If we tried to always @@ -2339,6 +2358,7 @@ main (int argc, char **argv) for one name when a name is specified multiple times. */ if (!disable_inotify && (tailable_stdin (F, n_files) || any_remote_file (F, n_files) + || ! any_non_remote_file (F, n_files) || any_symlinks (F, n_files) || (!ok && follow_mode == Follow_descriptor))) disable_inotify = true; |