summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2016-01-19 13:22:42 +0000
committerPádraig Brady <P@draigBrady.com>2016-01-19 14:07:10 +0000
commitdbff2508b85baf12d5e2eee4134eb17be69fdca9 (patch)
treedd7ef8381e0a9e95558b3095e6ba8a8a7d22df58 /src
parent6e2208e07a3b9db8147ec9de5cdf466a5540c8f7 (diff)
downloadcoreutils-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.c20
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;