Beispiel #1
0
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;
}
Beispiel #2
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;
}