From 1cf9172194eb88c50ab763d7dd6994947b3d747c Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 3 Jan 2023 10:05:30 +0100 Subject: [PATCH] Make client list dynamic --- src/server.c | 36 ++++++++++++++++++++++++++++++------ src/server.h | 4 ++++ src/worker/tcp_acceptor.c | 2 +- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/server.c b/src/server.c index 0ce729a..f71a032 100644 --- a/src/server.c +++ b/src/server.c @@ -17,6 +17,7 @@ #include "lib/geoip.h" #include "workers.h" #include "worker/func.h" +#include "lib/list.h" #include #include @@ -39,7 +40,7 @@ const char *config_file; static int sockets[NUM_SOCKETS]; static SSL_CTX *contexts[CONFIG_MAX_CERT_CONFIG]; -static client_ctx_t clients[MAX_CLIENTS]; // TODO dynamic +static client_ctx_t **clients; static const char *color_table[] = {"\x1B[31m", "\x1B[32m", "\x1B[33m", "\x1B[34m", "\x1B[35m", "\x1B[36m"}; @@ -58,15 +59,34 @@ static int ssl_servername_cb(SSL *ssl, int *ad, void *arg) { return SSL_TLSEXT_ERR_OK; } +void server_free_client(client_ctx_t *ctx) { + for (int i = 0; i < list_size(clients); i++) { + if (clients[i] == ctx) { + clients = list_remove(clients, i); + break; + } + } + free(ctx); +} + static void accept_cb(void *arg) { int i = (int) (((int *) arg) - sockets); int fd = sockets[i]; - int j; - for (j = 0; j < MAX_CLIENTS; j++) { - if (clients[j].in_use == 0) break; + client_ctx_t *client_ctx = malloc(sizeof(client_ctx_t)); + if (client_ctx == NULL) { + critical("Unable to allocate memory for client context"); + errno = 0; + return; } - client_ctx_t *client_ctx = &clients[j]; + + clients = list_append(clients, &client_ctx); + if (clients == NULL) { + critical("Unable to add client context to list"); + errno = 0; + return; + } + client_ctx->in_use = 1; sock *client = &client_ctx->socket; @@ -127,7 +147,11 @@ int main(int argc, char *const argv[]) { int ret; memset(sockets, 0, sizeof(sockets)); - memset(clients, 0, sizeof(clients)); + clients = list_create(sizeof(void *), 64); + if (clients == NULL) { + critical("Unable to initialize client list"); + return 1; + } const struct sockaddr_in6 addresses[2] = { {.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(80)}, diff --git a/src/server.h b/src/server.h index 7de181a..091960b 100644 --- a/src/server.h +++ b/src/server.h @@ -9,6 +9,8 @@ #ifndef SESIMOS_SERVER_H #define SESIMOS_SERVER_H +#include "worker/func.h" + #include #define NUM_SOCKETS 2 @@ -24,4 +26,6 @@ extern volatile sig_atomic_t server_alive; +void server_free_client(client_ctx_t *ctx); + #endif //SESIMOS_SERVER_H diff --git a/src/worker/tcp_acceptor.c b/src/worker/tcp_acceptor.c index ef7e2d7..763bc24 100644 --- a/src/worker/tcp_acceptor.c +++ b/src/worker/tcp_acceptor.c @@ -126,5 +126,5 @@ void tcp_close(client_ctx_t *ctx) { char buf[32]; info("Connection closed (%s)", format_duration(ctx->cnx_e - ctx->cnx_s, buf)); - memset(ctx, 0, sizeof(*ctx)); + server_free_client(ctx); }