Watching a directory with inotify

From WTFwiki
Jump to navigation Jump to search

Here's a thing one can compile to use inotify(7) to watch for files being created and deleted in a directory:

#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE     (sizeof (struct inotify_event))
#define EVENT_BUF_LEN  (1024 * (EVENT_SIZE + 16))

int main(int argc, char **argv) {
       int fd, ret, i;
       char buffer[EVENT_BUF_LEN];
       struct inotify_event *event;

       if (argc < 2) {
               printf("Usage: %s <dir>\n", argv[0]);
               return 1;
       }

       fd = inotify_init();
       if (fd == -1) {
               perror("inotify_init");
               return 1;
       }

       ret = inotify_add_watch(fd, argv[1], IN_CREATE | IN_DELETE);
       if (ret == -1) {
               perror("inotify_add_watch");
               return 1;
       }

       while (1) {
               ret = read(fd, buffer, EVENT_BUF_LEN);
               if (ret == -1) {
                       perror("read");
                       return 1;
               }

               i = 0;
               while (i < ret) {
                       event = (struct inotify_event *)&buffer[i];
                       if (event->mask & IN_CREATE)
                               printf("%s created\n", event->name);
                       if (event->mask & IN_DELETE)
                               printf("%s deleted\n", event->name);
                       i += EVENT_SIZE + event->len;
               }
       }

       return 0;
}