Fix: initialize the cur_event variable before using it
[lttng-tools.git] / src / bin / lttng / commands / list.c
index 96ccdb039e53ef2d9e84609c75f087f7243f2480..796a01784ac9d9dd0f7c32cc80a760fe67141518 100644 (file)
@@ -24,6 +24,7 @@
 #include <assert.h>
 
 #include <common/mi-lttng.h>
+#include <lttng/constant.h>
 
 #include "../command.h"
 
@@ -34,6 +35,7 @@ static int opt_log4j;
 static char *opt_channel;
 static int opt_domain;
 static int opt_fields;
+static int opt_syscall;
 #if 0
 /* Not implemented yet */
 static char *opt_cmd_name;
@@ -69,6 +71,7 @@ static struct poptOption long_options[] = {
        {"channel",   'c', POPT_ARG_STRING, &opt_channel, 0, 0, 0},
        {"domain",    'd', POPT_ARG_VAL, &opt_domain, 1, 0, 0},
        {"fields",    'f', POPT_ARG_VAL, &opt_fields, 1, 0, 0},
+       {"syscall",   'S', POPT_ARG_VAL, &opt_syscall, 1, 0, 0},
        {"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL},
        {0, 0, 0, 0, 0, 0, 0}
 };
@@ -90,7 +93,9 @@ static void usage(FILE *ofp)
        fprintf(ofp, "  -k, --kernel            Select kernel domain\n");
        fprintf(ofp, "  -u, --userspace         Select user-space domain.\n");
        fprintf(ofp, "  -j, --jul               Apply for Java application using JUL\n");
+       fprintf(ofp, "  -l, --log4j             Apply for Java application using LOG4J\n");
        fprintf(ofp, "  -f, --fields            List event fields.\n");
+       fprintf(ofp, "      --syscall           List available system calls.\n");
 #if 0
        fprintf(ofp, "  -p, --pid PID           List user-space events by PID\n");
 #endif
@@ -110,9 +115,10 @@ static void usage(FILE *ofp)
 static char *get_cmdline_by_pid(pid_t pid)
 {
        int ret;
-       FILE *fp;
+       FILE *fp = NULL;
        char *cmdline = NULL;
-       char path[20];  /* Can't go bigger than /proc/65535/cmdline */
+       /* Can't go bigger than /proc/LTTNG_MAX_PID/cmdline */
+       char path[sizeof("/proc//cmdline") + sizeof(LTTNG_MAX_PID_STR) - 1];
 
        snprintf(path, sizeof(path), "/proc/%d/cmdline", pid);
        fp = fopen(path, "r");
@@ -121,7 +127,7 @@ static char *get_cmdline_by_pid(pid_t pid)
        }
 
        /* Caller must free() *cmdline */
-       cmdline = malloc(PATH_MAX);
+       cmdline = zmalloc(PATH_MAX);
        if (!cmdline) {
                perror("malloc cmdline");
                goto end;
@@ -130,9 +136,11 @@ static char *get_cmdline_by_pid(pid_t pid)
        if (ret < 0) {
                perror("fread proc list");
        }
-       fclose(fp);
 
 end:
+       if (fp) {
+               fclose(fp);
+       }
        return cmdline;
 }
 
@@ -200,6 +208,21 @@ static const char *logleveltype_string(enum lttng_loglevel_type value)
        }
 }
 
+static const char *bitness_event(enum lttng_event_flag flags)
+{
+       if (flags & LTTNG_EVENT_FLAG_SYSCALL_32) {
+               if (flags & LTTNG_EVENT_FLAG_SYSCALL_64) {
+                       return " [32/64-bit]";
+               } else {
+                       return " [32-bit]";
+               }
+       } else if (flags & LTTNG_EVENT_FLAG_SYSCALL_64) {
+               return " [64-bit]";
+       } else {
+               return "";
+       }
+}
+
 /*
  * Pretty print single event.
  */
@@ -213,7 +236,7 @@ static void print_events(struct lttng_event *event)
                                indent6,
                                event->name,
                                logleveltype_string(event->loglevel_type),
-                               mi_lttng_loglevel_string(event->loglevel),
+                               mi_lttng_loglevel_string(event->loglevel, handle->domain.type),
                                event->loglevel,
                                enabled_string(event->enabled),
                                exclusion_string(event->exclusion),
@@ -257,9 +280,10 @@ static void print_events(struct lttng_event *event)
                MSG("%ssymbol: \"%s\"", indent8, event->attr.ftrace.symbol_name);
                break;
        case LTTNG_EVENT_SYSCALL:
-               MSG("%ssyscalls (type: syscall)%s%s", indent6,
+               MSG("%s%s%s%s%s", indent6, event->name,
+                               (opt_syscall ? "" : " (type:syscall)"),
                                enabled_string(event->enabled),
-                               filter_string(event->filter));
+                               bitness_event(event->flags));
                break;
        case LTTNG_EVENT_NOOP:
                MSG("%s (type: noop)%s%s", indent6,
@@ -369,7 +393,7 @@ static int mi_list_agent_ust_events(struct lttng_event *events, int count,
                }
 
                /* Write an event */
-               ret = mi_lttng_event(writer, &events[i], 0);
+               ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type);
                if (ret) {
                        goto end;
                }
@@ -394,8 +418,8 @@ static int list_agent_events(void)
 {
        int i, size, ret = CMD_SUCCESS;
        struct lttng_domain domain;
-       struct lttng_handle *handle;
-       struct lttng_event *event_list;
+       struct lttng_handle *handle = NULL;
+       struct lttng_event *event_list = NULL;
        pid_t cur_pid = 0;
        char *cmdline = NULL;
        const char *agent_domain_str;
@@ -405,6 +429,10 @@ static int list_agent_events(void)
                domain.type = LTTNG_DOMAIN_JUL;
        } else if (opt_log4j) {
                domain.type = LTTNG_DOMAIN_LOG4J;
+       } else {
+               ERR("Invalid agent domain selected.");
+               ret = CMD_ERROR;
+               goto error;
        }
 
        agent_domain_str = get_domain_str(domain.type);
