X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Flttng-live%2Flttng-live-plugin.c;h=a8cae580de7a140470fc78180db667839368f40e;hp=b3c660c8d7648fec124f90bc257a30524d1b00f3;hb=9010d19ccc1373a310ab77ffbeee61bb69565f32;hpb=c98627ca822e1284ccbda17597c8b057f0997acf diff --git a/formats/lttng-live/lttng-live-plugin.c b/formats/lttng-live/lttng-live-plugin.c index b3c660c8..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. */ @@ -46,14 +97,14 @@ int parse_url(const char *path, struct lttng_live_ctx *ctx) { char remain[3][NAME_MAX]; int ret = -1, proto, proto_offset = 0; - size_t path_len = strlen(path); + size_t path_len = strlen(path); /* not accounting \0 */ /* * Since sscanf API does not allow easily checking string length * against a size defined by a macro. Test it beforehand on the * input. We know the output is always <= than the input length. */ - if (path_len > NAME_MAX) { + if (path_len >= NAME_MAX) { goto end; } ret = sscanf(path, "net%d://", &proto); @@ -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 '/': @@ -102,8 +157,9 @@ int parse_url(const char *path, struct lttng_live_ctx *ctx) } } - if (ctx->port < 0) + if (ctx->port < 0) { ctx->port = LTTNG_DEFAULT_NETWORK_VIEWER_PORT; + } if (strlen(remain[2]) == 0) { printf_verbose("Connecting to hostname : %s, port : %d, " @@ -152,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"); @@ -168,18 +226,22 @@ 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; } - if (ctx->session_ids->len > 0) + if (ctx->session_ids->len > 0) { lttng_live_read(ctx); + } end_free: g_hash_table_destroy(ctx->session->ctf_traces); g_free(ctx->session); g_free(ctx->session->streams); g_free(ctx); + + if (lttng_live_should_quit()) { + ret = 0; + } return ret; }