X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Flttng-live%2Flttng-live-plugin.c;h=a8cae580de7a140470fc78180db667839368f40e;hp=83c0458289bc1e9e2b0d9ac024eeaf0c679f3dbc;hb=9010d19ccc1373a310ab77ffbeee61bb69565f32;hpb=49a4acefd0905cd95253f91d3781c758999847c3 diff --git a/formats/lttng-live/lttng-live-plugin.c b/formats/lttng-live/lttng-live-plugin.c index 83c04582..a8cae580 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. */ @@ -84,6 +135,10 @@ int parse_url(const char *path, struct lttng_live_ctx *ctx) if (ret < 0) { goto end; } + } else if (ret == 0) { + fprintf(stderr, "[error] Missing port number after delimitor ':'\n"); + ret = -1; + goto end; } break; case '/': @@ -153,10 +208,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 +226,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 +238,10 @@ end_free: g_free(ctx->session); g_free(ctx->session->streams); g_free(ctx); + + if (lttng_live_should_quit()) { + ret = 0; + } return ret; }