X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fnetwork-live.c;h=955c10455af662746a00ac8c5bd2353af2fad740;hp=278e8aa1c8a0569f7618fce1b35db0cc27dd97bb;hb=54645d5cab414bb3391837ef7acb919cf106c71f;hpb=0c445945a528a554dda28a7dbf471853e09eaa17 diff --git a/src/network-live.c b/src/network-live.c index 278e8aa..955c104 100644 --- a/src/network-live.c +++ b/src/network-live.c @@ -36,7 +36,7 @@ #include "lttng-viewer-abi.h" #include "network-live.h" -#include "liblttng-live.h" +#include "lttng-live-comm.h" #include #include @@ -51,22 +51,74 @@ #include #include +static volatile int should_quit; + +int lttng_live_should_quit(void) +{ + return should_quit; +} + +#if 0 +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; +} +#endif + /* * hostname parameter needs to hold NAME_MAX chars. */ -static int parse_url(const char *path, char *hostname, int *port, - uint64_t *session_id) +static +int parse_url(const char *path, struct lttng_live_ctx *ctx) { - char remain[2][NAME_MAX]; + 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,25 +136,28 @@ static int parse_url(const char *path, char *hostname, int *port, /* TODO : parse for IPv6 as well */ /* Parse the hostname or IP */ ret = sscanf(&path[proto_offset], "%[a-zA-Z.0-9%-]%s", - hostname, remain[0]); + ctx->relay_hostname, remain[0]); if (ret == 2) { /* Optional port number */ switch (remain[0][0]) { case ':': - ret = sscanf(remain[0], ":%d%s", port, remain[1]); + ret = sscanf(remain[0], ":%d%s", &ctx->port, remain[1]); /* Optional session ID with port number */ if (ret == 2) { - ret = sscanf(remain[1], "/%" PRIu64, - session_id); + ret = sscanf(remain[1], "/%s", remain[2]); /* Accept 0 or 1 (optional) */ if (ret < 0) { goto end; } + } else if (ret == 0) { + fprintf(stderr, "[error] Missing port number after delimitor ':'\n"); + ret = -1; + goto end; } break; case '/': /* Optional session ID */ - ret = sscanf(remain[0], "/%" PRIu64, session_id); + ret = sscanf(remain[0], "/%s", remain[2]); /* Accept 0 or 1 (optional) */ if (ret < 0) { goto end; @@ -116,17 +171,30 @@ static int parse_url(const char *path, char *hostname, int *port, } } - if (*port < 0) - *port = LTTNG_DEFAULT_NETWORK_VIEWER_PORT; + if (ctx->port < 0) { + ctx->port = LTTNG_DEFAULT_NETWORK_VIEWER_PORT; + } - if (*session_id == -1ULL) + if (strlen(remain[2]) == 0) { printf_verbose("Connecting to hostname : %s, port : %d, " "proto : IPv%d\n", - hostname, *port, proto); - else - printf_verbose("Connecting to hostname : %s, port : %d, " - "session id : %" PRIu64 ", proto : IPv%d\n", - hostname, *port, *session_id, proto); + ctx->relay_hostname, ctx->port, proto); + ret = 0; + goto end; + } + ret = sscanf(remain[2], "host/%[a-zA-Z.0-9%-]/%s", + ctx->traced_hostname, ctx->session_name); + if (ret != 2) { + fprintf(stderr, "[error] Format : " + "net:///host//\n"); + goto end; + } + + printf_verbose("Connecting to hostname : %s, port : %d, " + "traced hostname : %s, session name : %s, " + "proto : IPv%d\n", + ctx->relay_hostname, ctx->port, ctx->traced_hostname, + ctx->session_name, proto); ret = 0; end: @@ -135,53 +203,61 @@ end: static int lttng_live_open_trace_read(const char *path) { - char hostname[NAME_MAX]; - int port = -1; - uint64_t session_id = -1ULL; int ret = 0; - struct lttng_live_ctx ctx; + struct lttng_live_ctx *ctx; - ctx.session = g_new0(struct lttng_live_session, 1); + ctx = g_new0(struct lttng_live_ctx, 1); + ctx->session = g_new0(struct lttng_live_session, 1); /* We need a pointer to the context from the packet_seek function. */ - ctx.session->ctx = &ctx; + ctx->session->ctx = ctx; /* HT to store the CTF traces. */ - ctx.session->ctf_traces = g_hash_table_new(g_direct_hash, + ctx->session->ctf_traces = g_hash_table_new(g_direct_hash, g_direct_equal); + ctx->port = -1; + ctx->session_ids = g_array_new(FALSE, TRUE, sizeof(uint64_t)); - ret = parse_url(path, hostname, &port, &session_id); + ret = parse_url(path, ctx); if (ret < 0) { goto end_free; } - - ret = lttng_live_connect_viewer(&ctx, hostname, port); +#if 0 + ret = setup_sighandler(); + if (ret < 0) { + goto end_free; + } +#endif + 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"); - ret = lttng_live_establish_connection(&ctx); + ret = lttng_live_establish_connection(ctx); if (ret < 0) { goto end_free; } - if (session_id == -1ULL) { - printf_verbose("Listing sessions\n"); - ret = lttng_live_list_sessions(&ctx, path); - if (ret < 0) { - fprintf(stderr, "[error] List error\n"); - goto end_free; - } - } else { - lttng_live_read(&ctx, session_id); + printf_verbose("Listing sessions\n"); + ret = lttng_live_list_sessions(ctx, path); + if (ret < 0) { + goto end_free; + } + + if (ctx->session_ids->len > 0) { + ret = lttng_live_read(ctx); } end_free: - g_hash_table_destroy(ctx.session->ctf_traces); - g_free(ctx.session); - g_free(ctx.session->streams); + 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; } @@ -208,7 +284,9 @@ struct bt_trace_descriptor *lttng_live_open_trace(const char *path, int flags, pos->parent.rw_table = NULL; pos->parent.event_cb = NULL; pos->parent.trace = &pos->trace_descriptor; - lttng_live_open_trace_read(path); + if (lttng_live_open_trace_read(path) < 0) { + goto error; + } return &pos->trace_descriptor; error: