summaryrefslogtreecommitdiff
path: root/src/tail.c
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2011-12-22 23:23:02 +0100
committerJim Meyering <meyering@redhat.com>2011-12-23 22:39:14 +0100
commit9c54c0a1d04ec243f9d118d679f31cd17b35ce6b (patch)
tree25bfac7d970d951301e05e15e3f12b6a2fa46db5 /src/tail.c
parent6e3299fcdb783b19552dbb2ceb0d012ce51a3501 (diff)
downloadcoreutils-9c54c0a1d04ec243f9d118d679f31cd17b35ce6b.tar.xz
tail: with -f, use polling when a file is on an FS of unknown type
Before, we would use inotify in that case, which would work as long as updates were taking place locally, but not at all when remote. Move hard-coded list of known remote FS types into a more maintainable table in stat.c, alongside the list of FS names and magic numbers. Generate a new is_local_fs_type function. * src/Makefile.am (fs-is-local.h): New rule, generated file. * src/extract-magic: Revamp to parse local/remote keyword after each magic number in src/stat.c's case statements. Accept new --local option. * src/.gitignore: Ignore the generated fs-is-local.h. * src/tail.c [HAVE_INOTIFY]: Include fs-is-local.h. (fremote) [HAVE_INOTIFY]: Use the new function in place of the switch stmt with hard-coded list of FS types. Emit a warning when processing a file on a file system of unknown type. * NEWS (Changes in behavior): Mention it. Suggested by Sven Breuner.
Diffstat (limited to 'src/tail.c')
-rw-r--r--src/tail.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/src/tail.c b/src/tail.c
index 1f619f3eb..4581845d1 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -54,6 +54,7 @@
/* inotify needs to know if a file is local. */
# include "fs.h"
+# include "fs-is-local.h"
# if HAVE_SYS_STATFS_H
# include <sys/statfs.h>
# elif HAVE_SYS_VFS_H
@@ -896,26 +897,21 @@ fremote (int fd, const char *name)
}
else
{
- switch (buf.f_type)
+ switch (is_local_fs_type (buf.f_type))
{
- case S_MAGIC_AFS:
- case S_MAGIC_CIFS:
- case S_MAGIC_CODA:
- case S_MAGIC_FUSEBLK:
- case S_MAGIC_FUSECTL:
- case S_MAGIC_GFS:
- case S_MAGIC_GPFS:
- case S_MAGIC_FHGFS:
- case S_MAGIC_KAFS:
- case S_MAGIC_LUSTRE:
- case S_MAGIC_NCP:
- case S_MAGIC_NFS:
- case S_MAGIC_NFSD:
- case S_MAGIC_OCFS2:
- case S_MAGIC_SMB:
+ case 0:
break;
- default:
+ case -1:
+ error (0, 0, _("unrecognized file system type 0x%08lx for %s. "
+ "please report this to %s. reverting to polling"),
+ buf.f_type, quote (name), PACKAGE_BUGREPORT);
+ /* Treat as "remote", so caller polls. */
+ break;
+ case 1:
remote = false;
+ break;
+ default:
+ assert (!"unexpected return value from is_local_fs_type");
}
}
# endif