Browse Source

split server implementation for readability

master
Georg Hopp 14 years ago
parent
commit
19724f0d11
  1. 25
      src/server/handle_accept.c
  2. 29
      src/server/poll.c
  3. 42
      src/server/read.c
  4. 106
      src/server/run.c

25
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:

29
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:

42
src/server/read.c

@ -0,0 +1,42 @@
static
int
serverRead(Server this)
{
unsigned int i;
for (i=1; i<this->nfds; 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:

106
src/server/run.c

@ -1,4 +1,4 @@
#include <poll.h> /* for select system call and related */
#include <poll.h> /* for poll system call and related */
#include <string.h> /* for memset and stuff */
#include <stdlib.h> /* for exit */
#include <errno.h> /* 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; i<this->nfds; 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);
}
}

Loading…
Cancel
Save