X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Flttng-live%2Flttng-live-plugin.c;h=d02b799a09d759e22504dee26112fb01d0ecdbf4;hp=83c0458289bc1e9e2b0d9ac024eeaf0c679f3dbc;hb=8ace20bfc87729d45edc4e1a2aa6bec330580d91;hpb=a5e4b11e1a2fdb35056382f7d89230dbc2195975 diff --git a/formats/lttng-live/lttng-live-plugin.c b/formats/lttng-live/lttng-live-plugin.c index 83c04582..d02b799a 100644 --- a/formats/lttng-live/lttng-live-plugin.c +++ b/formats/lttng-live/lttng-live-plugin.c @@ -36,8 +36,59 @@ #include #include #include +#include #include "lttng-live.h" +static volatile int should_quit; + +int lttng_live_should_quit(void) +{ + return should_quit; +} + +static +void sighandler(int sig) +{ + switch (sig) { + case SIGTERM: + case SIGINT: + should_quit = 1; + break; + default: + break; + } +} + +/* + * TODO: Eventually, this signal handler setup should be done at the + * plugin manager level, rather than within this plugin. Beware, we are + * not cleaning up the signal handler after plugin execution. + */ +static +int setup_sighandler(void) +{ + struct sigaction sa; + sigset_t sigset; + int ret; + + if ((ret = sigemptyset(&sigset)) < 0) { + perror("sigemptyset"); + return ret; + } + sa.sa_handler = sighandler; + sa.sa_mask = sigset; + sa.sa_flags = 0; + if ((ret = sigaction(SIGTERM, &sa, NULL)) < 0) { + perror("sigaction"); + return ret; + } + if ((ret = sigaction(SIGINT, &sa, NULL)) < 0) { + perror("sigaction"); + return ret; + } + return 0; +} + /* * hostname parameter needs to hold NAME_MAX chars. */ @@ -153,10 +204,12 @@ static int lttng_live_open_trace_read(const char *path) if (ret < 0) { goto end_free; } - + ret = setup_sighandler(); + if (ret < 0) { + goto end_free; + } ret = lttng_live_connect_viewer(ctx); if (ret < 0) { - fprintf(stderr, "[error] Connection failed\n"); goto end_free; } printf_verbose("LTTng-live connected to relayd\n"); @@ -169,7 +222,6 @@ static int lttng_live_open_trace_read(const char *path) printf_verbose("Listing sessions\n"); ret = lttng_live_list_sessions(ctx, path); if (ret < 0) { - fprintf(stderr, "[error] List error\n"); goto end_free; } @@ -182,6 +234,10 @@ end_free: g_free(ctx->session); g_free(ctx->session->streams); g_free(ctx); + + if (lttng_live_should_quit()) { + ret = 0; + } return ret; }