From 9141b8a6573f973f97aa1615a8cc0c488cfd77e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 10 Jan 2020 19:30:03 +0100 Subject: [PATCH] server: use edge-triggered FDM handler for the client connections --- server.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/server.c b/server.c index 92f326a0..71ee113d 100644 --- a/server.c +++ b/server.c @@ -152,21 +152,21 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data) return true; /* Let FDM trigger again when we have more data */ } - /* Keep filling our buffer of initialization data */ - ssize_t count = recv( - fd, &client->buffer.data[client->buffer.idx], client->buffer.left, 0); + while (client->buffer.left > 0) { + /* Keep filling our buffer of initialization data */ + ssize_t count = recv( + fd, &client->buffer.data[client->buffer.idx], client->buffer.left, 0); - if (count < 0) { - LOG_ERRNO("failed to read"); - goto shutdown; - } + if (count < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) + return true; - client->buffer.idx += count; - client->buffer.left -= count; + LOG_ERRNO("failed to read"); + goto shutdown; + } - if (client->buffer.left > 0) { - /* Not done yet */ - return true; + client->buffer.idx += count; + client->buffer.left -= count; } /* All initialization data received - time to instantiate a terminal! */ @@ -288,7 +288,7 @@ fdm_server(struct fdm *fdm, int fd, int events, void *data) .fd = client_fd, }; - if (!fdm_add(server->fdm, client_fd, EPOLLIN, &fdm_client, client)) { + if (!fdm_add(server->fdm, client_fd, EPOLLIN | EPOLLET, &fdm_client, client)) { close(client_fd); free(client); return false;