On Fri, 2004-09-24 at 01:30 +0200, Martin Schlemmer wrote: > On Thu, 2004-09-23 at 19:17 -0400, Daniel Veillard wrote: > > > > to do it. So if you are interested in working on it that would be > > > wicked! I can answer any questions you have about inotify. > > > > inotify relies on kernel support, this can be checked at runtime > > I think one of the best thing to do to get more inotify testing is to > > get rid of the inotify configure option, always compile it in and make > > its init routine check at runtime, if not present then use dnotify. > > That way it's only a kernel option, and users/testers are quite more > > familiar to installing and booting a new kernel than replacing a > > component of their infrastructure after having recompiled it with a different > > option. > > > > Will work for me - then I can drop some magic I have to do. Possible > problem though, is that you need inotify.h. One solution is to check > if we can include it, but seeing that many out there will not have > it in /usr/include/linux, and using current kernel sources have sticky > issues, I do not know if that is such a good idea. The other possible > solution is to ship our own, and use that if it is not > in /usr/include ... ? Then you can enable it for the same checks as > dnotify. > How about attached patch? -- Martin Schlemmer Gentoo Linux Developer, Desktop/System Team Developer Cape Town, South Africa
diff -x CVS -urpN gamin/configure.in gamin-inotify/configure.in
--- gamin/configure.in 2004-09-24 12:38:48.127978176 +0200
+++ gamin-inotify/configure.in 2004-09-24 12:51:20.160651832 +0200
@@ -167,39 +167,50 @@ esac],[os=${target_os}])
dnl check what OS we're on
AM_CONDITIONAL(HAVE_LINUX, test x$os = xlinux-gnu)
+# We use polling no matter what.
+AC_DEFINE(ENABLE_POLLING,1,[Use polling as backend])
+backends="polling"
+
if test x$os = xlinux-gnu; then
AC_DEFINE([HAVE_LINUX],[],[Whether we are using linux or not])
-
- # We enable dnotify no matter what. If the user enables
- # inotify, he will still have dnotify to fall back on ...
+fi
+
+if test x$os = xlinux-gnu; then
+ AC_ARG_ENABLE(dnotify,
+ [ --disable-dnotify Disable the DNotify backend],
+ [case "${enableval}" in
+ yes) dnotify=true ;;
+ no) dnotify=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --disable-dnotify) ;;
+ esac],[dnotify=true])
+fi
+
+dnl check if dnotify backend is enabled
+AM_CONDITIONAL(ENABLE_DNOTIFY, test x$dnotify = xtrue)
+
+if test x$dnotify = xtrue; then
AC_DEFINE(ENABLE_DNOTIFY,1,[Use dnotify as backend])
- backend="dnotify"
-else
- backend="polling"
-fi
-
-# We do not care about inotify for now - if the user enables
-# it, we still want to build dnotify support ...
-AM_CONDITIONAL(ENABLE_DNOTIFY, test x$backend = xdnotify)
-
-AC_ARG_ENABLE(inotify,
-[ --enable-inotify Uses inotify as backend],
-[case "${enableval}" in
- yes) backend="inotify" ;;
- no) ;;
- *) AC_MSG_ERROR(bad value ${enableval} for --enable-inotify) ;;
-esac])
-
-if test x$backend = xinotify; then
- AC_DEFINE(ENABLE_INOTIFY,1,[Use inotify as backend])
-else
- # If all else fails, use polling
- if test x$backend = xpolling; then
- AC_DEFINE(ENABLE_POLLING,1,[Use polling as backend])
- fi
+ backends="${backends}, dnotify"
fi
-AM_CONDITIONAL(ENABLE_INOTIFY, test x$backend = xinotify)
+if test x$os = xlinux-gnu; then
+ AC_ARG_ENABLE(inotify,
+ [ --disable-inotify Disable the INotify backend],
+ [case "${enableval}" in
+ yes) inotify=true ;;
+ no) inotify=false;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --disable-inotify) ;;
+ esac],[inotify=true])
+fi
+
+dnl check if inotify backend is enabled
+AM_CONDITIONAL(ENABLE_INOTIFY, test x$inotify = xtrue)
+
+if test x$inotify = xtrue; then
+ AC_CHECK_HEADERS(linux/inotify.h)
+ AC_DEFINE(ENABLE_INOTIFY,1,[Use inotify as backend])
+ backends="${backends}, inotify"
+fi
dnl check for flavours of varargs macros (test from GLib)
AC_MSG_CHECKING(for ISO C99 varargs macros in C)
@@ -326,6 +337,6 @@ gamin-$VERSION:
source code location: ${srcdir}
compiler: ${CC}
- backend: ${backend}
+ backends: ${backends}
build documentation: ${build_docs}
"
diff -x CVS -urpN gamin/server/gam_inotify.c gamin-inotify/server/gam_inotify.c
--- gamin/server/gam_inotify.c 2004-09-24 12:38:48.176970728 +0200
+++ gamin-inotify/server/gam_inotify.c 2004-09-24 12:38:07.755115784 +0200
@@ -27,7 +27,11 @@
#include <unistd.h>
#include <stdio.h>
#include <glib.h>
-#include "/usr/src/linux/include/linux/inotify.h"
+#ifdef HAVE_LINUX_INOTIFY_H
+#include <linux/inotify.h>
+#else
+#include "local_inotify.h"
+#endif
#include "gam_error.h"
#include "gam_inotify.h"
#include "gam_tree.h"
diff -x CVS -urpN gamin/server/local_inotify.h gamin-inotify/server/local_inotify.h
--- gamin/server/local_inotify.h 1970-01-01 02:00:00.000000000 +0200
+++ gamin-inotify/server/local_inotify.h 2004-09-24 12:38:07.755115784 +0200
@@ -0,0 +1,100 @@
+/*
+ * Inode based directory notification for Linux
+ *
+ * Copyright (C) 2004 John McCutchan
+ *
+ * Signed-off-by: John McCutchan ttb tentacle dhs org
+ */
+
+#ifndef _LINUX_INOTIFY_H
+#define _LINUX_INOTIFY_H
+
+#include <linux/limits.h>
+
+/* this size could limit things, since technically we could need PATH_MAX */
+#define INOTIFY_FILENAME_MAX 256
+
+/*
+ * struct inotify_event - structure read from the inotify device for each event
+ *
+ * When you are watching a directory, you will receive the filename for events
+ * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ...
+ *
+ * Note: When reading from the device you must provide a buffer that is a
+ * multiple of sizeof(struct inotify_event)
+ */
+struct inotify_event {
+ int wd;
+ int mask;
+ char filename[INOTIFY_FILENAME_MAX];
+};
+
+/* the following are legal, implemented events */
+#define IN_ACCESS 0x00000001 /* File was accessed */
+#define IN_MODIFY 0x00000002 /* File was modified */
+#define IN_CREATE 0x00000004 /* File was created */
+#define IN_DELETE 0x00000008 /* File was deleted */
+#define IN_RENAME 0x00000010 /* File was renamed */
+#define IN_UNMOUNT 0x00000080 /* Backing filesystem was unmounted */
+#define IN_CLOSE 0x00000100 /* File was closed */
+#define IN_OPEN 0x00000200 /* File was opened */
+#define IN_MOVEDFROM 0x00000400 /* File was moved from X */
+#define IN_MOVEDTO 0x00000800 /* File was moved to Y */
+#define IN_Q_OVERFLOW 0x00001000 /* The event queued overflowed */
+
+/* the following are legal, but not yet implemented, events */
+#define IN_ATTRIB 0x00000020 /* File changed attributes */
+#define IN_MOVE 0x00000040 /* File was moved */
+
+/* special flags */
+#define IN_IGNORED 0x00000400 /* File was ignored */
+#define IN_ALL_EVENTS 0xffffffff /* All the events */
+
+/*
+ * struct inotify_watch_request - represents a watch request
+ *
+ * Pass to the inotify device via the INOTIFY_WATCH ioctl
+ */
+struct inotify_watch_request {
+ char *dirname; /* directory name */
+ unsigned long mask; /* event mask */
+};
+
+#define INOTIFY_IOCTL_MAGIC 'Q'
+#define INOTIFY_IOCTL_MAXNR 4
+
+#define INOTIFY_WATCH _IOR(INOTIFY_IOCTL_MAGIC, 1, struct inotify_watch_request)
+#define INOTIFY_IGNORE _IOR(INOTIFY_IOCTL_MAGIC, 2, int)
+#define INOTIFY_STATS _IOR(INOTIFY_IOCTL_MAGIC, 3, int)
+#define INOTIFY_SETDEBUG _IOR(INOTIFY_IOCTL_MAGIC, 4, int)
+
+#define INOTIFY_DEBUG_NONE 0x00000000
+#define INOTIFY_DEBUG_ALLOC 0x00000001
+#define INOTIFY_DEBUG_EVENTS 0x00000002
+#define INOTIFY_DEBUG_INODE 0x00000004
+#define INOTIFY_DEBUG_ERRORS 0x00000008
+#define INOTIFY_DEBUG_FILEN 0x00000010
+#define INOTIFY_DEBUG_ALL 0xffffffff
+
+#ifdef __KERNEL__
+
+#include <linux/dcache.h>
+#include <linux/fs.h>
+
+/* Adds events to all watchers on inode that are interested in mask */
+void inotify_inode_queue_event (struct inode *inode, unsigned long mask,
+ const char *filename);
+
+/* Same as above but uses dentry's inode */
+void inotify_dentry_parent_queue_event (struct dentry *dentry,
+ unsigned long mask, const char *filename);
+
+/* This will remove all watchers from all inodes on the superblock */
+void inotify_super_block_umount (struct super_block *sb);
+
+/* Call this when an inode is dead, and inotify should ignore it */
+void inotify_inode_is_dead (struct inode *inode);
+
+#endif /* __KERNEL __ */
+
+#endif /* _LINUX_INOTIFY_H */
Attachment:
signature.asc
Description: This is a digitally signed message part