libustctl: use direct socket communication
[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, sock;
110
111 sock = parse_and_connect_pid(argv[1]);
112
113 if (ustctl_get_tes(sock, &tes)) {
114 ERR("error while trying to list "
115 "trace_events for PID %s\n",
116 argv[1]);
117 return -1;
118 }
119 i = 0;
120 for (i = 0; tes[i].name; i++) {
121 printf("{PID: %s, trace_event: %s}\n",
122 argv[1],
123 tes[i].name);
124 }
125 ustctl_free_tes(tes);
126
127 return 0;
128 }
129
130 static int set_sock_path(int argc, char *argv[])
131 {
132 int sock;
133
134 sock = parse_and_connect_pid(argv[1]);
135
136 if (ustctl_set_sock_path(sock, argv[2])) {
137 ERR("error while trying to set sock path for PID %s\n", argv[1]);
138 return -1;
139 }
140
141 return 0;
142 }
143
144 static int get_sock_path(int argc, char *argv[])
145 {
146 int sock;
147 char *sock_path;
148
149 sock = parse_and_connect_pid(argv[1]);
150
151 if (ustctl_get_sock_path(sock, &sock_path)) {
152 ERR("error while trying to get sock path for PID %s\n", argv[1]);
153 return -1;
154 }
155 printf("The socket path is %s\n", sock_path);
156 free(sock_path);
157
158 return 0;
159 }
160
161 struct cli_cmd __cli_cmds general_cmds[] = {
162 {
163 .name = "list-trace-events",
164 .description = "List trace-events for a given pid",
165 .help_text = "list-trace-events <pid>\n"
166 "List the trace-events in a process\n",
167 .function = list_trace_events,
168 .desired_args = 1,
169 .desired_args_op = CLI_EQ,
170 },
171 {
172 .name = "set-sock-path",
173 .description = "Set the path to the consumer daemon socket",
174 .help_text = "set-sock-path <pid> <sock-path>\n"
175 "Set the path to the consumer daemon socket\n",
176 .function = set_sock_path,
177 .desired_args = 2,
178 .desired_args_op = CLI_EQ,
179 },
180 {
181 .name = "get-sock-path",
182 .description = "Get the path to the consumer daemon socket",
183 .help_text = "get-sock-path <pid>\n"
184 "Get the path to the consumer daemon socket\n",
185 .function = get_sock_path,
186 .desired_args = 1,
187 .desired_args_op = CLI_EQ,
188 },
189 };
This page took 0.032344 seconds and 4 git commands to generate.