lttng-view: make babeltrace2 the default viewer
[lttng-tools.git] / src / bin / lttng / commands / view.c
index 8e63a8997837079f2ef97a00ea9cfbe985f4a167..3e2ce40ef1591c05143f7b8928427b7dd0da7da9 100644 (file)
@@ -30,7 +30,7 @@ static char *opt_session_name;
 static char *opt_viewer;
 static char *opt_trace_path;
 static const char *babeltrace_bin = CONFIG_BABELTRACE_BIN;
-//static const char *lttv_gui_bin = CONFIG_LTTV_GUI_BIN;
+static const char *babeltrace2_bin = CONFIG_BABELTRACE2_BIN;
 
 #ifdef LTTNG_EMBED_HELP
 static const char help_msg[] =
@@ -56,7 +56,7 @@ static struct poptOption long_options[] = {
  * This is needed for each viewer since we are using execvp().
  */
 static const char *babeltrace_opts[] = { "babeltrace" };
-//static const char *lttv_gui_opts[] = { "lttv-gui", "-t", };
+static const char *babeltrace2_opts[] = { "babeltrace2" };
 
 /*
  * Type is also use as the index in the viewers array. So please, make sure
@@ -64,7 +64,7 @@ static const char *babeltrace_opts[] = { "babeltrace" };
  */
 enum viewer_type {
        VIEWER_BABELTRACE    = 0,
-       VIEWER_LTTV_GUI      = 1,
+       VIEWER_BABELTRACE2   = 1,
        VIEWER_USER_DEFINED  = 2,
 };
 
@@ -72,23 +72,23 @@ enum viewer_type {
  * NOTE: "lttv" is a shell command and it's not working for exec() family
  * functions so we might think of removing this wrapper or using bash.
  */
-static struct viewers {
+static const struct viewers {
        const char *exec_name;
        enum viewer_type type;
 } viewers[] = {
        { "babeltrace", VIEWER_BABELTRACE },
-       { "lttv-gui", VIEWER_LTTV_GUI },
+       { "babeltrace2", VIEWER_BABELTRACE2 },
        { NULL, VIEWER_USER_DEFINED },
 };
 
 /* Is the session we are trying to view is in live mode. */
 static int session_live_mode;
 
-static struct viewers *parse_options(void)
+static const struct viewers *parse_options(void)
 {
        if (opt_viewer == NULL) {
                /* Default is babeltrace */
-               return &(viewers[VIEWER_BABELTRACE]);
+               return &(viewers[VIEWER_BABELTRACE2]);
        }
 
        /*
@@ -169,7 +169,6 @@ static char **alloc_argv_from_local_opts(const char **opts, size_t opts_len,
        char **argv;
        size_t size, mem_len;
 
-
        /* Add one for the NULL terminating element. */
        mem_len = opts_len + 1;
        if (session_live_mode) {
@@ -212,7 +211,7 @@ static int spawn_viewer(const char *trace_path)
        int ret = 0;
        struct stat status;
        const char *viewer_bin = NULL;
-       struct viewers *viewer;
+       const struct viewers *viewer;
        char **argv = NULL;
 
        /* Check for --viewer options */
@@ -222,7 +221,17 @@ static int spawn_viewer(const char *trace_path)
                goto error;
        }
 
+retry_viewer:
        switch (viewer->type) {
+       case VIEWER_BABELTRACE2:
+               if (stat(babeltrace2_bin, &status) == 0) {
+                       viewer_bin = babeltrace2_bin;
+               } else {
+                       viewer_bin = viewer->exec_name;
+               }
+               argv = alloc_argv_from_local_opts(babeltrace2_opts,
+                               ARRAY_SIZE(babeltrace2_opts), trace_path);
+               break;
        case VIEWER_BABELTRACE:
                if (stat(babeltrace_bin, &status) == 0) {
                        viewer_bin = babeltrace_bin;
@@ -254,10 +263,20 @@ static int spawn_viewer(const char *trace_path)
 
        ret = execvp(viewer_bin, argv);
        if (ret) {
-               if (errno == ENOENT) {
-                       ERR("%s not found on the system", viewer_bin);
+               if (errno == ENOENT && viewer->exec_name) {
+                       if (viewer->type == VIEWER_BABELTRACE2) {
+                               /* Fallback to legacy babeltrace. */
+                               DBG("babeltrace2 not installed on the system, falling back to babeltrace 1.x");
+                               viewer = &viewers[VIEWER_BABELTRACE];
+                               free(argv);
+                               argv = NULL;
+                               goto retry_viewer;
+                       } else {
+                               ERR("Viewer \"%s\" not found on the system",
+                                               viewer_bin);
+                       }
                } else {
-                       PERROR("exec: %s", viewer_bin);
+                       PERROR("Failed to launch \"%s\" viewer", viewer_bin);
                }
                ret = CMD_FATAL;
                goto error;
This page took 0.026389 seconds and 5 git commands to generate.