c1bbe8ce0155289e2975325b6d5631d5ce45e254
[ust.git] / ustctl / ustctl.c
1 /* Copyright (C) 2009 Pierre-Marc Fournier
2 * Copyright (C) 2011 Ericsson AB, Nils Carlson <nils.carlson@ericsson.com>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #define _GNU_SOURCE
20 #include <stdio.h>
21 #include <unistd.h>
22 #include <getopt.h>
23 #include <stdlib.h>
24 #include <fcntl.h>
25
26 #include "ust/ustctl.h"
27 #include "usterr.h"
28 #include "cli.h"
29 #include "scanning_functions.h"
30
31 void usage(const char *process_name)
32 {
33 fprintf(stderr, "Usage: %s COMMAND [ARGS]...\n", process_name);
34 fprintf(stderr,
35 "Control tracing within a process that supports UST,\n"
36 " the Userspace Tracing libary\n"
37 "Options:\n"
38 " -h[<cmd>], --help[=<cmd>] "
39 "help, for a command if provided\n"
40 " -l, --list "
41 "short list of commands\n"
42 " -e, --extended-list "
43 "extented list of commands with help\n"
44 "Commands:\n");
45 list_cli_cmds(CLI_DESCRIPTIVE_LIST);
46 }
47
48 struct option options[] =
49 {
50 {"help", 2, NULL, 'h'},
51 {"list", 0, NULL, 'l'},
52 {"extended-list", 0, NULL, 'e'},
53 {NULL, 0, NULL, 0},
54 };
55
56 int main(int argc, char *argv[])
57 {
58 struct cli_cmd *cli_cmd;
59 int opt;
60
61 if(argc <= 1) {
62 fprintf(stderr, "No operation specified.\n");
63 usage(argv[0]);
64 exit(EXIT_FAILURE);
65 }
66
67 while ((opt = getopt_long(argc, argv, "+h::le",
68 options, NULL)) != -1) {
69 switch (opt) {
70 case 'h':
71 if (!optarg) {
72 usage(argv[0]);
73 } else {
74 if (cli_print_help(optarg)) {
75 fprintf(stderr, "No such command %s\n",
76 optarg);
77 }
78 }
79 exit(EXIT_FAILURE);
80 break;
81 case 'l':
82 list_cli_cmds(CLI_SIMPLE_LIST);
83 exit(EXIT_FAILURE);
84 break;
85 case 'e':
86 list_cli_cmds(CLI_EXTENDED_LIST);
87 exit(EXIT_FAILURE);
88 default:
89 fprintf(stderr, "Unknown option\n");
90 break;
91 }
92 }
93
94 cli_cmd = find_cli_cmd(argv[optind]);
95 if (!cli_cmd) {
96 fprintf(stderr, "No such command %s\n",
97 argv[optind]);
98 exit(EXIT_FAILURE);
99 }
100
101 cli_dispatch_cmd(cli_cmd, argc - optind, &argv[optind]);
102
103 return 0;
104 }
105
106 static int list_trace_events(int argc, char *argv[])
107 {
108 struct trace_event_status *tes = NULL;
109 int i;
110 pid_t pid;
111
112 pid = parse_pid(argv[1]);
113
114 if (ustctl_get_tes(&tes, pid)) {
115 ERR("error while trying to list "
116 "trace_events for PID %u\n",
117 pid);
118 return -1;
119 }
120 i = 0;
121 for (i = 0; tes[i].name; i++) {
122 printf("{PID: %u, trace_event: %s}\n",
123 pid,
124 tes[i].name);
125 }
126 ustctl_free_tes(tes);
127
128 return 0;
129 }
130
131 static int set_sock_path(int argc, char *argv[])
132 {
133 pid_t pid;
134
135 pid = parse_pid(argv[1]);
136
137 if (ustctl_set_sock_path(argv[2], pid)) {
138 ERR("error while trying to set sock path for PID %u\n", pid);
139 return -1;
140 }
141
142 return 0;
143 }
144
145 static int get_sock_path(int argc, char *argv[])
146 {
147 pid_t pid;
148 char *sock_path;
149
150 pid = parse_pid(argv[1]);
151
152 if (ustctl_get_sock_path(&sock_path, pid)) {
153 ERR("error while trying to get sock path for PID %u\n", pid);
154 return -1;
155 }
156 printf("The socket path is %s\n", sock_path);
157 free(sock_path);
158
159 return 0;
160 }
161
162 struct cli_cmd __cli_cmds general_cmds[] = {
163 {
164 .name = "list-trace-events",
165 .description = "List trace-events for a given pid",
166 .help_text = "list-trace-events <pid>\n"
167 "List the trace-events in a process\n",
168 .function = list_trace_events,
169 .desired_args = 1,
170 .desired_args_op = CLI_EQ,
171 },
172 {
173 .name = "set-sock-path",
174 .description = "Set the path to the consumer daemon socket",
175 .help_text = "set-sock-path <pid> <sock-path>\n"
176 "Set the path to the consumer daemon socket\n",
177 .function = set_sock_path,
178 .desired_args = 2,
179 .desired_args_op = CLI_EQ,
180 },
181 {
182 .name = "get-sock-path",
183 .description = "Get the path to the consumer daemon socket",
184 .help_text = "get-sock-path <pid>\n"
185 "Get the path to the consumer daemon socket\n",
186 .function = get_sock_path,
187 .desired_args = 1,
188 .desired_args_op = CLI_EQ,
189 },
190 };
This page took 0.031787 seconds and 3 git commands to generate.