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)
{
}
}
}
-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;
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)
{
#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;
"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();
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)
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);
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();