@@ -473,7 +501,7 @@ static int list_ust_events(void)
        int i, size, ret = CMD_SUCCESS;
        struct lttng_domain domain;
        struct lttng_handle *handle;
-       struct lttng_event *event_list;
+       struct lttng_event *event_list = NULL;
        pid_t cur_pid = 0;
        char *cmdline = NULL;
 
@@ -545,6 +573,8 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count,
        int event_element_open = 0;
        struct lttng_event cur_event;
 
+       memset(&cur_event, 0, sizeof(cur_event));
+
        /* Open domains element */
        ret = mi_lttng_domains_open(writer);
        if (ret) {
@@ -619,7 +649,8 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count,
 
                        if (!event_element_open) {
                                /* Open and write the event */
-                               ret = mi_lttng_event(writer, &cur_event, 1);
+                               ret = mi_lttng_event(writer, &cur_event, 1,
+                                               handle->domain.type);
                                if (ret) {
                                        goto end;
                                }
@@ -757,7 +788,7 @@ static int mi_list_kernel_events(struct lttng_event *events, int count,
        }
 
        for (i = 0; i < count; i++) {
-               ret = mi_lttng_event(writer, &events[i], 0);
+               ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type);
                if (ret) {
                        goto end;
                }
@@ -830,6 +861,79 @@ error:
        return ret;
 }
 
+/*
+ * Machine interface
+ * Print a list of system calls.
+ */
+static int mi_list_syscalls(struct lttng_event *events, int count)
+{
+       int ret, i;
+
+       /* Open events */
+       ret = mi_lttng_events_open(writer);
+       if (ret) {
+               goto end;
+       }
+
+       for (i = 0; i < count; i++) {
+               ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type);
+               if (ret) {
+                       goto end;
+               }
+       }
+
+       /* Close events. */
+       ret = mi_lttng_writer_close_element(writer);
+       if (ret) {
+               goto end;
+       }
+
+end:
+       return ret;
+}
+
+/*
+ * Ask for kernel system calls.
+ */
+static int list_syscalls(void)
+{
+       int i, size, ret = CMD_SUCCESS;
+       struct lttng_event *event_list;
+
+       DBG("Getting kernel system call events");
+
+       size = lttng_list_syscalls(&event_list);
+       if (size < 0) {
+               ERR("Unable to list system calls: %s", lttng_strerror(size));
+               ret = CMD_ERROR;
+               goto error;
+       }
+
+       if (lttng_opt_mi) {
+               /* Mi print */
+               ret = mi_list_syscalls(event_list, size);
+               if (ret) {
+                       ret = CMD_ERROR;
+                       goto end;
+               }
+       } else {
+               MSG("System calls:\n-------------");
+
+               for (i = 0; i < size; i++) {
+                       print_events(&event_list[i]);
+               }
+
+               MSG("");
+       }
+
+end:
+       free(event_list);
+       return ret;
+
+error:
+       return ret;
+}
+
 /*
  * Machine Interface
  * Print a list of agent events
@@ -845,7 +949,7 @@ static int mi_list_session_agent_events(struct lttng_event *events, int count)
        }
 
        for (i = 0; i < count; i++) {
-               ret = mi_lttng_event(writer, &events[i], 0);
+               ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type);
                if (ret) {
                        goto end;
                }
@@ -894,7 +998,8 @@ static int list_session_agent_events(void)
                        MSG("%s- %s%s (loglevel%s %s)", indent4, events[i].name,
                                        enabled_string(events[i].enabled),
                                        logleveltype_string(events[i].loglevel_type),
-                                       mi_lttng_loglevel_string(events[i].loglevel));
+                                       mi_lttng_loglevel_string(events[i].loglevel,
+                                               handle->domain.type));
                }
 
                MSG("");
@@ -921,7 +1026,7 @@ static int mi_list_events(struct lttng_event *events, int count)
        }
 
        for (i = 0; i < count; i++) {
-               ret = mi_lttng_event(writer, &events[i], 0);
+               ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type);
                if (ret) {
                        goto end;
                }
@@ -1105,7 +1210,7 @@ static int list_channels(const char *channel_name)
                }
        } else {
                /* Pretty print */
-               if (channel_name == NULL) {
+               if (count) {
                        MSG("Channels:\n-------------");
                }
 
@@ -1466,6 +1571,12 @@ int cmd_list(int argc, const char **argv)
                domain.type = LTTNG_DOMAIN_LOG4J;
        }
 
+       if (!opt_kernel && opt_syscall) {
+               WARN("--syscall will only work with the Kernel domain (-k)");
+               ret = CMD_ERROR;
+               goto end;
+       }
+
        if (opt_kernel || opt_userspace || opt_jul || opt_log4j) {
                handle = lttng_create_handle(session_name, &domain);
                if (handle == NULL) {
@@ -1482,9 +1593,16 @@ int cmd_list(int argc, const char **argv)
                        }
                }
                if (opt_kernel) {
-                       ret = list_kernel_events();
-                       if (ret) {
-                               goto end;
+                       if (opt_syscall) {
+                               ret = list_syscalls();
+                               if (ret) {
+                                       goto end;
+                               }
+                       } else {
+                               ret = list_kernel_events();
+                               if (ret) {
+                                       goto end;
+                               }
                        }
                }
                if (opt_userspace) {
This page took 0.032442 seconds and 4 git commands to generate.