summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile21
-rw-r--r--direct-append.c71
-rw-r--r--inotify-watch.c113
3 files changed, 205 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0212a22
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+CC := gcc
+CFLAGS := $(CFLAGS) -I../inotail -W -Wall -pipe -D_USE_SOURCE \
+ -Wstrict-prototypes -Wsign-compare -Wshadow -Wchar-subscripts \
+ -Wmissing-declarations -Wpointer-arith -Wcast-align -Wmissing-prototypes
+
+# Compile with 'make DEBUG=true' to enable debugging
+DEBUG = false
+ifeq ($(strip $(DEBUG)),true)
+ CFLAGS += -g -DDEBUG -fmudflap
+ LDFLAGS += -lmudflap
+endif
+
+all: inotify-watch direct-append
+inotify-watch: inotify-watch.o
+direct-append: direct-append.o
+
+%.o: %.c %.h
+ $(CC) $(CFLAGS) -c $< -o $@
+
+clean:
+ rm -f inotify-watch direct-append *.o
diff --git a/direct-append.c b/direct-append.c
new file mode 100644
index 0000000..bf18c72
--- /dev/null
+++ b/direct-append.c
@@ -0,0 +1,71 @@
+/*
+ * Append some random characters to a file
+ *
+ * Just a small tool to debug inotify
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define DEFAULT_N_CHARS 1024
+
+static char get_random_printable_char(void)
+{
+ int fd;
+ char ret;
+
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd < 0) {
+ perror("open");
+ exit(EXIT_FAILURE);
+ }
+
+ do {
+ read(fd, &ret, sizeof(ret));
+ } while (ret < 0x20 || ret > 0x7e);
+
+ close(fd);
+
+ return ret;
+}
+
+int main(int argc, char *argv[])
+{
+ int fd, n_chars, i;
+ char *str;
+
+ if (argc < 3) {
+ fprintf(stderr, "Usage: %s <file> <n_chars>\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Open the file, create it in case it doesn't exist */
+ if ((fd = open(argv[1], O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0) {
+ perror("open");
+ exit(EXIT_FAILURE);
+ }
+
+ if (lseek(fd, 0, SEEK_END) < 0) {
+ perror("lseek");
+ exit(EXIT_FAILURE);
+ }
+
+ n_chars = strtoul(argv[2], NULL, 0);
+ if (n_chars <= 0)
+ n_chars = DEFAULT_N_CHARS;
+
+ str = malloc(n_chars * sizeof(char));
+
+ for (i = 0; i < n_chars; i++)
+ str[i] = get_random_printable_char();
+
+ write(fd, str, n_chars);
+ free(str);
+ close(fd);
+
+ exit(EXIT_SUCCESS);
+}
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;
+}