list_cli_cmds(CLI_DESCRIPTIVE_LIST);
}
+/*
+ * Provide backward compatibility for scripts that make use of the
+ * --commands in ustctl version <= 0.11
+ */
+enum command {
+ CREATE_TRACE=1000,
+ ALLOC_TRACE,
+ START_TRACE,
+ STOP_TRACE,
+ DESTROY_TRACE,
+ LIST_MARKERS,
+ LIST_TRACE_EVENTS,
+ ENABLE_MARKER,
+ DISABLE_MARKER,
+};
+
struct option options[] =
{
+ { "create-trace", 0, 0, CREATE_TRACE },
+ { "alloc-trace", 0, 0, ALLOC_TRACE },
+ { "start-trace", 0, 0, START_TRACE },
+ { "stop-trace", 0, 0, STOP_TRACE },
+ { "destroy-trace", 0, 0, DESTROY_TRACE },
+ { "list-markers", 0, 0, LIST_MARKERS },
+ { "list-trace-events", 0, 0, LIST_TRACE_EVENTS},
+ { "enable-marker", 0, 0, ENABLE_MARKER },
+ { "disable-marker", 0, 0, DISABLE_MARKER },
{"help", 2, NULL, 'h'},
{"list", 0, NULL, 'l'},
{"extended-list", 0, NULL, 'e'},
int main(int argc, char *argv[])
{
struct cli_cmd *cli_cmd;
+ char **args = argv;
int opt;
+ int i;
if(argc <= 1) {
fprintf(stderr, "No operation specified.\n");
case 'e':
list_cli_cmds(CLI_EXTENDED_LIST);
exit(EXIT_FAILURE);
+ case LIST_MARKERS:
+ case LIST_TRACE_EVENTS:
+ case CREATE_TRACE:
+ case ALLOC_TRACE:
+ case START_TRACE:
+ case STOP_TRACE:
+ case DESTROY_TRACE:
+ case ENABLE_MARKER:
+ case DISABLE_MARKER:
+ args = (char **)malloc(sizeof(char *) * (argc + 3));
+ optind--;
+ args[optind] = strdup(&argv[optind][2]);
+ for (i = optind + 1; i < argc; i++) {
+ args[i] = argv[i];
+ }
+ if (opt >= CREATE_TRACE && opt <= DESTROY_TRACE) {
+ args[argc] = strdup("auto");
+ argc++;
+ }
+ if (opt >= ENABLE_MARKER && opt <= DISABLE_MARKER) {
+ args[argc] = args[argc - 2];
+ args[argc - 2] = args[argc - 1];
+ args[argc - 1] = strdup("auto");
+ argc++;
+ }
+ args[argc] = NULL;
+ goto do_cli;
default:
fprintf(stderr, "Unknown option\n");
break;
}
}
- cli_cmd = find_cli_cmd(argv[optind]);
+do_cli:
+ cli_cmd = find_cli_cmd(args[optind]);
if (!cli_cmd) {
fprintf(stderr, "No such command %s\n",
- argv[optind]);
+ args[optind]);
exit(EXIT_FAILURE);
}
- cli_dispatch_cmd(cli_cmd, argc - optind, &argv[optind]);
+ cli_dispatch_cmd(cli_cmd, argc - optind, &args[optind]);
return 0;
}
static int list_trace_events(int argc, char *argv[])
{
struct trace_event_status *tes = NULL;
- int i;
- pid_t pid;
+ int i, sock;
- pid = parse_pid(argv[1]);
+ sock = parse_and_connect_pid(argv[1]);
- if (ustctl_get_tes(&tes, pid)) {
+ if (ustctl_get_tes(sock, &tes)) {
ERR("error while trying to list "
- "trace_events for PID %u\n",
- pid);
+ "trace_events for PID %s\n",
+ argv[1]);
return -1;
}
i = 0;
for (i = 0; tes[i].name; i++) {
- printf("{PID: %u, trace_event: %s}\n",
- pid,
+ printf("{PID: %s, trace_event: %s}\n",
+ argv[1],
tes[i].name);
}
ustctl_free_tes(tes);
static int set_sock_path(int argc, char *argv[])
{
- pid_t pid;
+ int sock;
- pid = parse_pid(argv[1]);
+ sock = parse_and_connect_pid(argv[1]);
- if (ustctl_set_sock_path(argv[2], pid)) {
- ERR("error while trying to set sock path for PID %u\n", pid);
+ if (ustctl_set_sock_path(sock, argv[2])) {
+ ERR("error while trying to set sock path for PID %s\n", argv[1]);
return -1;
}
static int get_sock_path(int argc, char *argv[])
{
- pid_t pid;
+ int sock;
char *sock_path;
- pid = parse_pid(argv[1]);
+ sock = parse_and_connect_pid(argv[1]);
- if (ustctl_get_sock_path(&sock_path, pid)) {
- ERR("error while trying to get sock path for PID %u\n", pid);
+ if (ustctl_get_sock_path(sock, &sock_path)) {
+ ERR("error while trying to get sock path for PID %s\n", argv[1]);
return -1;
}
printf("The socket path is %s\n", sock_path);
return 0;
}
+static int list_pids(int argc, char *argv[])
+{
+ pid_t *pid_list;
+ int i;
+
+ pid_list = ustctl_get_online_pids();
+ if (!pid_list) {
+ return -1;
+ }
+
+ for (i = 0; pid_list[i]; i++) {
+ printf("%ld\n", (long)pid_list[i]);
+ }
+
+ free(pid_list);
+
+ return 0;
+}
+
struct cli_cmd __cli_cmds general_cmds[] = {
{
.name = "list-trace-events",
.desired_args = 1,
.desired_args_op = CLI_EQ,
},
+ {
+ .name = "list-pids",
+ .description = "List traceable pids",
+ .help_text = "list-pids\n"
+ "List the traceable pids for the current user\n",
+ .function = list_pids,
+ .desired_args = 0,
+ .desired_args_op = CLI_EQ,
+ },
};