From: Egor Date: Thu, 12 Jun 2025 03:18:31 +0000 (+0300) Subject: use vector for listeners X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=ef5af32dce7cd626a311b1bd33f1ecc5837b91cf;p=patchyircd.git use vector for listeners --- diff --git a/src/job.cpp b/src/job.cpp index 3e5bdb0..bc0fd19 100644 --- a/src/job.cpp +++ b/src/job.cpp @@ -22,7 +22,7 @@ static std::deque jobq; static pid_t current_child = -1; static int current_result = 0; -static uv_signal_t uvsigchld, uvsigint; +static uv_signal_t uvsigchld; static void job_child([[maybe_unused]] uv_signal_t *handle, [[maybe_unused]] int signum) { @@ -35,11 +35,6 @@ static void job_child([[maybe_unused]] uv_signal_t *handle, [[maybe_unused]] int } } } -static void job_int([[maybe_unused]] uv_signal_t *handle, [[maybe_unused]] int signum) -{ - extern bool is_siginted; - is_siginted = true; -} void job_init(void) { struct sigaction sa; @@ -52,13 +47,10 @@ void job_init(void) uv_signal_init(uv_default_loop(), &uvsigchld); uv_signal_start(&uvsigchld, job_child, SIGCHLD); - uv_signal_init(uv_default_loop(), &uvsigint); - uv_signal_start_oneshot(&uvsigint, job_int, SIGINT); } void job_fini(void) { uv_close((uv_handle_t *)&uvsigchld, 0); - uv_close((uv_handle_t *)&uvsigint, 0); } void job_process(void) { diff --git a/src/main.cpp b/src/main.cpp index 91a5e51..0a29d5f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,9 +6,9 @@ #include "irc.h" #include "job.h" #include +#include static int is_running = 1; -bool is_siginted = 0; // Client linked list struct client_data *clients = NULL, *dyingclients = NULL; @@ -213,11 +213,9 @@ PACKAGE_STRING "\n" "with this program; if not, see .\n"); } +static std::vector listeners; int main(int argc, char *argv[]) { -#define MAX_LISTENERS 16 - struct listener listeners[MAX_LISTENERS]; - int listener_count = 0; setlocale(LC_ALL, "C"); show_license(); @@ -258,12 +256,9 @@ int main(int argc, char *argv[]) if (!strcmp(argv[i], "--listenPlain") || (is_tls = !strcmp(argv[i], "--listenTls"))) { if (i + 2 >= argc) return fprintf(stderr, "not enough parameters\n"), 1; - if (listener_count == MAX_LISTENERS) - return fprintf(stderr, "too many listeners\n"), 1; 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]); + listeners.emplace_back(create_listen_sock(argv[i+1], argv[i+2]), is_tls ? tls_ctx : nullptr); i += 2; } else if(!strcmp(argv[i], "--autojoin")) { if (i + 1 >= argc) @@ -292,23 +287,20 @@ int main(int argc, char *argv[]) determine_hostname(); - if (!listener_count) { - 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"); + if (listeners.empty()) { + listeners.emplace_back(create_listen_sock("0", "6667"), nullptr); + listeners.emplace_back(create_listen_sock("::", "6667"), nullptr); #ifdef HAVE_LIBTLS - 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"); + listeners.emplace_back(create_listen_sock("0", "6697"), tls_ctx); + listeners.emplace_back(create_listen_sock("::", "6697"), tls_ctx); #endif } - for (int i = 0; i < listener_count; i++) { - net_nonblock(listeners[i].sock); - netpoll::add(listeners[i].sock, SOCKTYPE_LISTENER, &listeners[i]); - netpoll::reg(listeners[i].sock, UV_READABLE); + // NOTE: don't push_back to listeners beyond this point + for (listener &listener : listeners) { + net_nonblock(listener.sock); + netpoll::add(listener.sock, SOCKTYPE_LISTENER, &listener); + netpoll::reg(listener.sock, UV_READABLE); } FILE *f = fopen(getdatafile("init.txt"), "rb" FOPEN_CLOEXEC); @@ -369,25 +361,25 @@ int main(int argc, char *argv[]) fflush(fchanlog); } - // Main loop - while (is_running || dyingclients) { - if (is_siginted) { + uv_signal_t uvsigint; + uv_signal_init(uv_default_loop(), &uvsigint); + uv_signal_start_oneshot(&uvsigint, [](uv_signal_t *handle, int) { fprintf(stderr, "Cleaning up...\n"); - for (int i = 0; i < listener_count; i++) { - netpoll::del_and_close(listeners[i].sock); + for (listener &listener : listeners) { + netpoll::del_and_close(listener.sock); } - listener_count = 0; for (struct client_data *cl = clients; cl;) { struct client_data *next = cl->next; killConnection(cl, 0); cl = next; } is_running = 0; - is_siginted = 0; - if (!dyingclients) - break; - } + uv_close((uv_handle_t *)handle, 0); + }, SIGINT); + + // Main loop + while (is_running || dyingclients) { job_process(); netpoll::begin(); job_process();