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 <david.goulet@polymtl.ca>
size_t size;
void *data = NULL;
size_t size;
void *data = NULL;
+ ret = lttng_connect_sessiond();
+ if (ret < 0) {
+ goto end;
+ }
+
lsm.cmd_type = lct;
/* Send command to session daemon */
lsm.cmd_type = lct;
/* Send command to session daemon */
- /* Reset lsm data struct */
+ lttng_disconnect_sessiond();
memset(&lsm, 0, sizeof(lsm));
return ret;
}
memset(&lsm, 0, sizeof(lsm));
return ret;
}
lta = find_app_by_pid(pid);
if (lta == NULL) {
/* App not found */
lta = find_app_by_pid(pid);
if (lta == NULL) {
/* App not found */
+ DBG("Application pid %d not found", pid);
+ DBG("Return code to client %d", ret);
/* Notify client of error */
llm.ret_code = ret;
llm.size_payload = 0;
/* Notify client of error */
llm.ret_code = ret;
llm.size_payload = 0;
/* Variables */
static char *progname;
/* Variables */
static char *progname;
+static char short_uuid[9];
/* Prototypes */
static int process_client_opt(void);
/* Prototypes */
static int process_client_opt(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_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 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);
static int set_signal_handler(void);
static int validate_options(void);
static char *get_cmdline_by_pid(pid_t pid);
- /* 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) {
if (opt_list_apps) {
ret = process_opt_list_apps();
if (ret < 0) {
}
if (opt_session_uuid != NULL) {
}
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) {
}
if (opt_trace_kernel) {
end:
ERR("%s", lttng_get_readable_code(ret));
return ret;
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;
+/*
+ * extract_short_uuid
+ *
+ * Extract shorten uuid and copy it to out.
+ * Shorten uuid format : '<name>.<short_uuid>'
+ */
+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
*
/*
* process_opt_list_sessions
*
static int process_opt_list_sessions(void)
{
int ret, count, i;
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);
struct lttng_session *sess;
count = lttng_list_sessions(&sess);
+ DBG("Session count %d", count);
if (count < 0) {
ret = count;
goto error;
}
if (count < 0) {
ret = count;
goto error;
}
- MSG("Available sessions [Name (uuid)]:");
+ MSG("Available sessions (UUIDs):");
for (i = 0; i < count; i++) {
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);
- MSG("\nTo select a session, use --session UUID.");
+ MSG("\nTo select a session, use -s, --session UUID.");
*/
static int validate_options(void)
{
*/
static int validate_options(void)
{
/* Conflicting command */
if (opt_start_trace && opt_stop_trace) {
ERR("Can't use --start and --stop together.");
/* Conflicting command */
if (opt_start_trace && opt_stop_trace) {
ERR("Can't use --start and --stop together.");
+ if (opt_session_uuid != NULL) {
+ ret = extract_short_uuid(opt_session_uuid, short_uuid);
+ if (ret < 0) {
+ ERR("Session UUID not valid. Must be <name>.<short_uuid>");
+ goto error;
+ }
+ }
+
/*
* clean_exit
*/
void clean_exit(int code)
{
DBG("Clean exit");
/*
* clean_exit
*/
void clean_exit(int code)
{
DBG("Clean exit");
- if (lttng_disconnect_sessiond() < 0) {
- ERR("Session daemon disconnect failed.");
- }