diff --git a/daemon/control.c b/daemon/control.c index d6ca08fb4..7d4a7a65d 100644 --- a/daemon/control.c +++ b/daemon/control.c @@ -204,6 +204,7 @@ static void control_incoming(int fd, void *p, uintptr_t u) { struct sockaddr_in sin; socklen_t sinl; +next: sinl = sizeof(sin); nfd = accept(fd, (struct sockaddr *) &sin, &sinl); if (nfd == -1) @@ -238,10 +239,11 @@ static void control_incoming(int fd, void *p, uintptr_t u) { c->streams = g_list_prepend(c->streams, s); mutex_unlock(&c->lock); - return; + goto next; fail: obj_put(s); + goto next; } diff --git a/daemon/control_udp.c b/daemon/control_udp.c index f493ff99a..d452a0318 100644 --- a/daemon/control_udp.c +++ b/daemon/control_udp.c @@ -36,10 +36,11 @@ static void control_udp_incoming(int fd, void *p, uintptr_t x) { struct iovec iov[10]; char addr[64]; +next: sin_len = sizeof(sin); len = recvfrom(fd, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &sin, &sin_len); if (len < 0) { - if (errno != EWOULDBLOCK) + if (errno != EWOULDBLOCK && errno != EAGAIN && errno != EINTR) mylog(LOG_WARNING, "Error reading from UDP socket"); return; } @@ -52,7 +53,7 @@ static void control_udp_incoming(int fd, void *p, uintptr_t x) { ret = pcre_exec(u->fallback_re, NULL, buf, len, 0, 0, ovec, G_N_ELEMENTS(ovec)); if (ret <= 0) { mylog(LOG_WARNING, "Unable to parse command line from udp:%s:%u: %s", addr, ntohs(sin.sin6_port), buf); - return; + goto next; } mylog(LOG_WARNING, "Failed to properly parse UDP command line '%s' from %s:%u, using fallback RE", buf, addr, ntohs(sin.sin6_port)); @@ -85,7 +86,7 @@ static void control_udp_incoming(int fd, void *p, uintptr_t x) { pcre_free(out); - return; + goto next; } mylog(LOG_INFO, "Got valid command from udp:%s:%u: %s", addr, ntohs(sin.sin6_port), buf); @@ -177,6 +178,7 @@ restart: out: pcre_free(out); + goto next; } struct control_udp *control_udp_new(struct poller *p, struct in6_addr ip, u_int16_t port, struct callmaster *m) { diff --git a/daemon/poller.c b/daemon/poller.c index f1dfc3207..9bdd0cd2a 100644 --- a/daemon/poller.c +++ b/daemon/poller.c @@ -74,7 +74,7 @@ struct poller *poller_new(void) { static int epoll_events(struct poller_item *it, struct poller_item_int *ii) { if (!it) it = &ii->item; - return EPOLLHUP | EPOLLERR | + return EPOLLHUP | EPOLLERR | EPOLLET | ((it->writeable && ii && ii->blocked) ? EPOLLOUT : 0) | (it->readable ? EPOLLIN : 0); }