Mi: track/untrack/listing
[lttng-tools.git] / src / bin / lttng / commands / list.c
index f69d34db99aab59b115cf3c6cdf9b77f2a3a9252..f43ee167ab535fd190fbedc75b60db7e8ebc5381 100644 (file)
@@ -25,6 +25,7 @@
 #include <assert.h>
 
 #include <common/mi-lttng.h>
+#include <lttng/constant.h>
 
 #include "../command.h"
 
@@ -37,11 +38,6 @@ 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;
-static pid_t opt_pid;
-#endif
 
 const char *indent4 = "    ";
 const char *indent6 = "      ";
@@ -58,22 +54,16 @@ static struct mi_writer *writer;
 
 static struct poptOption long_options[] = {
        /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
-       {"help",      'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
-       {"kernel",    'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0},
-       {"jul",       'j', POPT_ARG_VAL, &opt_jul, 1, 0, 0},
-       {"log4j",     'l', POPT_ARG_VAL, &opt_log4j, 1, 0, 0},
-       {"python",    'p', POPT_ARG_VAL, &opt_python, 1, 0, 0},
-#if 0
-       /* Not implemented yet */
-       {"userspace",      'u', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, &opt_cmd_name, OPT_USERSPACE, 0, 0},
-       {"pid",            'p', POPT_ARG_INT, &opt_pid, 0, 0, 0},
-#else
-       {"userspace",      'u', POPT_ARG_NONE, 0, OPT_USERSPACE, 0, 0},
-#endif
-       {"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},
+       {"help",        'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
+       {"kernel",      'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0},
+       {"jul", 'j', POPT_ARG_VAL, &opt_jul, 1, 0, 0},
+       {"log4j",       'l', POPT_ARG_VAL, &opt_log4j, 1, 0, 0},
+       {"python",      'p', POPT_ARG_VAL, &opt_python, 1, 0, 0},
+       {"userspace",   'u', POPT_ARG_NONE, 0, OPT_USERSPACE, 0, 0},
+       {"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}
 };
@@ -99,9 +89,6 @@ static void usage(FILE *ofp)
        fprintf(ofp, "  -p, --python            Apply for Python application using logging\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
        fprintf(ofp, "\n");
        fprintf(ofp, "Session Options:\n");
        fprintf(ofp, "  -c, --channel NAME      List details of a channel\n");
@@ -120,7 +107,8 @@ static char *get_cmdline_by_pid(pid_t pid)
        int ret;
        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");
@@ -129,14 +117,14 @@ 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");
+               PERROR("malloc cmdline");
                goto end;
        }
        ret = fread(cmdline, 1, PATH_MAX, fp);
        if (ret < 0) {
-               perror("fread proc list");
+               PERROR("fread proc list");
        }
 
 end:
@@ -352,8 +340,8 @@ static int mi_list_agent_ust_events(struct lttng_event *events, int count,
                goto end;
        }
 
-       /* Open pids element */
-       ret = mi_lttng_pids_open(writer);
+       /* Open processes element */
+       ret = mi_lttng_processes_open(writer);
        if (ret) {
                goto end;
        }
@@ -361,7 +349,7 @@ static int mi_list_agent_ust_events(struct lttng_event *events, int count,
        for (i = 0; i < count; i++) {
                if (cur_pid != events[i].pid) {
                        if (pid_element_open) {
-                               /* Close the previous events and  pid element */
+                               /* Close the previous events and pid element */
                                ret = mi_lttng_close_multi_element(writer, 2);
                                if (ret) {
                                        goto end;
@@ -378,7 +366,7 @@ static int mi_list_agent_ust_events(struct lttng_event *events, int count,
 
                        if (!pid_element_open) {
                                /* Open and write a pid element */
-                               ret = mi_lttng_pid(writer, cur_pid, cmdline, 1);
+                               ret = mi_lttng_process(writer, cur_pid, cmdline, 1);
                                if (ret) {
                                        goto error;
                                }
@@ -401,7 +389,7 @@ static int mi_list_agent_ust_events(struct lttng_event *events, int count,
                }
        }
 
-       /* Close pids */
+       /* Close processes */
        ret = mi_lttng_writer_close_element(writer);
        if (ret) {
                goto end;
@@ -420,8 +408,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;
@@ -433,6 +421,10 @@ static int list_agent_events(void)
                domain.type = LTTNG_DOMAIN_LOG4J;
        } else if (opt_python) {
                domain.type = LTTNG_DOMAIN_PYTHON;
+       } else {
+               ERR("Invalid agent domain selected.");
+               ret = CMD_ERROR;
+               goto error;
        }
 
        agent_domain_str = get_domain_str(domain.type);
@@ -585,8 +577,8 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count,
                goto end;
        }
 
-       /* Open pids element */
-       ret = mi_lttng_pids_open(writer);
+       /* Open processes element */
+       ret = mi_lttng_processes_open(writer);
        if (ret) {
                goto end;
        }
@@ -614,8 +606,8 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count,
                        cur_pid = fields[i].event.pid;
                        cmdline = get_cmdline_by_pid(cur_pid);
                        if (!pid_element_open) {
-                               /* Open and write a pid element */
-                               ret = mi_lttng_pid(writer, cur_pid, cmdline, 1);
+                               /* Open and write a process element */
+                               ret = mi_lttng_process(writer, cur_pid, cmdline, 1);
                                if (ret) {
                                        goto error;
                                }
@@ -669,7 +661,7 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count,
                }
        }
 
-       /* Close pids, domain, domains */
+       /* Close processes, domain, domains */
        ret = mi_lttng_close_multi_element(writer, 3);
 end:
        return ret;
@@ -1246,6 +1238,97 @@ error_channels:
        return ret;
 }
 
+/*
+ * List tracker PID(s) of session and domain.
+ */
+static int list_tracker_pids(void)
+{
+       int ret = 0;
+       int enabled;
+       int *pids = NULL;
+       size_t nr_pids;
+
+       ret = lttng_list_tracker_pids(handle,
+               &enabled, &pids, &nr_pids);
+       if (ret) {
+               return ret;
+       }
+       if (enabled) {
+               int i;
+               _MSG("PID tracker: [");
+
+               /* Mi tracker_pid element*/
+               if (writer) {
+                       /* Open tracker_pid and targets elements */
+                       ret = mi_lttng_pid_tracker_open(writer);
+                       if (ret) {
+                               goto end;
+                       }
+               }
+
+               for (i = 0; i < nr_pids; i++) {
+                       if (i) {
+                               _MSG(",");
+                       }
+                       _MSG(" %d", pids[i]);
+
+                       /* Mi */
+                       if (writer) {
+                               ret = mi_lttng_pid_target(writer, pids[i], 0);
+                               if (ret) {
+                                       goto end;
+                               }
+                       }
+               }
+               _MSG(" ]\n\n");
+
+               /* Mi close tracker_pid and targets */
+               if (writer) {
+                       ret = mi_lttng_close_multi_element(writer,2);
+                       if (ret) {
+                               goto end;
+                       }
+               }
+       }
+end:
+       free(pids);
+       return ret;
+
+}
+
+/*
+ * List all tracker of a domain
+ */
+static int list_trackers(void)
+{
+       int ret;
+
+       /* Trackers listing */
+       if (lttng_opt_mi) {
+               ret = mi_lttng_trackers_open(writer);
+               if (ret) {
+                       goto end;
+               }
+       }
+
+       /* pid tracker */
+       ret = list_tracker_pids();
+       if (ret) {
+               goto end;
+       }
+
+       if (lttng_opt_mi) {
+               /* Close trackers element */
+               ret = mi_lttng_writer_close_element(writer);
+               if (ret) {
+                       goto end;
+               }
+       }
+
+end:
+       return ret;
+}
+
 /*
  * Machine interface
  * Find the session with session_name as name
@@ -1378,8 +1461,11 @@ static int list_sessions(const char *session_name)
                                                active_string(sessions[i].enabled),
                                                snapshot_string(sessions[i].snapshot_mode));
                                MSG("%sTrace path: %s", indent4, sessions[i].path);
-                               MSG("%sLive timer interval (usec): %u\n", indent4,
-                                               sessions[i].live_timer_interval);
+                               if (sessions[i].live_timer_interval != 0) {
+                                       MSG("%sLive timer interval (usec): %u", indent4,
+                                                       sessions[i].live_timer_interval);
+                               }
+                               MSG("");
                        }
                }
 
@@ -1667,6 +1753,14 @@ int cmd_list(int argc, const char **argv)
 
                        }
 
+
+                       /* Trackers */
+                       ret = list_trackers();
+                       if (ret) {
+                               goto end;
+                       }
+
+                       /* Channels */
                        ret = list_channels(opt_channel);
                        if (ret) {
                                goto end;
@@ -1754,6 +1848,18 @@ int cmd_list(int argc, const char **argv)
                                        continue;
                                }
 
+                               switch (domains[i].type) {
+                               case LTTNG_DOMAIN_KERNEL:
+                               case LTTNG_DOMAIN_UST:
+                                       ret = list_trackers();
+                                       if (ret) {
+                                               goto end;
+                                       }
+                                       break;
+                               default:
+                                       break;
+                               }
+
                                ret = list_channels(opt_channel);
                                if (ret) {
                                        goto end;
This page took 0.02848 seconds and 5 git commands to generate.