aboutsummaryrefslogtreecommitdiffstats
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c126
1 files changed, 94 insertions, 32 deletions
diff --git a/src/server.c b/src/server.c
index fc4bc5c..96300e6 100644
--- a/src/server.c
+++ b/src/server.c
@@ -51,11 +51,6 @@ size_t connections_ptr = 0;
size_t connections_used = 0;
/**
- * The server connection's message buffer
- */
-struct message server_message;
-
-/**
* The clients' connections' message buffers
*/
struct message* client_messages = NULL;
@@ -81,17 +76,6 @@ extern volatile sig_atomic_t terminate;
/**
- * Initialise the state of the connections
- *
- * @param Zero on success, -1 on error
- */
-int server_initialise(void)
-{
- return message_initialise(&server_message);
-}
-
-
-/**
* Destroy the state of the connections
*
* @param disconnect Disconnect all connections?
@@ -106,7 +90,6 @@ void server_destroy(int disconnect)
if (connections[i] >= 0)
message_destroy(client_messages + i);
free(client_messages);
- message_destroy(&server_message);
free(connections);
}
@@ -136,8 +119,6 @@ size_t server_marshal(void* buf)
memcpy(bs + off, connections, connections_used * sizeof(*connections));
off += connections_used * sizeof(*connections);
- off += message_marshal(&server_message, bs ? bs + off : NULL);
-
for (i = 0; i < connections_used; i++)
if (connections[i] >= 0)
off += message_marshal(client_messages + i, bs ? bs + off : NULL);
@@ -159,7 +140,6 @@ size_t server_unmarshal(const void* buf)
connections = NULL;
client_messages = NULL;
- memset(&server_message, 0, sizeof(server_message));
connections_ptr = *(const size_t*)(bs + off);
off += sizeof(size_t);
@@ -179,10 +159,6 @@ size_t server_unmarshal(const void* buf)
return 0;
}
- off += n = message_unmarshal(&server_message, bs + off);
- if (n == 0)
- return 0;
-
for (i = 0; i < connections_used; i++)
if (connections[i] >= 0)
{
@@ -220,30 +196,116 @@ static int update_fdset(fd_set* fds)
/**
+ * Handle event on the server socket
+ *
+ * @return 1: New connection accepted
+ * 0: Successful
+ * -1: Failure
+ */
+static int handle_server(void)
+{
+ int fd;
+
+ fd = accept(socketfd, NULL, NULL);
+ if (fd < 0)
+ switch (errno)
+ {
+ case EINTR:
+ return 0;
+ case ECONNABORTED:
+ case EINVAL:
+ terminate = 1;
+ return 0;
+ default:
+ return -1;
+ }
+
+ if (connections_ptr == connections_alloc)
+ {
+ int* new;
+ new = realloc(connections, (connections_alloc + 10) * sizeof(*connections));
+ if (new == NULL)
+ return -1;
+ connections = new;
+ connections_alloc += 10;
+ }
+
+ connections[connections_ptr++] = fd;
+ while (connections_ptr < connections_used)
+ if (connections[connections_ptr] >= 0)
+ connections_ptr++;
+ if (connections_used < connections_ptr)
+ connections_used = connections_ptr;
+
+ return 1;
+}
+
+
+/**
+ * Handle event on a connection to a client
+ *
+ * @param conn The index of the connection
+ * @return 1: New connection accepted
+ * 0: Successful
+ * -1: Failure
+ */
+static int handle_connection(size_t conn)
+{
+ /* TODO */
+ return 0;
+}
+
+
+/**
* The program's main loop
*
* @return Zero on success, -1 on error
*/
int main_loop(void)
{
- fd_set fds_orig, fds_read, fds_err;
- int fdn = update_fdset(&fds_orig);
+ fd_set fds_orig, fds_read, fds_ex;
+ int i, r, update, fdn = update_fdset(&fds_orig);
+ size_t j;
while (!reexec && !terminate)
{
memcpy(&fds_read, &fds_orig, sizeof(fd_set));
- memcpy(&fds_err, &fds_orig, sizeof(fd_set));
- if (select(fdn, &fds_read, NULL, &fds_err, NULL) < 0)
+ memcpy(&fds_ex, &fds_orig, sizeof(fd_set));
+ if (select(fdn, &fds_read, NULL, &fds_ex, NULL) < 0)
{
if (errno == EINTR)
continue;
- goto fail;
+ return -1;
}
- /* TODO */
+
+ update = 0;
+ for (i = 0; i < fdn; i++)
+ if (FD_ISSET(i, &fds_read) || FD_ISSET(i, &fds_ex))
+ {
+ if (i == socketfd)
+ r = handle_server();
+ else
+ {
+ for (j = 0;; j++)
+ if (connections[j] == i)
+ break;
+ r = handle_connection(j);
+ }
+ switch (r)
+ {
+ case 0:
+ break;
+ case 1:
+ update = 1;
+ break;
+ default:
+ return -1;
+ }
+ }
+ if (update)
+ update_fdset(&fds_orig);
}
return 0;
- fail:
- return -1;
}