Add ust create trace feature
[lttng-tools.git] / lttng / lttng.c
index 907984370edf7831e4fdb5b0f8a135345d58b357..3878fb8367614654d1e837951c121024803e8366 100644 (file)
@@ -41,6 +41,8 @@ static char *progname;
 /* Prototypes */
 static int process_client_opt(void);
 static int process_opt_list_apps(void);
+static int process_opt_list_sessions(void);
+static int process_opt_create_session(void);
 static void sighandler(int sig);
 static int set_signal_handler(void);
 
@@ -54,6 +56,7 @@ static int set_signal_handler(void);
 static int process_client_opt(void)
 {
        int ret;
+       uuid_t uuid;
 
        /* Connect to the session daemon */
        ret = lttng_connect_sessiond();
@@ -68,6 +71,41 @@ static int process_client_opt(void)
                }
        }
 
+       if (opt_list_session) {
+               ret = process_opt_list_sessions();
+               if (ret < 0) {
+                       goto end;
+               }
+       }
+
+       if (opt_create_session != NULL) {
+               ret = process_opt_create_session();
+               if (ret < 0) {
+                       goto end;
+               }
+       }
+
+       if (opt_destroy_session != NULL) {
+               uuid_parse(opt_destroy_session, uuid);
+               ret = lttng_destroy_session(&uuid);
+               if (ret < 0) {
+                       goto end;
+               }
+       }
+
+       if (opt_session_uuid != NULL) {
+               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);
+               if (ret < 0) {
+                       goto end;
+               }
+               MSG("Trace created successfully!\nUse --start PID to start tracing");
+       }
+
        return 0;
 
 end:
@@ -75,6 +113,63 @@ end:
        return ret;
 }
 
+/*
+ *  process_opt_create_session
+ *
+ *  Create a new session using the name pass
+ *  to the command line.
+ */
+static int process_opt_create_session(void)
+{
+       int ret;
+       uuid_t session_id;
+       char str_uuid[37];
+
+       ret = lttng_create_session(opt_create_session, &session_id);
+       if (ret < 0) {
+               goto error;
+       }
+
+       uuid_unparse(session_id, str_uuid);
+
+       MSG("Session created:");
+       MSG("    %s (%s)", opt_create_session, str_uuid);
+
+error:
+       return ret;
+}
+
+/*
+ *  process_opt_list_sessions
+ *
+ *  Get the list of available sessions from
+ *  the session daemon and print it to user.
+ */
+static int process_opt_list_sessions(void)
+{
+       int ret, count, i;
+       struct lttng_session *sess;
+
+       count = lttng_list_sessions(&sess);
+       if (count < 0) {
+               ret = count;
+               goto error;
+       }
+
+       MSG("Available sessions [Name (uuid)]:");
+       for (i = 0; i < count; i++) {
+               MSG("\tName: %s (uuid: %s)", sess[i].name, sess[i].uuid);
+       }
+
+       free(sess);
+       MSG("\nTo select a session, use --session UUID.");
+
+       return 0;
+
+error:
+       return ret;
+}
+
 /*
  *  process_opt_list_apps
  *
@@ -83,22 +178,24 @@ end:
  */
 static int process_opt_list_apps(void)
 {
-       int i, ret;
+       int i, ret, count;
        pid_t *pids;
        FILE *fp;
        char path[24];  /* Can't go bigger than /proc/65535/cmdline */
        char cmdline[PATH_MAX];
 
-       ret = lttng_ust_list_apps(&pids);
-       if (ret < 0) {
+       count = lttng_ust_list_apps(&pids);
+       if (count < 0) {
+               ret = count;
                goto error;
        }
 
        MSG("LTTng UST traceable application [name (pid)]:");
-       for (i=0; i < ret; i++) {
+       for (i=0; i < count; i++) {
                snprintf(path, sizeof(path), "/proc/%d/cmdline", pids[i]);
                fp = fopen(path, "r");
                if (fp == NULL) {
+                       MSG("\t(not running) (%d)", pids[i]);
                        continue;
                }
                ret = fread(cmdline, 1, sizeof(cmdline), fp);
@@ -131,7 +228,7 @@ static int spawn_sessiond(char *pathname)
                /* Spawn session daemon and tell
                 * it to signal us when ready.
                 */
-               ret = execlp(pathname, "ltt-sessiond", "--sig-parent", NULL);
+               ret = execlp(pathname, "ltt-sessiond", "--sig-parent", "--quiet", NULL);
                if (ret < 0) {
                        if (errno == ENOENT) {
                                ERR("No session daemon found. Use --sessiond-path.");
@@ -180,7 +277,13 @@ static int check_ltt_sessiond(void)
                        pathname = opt_sessiond_path;
                } else {
                        /* Try LTTNG_SESSIOND_PATH env variable */
-                       pathname = strdup(getenv(LTTNG_SESSIOND_PATH_ENV));
+                       pathname = getenv(LTTNG_SESSIOND_PATH_ENV);
+                       if (pathname != NULL) {
+                               /* strdup here in order to make the free()
+                                * not fail later on.
+                                */
+                               pathname = strdup(pathname);
+                       }
                }
 
                /* Let's rock and roll */
@@ -263,6 +366,9 @@ static void sighandler(int sig)
 void clean_exit(int code)
 {
        DBG("Clean exit");
+       if (lttng_disconnect_sessiond() < 0) {
+               ERR("Session daemon disconnect failed.");
+       }
        exit(code);
 }
 
@@ -282,12 +388,12 @@ int main(int argc, char *argv[])
 
        ret = parse_args(argc, (const char **) argv);
        if (ret < 0) {
-               return EXIT_FAILURE;
+               clean_exit(EXIT_FAILURE);
        }
 
        ret = set_signal_handler();
        if (ret < 0) {
-               return ret;
+               clean_exit(ret);
        }
 
        if (opt_tracing_group != NULL) {
@@ -300,7 +406,7 @@ int main(int argc, char *argv[])
                DBG("Kernel tracing activated");
                if (getuid() != 0) {
                        ERR("%s must be setuid root", progname);
-                       return -EPERM;
+                       clean_exit(-EPERM);
                }
        }
 
@@ -308,13 +414,15 @@ int main(int argc, char *argv[])
         * If no, a daemon will be spawned.
         */
        if (opt_no_sessiond == 0 && (check_ltt_sessiond() < 0)) {
-               return EXIT_FAILURE;
+               clean_exit(EXIT_FAILURE);
        }
 
        ret = process_client_opt();
        if (ret < 0) {
-               return ret;
+               clean_exit(ret);
        }
 
+       clean_exit(0);
+
        return 0;
 }
This page took 0.025563 seconds and 4 git commands to generate.