summaryrefslogtreecommitdiff
path: root/common/inotify_helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/inotify_helpers.c')
-rw-r--r--common/inotify_helpers.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/common/inotify_helpers.c b/common/inotify_helpers.c
new file mode 100644
index 0000000..0aac023
--- /dev/null
+++ b/common/inotify_helpers.c
@@ -0,0 +1,92 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "inotify_helpers.h"
+
+static
+const char *in_bits[] = {
+ /* main */
+ "IN_ACCESS", // 0
+ "IN_MODIFY", // 1
+ "IN_ATTRIB", // 2
+ "IN_CLOSE_WRITE", // 3
+ "IN_CLOSE_NOWRITE", // 4
+ "IN_OPEN", // 5
+ "IN_MOVED_FROM", // 6
+ "IN_MOVED_TO", // 7
+ "IN_CREATE", // 8
+ "IN_DELETE", // 9
+ "IN_DELETE_SELF", // 10
+ "IN_MOVE_SELF", // 11
+ /* gap */
+ "<invalid-12>", // 12
+ /* events sent by the kernel */
+ "IN_UNMOUNT", // 13
+ "IN_Q_OVERFLOW", // 14
+ "IN_IGNORED", // 15
+ /* gap */
+ "<invalid-16>", // 16
+ "<invalid-17>", // 17
+ "<invalid-18>", // 18
+ "<invalid-19>", // 19
+ "<invalid-20>", // 20
+ "<invalid-21>", // 21
+ "<invalid-22>", // 22
+ "<invalid-23>", // 23
+ /* special flags */
+ "IN_ONLYDIR", // 24
+ "IN_DONT_FOLLOW", // 25
+ "IN_EXCL_UNLINK", // 26
+ "<invalid-27>", // 27
+ "<invalid-28>", // 28
+ "IN_MASK_ADD", // 29
+ "IN_ISDIR", // 30
+ "IN_ONESHOT", // 31
+};
+
+char *inotify_mask2str(uint32 mask);
+int inotify_print_event(FILE *file, struct inotify_event *event);
+
+
+struct strbuf {
+ char *str;
+ size_t len;
+ size_t cap;
+};
+
+static
+void strbufcat(struct strbuf *a, const char *b) {
+ size_t blen = strlen(b);
+ while (a->cap <= (a->len + blen)) {
+ a->cap += 256;
+ a->str = realloc(a->str, a->cap);
+ }
+ memcpy(&(a->str[a->len]), b, blen+1);
+ a->len += blen;
+}
+
+
+char *inotify_mask2str(uint32_t mask) {
+ struct strbuf out = { NULL, 0, 0 };
+ for (size_t i = 0; i < sizeof(in_bits)/sizeof(in_bits[0]); i++) {
+ if (mask & (1 << i)) {
+ if (out.len > 0)
+ strbufcat(&out, ", ");
+ strbufcat(&out, in_bits[i]);
+ }
+ }
+ return out.str;
+}
+
+int inotify_print_event(struct inotify_event *event) {
+ return printf("wd:%d\n"
+ "\tmask:[%s]\n"
+ "\tcookie:%u\n"
+ "\tlen:%u\n"
+ "\tname:%s\n",
+ event->wd,
+ mask2str(event->mask),
+ event->cookie,
+ event->len,
+ event->len > 0 ? event->name : "");
+}