Add support for shorten session uuid
[lttng-tools.git] / lttng / lttng.c
index 8a0d58faeaa8ac7ec7299a7a633d9ada73e8e513..3c3747de1f002a971ab64794f4a6f8ffe68a8036 100644 (file)
 #include <sys/wait.h>
 #include <unistd.h>
 
-#include <lttng/liblttngctl.h>
+#include <lttng/lttng.h>
 
 #include "lttng.h"
 #include "lttngerr.h"
 
 /* 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,35 +101,45 @@ 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);
-       }
-
-       if (opt_create_trace) {
-               DBG("Create trace for pid %d", opt_create_trace);
-               ret = lttng_ust_create_trace(opt_create_trace);
+               DBG("Set session uuid to %s", short_uuid);
+               ret = process_opt_session_uuid();
                if (ret < 0) {
-                       goto end;
+                       ERR("Session UUID %s not found", opt_session_uuid);
+                       goto error;
                }
-               MSG("Trace created successfully!\nUse --start PID to start tracing.");
        }
 
-       if (opt_start_trace) {
-               DBG("Start trace for pid %d", opt_start_trace);
-               ret = lttng_ust_start_trace(opt_start_trace);
-               if (ret < 0) {
-                       goto end;
-               }
-               MSG("Trace started successfully!");
+       if (opt_trace_kernel) {
+               ERR("Not implemented yet");
+               goto end;
        }
 
-       if (opt_stop_trace) {
-               DBG("Stop trace for pid %d", opt_stop_trace);
-               ret = lttng_ust_stop_trace(opt_stop_trace);
-               if (ret < 0) {
-                       goto end;
+       if (opt_trace_pid != 0) {
+               if (opt_create_trace) {
+                       DBG("Create a userspace trace for pid %d", opt_trace_pid);
+                       ret = lttng_ust_create_trace(opt_trace_pid);
+                       if (ret < 0) {
+                               goto end;
+                       }
+                       MSG("Trace created successfully!\nUse --start to start tracing.");
+               }
+
+               if (opt_start_trace) {
+                       DBG("Start trace for pid %d", opt_trace_pid);
+                       ret = lttng_ust_start_trace(opt_trace_pid);
+                       if (ret < 0) {
+                               goto end;
+                       }
+                       MSG("Trace started successfully!");
+               } else if (opt_stop_trace) {
+                       DBG("Stop trace for pid %d", opt_trace_pid);
+                       ret = lttng_ust_stop_trace(opt_trace_pid);
+                       if (ret < 0) {
+                               goto end;
+                       }
+                       MSG("Trace stopped successfully!");
                }
-               MSG("Trace stopped successfully!");
+
        }
 
        return 0;
@@ -140,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;
 }
 
 /*
@@ -209,6 +251,38 @@ 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
  *
@@ -218,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;
 
@@ -320,10 +397,30 @@ end:
  */
 static int validate_options(void)
 {
-       if ((opt_session_uuid == NULL) &&
-                       (opt_create_trace || opt_start_trace || opt_list_traces)) {
+       int ret;
+
+       /* Conflicting command */
+       if (opt_start_trace && opt_stop_trace) {
+               ERR("Can't use --start and --stop together.");
+               goto error;
+       /* Must have a session UUID for trace action. */
+       } else if ((opt_session_uuid == NULL) &&
+                       (opt_create_trace || opt_start_trace || opt_stop_trace || opt_list_traces)) {
                ERR("You need to specify a session UUID.\nPlease use --session UUID to do so.");
                goto error;
+       /* If no PID specified and trace_kernel is off */
+       } else if ((opt_trace_pid == 0 && opt_trace_kernel == 0) &&
+                       (opt_create_trace || opt_start_trace || opt_stop_trace)) {
+               ERR("Please specify a PID using -p, --pid PID.");
+               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 <name>.<short_uuid>");
+                       goto error;
+               }
        }
 
        return 0;
@@ -482,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);
 }
 
This page took 0.025911 seconds and 4 git commands to generate.