+ return r;
+}
+
+static int accept_cb(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
+ struct proxy *p = (struct proxy *) userdata;
+ sd_event *e = NULL;
+ int r = 0;
+
+ assert(revents & EPOLLIN);
+
+ e = sd_event_get(s);
+
+ for (;;) {
+ r = do_accept(e, p, fd);
+ if (r == -EAGAIN || r == -EWOULDBLOCK)
+ break;
+ if (r < 0) {
+ log_error("Error %d while trying to accept: %s", r, strerror(-r));
+ break;
+ }
+ }
+
+ /* Re-enable the watcher. */
+ r = sd_event_source_set_enabled(s, SD_EVENT_ONESHOT);
+ if (r < 0) {
+ log_error("Error %d while re-enabling listener with ONESHOT: %s", r, strerror(-r));
+ return r;
+ }
+
+ /* Preserve the main loop even if a single accept() fails. */