From: David Goulet Date: Wed, 4 May 2011 16:26:03 +0000 (-0400) Subject: Add support for shorten session uuid X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=7442b2ba0c15bf9c950b96a19e948243c2b57683;p=lttng-tools.git Add support for shorten session uuid Session are now identified by name.short_uuid where short_uuid is the first 8 bytes of the 36 bytes uuid. Also, fix the bug where you could'nt pass two command to the session daemon from liblttngctl. The connect and disconnect is added to the ask_sessiond function. So, on every command, a connect and close is done. Signed-off-by: David Goulet --- diff --git a/liblttngctl/liblttngctl.c b/liblttngctl/liblttngctl.c index 76bdf5ffd..adff646e1 100644 --- a/liblttngctl/liblttngctl.c +++ b/liblttngctl/liblttngctl.c @@ -111,6 +111,11 @@ static int ask_sessiond(enum lttcomm_command_type lct, void **buf) size_t size; void *data = NULL; + ret = lttng_connect_sessiond(); + if (ret < 0) { + goto end; + } + lsm.cmd_type = lct; /* Send command to session daemon */ @@ -148,7 +153,7 @@ static int ask_sessiond(enum lttcomm_command_type lct, void **buf) ret = size; end: - /* Reset lsm data struct */ + lttng_disconnect_sessiond(); memset(&lsm, 0, sizeof(lsm)); return ret; } diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 2fd622299..241a1cffd 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -242,6 +242,7 @@ static int connect_app(pid_t pid) lta = find_app_by_pid(pid); if (lta == NULL) { /* App not found */ + DBG("Application pid %d not found", pid); return -1; } @@ -645,6 +646,7 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) return ret; end: + DBG("Return code to client %d", ret); /* Notify client of error */ llm.ret_code = ret; llm.size_payload = 0; diff --git a/lttng/lttng.c b/lttng/lttng.c index a5569c9af..3c3747de1 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -37,6 +37,7 @@ /* Variables */ static char *progname; +static char short_uuid[9]; /* Prototypes */ static int process_client_opt(void); @@ -44,7 +45,9 @@ static int process_opt_list_apps(void); static int process_opt_list_sessions(void); static int process_opt_list_traces(void); static int process_opt_create_session(void); +static int process_opt_session_uuid(void); static void sighandler(int sig); +static void shorten_uuid(char *in, char *out); static int set_signal_handler(void); static int validate_options(void); static char *get_cmdline_by_pid(pid_t pid); @@ -61,12 +64,6 @@ static int process_client_opt(void) int ret; uuid_t uuid; - /* Connect to the session daemon */ - ret = lttng_connect_sessiond(); - if (ret < 0) { - goto end; - } - if (opt_list_apps) { ret = process_opt_list_apps(); if (ret < 0) { @@ -104,8 +101,12 @@ static int process_client_opt(void) } if (opt_session_uuid != NULL) { - DBG("Set session uuid to %s", opt_session_uuid); - lttng_set_current_session_uuid(opt_session_uuid); + DBG("Set session uuid to %s", short_uuid); + ret = process_opt_session_uuid(); + if (ret < 0) { + ERR("Session UUID %s not found", opt_session_uuid); + goto error; + } } if (opt_trace_kernel) { @@ -146,6 +147,41 @@ static int process_client_opt(void) end: ERR("%s", lttng_get_readable_code(ret)); return ret; + +error: + return ret; +} + +/* + * process_opt_session_uuid + * + * Set current session uuid to the current flow of + * command(s) using the already shorten uuid. + */ +static int process_opt_session_uuid(void) +{ + int ret, count, i; + struct lttng_session *sessions; + + count = lttng_list_sessions(&sessions); + if (count < 0) { + ret = count; + goto error; + } + + for (i = 0; i < count; i++) { + if (strncmp(sessions[i].uuid, short_uuid, 8) == 0) { + lttng_set_current_session_uuid(sessions[i].uuid); + break; + } + } + + free(sessions); + + return 0; + +error: + return ret; } /* @@ -215,6 +251,38 @@ error: return ret; } +/* + * extract_short_uuid + * + * Extract shorten uuid and copy it to out. + * Shorten uuid format : '.' + */ +static int extract_short_uuid(char *in, char *out) +{ + char *tok; + + tok = strchr(in, '.'); + if (strlen(tok+1) == 8) { + memcpy(out, tok+1, 8); + out[9] = '\0'; + return 0; + } + + return -1; +} + +/* + * shorten_uuid + * + * Small function to shorten the 37 bytes long uuid_t + * string representation to 8 characters. + */ +static void shorten_uuid(char *in, char *out) +{ + memcpy(out, in, 8); + out[8] = '\0'; +} + /* * process_opt_list_sessions * @@ -224,21 +292,24 @@ error: static int process_opt_list_sessions(void) { int ret, count, i; + char tmp_short_uuid[9]; struct lttng_session *sess; count = lttng_list_sessions(&sess); + DBG("Session count %d", count); if (count < 0) { ret = count; goto error; } - MSG("Available sessions [Name (uuid)]:"); + MSG("Available sessions (UUIDs):"); for (i = 0; i < count; i++) { - MSG("\tName: %s (uuid: %s)", sess[i].name, sess[i].uuid); + shorten_uuid(sess[i].uuid, tmp_short_uuid); + MSG(" %d) %s.%s", i+1, sess[i].name, tmp_short_uuid); } free(sess); - MSG("\nTo select a session, use --session UUID."); + MSG("\nTo select a session, use -s, --session UUID."); return 0; @@ -326,6 +397,8 @@ end: */ static int validate_options(void) { + int ret; + /* Conflicting command */ if (opt_start_trace && opt_stop_trace) { ERR("Can't use --start and --stop together."); @@ -342,6 +415,14 @@ static int validate_options(void) goto error; } + if (opt_session_uuid != NULL) { + ret = extract_short_uuid(opt_session_uuid, short_uuid); + if (ret < 0) { + ERR("Session UUID not valid. Must be ."); + goto error; + } + } + return 0; error: @@ -498,15 +579,13 @@ static void sighandler(int sig) return; } + /* * clean_exit */ void clean_exit(int code) { DBG("Clean exit"); - if (lttng_disconnect_sessiond() < 0) { - ERR("Session daemon disconnect failed."); - } exit(code); }