Mercurial > hg > rlgwebd
changeset 167:fba1b34e7554
Rename watcher to dglwatcher.
author | John "Elwin" Edwards |
---|---|
date | Wed, 07 Jan 2015 13:49:37 -0500 |
parents | 66fef65c34e7 |
children | 0ceaca924b4c |
files | dglwatcher.c rlgwebd.js watcher.c |
diffstat | 3 files changed, 110 insertions(+), 110 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dglwatcher.c Wed Jan 07 13:49:37 2015 -0500 @@ -0,0 +1,109 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/inotify.h> +#include <sys/select.h> +#include <unistd.h> +#include <limits.h> +#include <dirent.h> + +struct watchdir { + int wd; + char *name; +}; + +char ibuf[sizeof(struct inotify_event) + NAME_MAX + 1]; + +int startwatch(int ifd, char *dir, struct watchdir *w) { + DIR *dstream; + struct dirent *ent; + + w->name = dir; + w->wd = inotify_add_watch(ifd, dir, IN_CREATE|IN_DELETE|IN_DELETE_SELF); + if (w->wd < 0) { + fprintf(stderr, "Could not watch %s\n", dir); + return 1; + } + dstream = opendir(dir); + if (dstream == NULL) { + fprintf(stderr, "%s is not a readable directory\n", dir); + inotify_rm_watch(ifd, w->wd); + w->wd = -1; + return 1; + } + ent = readdir(dstream); + while (ent != NULL) { + if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) + printf("E %s/%s\n", dir, ent->d_name); + ent = readdir(dstream); + } + closedir(dstream); + fflush(stdout); + return 0; +} + +int main(int argc, char *argv[]) { + int ifd, rsize, off, done, nwatchers, i, result; + char typecode; + struct inotify_event *iev; + fd_set rfds; + struct watchdir *watchers; + + done = 0; + nwatchers = argc - 1; + iev = (struct inotify_event *) ibuf; + ifd = inotify_init(); + if (nwatchers == 0) { + watchers = malloc(sizeof(struct watchdir)); + nwatchers = 1; + startwatch(ifd, ".", watchers); + } + else { + watchers = malloc(nwatchers * sizeof(struct watchdir)); + for (i = 0; i < nwatchers; i++) { + startwatch(ifd, argv[i+1], watchers + i); + } + } + + while (!done) { + FD_ZERO(&rfds); + FD_SET(0, &rfds); + FD_SET(ifd, &rfds); + result = select(ifd + 1, &rfds, NULL, NULL, NULL); + if (result < 0) { + /* Something went wrong. */ + break; + } + if (FD_ISSET(ifd, &rfds)) { + off = 0; + rsize = read(ifd, ibuf, sizeof(struct inotify_event) + NAME_MAX + 1); + while (off < rsize) { + iev = (struct inotify_event *) (ibuf + off); + if (iev->mask & IN_CREATE) + typecode = 'C'; + else if (iev->mask & IN_DELETE) + typecode = 'D'; + else + typecode = '?'; + for (i = 0; i < nwatchers; i++) { + if (watchers[i].wd == iev->wd) + printf("%c %s/%s\n", typecode, watchers[i].name, iev->name); + } + off += sizeof(struct inotify_event) + iev->len; + } + fflush(stdout); + } + if (FD_ISSET(0, &rfds)) { + result = read(0, &typecode, 1); + if (result <= 0) { + /* EOF on stdin: controlling process probably died. */ + done = 1; + } + if (typecode == '\n') + done = 1; + } + + } + close(ifd); + return 0; +}
--- a/rlgwebd.js Wed Jan 07 13:22:05 2015 -0500 +++ b/rlgwebd.js Wed Jan 07 13:49:37 2015 -0500 @@ -724,7 +724,7 @@ for (var gname in games) { watchdirs.push(path.join("/dgldir/inprogress", gname)); } - var subproc = child_process.spawn("/bin/watcher", watchdirs); + var subproc = child_process.spawn("/bin/dglwatcher", watchdirs); subproc.stdout.setEncoding('utf8'); subproc.stdout.on('data', function (chunk) { var fname = chunk.slice(2, -1);
--- a/watcher.c Wed Jan 07 13:22:05 2015 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/inotify.h> -#include <sys/select.h> -#include <unistd.h> -#include <limits.h> -#include <dirent.h> - -struct watchdir { - int wd; - char *name; -}; - -char ibuf[sizeof(struct inotify_event) + NAME_MAX + 1]; - -int startwatch(int ifd, char *dir, struct watchdir *w) { - DIR *dstream; - struct dirent *ent; - - w->name = dir; - w->wd = inotify_add_watch(ifd, dir, IN_CREATE|IN_DELETE|IN_DELETE_SELF); - if (w->wd < 0) { - fprintf(stderr, "Could not watch %s\n", dir); - return 1; - } - dstream = opendir(dir); - if (dstream == NULL) { - fprintf(stderr, "%s is not a readable directory\n", dir); - inotify_rm_watch(ifd, w->wd); - w->wd = -1; - return 1; - } - ent = readdir(dstream); - while (ent != NULL) { - if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) - printf("E %s/%s\n", dir, ent->d_name); - ent = readdir(dstream); - } - closedir(dstream); - fflush(stdout); - return 0; -} - -int main(int argc, char *argv[]) { - int ifd, rsize, off, done, nwatchers, i, result; - char typecode; - struct inotify_event *iev; - fd_set rfds; - struct watchdir *watchers; - - done = 0; - nwatchers = argc - 1; - iev = (struct inotify_event *) ibuf; - ifd = inotify_init(); - if (nwatchers == 0) { - watchers = malloc(sizeof(struct watchdir)); - nwatchers = 1; - startwatch(ifd, ".", watchers); - } - else { - watchers = malloc(nwatchers * sizeof(struct watchdir)); - for (i = 0; i < nwatchers; i++) { - startwatch(ifd, argv[i+1], watchers + i); - } - } - - while (!done) { - FD_ZERO(&rfds); - FD_SET(0, &rfds); - FD_SET(ifd, &rfds); - result = select(ifd + 1, &rfds, NULL, NULL, NULL); - if (result < 0) { - /* Something went wrong. */ - break; - } - if (FD_ISSET(ifd, &rfds)) { - off = 0; - rsize = read(ifd, ibuf, sizeof(struct inotify_event) + NAME_MAX + 1); - while (off < rsize) { - iev = (struct inotify_event *) (ibuf + off); - if (iev->mask & IN_CREATE) - typecode = 'C'; - else if (iev->mask & IN_DELETE) - typecode = 'D'; - else - typecode = '?'; - for (i = 0; i < nwatchers; i++) { - if (watchers[i].wd == iev->wd) - printf("%c %s/%s\n", typecode, watchers[i].name, iev->name); - } - off += sizeof(struct inotify_event) + iev->len; - } - fflush(stdout); - } - if (FD_ISSET(0, &rfds)) { - result = read(0, &typecode, 1); - if (result <= 0) { - /* EOF on stdin: controlling process probably died. */ - done = 1; - } - if (typecode == '\n') - done = 1; - } - - } - close(ifd); - return 0; -}