+ return manager_dispatch_sigchld(m);
+
+ return 0;
+}
+
+static int process_event(Manager *m, struct epoll_event *ev) {
+ int r;
+
+ assert(m);
+ assert(ev);
+
+ switch (ev->data.u32) {
+
+ case MANAGER_SIGNAL:
+ assert(ev->data.fd == m->signal_fd);
+
+ /* An incoming signal? */
+ if (ev->events != POLLIN)
+ return -EINVAL;
+
+ if ((r = manager_process_signal_fd(m)) < 0)
+ return -r;
+
+ break;
+
+ case MANAGER_FD: {
+ Name *n;
+
+ /* Some fd event, to be dispatched to the names */
+ assert_se(n = ev->data.ptr);
+ NAME_VTABLE(n)->fd_event(n, ev->data.fd, ev->events);
+ break;
+ }
+
+ case MANAGER_TIMER: {
+ Name *n;
+ uint64_t u;
+ ssize_t k;
+
+ /* Some timer event, to be dispatched to the names */
+ if ((k = read(ev->data.fd, &u, sizeof(u))) != sizeof(u)) {
+
+ if (k < 0 && (errno == EINTR || errno == EAGAIN))
+ break;
+
+ return k < 0 ? -errno : -EIO;
+ }
+
+ assert_se(n = ev->data.ptr);
+ NAME_VTABLE(n)->timer_event(n, ev->data.fd, u);
+ break;
+ }
+
+ default:
+ assert_not_reached("Unknown epoll event type.");
+ }