#include #include #include #include #include #include #include #include #include #define log(...) fprintf(stderr, __VA_ARGS__) static void put(int c) { putchar(c); fflush(stdout); } int main(int argc, char *argv[]) { int ifd = -1; int wd; char buf[sizeof(struct inotify_event) + NAME_MAX + 1]; if (argc != 2) { log("I need a file..\n"); goto error; } ifd = inotify_init(); if (ifd < 0) { if (errno == EMFILE) put('!'); else log("Error initializing inotify: %s\n", strerror(errno)); goto error; } wd = inotify_add_watch(ifd, argv[1], IN_CLOSE_WRITE | IN_DELETE); if (wd < 0) { log("Error adding watch on '%s': %s\n", argv[1], strerror(errno)); goto error; } put('z'); if (read(ifd, buf, sizeof(buf)) < 0) { log("Error reading inotify event: %s\n", strerror(errno)); goto error; } put('x'); if (close(ifd)) { log("Error closing inotify: %s\n", strerror(errno)); ifd = -1; goto error; } put('.'); return EXIT_SUCCESS; error: if (ifd > 0) close(ifd); return EXIT_FAILURE; }