int main(int argc, char **argv) { unsigned long i; struct passwd *ent; process_options(argc, argv); ent = getpwnam(ltp_user); if (ent == NULL) { fprintf(stderr, "can't get password entry for %s", ltp_user); exit(1); } ltp_uid = ent->pw_uid; ltp_gid = ent->pw_gid; signal(SIGCHLD, SIG_IGN); /* special processing for gen_exec, see comments above gen_exec() */ if (gen_event == gen_exec) { exec_argv = argv; gen_exec(); /* won't reach here */ return 0; } /* other events */ for (i = 0; i < nr_event; i++) gen_event(); return 0; }
static void *watch_thread (void *userdata) { fsevent_watch_t *w = userdata; fsevent_t event; bool exit = false; for (; !exit;) { struct kevent kqe; if (-1 == kevent(w->kq, &w->pipe_event, w->num_entries + 1, &kqe, 1, NULL)) { debug_error(errors, "kevent failed"); event.data.destroyed.reason = FSEVENT_BUG; break; } if ((int)kqe.ident == w->pipe_fds[0]) { char ev_code; read(w->pipe_fds[0], &ev_code, 1); switch (ev_code) { case EVENT_DESTROY: event.data.destroyed.reason = FSEVENT_EXPLICIT; exit = true; break; case EVENT_ADD_TO_WATCH: // FIXME //add_entries(&w); break; case EVENT_REMOVE_FROM_WATCH: // FIXME //remove_entries(&w); break; default: debug_error(NULL, "unknown event %i", ev_code); event.data.destroyed.reason = FSEVENT_BUG; exit = true; break; } } else if (EVFILT_VNODE == kqe.filter) { gen_event(w, &kqe); } else { debug_error(NULL, "unknown filter event %u", kqe.filter); event.data.destroyed.reason = FSEVENT_FAILED; exit = true; } } // inform about deletion event.type = FSEVENT_DESTROYED; w->callback(w, &event, w->userdata); if (w->pipe_fds[0] >= 0) { close(w->pipe_fds[0]); close(w->pipe_fds[1]); } for (int i = 0; i < w->num_entries; i++) { free(w->entries[i].udata); } close(w->kq); free(w); return NULL; }