From 19724f0d11d899521dcbbb4800af928796785228 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 6 Feb 2012 16:08:13 +0100 Subject: [PATCH] split server implementation for readability --- src/server/handle_accept.c | 25 +++++++++ src/server/poll.c | 29 ++++++++++ src/server/read.c | 42 +++++++++++++++ src/server/run.c | 106 ++++--------------------------------- 4 files changed, 106 insertions(+), 96 deletions(-) create mode 100644 src/server/handle_accept.c create mode 100644 src/server/poll.c create mode 100644 src/server/read.c diff --git a/src/server/handle_accept.c b/src/server/handle_accept.c new file mode 100644 index 0000000..cc89222 --- /dev/null +++ b/src/server/handle_accept.c @@ -0,0 +1,25 @@ +static +void +serverHandleAccept(Server this) +{ + if (0 != ((this->fds)[0].revents & POLLIN)) { + char remoteAddr[16] = ""; + Sock acc; + + acc = socketAccept(this->sock, remoteAddr); + + if (-1 != acc->handle) { + (this->conns)[this->nfds].sock = acc; // save the socket handle + (this->conns)[this->nfds].reader = clone(this->reader); // clone reader + (this->fds)[this->nfds].fd = acc->handle; + (this->fds)[this->nfds].events = POLLIN; + this->nfds++; + } else { + delete(&acc); + } + + (this->fds)[0].revents |= POLLIN; + } +} + +// vim: set ts=4 sw=4: diff --git a/src/server/poll.c b/src/server/poll.c new file mode 100644 index 0000000..7b64bce --- /dev/null +++ b/src/server/poll.c @@ -0,0 +1,29 @@ +static +int +serverPoll(Server this) { + int events; + + /* + * wait for handles to become ready + */ + if (-1 == (events = poll(this->fds, this->nfds, -1))) { + switch (errno) { + default: + case EBADF: + case EINVAL: + case ENOMEM: + doShutdown = 1; + /* Fallthrough */ + + case EINTR: + loggerLog(this->logger, LOGGER_CRIT, + "poll systemcall failed: [%s] - service terminated", + strerror(errno)); + //exit(EXIT_FAILURE); /* @TODO do real shutdown here */ + } + } + + return events; +} + +// vim: set ts=4 sw=4: diff --git a/src/server/read.c b/src/server/read.c new file mode 100644 index 0000000..56c066f --- /dev/null +++ b/src/server/read.c @@ -0,0 +1,42 @@ +static +int +serverRead(Server this) +{ + unsigned int i; + + for (i=1; infds; i++) { + if (0 != ((this->fds)[i].revents & POLLIN)) { + if (NULL == (this->conns)[i].reader) { + loggerLog( + this->logger, + LOGGER_INFO, + "initialization error: NULL reader"); + serverCloseConn(this, i); + } + + switch (streamReaderRead((this->conns)[i].reader, (this->fds)[i].fd)) { + case 0: + /* + * normal close: write remaining data + * @TODO: actually we have no remaining data here.... + */ + /* DROP-THROUGH */ + + case -1: + /* + * read failure / close connection + */ + loggerLog(this->logger, LOGGER_INFO, "connection closed..."); + serverCloseConn(this, i); + break; + + default: + break; + } + } + } + + return 0; +} + +// vim: set ts=4 sw=4: diff --git a/src/server/run.c b/src/server/run.c index ae29efd..a7adaa2 100644 --- a/src/server/run.c +++ b/src/server/run.c @@ -1,4 +1,4 @@ -#include /* for select system call and related */ +#include /* for poll system call and related */ #include /* for memset and stuff */ #include /* for exit */ #include /* for errno */ @@ -14,98 +14,9 @@ #undef MAX #define MAX(x,y) ((x) > (y) ? (x) : (y)) -static -int -serverPoll(Server this) { - int events; - - /* - * wait for handles to become ready - */ - if (-1 == (events = poll(this->fds, this->nfds, -1))) { - switch (errno) { - default: - case EBADF: - case EINVAL: - case ENOMEM: - doShutdown = 1; - /* Fallthrough */ - - case EINTR: - loggerLog(this->logger, LOGGER_CRIT, - "poll systemcall failed: [%s] - service terminated", - strerror(errno)); - //exit(EXIT_FAILURE); /* @TODO do real shutdown here */ - } - } - - return events; -} - -static -void -serverHandleAccept(Server this) -{ - if (0 != ((this->fds)[0].revents & POLLIN)) { - char remoteAddr[16] = ""; - Sock acc; - - acc = socketAccept(this->sock, remoteAddr); - - if (-1 != acc->handle) { - (this->conns)[this->nfds].sock = acc; // save the socket handle - (this->conns)[this->nfds].reader = clone(this->reader); // clone reader - (this->fds)[this->nfds].fd = acc->handle; - (this->fds)[this->nfds].events = POLLIN; - this->nfds++; - } else { - delete(&acc); - } - - (this->fds)[0].revents |= POLLIN; - } -} - -static -int -serverRead(Server this) -{ - unsigned int i; - - for (i=1; infds; i++) { - if (0 != ((this->fds)[i].revents & POLLIN)) { - if (NULL == (this->conns)[i].reader) { - loggerLog( - this->logger, - LOGGER_INFO, - "initialization error: NULL reader"); - serverCloseConn(this, i); - } - - switch (streamReaderRead((this->conns)[i].reader, (this->fds)[i].fd)) { - case 0: - /* - * normal close: write remaining data - * @TODO: actually we have no remaining data here.... - */ - /* DROP-THROUGH */ - - case -1: - /* - * read failure / close connection - */ - loggerLog(this->logger, LOGGER_INFO, "connection closed..."); - serverCloseConn(this, i); - break; - - default: - break; - } - } - } - - return 0; -} +#include "poll.c" +#include "handle_accept.c" +#include "read.c" void serverRun(Server this) @@ -118,19 +29,22 @@ serverRun(Server this) while (!doShutdown) /* until error or signal */ { int events; - /* + + /** * @TODO take return value of poll into account with * further handling! */ events = serverPoll(this); if (doShutdown) break; - /* + /** * handle accept */ serverHandleAccept(this); - /* handle reads */ + /** + * handle reads + */ serverRead(this); } }