#include <assert.h>
#include <common/mi-lttng.h>
+#include <lttng/constant.h>
#include "../command.h"
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 = " ";
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}
};
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");
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");
goto end;
}
- /* Open pids element */
+ /* Open pids element element */
ret = mi_lttng_pids_open(writer);
if (ret) {
goto end;
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;
{
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;
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);
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;
}
}
- /* Close pids, domain, domains */
+ /* Close pid, domain, domains */
ret = mi_lttng_close_multi_element(writer, 3);
end:
return ret;
}
for (i = 0; i < count; i++) {
- 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,
- handle->domain.type));
+ if (events[i].loglevel_type !=
+ LTTNG_EVENT_LOGLEVEL_ALL) {
+ 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,
+ handle->domain.type));
+ } else {
+ MSG("%s- %s%s", indent4, events[i].name,
+ enabled_string(events[i].enabled));
+ }
}
MSG("");
*/
static int list_tracker_pids(void)
{
- int enabled, ret;
+ int ret = 0;
+ int enabled;
int *pids = NULL;
size_t nr_pids;
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 0;
+ 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;
}
/*
}
- ret = list_tracker_pids();
+
+ /* Trackers */
+ ret = list_trackers();
if (ret) {
goto end;
}
+ /* Channels */
ret = list_channels(opt_channel);
if (ret) {
goto end;
if (ret) {
goto end;
}
- continue;
+
+ goto next_domain;
}
switch (domains[i].type) {
case LTTNG_DOMAIN_KERNEL:
case LTTNG_DOMAIN_UST:
- ret = list_tracker_pids();
+ ret = list_trackers();
if (ret) {
goto end;
}
goto end;
}
+next_domain:
if (lttng_opt_mi) {
/* Close domain element */
ret = mi_lttng_writer_close_element(writer);