Mercurial > hg > toybox
changeset 1442:f3a41f485d68 draft
Promote inotifyd to other.
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 20 Aug 2014 22:23:39 -0500 |
parents | 2efbfb435c77 |
children | 27f608badc20 |
files | toys/other/inotifyd.c toys/pending/inotifyd.c |
diffstat | 2 files changed, 126 insertions(+), 126 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toys/other/inotifyd.c Wed Aug 20 22:23:39 2014 -0500 @@ -0,0 +1,126 @@ +/* inotifyd.c - inotify daemon. + * + * Copyright 2013 Ashwini Kumar <ak.ashwini1981@gmail.com> + * Copyright 2013 Kyungwan Han <asura321@gmail.com> + * + * No Standard. + +USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN)) + +config INOTIFYD + bool "inotifyd" + default y + help + usage: inotifyd PROG FILE[:MASK] ... + + When a filesystem event matching MASK occurs to a FILE, run PROG as: + + PROG EVENTS FILE [DIRFILE] + + If PROG is "-" events are sent to stdout. + + This file is: + a accessed c modified e metadata change w closed (writable) + r opened D deleted M moved 0 closed (unwritable) + u unmounted o overflow x unwatchable + + A file in this directory is: + m moved in y moved out n created d deleted + + When x event happens for all FILEs, inotifyd exits (after waiting for PROG). +*/ + +#define FOR_inotifyd +#include "toys.h" +#include <sys/inotify.h> + +void inotifyd_main(void) +{ + struct pollfd fds; + char *prog_args[5], **ss = toys.optargs; + char *masklist ="acew0rmyndDM uox"; + + fds.events = POLLIN; + + *prog_args = *toys.optargs; + prog_args[4] = 0; + if ((fds.fd = inotify_init()) == -1) perror_exit(0); + + // Track number of watched files. First one was program to run. + toys.optc--; + + while (*++ss) { + char *path = *ss, *masks = strchr(*ss, ':'); + int i, mask = 0; + + if (!masks) mask = 0xfff; // default to all + else{ + *masks++ = 0; + for (*masks++ = 0; *masks; masks++) { + i = stridx(masklist, *masks);; + if (i == -1) error_exit("bad mask '%c'", *masks); + mask |= 1<<i; + } + } + + // This returns increasing numbers starting from 1, which coincidentally + // is the toys.optargs position of the file. (0 is program to run.) + if (inotify_add_watch(fds.fd, path, mask) < 0) perror_exit("%s", path); + } + + for (;;) { + int ret = 0, len; + void *buf = 0; + struct inotify_event *event; + + // Read next event(s) + ret = poll(&fds, 1, -1); + if (ret < 0 && errno == EINTR) continue; + if (ret <= 0) break; + xioctl(fds.fd, FIONREAD, &len); + event = buf = xmalloc(len); + len = readall(fds.fd, buf, len); + + // Loop through set of events. + for (;;) { + int left = len - (((char *)event)-(char *)buf), + size = sizeof(struct inotify_event); + + // Don't dereference event if ->len is off end of bufer + if (left >= size) size += event->len; + if (left < size) break; + + if (event->mask) { + char *s = toybuf, *m; + + for (m = masklist; *m; m++) + if (event->mask & (1<<(m-masklist))) *s++ = *m; + *s = 0; + + if (**prog_args == '-' && !prog_args[0][1]) { + xprintf("%s\t%s\t%s\n" + 3*!event->len, toybuf, + toys.optargs[event->wd], event->name); + } else { + prog_args[1] = toybuf; + prog_args[2] = toys.optargs[event->wd]; + prog_args[3] = event->len ? event->name : 0; + xpclose(xpopen(prog_args, 0), 0); + } + + if (event->mask & IN_IGNORED) { + if (--toys.optc <= 0) { + free(buf); + + goto done; + } + inotify_rm_watch(fds.fd, event->wd); + } + } + event = (void*)(size + (char*)event); + } + free(buf); + } + +done: + toys.exitval = !!toys.signal; +}
--- a/toys/pending/inotifyd.c Wed Aug 20 22:22:46 2014 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/* inotifyd.c - inotify daemon. - * - * Copyright 2013 Ashwini Kumar <ak.ashwini1981@gmail.com> - * Copyright 2013 Kyungwan Han <asura321@gmail.com> - * - * No Standard. - -USE_INOTIFYD(NEWTOY(inotifyd, "<2", TOYFLAG_USR|TOYFLAG_BIN)) - -config INOTIFYD - bool "inotifyd" - default n - help - usage: inotifyd PROG FILE[:MASK] ... - - When a filesystem event matching MASK occurs to a FILE, run PROG as: - - PROG EVENTS FILE [DIRFILE] - - If PROG is "-" events are sent to stdout. - - This file is: - a accessed c modified e metadata change w closed (writable) - r opened D deleted M moved 0 closed (unwritable) - u unmounted o overflow x unwatchable - - A file in this directory is: - m moved in y moved out n created d deleted - - When x event happens for all FILEs, inotifyd exits (after waiting for PROG). -*/ - -#define FOR_inotifyd -#include "toys.h" -#include <sys/inotify.h> - -void inotifyd_main(void) -{ - struct pollfd fds; - char *prog_args[5], **ss = toys.optargs; - char *masklist ="acew0rmyndDM uox"; - - fds.events = POLLIN; - - *prog_args = *toys.optargs; - prog_args[4] = 0; - if ((fds.fd = inotify_init()) == -1) perror_exit(0); - - // Track number of watched files. First one was program to run. - toys.optc--; - - while (*++ss) { - char *path = *ss, *masks = strchr(*ss, ':'); - int i, mask = 0; - - if (!masks) mask = 0xfff; // default to all - else{ - *masks++ = 0; - for (*masks++ = 0; *masks; masks++) { - i = stridx(masklist, *masks);; - if (i == -1) error_exit("bad mask '%c'", *masks); - mask |= 1<<i; - } - } - - // This returns increasing numbers starting from 1, which coincidentally - // is the toys.optargs position of the file. (0 is program to run.) - if (inotify_add_watch(fds.fd, path, mask) < 0) perror_exit("%s", path); - } - - for (;;) { - int ret = 0, len; - void *buf = 0; - struct inotify_event *event; - - // Read next event(s) - ret = poll(&fds, 1, -1); - if (ret < 0 && errno == EINTR) continue; - if (ret <= 0) break; - xioctl(fds.fd, FIONREAD, &len); - event = buf = xmalloc(len); - len = readall(fds.fd, buf, len); - - // Loop through set of events. - for (;;) { - int left = len - (((char *)event)-(char *)buf), - size = sizeof(struct inotify_event); - - // Don't dereference event if ->len is off end of bufer - if (left >= size) size += event->len; - if (left < size) break; - - if (event->mask) { - char *s = toybuf, *m; - - for (m = masklist; *m; m++) - if (event->mask & (1<<(m-masklist))) *s++ = *m; - *s = 0; - - if (**prog_args == '-' && !prog_args[0][1]) { - xprintf("%s\t%s\t%s\n" + 3*!event->len, toybuf, - toys.optargs[event->wd], event->name); - } else { - prog_args[1] = toybuf; - prog_args[2] = toys.optargs[event->wd]; - prog_args[3] = event->len ? event->name : 0; - xpclose(xpopen(prog_args, 0), 0); - } - - if (event->mask & IN_IGNORED) { - if (--toys.optc <= 0) { - free(buf); - - goto done; - } - inotify_rm_watch(fds.fd, event->wd); - } - } - event = (void*)(size + (char*)event); - } - free(buf); - } - -done: - toys.exitval = !!toys.signal; -}