From af03988db7c9541ab6b0adf52cbb40f2a57fc9d5 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Thu, 11 Aug 2022 21:19:52 -0400 Subject: [PATCH] Poll the socket for data events. --- src/HttpServer.c | 50 +++++++++++++++++++++++++++++++++++------------ src/Telodendria.c | 3 ++- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/HttpServer.c b/src/HttpServer.c index b6083f2..b29ede0 100644 --- a/src/HttpServer.c +++ b/src/HttpServer.c @@ -26,7 +26,8 @@ #include #include #include -#include +#include +#include #include #include @@ -36,27 +37,34 @@ struct HttpServer { int sd; unsigned int nThreads; - HttpHandler *requestHandler; - void *handlerArgs; - pthread_t socketThread; volatile unsigned int stop:1; volatile unsigned int isRunning:1; + + HttpHandler *requestHandler; + void *handlerArgs; }; HttpServer * -HttpServerCreate(unsigned short port, unsigned int nThreads, HttpHandler * requestHandler, void *handlerArgs) +HttpServerCreate(unsigned short port, unsigned int nThreads, + HttpHandler * requestHandler, void *handlerArgs) { - HttpServer *server = malloc(sizeof(HttpServer)); + HttpServer *server; struct sockaddr_in sa = {0}; + if (!requestHandler) + { + return NULL; + } + + server = malloc(sizeof(HttpServer)); if (!server) { return NULL; } - server->sd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + server->sd = socket(AF_INET, SOCK_STREAM, 0); if (server->sd < 0) { @@ -108,21 +116,39 @@ static void * HttpServerEventThread(void *args) { HttpServer *server = (HttpServer *) args; + struct pollfd pollFds[1]; server->isRunning = 1; server->stop = 0; + pollFds[0].fd = server->sd; + pollFds[0].events = POLLIN; + while (!server->stop) { - printf("In server event thread\n"); - fflush(stdout); - sleep(1); + struct sockaddr_storage addr; + socklen_t addrLen = sizeof(addr); + int connFd; + int pollResult = poll(pollFds, 1, 60 * 1000); + + if (pollResult < 0) + { + /* The poll either timed out, or was interrupted. */ + continue; + } + + connFd = accept(server->sd, (struct sockaddr *) & addr, &addrLen); + + if (connFd < 0) + { + continue; + } + + close(connFd); } server->isRunning = 0; - printf("Event thread dying!\n"); - return NULL; } diff --git a/src/Telodendria.c b/src/Telodendria.c index ef1c3a2..16be3fc 100644 --- a/src/Telodendria.c +++ b/src/Telodendria.c @@ -295,7 +295,8 @@ main(int argc, char **argv) } /* Bind the socket before possibly dropping permissions */ - httpServer = HttpServerCreate(tConfig->listenPort, tConfig->threads, TelodendriaHttpHandler, NULL); + httpServer = HttpServerCreate(tConfig->listenPort, tConfig->threads, + TelodendriaHttpHandler, NULL); if (!httpServer) { Log(lc, LOG_ERROR, "Unable to create HTTP server on port %d: %s",