{0, 0, 0, 0, 0, 0, 0}
};
-/*
- * usage
- */
-static void usage(FILE *ofp)
-{
- fprintf(ofp, "usage: lttng list [OPTIONS] [SESSION [SESSION OPTIONS]]\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "With no arguments, list available tracing session(s)\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Without a session, -k lists available kernel events\n");
- fprintf(ofp, "Without a session, -u lists available userspace events\n");
- fprintf(ofp, "\n");
- fprintf(ofp, " -h, --help Show this help\n");
- fprintf(ofp, " --list-options Simple listing of options\n");
- 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, " -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");
- fprintf(ofp, "\n");
- fprintf(ofp, "Session Options:\n");
- fprintf(ofp, " -c, --channel NAME List details of a channel\n");
- fprintf(ofp, " -d, --domain List available domain(s)\n");
- fprintf(ofp, "\n");
-}
-
/*
* Get command line from /proc for a specific pid.
*
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) {
if (cur_pid != fields[i].event.pid) {
if (pid_element_open) {
if (event_element_open) {
-
/* Close the previous field element and event. */
ret = mi_lttng_close_multi_element(writer, 2);
if (ret) {
}
}
- /* Close pid, domain, domains */
+ /* Close pids, domain, domains */
ret = mi_lttng_close_multi_element(writer, 3);
end:
return ret;
MSG("%sAttributes:", indent4);
MSG("%soverwrite mode: %d", indent6, channel->attr.overwrite);
- MSG("%ssubbufers size: %" PRIu64, indent6, channel->attr.subbuf_size);
- MSG("%snumber of subbufers: %" PRIu64, indent6, channel->attr.num_subbuf);
+ MSG("%ssubbuffers size: %" PRIu64, indent6, channel->attr.subbuf_size);
+ MSG("%snumber of subbuffers: %" PRIu64, indent6, channel->attr.num_subbuf);
MSG("%sswitch timer interval: %u", indent6, channel->attr.switch_timer_interval);
MSG("%sread timer interval: %u", indent6, channel->attr.read_timer_interval);
MSG("%strace file count: %" PRIu64, indent6, channel->attr.tracefile_count);
return ret;
}
+static
+const char *get_tracker_str(enum lttng_tracker_type tracker_type)
+{
+ switch (tracker_type) {
+ case LTTNG_TRACKER_PID:
+ return "PID";
+ case LTTNG_TRACKER_VPID:
+ return "VPID";
+ case LTTNG_TRACKER_UID:
+ return "UID";
+ case LTTNG_TRACKER_VUID:
+ return "VUID";
+ case LTTNG_TRACKER_GID:
+ return "GID";
+ case LTTNG_TRACKER_VGID:
+ return "VGID";
+ }
+ return NULL;
+}
+
/*
- * List tracker PID(s) of session and domain.
+ * List tracker ID(s) of session and domain.
*/
-static int list_tracker_pids(void)
+static int list_tracker_ids(enum lttng_tracker_type tracker_type)
{
int ret = 0;
- int enabled;
- int *pids = NULL;
- size_t nr_pids;
+ int enabled = 1;
+ struct lttng_tracker_id *ids = NULL;
+ size_t nr_ids, i;
- ret = lttng_list_tracker_pids(handle,
- &enabled, &pids, &nr_pids);
+ ret = lttng_list_tracker_ids(handle, tracker_type,
+ &ids, &nr_ids);
if (ret) {
return ret;
}
+ if (nr_ids == 1 && ids[0].type == LTTNG_ID_ALL) {
+ enabled = 0;
+ }
if (enabled) {
- int i;
- _MSG("PID tracker: [");
+ _MSG("%s tracker: [", get_tracker_str(tracker_type));
- /* Mi tracker_pid element*/
+ /* Mi tracker_id element */
if (writer) {
- /* Open tracker_pid and targets elements */
- ret = mi_lttng_pid_tracker_open(writer);
+ /* Open tracker_id and targets elements */
+ ret = mi_lttng_id_tracker_open(writer, tracker_type);
if (ret) {
goto end;
}
}
- for (i = 0; i < nr_pids; i++) {
+ for (i = 0; i < nr_ids; i++) {
+ struct lttng_tracker_id *id = &ids[i];
+
if (i) {
_MSG(",");
}
- _MSG(" %d", pids[i]);
+ switch (id->type) {
+ case LTTNG_ID_ALL:
+ _MSG(" *");
+ break;
+ case LTTNG_ID_VALUE:
+ _MSG(" %d", ids[i].value);
+ break;
+ case LTTNG_ID_STRING:
+ _MSG(" %s", ids[i].string);
+ break;
+ case LTTNG_ID_UNKNOWN:
+ return CMD_ERROR;
+ }
/* Mi */
if (writer) {
- ret = mi_lttng_pid_target(writer, pids[i], 0);
+ ret = mi_lttng_id_target(writer,
+ tracker_type, id, 0);
if (ret) {
goto end;
}
}
_MSG(" ]\n\n");
- /* Mi close tracker_pid and targets */
+ /* Mi close tracker_id and targets */
if (writer) {
- ret = mi_lttng_close_multi_element(writer,2);
+ ret = mi_lttng_close_multi_element(writer, 2);
if (ret) {
goto end;
}
}
}
end:
- free(pids);
+ for (i = 0; i < nr_ids; i++) {
+ free(ids[i].string);
+ }
+ free(ids);
return ret;
-
}
/*
- * List all tracker of a domain
+ * List all trackers of a domain
*/
-static int list_trackers(void)
+static int list_trackers(struct lttng_domain *domain)
{
int ret;
}
}
- /* pid tracker */
- ret = list_tracker_pids();
- if (ret) {
- goto end;
+ switch (domain->type) {
+ case LTTNG_DOMAIN_KERNEL:
+ /* pid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_PID);
+ if (ret) {
+ goto end;
+ }
+ /* vpid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_VPID);
+ if (ret) {
+ goto end;
+ }
+ /* uid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_UID);
+ if (ret) {
+ goto end;
+ }
+ /* vuid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_VUID);
+ if (ret) {
+ goto end;
+ }
+ /* gid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_GID);
+ if (ret) {
+ goto end;
+ }
+ /* vgid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_VGID);
+ if (ret) {
+ goto end;
+ }
+ break;
+ case LTTNG_DOMAIN_UST:
+ /* vpid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_VPID);
+ if (ret) {
+ goto end;
+ }
+ /* vuid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_VUID);
+ if (ret) {
+ goto end;
+ }
+ /* vgid tracker */
+ ret = list_tracker_ids(LTTNG_TRACKER_VGID);
+ if (ret) {
+ goto end;
+ }
+ break;
+ default:
+ break;
}
-
if (lttng_opt_mi) {
/* Close trackers element */
ret = mi_lttng_writer_close_element(writer);
int cmd_list(int argc, const char **argv)
{
int opt, ret = CMD_SUCCESS;
- const char *session_name;
+ const char *session_name, *leftover = NULL;
static poptContext pc;
struct lttng_domain domain;
struct lttng_domain *domains = NULL;
memset(&domain, 0, sizeof(domain));
if (argc < 1) {
- usage(stderr);
ret = CMD_ERROR;
goto end;
}
list_cmd_options(stdout, long_options);
goto end;
default:
- usage(stderr);
ret = CMD_UNDEFINED;
goto end;
}
session_name = poptGetArg(pc);
DBG2("Session name: %s", session_name);
+ leftover = poptGetArg(pc);
+ if (leftover) {
+ ERR("Unknown argument: %s", leftover);
+ ret = CMD_ERROR;
+ goto end;
+ }
+
if (opt_kernel) {
domain.type = LTTNG_DOMAIN_KERNEL;
} else if (opt_userspace) {
/* Trackers */
- ret = list_trackers();
+ ret = list_trackers(&domain);
if (ret) {
goto end;
}
switch (domains[i].type) {
case LTTNG_DOMAIN_KERNEL:
case LTTNG_DOMAIN_UST:
- ret = list_trackers();
+ ret = list_trackers(&domains[i]);
if (ret) {
goto end;
}