]> PatchyGit - patchyircd.git/commitdiff
use vector for listeners
authorEgor <egor@patchysicp.xyz>
Thu, 12 Jun 2025 03:18:31 +0000 (06:18 +0300)
committerEgor <egor@patchysicp.xyz>
Thu, 12 Jun 2025 03:18:31 +0000 (06:18 +0300)
src/job.cpp
src/main.cpp

index 3e5bdb0..bc0fd19 100644 (file)
@@ -22,7 +22,7 @@ static std::deque<jobent> 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)
 {
index 91a5e51..0a29d5f 100644 (file)
@@ -6,9 +6,9 @@
 #include "irc.h"
 #include "job.h"
 #include <locale.h>
+#include <vector>
 
 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 <https://www.gnu.org/licenses/>.\n");
 }
 
+static std::vector<listener> 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();