From 163110c8149610c3fabb4e193d0c657141fe6419 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 9 May 2019 11:24:05 +0200 Subject: [PATCH] Now handle signals --- src/donar_client.c | 4 ++++ src/donar_init.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ src/donar_init.h | 3 +++ src/donar_server.c | 4 ++++ src/evt_core.c | 3 ++- src/evt_core.h | 1 + src/proxy.c | 1 + 7 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/donar_client.c b/src/donar_client.c index 55d82a9..b42f8c7 100644 --- a/src/donar_client.c +++ b/src/donar_client.c @@ -77,6 +77,10 @@ void donar_client(struct donar_client_ctx* ctx, struct donar_params* dp) { }; evt_core_init (&(ctx->evts), dp->verbose); + + signal_init(&ctx->evts); + printf("--- Signal initialized\n"); + algo_main_init(&ctx->evts, &ap); printf("--- Algorithm initialized\n"); diff --git a/src/donar_init.c b/src/donar_init.c index 9c48f87..19cefc3 100644 --- a/src/donar_init.c +++ b/src/donar_init.c @@ -8,6 +8,57 @@ void free_udp_t(void* v) { } } +int on_signal(struct evt_core_ctx* evts, struct evt_core_fdinfo* fdinfo) { + struct signalfd_siginfo fdsi; + + int sig_rd = read(fdinfo->fd, &fdsi, sizeof(struct signalfd_siginfo)); + if (sig_rd == -1 && errno == EAGAIN) return 1; + if (sig_rd != sizeof(struct signalfd_siginfo)) { + fprintf(stderr, "read size: %d / %ld\n", sig_rd, sizeof(struct signalfd_siginfo)); + perror("signal read failed"); + exit(EXIT_FAILURE); + } + printf("Signal received: %d\n", fdsi.ssi_signo); + + if (fdsi.ssi_signo == SIGINT || fdsi.ssi_signo == SIGQUIT) { + printf("Stop main loop and quit\n"); + evts->loop = 0; + } + return 0; +} + +void signal_init(struct evt_core_ctx* evts) { + sigset_t mask; + + struct evt_core_cat signal_read = { + .name = "signal-read", + .flags = EPOLLIN | EPOLLET | EPOLLRDHUP, + .app_ctx = NULL, + .free_app_ctx = NULL, + .cb = on_signal, + .err_cb = NULL + }; + evt_core_add_cat(evts, &signal_read); + + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) { + perror("sigprocmask"); + exit(EXIT_FAILURE); + } + int sigfd = signalfd(-1, &mask, 0); + if (sigfd == -1) { + perror("signalfd failed"); + exit(EXIT_FAILURE); + } + + struct evt_core_fdinfo fdinfo = {0}; + fdinfo.fd = sigfd; + fdinfo.cat = &signal_read; + fdinfo.url = "signal:read:int+quit"; + evt_core_add_fd(evts, &fdinfo); +} + void init_udp_remote(char* port, struct evt_core_ctx* evts) { int sock1, sock2; char url[1024]; diff --git a/src/donar_init.h b/src/donar_init.h index 6d83551..b6cbfe1 100644 --- a/src/donar_init.h +++ b/src/donar_init.h @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "net_tools.h" #include "evt_core.h" #include "packet.h" @@ -12,6 +14,7 @@ struct donar_params { GPtrArray *remote_ports, *exposed_ports; }; +void signal_init(struct evt_core_ctx* evts); void init_udp_remote(char* port, struct evt_core_ctx* evts); void init_udp_exposed(char* port, struct evt_core_ctx* evts); void donar_init_params(struct donar_params* dp); diff --git a/src/donar_server.c b/src/donar_server.c index 66e7f87..79540f1 100644 --- a/src/donar_server.c +++ b/src/donar_server.c @@ -59,6 +59,10 @@ void donar_server(struct donar_server_ctx* ctx, struct donar_params* dp) { }; evt_core_init (&(ctx->evts), dp->verbose); + + signal_init(&ctx->evts); + printf("--- Signal initialized\n"); + algo_main_init(&ctx->evts, &ap); printf("--- Algorithm initialized\n"); diff --git a/src/evt_core.c b/src/evt_core.c index 72daacc..3ab8b78 100644 --- a/src/evt_core.c +++ b/src/evt_core.c @@ -34,6 +34,7 @@ void evt_core_init(struct evt_core_ctx* ctx, uint8_t verbose) { exit(EXIT_FAILURE); } ctx->verbose = verbose; + ctx->loop = 1; ctx->catlist = g_hash_table_new_full(g_str_hash, g_str_equal,NULL, free_cat); ctx->socklist = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, free_fdinfo); ctx->urltofd = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); @@ -257,7 +258,7 @@ void evt_core_loop(struct evt_core_ctx* ctx) { printf("--- Start main loop\n"); int num_fd, n = 0; - while(1) { + while(ctx->loop) { timing_fx_start(&tfx_epoll); num_fd = epoll_wait(ctx->epollfd, events, EVT_CORE_MAX_EVENTS, -1); timing_fx_stop(&tfx_epoll); diff --git a/src/evt_core.h b/src/evt_core.h index dceae7d..6a4096a 100644 --- a/src/evt_core.h +++ b/src/evt_core.h @@ -32,6 +32,7 @@ struct evt_core_cat { struct evt_core_ctx { int epollfd; uint8_t verbose; + uint8_t loop; GHashTable* catlist; // name -> category GHashTable* socklist; // fd -> category GHashTable* urltofd; // url -> fd, like "tcp:127.0.0.1:7500" diff --git a/src/proxy.c b/src/proxy.c index 96a2959..43450c0 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -191,6 +191,7 @@ void algo_main_init(struct evt_core_ctx* evt, struct algo_params* ap) { .cb = main_on_tcp_co, .err_cb = NULL }; + ctx->ref_count++; evt_core_add_cat(evt, &tcp_listen); struct evt_core_cat tcp_read = {