Update version to 0.16
[ust.git] / ustctl / ustctl.c
index 2b75a58730b630c532e7d89f383725269b885bbc..18f7d307caa64477a7105814a65cf1a8d211ed96 100644 (file)
@@ -23,7 +23,7 @@
 #include <stdlib.h>
 #include <fcntl.h>
 
-#include "ust/ustcmd.h"
+#include "ust/ustctl.h"
 #include "usterr.h"
 #include "cli.h"
 #include "scanning_functions.h"
@@ -45,8 +45,33 @@ void usage(const char *process_name)
        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'},
@@ -56,7 +81,9 @@ struct option options[] =
 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");
@@ -85,20 +112,48 @@ int main(int argc, char *argv[])
                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;
 }
@@ -106,36 +161,35 @@ int main(int argc, char *argv[])
 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 (ustcmd_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);
        }
-       ustcmd_free_tes(tes);
+       ustctl_free_tes(tes);
 
        return 0;
 }
 
 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 (ustcmd_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;
        }
 
@@ -144,13 +198,13 @@ static int set_sock_path(int argc, char *argv[])
 
 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 (ustcmd_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);
@@ -159,6 +213,25 @@ static int get_sock_path(int argc, char *argv[])
        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",
@@ -187,4 +260,13 @@ struct cli_cmd __cli_cmds general_cmds[] = {
                .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,
+       },
 };
This page took 0.025486 seconds and 4 git commands to generate.