#include #include #include #include #include #include #include #include #include int watchfiles(struct filesig fs[]) { int ppid; int pid; int kq; int nent; int i, ret; struct kevent **ke; struct kevent kret; struct timespec bogus = { 0, 0}; /* count number of entries */ for (nent = 0; fs[nent].fs_datum.fd_file != NULL; nent++); ppid = getpid(); switch ((pid = fork())) { case -1: /* failed */ return -1; case 0: /* child */ break; default: /* parent */ return pid; } kq = kqueue(); ke = malloc(nent * sizeof *ke); for (i = 0; i < nent; i++) { ke[i] = malloc(sizeof *(ke[nent])); /* XXX - need to check return value */ switch (fs[i].fs_type) { case FS_FD: ke[i]->ident = fs[i].fs_datum.fd_fd; break; case FS_FILE: ke[i]->ident = open(fs[i].fs_datum.fd_file, O_RDONLY); break; } ke[i]->filter = EVFILT_VNODE; ke[i]->flags = EV_ADD | EV_ENABLE | EV_CLEAR; ke[i]->fflags = NOTE_WRITE; ke[i]->udata = fs[i].fs_sig; } printf("nent: %d\n", nent); kevent(kq, nent, ke, 0, &kret, &bogus); /* check for responses */ for (;;) { if ((ret = kevent(kq, 0, NULL, 1, &kret, NULL)) == -1) continue; for (i = 0; i < ret; i++) kill(ppid, ke[i]->udata); } }