summaryrefslogtreecommitdiff
path: root/inotify-watch.c
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2008-07-11 00:04:58 +0200
committerTobias Klauser <tklauser@xenon.tklauser.home>2008-07-11 00:04:58 +0200
commit59d34ee47b14c728ebd6399fb89c409383a1aa2e (patch)
tree356a31ecaacf3f1845e8ebda7c1765ede88ad284 /inotify-watch.c
Initial import
Diffstat (limited to 'inotify-watch.c')
-rw-r--r--inotify-watch.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/inotify-watch.c b/inotify-watch.c
new file mode 100644
index 0000000..7ccf9c4
--- /dev/null
+++ b/inotify-watch.c
@@ -0,0 +1,113 @@
+/*
+ * inotify-watchdir.c
+ *
+ * Watch a file or directory for changes using inotify
+ *
+ * Copyright (c) Tobias Klauser <tklauser@distanz.ch>
+ * All rights reserved
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+#include "inotify.h"
+#include "inotify-syscalls.h"
+
+struct mask2string {
+ uint32_t mask;
+ const char *desc;
+};
+
+static struct mask2string events[] = {
+ { IN_ACCESS, "ACCESS" },
+ { IN_MODIFY, "MODIFY" },
+ { IN_ATTRIB, "ATTRIB" },
+ { IN_CLOSE_WRITE, "CLOSE_WRITE" },
+ { IN_CLOSE_NOWRITE, "CLOSE_NOWRITE" },
+ { IN_OPEN, "OPEN" },
+ { IN_MOVED_FROM, "MOVED_FROM" },
+ { IN_MOVED_TO, "MOVED_TO" },
+ { IN_CREATE, "CREATE" },
+ { IN_DELETE, "DELETE" },
+ { IN_DELETE_SELF, "DELETE_SELF" },
+ { IN_MOVE_SELF, "MOVE_SELF" },
+ { IN_UNMOUNT, "UNMOUNT" },
+ { IN_Q_OVERFLOW, "Q_OVERFLOW" },
+ { IN_IGNORED, "IGNORED" },
+ /* special flags */
+ { IN_ONLYDIR, "ONLYDIR" },
+ { IN_DONT_FOLLOW, "DONT_FOLLOW" },
+ { IN_MASK_ADD, "MASK_ADD" },
+ { IN_ONESHOT, "ONESHOT" },
+ /* end of array */
+ { -1, NULL }
+};
+
+static void inotify_print_event(struct inotify_event *inev)
+{
+ int i;
+
+ /* stat? */
+ printf("(%s) wd=%04x, cookie=%04x, len=%04x, name=\"%s\" :",
+ inev->mask & IN_ISDIR ? "dir" : "file", inev->wd, inev->cookie, inev->len, inev->name);
+
+ for (i = 0; events[i].desc; i++)
+ if (inev->mask & events[i].mask)
+ printf(" %s", events[i].desc);
+
+ printf("\n");
+}
+
+int main(int argc, char *argv[])
+{
+ int fd, len;
+ int *watches;
+ struct inotify_event *inev;
+ char buf[1024];
+
+ if (argc < 2) {
+ printf("Usage: %s <path> ...\n", *argv);
+ exit(EXIT_FAILURE);
+ }
+
+ ++argv;
+
+ fd = inotify_init();
+ if (fd < 0) {
+ perror("inotify_init");
+ exit(EXIT_FAILURE);
+ }
+
+ watches = malloc(argc * sizeof(int));
+ if (!watches) {
+ perror("malloc");
+ exit(EXIT_FAILURE);
+ }
+
+ while (*argv) {
+ *watches = inotify_add_watch(fd, *argv, IN_ALL_EVENTS|IN_UNMOUNT);
+ if (*watches < 0) {
+ perror("inotify_add_watch");
+ exit(EXIT_FAILURE);
+ }
+ ++watches;
+ ++argv;
+ }
+
+ while (1) {
+ len = read(fd, buf, sizeof(buf));
+ inev = (struct inotify_event *) &buf;
+ while (len > 0) {
+ inotify_print_event(inev);
+
+ len -= sizeof(struct inotify_event) + inev->len;
+ inev = (struct inotify_event *) ((char *) inev + sizeof(struct inotify_event) + inev->len);
+ }
+ }
+
+ return 0;
+}