From a0538a63d004b9d1e895c546c61e8da2bbcc2180 Mon Sep 17 00:00:00 2001 From: Egor Date: Fri, 27 May 2022 00:54:33 +0300 Subject: [PATCH] create listener struct --- main.c | 60 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/main.c b/main.c index fdba603..259f6bd 100644 --- a/main.c +++ b/main.c @@ -73,6 +73,11 @@ fd_set readfds; FILE *fchanlog = NULL; +struct listener { + SOCKET sock; + struct tls *ctx; +}; + SOCKET create_listen_sock(const char *ip, const char *port) { struct addrinfo hints, *res; @@ -121,12 +126,12 @@ SOCKET create_listen_sock(const char *ip, const char *port) return sock; } -void accept_from_sock(SOCKET serverSocket, struct tls *ctx) +void accept_from_sock(struct listener *listener) { while (true) { struct sockaddr_storage addr; socklen_t len = sizeof(addr); - SOCKET newSocket = accept(serverSocket, (struct sockaddr *)&addr, &len); + SOCKET newSocket = accept(listener->sock, (struct sockaddr *)&addr, &len); if (newSocket == (SOCKET)INVALID_SOCKET) { if (!net_wouldblock()) net_perror("ERROR newSocket"); @@ -150,11 +155,11 @@ void accept_from_sock(SOCKET serverSocket, struct tls *ctx) fprintf(stderr, "Connection accepted from Socket: %"PRISocket", IP: %s PORT: %d\n", newSocket, client_addr, port); struct tls *cctx = NULL; - if (ctx) { + if (listener->ctx) { #ifdef HAS_TLS - if (tls_accept_socket(ctx, &cctx, newSocket) == -1) { + if (tls_accept_socket(listener->ctx, &cctx, newSocket) == -1) { close(newSocket); - fprintf(stderr, "tls_accept_socket: %s\n", tls_error(ctx)); + fprintf(stderr, "tls_accept_socket: %s\n", tls_error(listener->ctx)); continue; } #endif @@ -183,8 +188,7 @@ void accept_from_sock(SOCKET serverSocket, struct tls *ctx) int main(int argc, char *argv[]) { #define MAX_LISTENERS 16 - SOCKET listeners[MAX_LISTENERS]; - struct tls *listeners_tls[MAX_LISTENERS]; + struct listener listeners[MAX_LISTENERS]; int listener_count = 0; setlocale(LC_ALL, "C"); fprintf(stderr, "[PatchyIRCD]: Starting up...\n"); @@ -197,9 +201,9 @@ int main(int argc, char *argv[]) // Zero stuff out memset(clients, 0, sizeof(clients)); + struct tls *tls_ctx = NULL; #ifdef HAS_TLS struct tls_config *tls_cfg; - struct tls *tls_ctx; if (tls_init() == -1) return fprintf(stderr, "tls_init error\n"), 1; if (!(tls_cfg = tls_config_new())) @@ -224,14 +228,10 @@ int main(int argc, char *argv[]) return fprintf(stderr, "not enough parameters\n"), 1; if (listener_count == MAX_LISTENERS) return fprintf(stderr, "too many listeners\n"), 1; -#ifdef HAS_TLS - listeners_tls[listener_count] = is_tls ? tls_ctx : NULL; -#else - if (is_tls) - return fprintf(stderr, "not TLS support\n"), 1; - listeners_tls[listener_count] = NULL; -#endif - listeners[listener_count++] = create_listen_sock(argv[i+1], argv[i+2]); + if (is_tls && !tls_ctx) + return fprintf(stderr, "no TLS support\n"), 1; + listeners[listener_count].ctx = is_tls ? tls_ctx : NULL; + listeners[listener_count++].sock = create_listen_sock(argv[i+1], argv[i+2]); i += 2; } else { return fprintf(stderr, "unknown flag '%s'\n", argv[i]), 1; @@ -239,20 +239,20 @@ int main(int argc, char *argv[]) } if (!listener_count) { - listeners_tls[listener_count] = NULL; - listeners[listener_count++] = create_listen_sock("0", "6667"); - listeners_tls[listener_count] = NULL; - listeners[listener_count++] = create_listen_sock("::", "6667"); + listeners[listener_count].ctx = NULL; + listeners[listener_count++].sock = create_listen_sock("0", "6667"); + listeners[listener_count].ctx = NULL; + listeners[listener_count++].sock = create_listen_sock("::", "6667"); #ifdef HAS_TLS - listeners_tls[listener_count] = tls_ctx; - listeners[listener_count++] = create_listen_sock("0", "6697"); - listeners_tls[listener_count] = tls_ctx; - listeners[listener_count++] = create_listen_sock("::", "6697"); + listeners[listener_count].ctx = tls_ctx; + listeners[listener_count++].sock = create_listen_sock("0", "6697"); + listeners[listener_count].ctx = tls_ctx; + listeners[listener_count++].sock = create_listen_sock("::", "6697"); #endif } for (int i = 0; i < listener_count; i++) - net_nonblock(listeners[i]); + net_nonblock(listeners[i].sock); FILE *f = fopen("init.txt", "rb"); if (f) { @@ -313,7 +313,7 @@ int main(int argc, char *argv[]) FD_ZERO(&readfds); // Add listening SOCKETS to FDSET for (int i = 0; i < listener_count; i++) - FD_SET(listeners[i], &readfds); + FD_SET(listeners[i].sock, &readfds); #ifdef _WIN32 if (self_sock != INVALID_SOCKET) FD_SET(self_sock, &readfds); @@ -328,8 +328,8 @@ int main(int argc, char *argv[]) #else SOCKET highestFD = -1; for (int i = 0; i < listener_count; i++) - if (highestFD < listeners[i]) - highestFD = listeners[i]; + if (highestFD < listeners[i].sock) + highestFD = listeners[i].sock; for (int i = 0; i < CLIENTS; i++) if (clients[i] && highestFD < clients[i]->FD) highestFD = clients[i]->FD; @@ -352,8 +352,8 @@ int main(int argc, char *argv[]) // Accept new connections for (int i = 0; i < listener_count; i++) - if (FD_ISSET(listeners[i], &readfds)) - accept_from_sock(listeners[i], listeners_tls[i]); + if (FD_ISSET(listeners[i].sock, &readfds)) + accept_from_sock(&listeners[i]); // Respond to already connected clients for (int i = 0; i < CLIENTS; i++) if (clients[i] && FD_ISSET(clients[i]->FD, &readfds)) -- 2.56.0