Fix not NULL pointer on size 0
[lttng-tools.git] / lttng / commands / list.c
index 3c779c3a3444bfcc42dabd26a8236435cd191a7b..50dad9a2b4efc3aa57cb747c72820cea36773add 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 
 #include "../cmd.h"
 
@@ -39,6 +40,8 @@ enum {
        OPT_HELP = 1,
 };
 
+static struct lttng_handle *handle;
+
 static struct poptOption long_options[] = {
        /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
        {"help",      'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
@@ -113,13 +116,10 @@ static int list_kernel_events(void)
 {
        int i, size;
        struct lttng_event *event_list;
-       struct lttng_domain dom;
 
        DBG("Getting all tracing events");
 
-       dom.type = LTTNG_DOMAIN_KERNEL;
-
-       size = lttng_list_tracepoints(&dom, &event_list);
+       size = lttng_list_tracepoints(handle, &event_list);
        if (size < 0) {
                ERR("Unable to list kernel events");
                return size;
@@ -139,13 +139,12 @@ static int list_kernel_events(void)
 /*
  * List events of channel of session and domain.
  */
-static int list_events(struct lttng_domain *dom,
-               const char *session_name, const char *channel_name)
+static int list_events(const char *channel_name)
 {
        int ret, count, i;
        struct lttng_event *events = NULL;
 
-       count = lttng_list_events(dom, session_name, channel_name, &events);
+       count = lttng_list_events(handle, channel_name, &events);
        if (count < 0) {
                ret = count;
                goto error;
@@ -179,6 +178,18 @@ static int list_events(struct lttng_domain *dom,
                                                events[i].name, events[i].enabled);
                                MSG("%ssymbol: \"%s\"", indent8, events[i].attr.ftrace.symbol_name);
                                break;
+                       case LTTNG_EVENT_SYSCALL:
+                               MSG("%s (type: syscall) [enabled: %d]", indent6,
+                                               events[i].enabled);
+                               break;
+                       case LTTNG_EVENT_NOOP:
+                               MSG("%s (type: noop) [enabled: %d]", indent6,
+                                               events[i].enabled);
+                               break;
+                       case LTTNG_EVENT_ALL:
+                               /* We should never have "all" events in list. */
+                               assert(0);
+                               break;
                }
        }
 
@@ -222,8 +233,7 @@ static void print_channel(struct lttng_channel *channel)
  *
  * If channel_name is NULL, all channels are listed.
  */
-static int list_channels(struct lttng_domain *dom,
-               const char *session_name, const char *channel_name)
+static int list_channels(const char *channel_name)
 {
        int count, i, ret = CMD_SUCCESS;
        unsigned int chan_found = 0;
@@ -231,7 +241,7 @@ static int list_channels(struct lttng_domain *dom,
 
        DBG("Listing channel(s) (%s)", channel_name);
 
-       count = lttng_list_channels(dom, session_name, &channels);
+       count = lttng_list_channels(handle, &channels);
        if (count < 0) {
                ret = count;
                goto error;
@@ -255,9 +265,9 @@ static int list_channels(struct lttng_domain *dom,
                print_channel(&channels[i]);
 
                /* Listing events per channel */
-               ret = list_events(dom, session_name, channels[i].name);
+               ret = list_events(channels[i].name);
                if (ret < 0) {
-                       MSG("%s", lttng_get_readable_code(ret));
+                       MSG("%s", lttng_strerror(ret));
                }
 
                if (chan_found) {
@@ -307,6 +317,7 @@ static int list_sessions(const char *session_name)
                                MSG("%sTrace path: %s\n", indent4, sessions[i].path);
                                break;
                        }
+                       continue;
                }
 
                MSG("  %d) %s (%s)", i + 1, sessions[i].name, sessions[i].path);
@@ -323,7 +334,7 @@ static int list_sessions(const char *session_name)
        }
 
        if (session_name == NULL) {
-               MSG("\nUse lttng list -s <session_name> for a detail listing");
+               MSG("\nUse lttng list <session_name> for more details");
        }
 
        return CMD_SUCCESS;
@@ -335,14 +346,14 @@ error:
 /*
  * List available domain(s) for a session.
  */
-static int list_domains(const char *session_name)
+static int list_domains(void)
 {
        int i, count, ret = CMD_SUCCESS;
        struct lttng_domain *domains = NULL;
 
        MSG("Domains:\n-------------");
 
-       count = lttng_list_domains(session_name, &domains);
+       count = lttng_list_domains(handle, &domains);
        if (count < 0) {
                ret = count;
                goto error;
@@ -406,6 +417,15 @@ int cmd_list(int argc, const char **argv)
        session_name = poptGetArg(pc);
        DBG("Session name: %s", session_name);
 
+       if (opt_kernel) {
+               domain.type = LTTNG_DOMAIN_KERNEL;
+       }
+
+       handle = lttng_create_handle(session_name, &domain);
+       if (handle == NULL) {
+               goto end;
+       }
+
        if (session_name == NULL) {
                if (opt_kernel) {
                        ret = list_kernel_events();
@@ -427,14 +447,13 @@ int cmd_list(int argc, const char **argv)
 
                /* Domain listing */
                if (opt_domain) {
-                       ret = list_domains(session_name);
+                       ret = list_domains();
                        goto end;
                }
 
                if (opt_kernel) {
-                       domain.type = LTTNG_DOMAIN_KERNEL;
                        /* Channel listing */
-                       ret = list_channels(&domain, session_name, opt_channel);
+                       ret = list_channels(opt_channel);
                        if (ret < 0) {
                                goto end;
                        }
@@ -442,7 +461,7 @@ int cmd_list(int argc, const char **argv)
                        /* TODO: Userspace domain */
                } else {
                        /* We want all domain(s) */
-                       ret = lttng_list_domains(session_name, &domains);
+                       ret = lttng_list_domains(handle, &domains);
                        if (ret < 0) {
                                goto end;
                        }
@@ -457,7 +476,15 @@ int cmd_list(int argc, const char **argv)
                                        break;
                                }
 
-                               ret = list_channels(&domains[i], session_name, opt_channel);
+                               /* Clean handle before creating a new one */
+                               lttng_destroy_handle(handle);
+
+                               handle = lttng_create_handle(session_name, &domains[i]);
+                               if (handle == NULL) {
+                                       goto end;
+                               }
+
+                               ret = list_channels(opt_channel);
                                if (ret < 0) {
                                        goto end;
                                }
@@ -469,5 +496,7 @@ end:
        if (domains) {
                free(domains);
        }
+       lttng_destroy_handle(handle);
+
        return ret;
 }
This page took 0.02658 seconds and 5 git commands to generate.