libustctl: use direct socket communication
[ust.git] / ustctl / ustctl.c
CommitLineData
c39c72ee 1/* Copyright (C) 2009 Pierre-Marc Fournier
0c89df6c 2 * Copyright (C) 2011 Ericsson AB, Nils Carlson <nils.carlson@ericsson.com>
c39c72ee
PMF
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
872037bb
PMF
19#define _GNU_SOURCE
20#include <stdio.h>
fbd8191b
PMF
21#include <unistd.h>
22#include <getopt.h>
23#include <stdlib.h>
fbd8191b 24#include <fcntl.h>
fbd8191b 25
2298f329 26#include "ust/ustctl.h"
2028e7fd 27#include "usterr.h"
0c89df6c
NC
28#include "cli.h"
29#include "scanning_functions.h"
ae937656 30
0c89df6c 31void usage(const char *process_name)
fd2fb4f9 32{
0c89df6c
NC
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);
fd2fb4f9
PMF
46}
47
0c89df6c 48struct option options[] =
fbd8191b 49{
0c89df6c
NC
50 {"help", 2, NULL, 'h'},
51 {"list", 0, NULL, 'l'},
52 {"extended-list", 0, NULL, 'e'},
53 {NULL, 0, NULL, 0},
54};
52c51a47 55
0c89df6c
NC
56int main(int argc, char *argv[])
57{
58 struct cli_cmd *cli_cmd;
59 int opt;
52c51a47 60
0c89df6c
NC
61 if(argc <= 1) {
62 fprintf(stderr, "No operation specified.\n");
63 usage(argv[0]);
64 exit(EXIT_FAILURE);
65 }
52c51a47 66
0c89df6c
NC
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);
52c51a47 80 break;
0c89df6c
NC
81 case 'l':
82 list_cli_cmds(CLI_SIMPLE_LIST);
83 exit(EXIT_FAILURE);
52c51a47 84 break;
0c89df6c
NC
85 case 'e':
86 list_cli_cmds(CLI_EXTENDED_LIST);
87 exit(EXIT_FAILURE);
88 default:
89 fprintf(stderr, "Unknown option\n");
ae937656 90 break;
fbd8191b
PMF
91 }
92 }
93
0c89df6c
NC
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);
fbd8191b
PMF
99 }
100
0c89df6c
NC
101 cli_dispatch_cmd(cli_cmd, argc - optind, &argv[optind]);
102
52c51a47
PMF
103 return 0;
104}
fbd8191b 105
0c89df6c 106static int list_trace_events(int argc, char *argv[])
72098143 107{
0c89df6c 108 struct trace_event_status *tes = NULL;
8b26d56b 109 int i, sock;
72098143 110
8b26d56b 111 sock = parse_and_connect_pid(argv[1]);
72098143 112
8b26d56b 113 if (ustctl_get_tes(sock, &tes)) {
0c89df6c 114 ERR("error while trying to list "
8b26d56b
NC
115 "trace_events for PID %s\n",
116 argv[1]);
72098143 117 return -1;
72098143 118 }
0c89df6c
NC
119 i = 0;
120 for (i = 0; tes[i].name; i++) {
8b26d56b
NC
121 printf("{PID: %s, trace_event: %s}\n",
122 argv[1],
0c89df6c
NC
123 tes[i].name);
124 }
2298f329 125 ustctl_free_tes(tes);
0c89df6c
NC
126
127 return 0;
72098143
NC
128}
129
0c89df6c 130static int set_sock_path(int argc, char *argv[])
72098143 131{
8b26d56b 132 int sock;
72098143 133
8b26d56b 134 sock = parse_and_connect_pid(argv[1]);
72098143 135
8b26d56b
NC
136 if (ustctl_set_sock_path(sock, argv[2])) {
137 ERR("error while trying to set sock path for PID %s\n", argv[1]);
72098143
NC
138 return -1;
139 }
72098143 140
0c89df6c
NC
141 return 0;
142}
d89b8191 143
0c89df6c 144static int get_sock_path(int argc, char *argv[])
fbd8191b 145{
8b26d56b 146 int sock;
0c89df6c 147 char *sock_path;
fbd8191b 148
8b26d56b 149 sock = parse_and_connect_pid(argv[1]);
fbd8191b 150
8b26d56b
NC
151 if (ustctl_get_sock_path(sock, &sock_path)) {
152 ERR("error while trying to get sock path for PID %s\n", argv[1]);
0c89df6c 153 return -1;
ae937656 154 }
0c89df6c
NC
155 printf("The socket path is %s\n", sock_path);
156 free(sock_path);
fbd8191b 157
0c89df6c 158 return 0;
fbd8191b 159}
ae937656 160
0c89df6c
NC
161struct 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.041455 seconds and 4 git commands to generate.