lttng add-trigger: replace --exclude-names with --exclude-name
[lttng-tools.git] / src / bin / lttng / commands / enable_events.c
CommitLineData
f3ed775e 1/*
ab5be9fa 2 * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
f3ed775e 3 *
ab5be9fa 4 * SPDX-License-Identifier: GPL-2.0-only
f3ed775e 5 *
f3ed775e
DG
6 */
7
6c1c0768 8#define _LGPL_SOURCE
b2064f54 9#include <assert.h>
f3ed775e
DG
10#include <popt.h>
11#include <stdio.h>
12#include <stdlib.h>
f3ed775e
DG
13#include <sys/stat.h>
14#include <sys/types.h>
15#include <unistd.h>
5a0de755 16#include <inttypes.h>
8f0d098b 17#include <ctype.h>
f3ed775e 18
343af227 19#include <common/sessiond-comm/sessiond-comm.h>
f5436bfc 20#include <common/compat/string.h>
dbc478f3 21#include <common/compat/getenv.h>
9f449915 22#include <common/string-utils/string-utils.h>
dbc478f3 23#include <common/utils.h>
f3ed775e 24
89476427
JRJ
25/* Mi dependancy */
26#include <common/mi-lttng.h>
27
7e8f2e9c
JG
28#include <lttng/event-internal.h>
29
89476427 30#include "../command.h"
7e8f2e9c 31#include "../loglevel.h"
0c4e727b 32#include "../uprobe.h"
89476427 33
8ab7c0d9
MD
34#if (LTTNG_SYMBOL_NAME_LEN == 256)
35#define LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API "255"
36#endif
37
f3ed775e
DG
38static char *opt_event_list;
39static int opt_event_type;
0cda4f28
MD
40static const char *opt_loglevel;
41static int opt_loglevel_type;
6181537c 42static int opt_kernel;
5440dc42 43static char *opt_session_name;
f3ed775e 44static int opt_userspace;
b9dfb167 45static int opt_jul;
5cdb6027 46static int opt_log4j;
0e115563 47static int opt_python;
f3ed775e 48static int opt_enable_all;
cf0e5467 49static char *opt_probe;
dcabc190 50static char *opt_userspace_probe;
8f0d098b 51static char *opt_function;
f3ed775e 52static char *opt_channel_name;
53a80697 53static char *opt_filter;
fac3366c 54static char *opt_exclude;
f3ed775e 55
4fc83d94
PP
56#ifdef LTTNG_EMBED_HELP
57static const char help_msg[] =
58#include <lttng-enable-event.1.h>
59;
60#endif
61
f3ed775e
DG
62enum {
63 OPT_HELP = 1,
f3ed775e 64 OPT_TRACEPOINT,
cf0e5467 65 OPT_PROBE,
dcabc190 66 OPT_USERSPACE_PROBE,
f3ed775e 67 OPT_FUNCTION,
a54bd42d 68 OPT_SYSCALL,
eeac7d46 69 OPT_USERSPACE,
0cda4f28
MD
70 OPT_LOGLEVEL,
71 OPT_LOGLEVEL_ONLY,
679b4943 72 OPT_LIST_OPTIONS,
53a80697 73 OPT_FILTER,
fac3366c 74 OPT_EXCLUDE,
f3ed775e
DG
75};
76
cd80958d 77static struct lttng_handle *handle;
89476427 78static struct mi_writer *writer;
cd80958d 79
f3ed775e
DG
80static struct poptOption long_options[] = {
81 /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
82 {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
5440dc42 83 {"session", 's', POPT_ARG_STRING, &opt_session_name, 0, 0, 0},
e14f64a8 84 {"all", 'a', POPT_ARG_VAL, &opt_enable_all, 1, 0, 0},
f3ed775e
DG
85 {"channel", 'c', POPT_ARG_STRING, &opt_channel_name, 0, 0, 0},
86 {"kernel", 'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0},
d78d6610 87 {"userspace", 'u', POPT_ARG_NONE, 0, OPT_USERSPACE, 0, 0},
b9dfb167 88 {"jul", 'j', POPT_ARG_VAL, &opt_jul, 1, 0, 0},
5cdb6027 89 {"log4j", 'l', POPT_ARG_VAL, &opt_log4j, 1, 0, 0},
0e115563 90 {"python", 'p', POPT_ARG_VAL, &opt_python, 1, 0, 0},
f3ed775e 91 {"tracepoint", 0, POPT_ARG_NONE, 0, OPT_TRACEPOINT, 0, 0},
7ebae521 92 {"probe", 0, POPT_ARG_STRING, &opt_probe, OPT_PROBE, 0, 0},
dcabc190 93 {"userspace-probe",0, POPT_ARG_STRING, &opt_userspace_probe, OPT_USERSPACE_PROBE, 0, 0},
40e9d5d3 94 {"function", 0, POPT_ARG_STRING, &opt_function, OPT_FUNCTION, 0, 0},
7ebae521 95 {"syscall", 0, POPT_ARG_NONE, 0, OPT_SYSCALL, 0, 0},
0cda4f28
MD
96 {"loglevel", 0, POPT_ARG_STRING, 0, OPT_LOGLEVEL, 0, 0},
97 {"loglevel-only", 0, POPT_ARG_STRING, 0, OPT_LOGLEVEL_ONLY, 0, 0},
679b4943 98 {"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL},
53a80697 99 {"filter", 'f', POPT_ARG_STRING, &opt_filter, OPT_FILTER, 0, 0},
fac3366c 100 {"exclude", 'x', POPT_ARG_STRING, &opt_exclude, OPT_EXCLUDE, 0, 0},
f3ed775e
DG
101 {0, 0, 0, 0, 0, 0, 0}
102};
103
0d63dd19 104/*
6181537c 105 * Parse probe options.
0d63dd19 106 */
cf0e5467 107static int parse_probe_opts(struct lttng_event *ev, char *opt)
0d63dd19 108{
49d4e302
JRJ
109 int ret = CMD_SUCCESS;
110 int match;
8ff0bbd0 111 char s_hex[19];
8ab7c0d9 112#define S_HEX_LEN_SCANF_IS_A_BROKEN_API "18" /* 18 is (19 - 1) (\0 is extra) */
0d63dd19
DG
113 char name[LTTNG_SYMBOL_NAME_LEN];
114
115 if (opt == NULL) {
49d4e302 116 ret = CMD_ERROR;
8f0d098b 117 goto end;
0d63dd19
DG
118 }
119
120 /* Check for symbol+offset */
49d4e302 121 match = sscanf(opt, "%" LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API
8ab7c0d9 122 "[^'+']+%" S_HEX_LEN_SCANF_IS_A_BROKEN_API "s", name, s_hex);
49d4e302 123 if (match == 2) {
7d29a247 124 strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
99497cd0 125 ev->attr.probe.symbol_name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
cf0e5467 126 DBG("probe symbol %s", ev->attr.probe.symbol_name);
9d035200 127 if (*s_hex == '\0') {
8ff0bbd0 128 ERR("Invalid probe offset %s", s_hex);
49d4e302 129 ret = CMD_ERROR;
8f0d098b 130 goto end;
0d63dd19 131 }
8ff0bbd0 132 ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
cf0e5467 133 DBG("probe offset %" PRIu64, ev->attr.probe.offset);
3000dc78 134 ev->attr.probe.addr = 0;
8f0d098b
MD
135 goto end;
136 }
137
138 /* Check for symbol */
88c91427 139 if (isalpha(name[0]) || name[0] == '_') {
49d4e302 140 match = sscanf(opt, "%" LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API "s",
8ab7c0d9 141 name);
49d4e302 142 if (match == 1) {
8f0d098b 143 strncpy(ev->attr.probe.symbol_name, name, LTTNG_SYMBOL_NAME_LEN);
99497cd0 144 ev->attr.probe.symbol_name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
8f0d098b
MD
145 DBG("probe symbol %s", ev->attr.probe.symbol_name);
146 ev->attr.probe.offset = 0;
147 DBG("probe offset %" PRIu64, ev->attr.probe.offset);
148 ev->attr.probe.addr = 0;
149 goto end;
150 }
0d63dd19
DG
151 }
152
153 /* Check for address */
49d4e302
JRJ
154 match = sscanf(opt, "%" S_HEX_LEN_SCANF_IS_A_BROKEN_API "s", s_hex);
155 if (match > 0) {
531be721
FD
156 /*
157 * Return an error if the first character of the tentative
158 * address is NULL or not a digit. It can be "0" if the address
159 * is in hexadecimal and can be 1 to 9 if it's in decimal.
160 */
161 if (*s_hex == '\0' || !isdigit(*s_hex)) {
162 ERR("Invalid probe description %s", s_hex);
49d4e302 163 ret = CMD_ERROR;
8f0d098b 164 goto end;
0d63dd19 165 }
8ff0bbd0 166 ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
cf0e5467 167 DBG("probe addr %" PRIu64, ev->attr.probe.addr);
3000dc78
DG
168 ev->attr.probe.offset = 0;
169 memset(ev->attr.probe.symbol_name, 0, LTTNG_SYMBOL_NAME_LEN);
8f0d098b 170 goto end;
0d63dd19
DG
171 }
172
173 /* No match */
49d4e302 174 ret = CMD_ERROR;
0d63dd19 175
8f0d098b 176end:
0d63dd19
DG
177 return ret;
178}
179
85076754
MD
180static
181const char *print_channel_name(const char *name)
182{
183 return name ? : DEFAULT_CHANNEL_NAME;
184}
185
186static
187const char *print_raw_channel_name(const char *name)
188{
189 return name ? : "<default>";
190}
191
89476427
JRJ
192/*
193 * Mi print exlcusion list
194 */
195static
9f449915 196int mi_print_exclusion(char **names)
89476427
JRJ
197{
198 int i, ret;
9f449915 199 int count = names ? strutils_array_of_strings_len(names) : 0;
89476427
JRJ
200
201 assert(writer);
202
203 if (count == 0) {
204 ret = 0;
205 goto end;
206 }
207 ret = mi_lttng_writer_open_element(writer, config_element_exclusions);
208 if (ret) {
209 goto end;
210 }
211
212 for (i = 0; i < count; i++) {
213 ret = mi_lttng_writer_write_element_string(writer,
214 config_element_exclusion, names[i]);
215 if (ret) {
216 goto end;
217 }
218 }
219
220 /* Close exclusions element */
221 ret = mi_lttng_writer_close_element(writer);
222
223end:
224 return ret;
225}
226
9c48cab3
JI
227/*
228 * Return allocated string for pretty-printing exclusion names.
229 */
230static
9f449915 231char *print_exclusions(char **names)
9c48cab3
JI
232{
233 int length = 0;
234 int i;
bfe36393 235 const char preamble[] = " excluding ";
9c48cab3 236 char *ret;
9f449915 237 int count = names ? strutils_array_of_strings_len(names) : 0;
9c48cab3
JI
238
239 if (count == 0) {
240 return strdup("");
241 }
242
243 /* calculate total required length */
244 for (i = 0; i < count; i++) {
9f449915 245 length += strlen(names[i]) + 4;
9c48cab3
JI
246 }
247
bfe36393
JG
248 length += sizeof(preamble);
249 ret = zmalloc(length);
fd591b18
MD
250 if (!ret) {
251 return NULL;
252 }
9c48cab3
JI
253 strncpy(ret, preamble, length);
254 for (i = 0; i < count; i++) {
9f449915 255 strcat(ret, "\"");
9c48cab3 256 strcat(ret, names[i]);
9f449915 257 strcat(ret, "\"");
9c48cab3 258 if (i != count - 1) {
9f449915 259 strcat(ret, ", ");
9c48cab3
JI
260 }
261 }
89476427 262
9c48cab3
JI
263 return ret;
264}
265
748bde76 266static
9f449915 267int check_exclusion_subsets(const char *event_name, const char *exclusion)
748bde76 268{
9f449915
PP
269 bool warn = false;
270 int ret = 0;
271 const char *e = event_name;
272 const char *x = exclusion;
273
274 /* Scan both the excluder and the event letter by letter */
275 while (true) {
276 if (*e == '\\') {
277 if (*x != *e) {
278 warn = true;
279 goto end;
280 }
748bde76 281
9f449915
PP
282 e++;
283 x++;
284 goto cmp_chars;
285 }
286
287 if (*x == '*') {
288 /* Event is a subset of the excluder */
289 ERR("Event %s: %s excludes all events from %s",
290 event_name, exclusion, event_name);
291 goto error;
292 }
293
294 if (*e == '*') {
295 /*
296 * Reached the end of the event name before the
297 * end of the exclusion: this is valid.
298 */
299 goto end;
300 }
301
302cmp_chars:
303 if (*x != *e) {
304 warn = true;
305 break;
306 }
307
308 x++;
309 e++;
748bde76
JI
310 }
311
9f449915 312 goto end;
748bde76 313
9f449915
PP
314error:
315 ret = -1;
748bde76 316
9f449915
PP
317end:
318 if (warn) {
319 WARN("Event %s: %s does not exclude any events from %s",
320 event_name, exclusion, event_name);
321 }
748bde76 322
9f449915
PP
323 return ret;
324}
325
4624dad0
SM
326/*
327 * FIXME: find a good place to declare this since add trigger also uses it
328 */
329LTTNG_HIDDEN
b03a81fb
SM
330int validate_exclusion_list(
331 const char *event_name, const char *const *exclusions);
4624dad0
SM
332
333LTTNG_HIDDEN
b03a81fb
SM
334int validate_exclusion_list(
335 const char *event_name, const char *const *exclusions)
9f449915 336{
b03a81fb 337 int ret;
9f449915
PP
338
339 /* Event name must be a valid globbing pattern to allow exclusions. */
340 if (!strutils_is_star_glob_pattern(event_name)) {
341 ERR("Event %s: Exclusions can only be used with a globbing pattern",
342 event_name);
343 goto error;
344 }
345
9f449915
PP
346 /*
347 * If the event name is a star-at-end only globbing pattern,
348 * then we can validate the individual exclusions. Otherwise
349 * all exclusions are passed to the session daemon.
350 */
351 if (strutils_is_star_at_the_end_only_glob_pattern(event_name)) {
b03a81fb 352 const char *const *exclusion;
9f449915
PP
353
354 for (exclusion = exclusions; *exclusion; exclusion++) {
355 if (!strutils_is_star_glob_pattern(*exclusion) ||
356 strutils_is_star_at_the_end_only_glob_pattern(*exclusion)) {
8aa579d4 357 ret = check_exclusion_subsets(event_name, *exclusion);
9f449915 358 if (ret) {
5ef79758
MD
359 goto error;
360 }
748bde76 361 }
748bde76
JI
362 }
363 }
9f449915 364
b03a81fb
SM
365 ret = 0;
366 goto end;
367
368error:
369 ret = -1;
370
371end:
372 return ret;
373}
374
375static int create_exclusion_list_and_validate(const char *event_name,
376 const char *exclusions_arg,
377 char ***exclusion_list)
378{
379 int ret = 0;
380 char **exclusions = NULL;
381
382 /* Split exclusions. */
383 exclusions = strutils_split(exclusions_arg, ',', true);
384 if (!exclusions) {
385 goto error;
386 }
387
388 if (validate_exclusion_list(event_name, (const char **) exclusions) !=
389 0) {
390 goto error;
391 }
392
9f449915
PP
393 *exclusion_list = exclusions;
394
748bde76 395 goto end;
9f449915 396
748bde76 397error:
9f449915
PP
398 ret = -1;
399 strutils_free_null_terminated_array_of_strings(exclusions);
400
748bde76 401end:
748bde76
JI
402 return ret;
403}
502bbe89 404
9f449915
PP
405static void warn_on_truncated_exclusion_names(char * const *exclusion_list,
406 int *warn)
502bbe89 407{
9f449915 408 char * const *exclusion;
502bbe89 409
9f449915
PP
410 for (exclusion = exclusion_list; *exclusion; exclusion++) {
411 if (strlen(*exclusion) >= LTTNG_SYMBOL_NAME_LEN) {
502bbe89 412 WARN("Event exclusion \"%s\" will be truncated",
9f449915 413 *exclusion);
502bbe89
PP
414 *warn = 1;
415 }
416 }
417}
418
f3ed775e 419/*
6181537c 420 * Enabling event using the lttng API.
89476427 421 * Note: in case of error only the last error code will be return.
f3ed775e 422 */
cd80958d 423static int enable_events(char *session_name)
f3ed775e 424{
89476427
JRJ
425 int ret = CMD_SUCCESS, command_ret = CMD_SUCCESS;
426 int error_holder = CMD_SUCCESS, warn = 0, error = 0, success = 1;
b73d0b29 427 char *event_name, *channel_name = NULL;
91744e14 428 struct lttng_event *ev;
7d29a247 429 struct lttng_domain dom;
7ed70bc9 430 char **exclusion_list = NULL;
0c4e727b 431 struct lttng_userspace_probe_location *uprobe_loc = NULL;
f3ed775e 432
441c16a7
MD
433 memset(&dom, 0, sizeof(dom));
434
91744e14
FD
435 ev = lttng_event_create();
436 if (!ev) {
437 ret = CMD_ERROR;
438 goto error;
439 }
440
53a80697 441 if (opt_kernel) {
67b58630
JG
442 if (opt_loglevel) {
443 WARN("Kernel loglevels are not supported.");
444 }
53a80697
MD
445 }
446
7d29a247
DG
447 /* Create lttng domain */
448 if (opt_kernel) {
449 dom.type = LTTNG_DOMAIN_KERNEL;
7972aab2 450 dom.buf_type = LTTNG_BUFFER_GLOBAL;
d78d6610 451 } else if (opt_userspace) {
2bdd86d4 452 dom.type = LTTNG_DOMAIN_UST;
7972aab2 453 /* Default. */
8692d4e5 454 dom.buf_type = LTTNG_BUFFER_PER_UID;
b9dfb167
DG
455 } else if (opt_jul) {
456 dom.type = LTTNG_DOMAIN_JUL;
457 /* Default. */
458 dom.buf_type = LTTNG_BUFFER_PER_UID;
5cdb6027
DG
459 } else if (opt_log4j) {
460 dom.type = LTTNG_DOMAIN_LOG4J;
461 /* Default. */
462 dom.buf_type = LTTNG_BUFFER_PER_UID;
0e115563
DG
463 } else if (opt_python) {
464 dom.type = LTTNG_DOMAIN_PYTHON;
465 /* Default. */
466 dom.buf_type = LTTNG_BUFFER_PER_UID;
6181537c 467 } else {
3ecec76a
PP
468 /* Checked by the caller. */
469 assert(0);
2bdd86d4 470 }
7d29a247 471
8b08c525
AB
472 if (opt_exclude) {
473 switch (dom.type) {
474 case LTTNG_DOMAIN_KERNEL:
475 case LTTNG_DOMAIN_JUL:
476 case LTTNG_DOMAIN_LOG4J:
477 case LTTNG_DOMAIN_PYTHON:
478 ERR("Event name exclusions are not yet implemented for %s events",
479 get_domain_str(dom.type));
480 ret = CMD_ERROR;
481 goto error;
482 case LTTNG_DOMAIN_UST:
483 /* Exclusions supported */
484 break;
485 default:
486 assert(0);
487 }
d5dd17fd
JI
488 }
489
4fd2697f
FD
490 /*
491 * Adding a filter to a probe, function or userspace-probe would be
492 * denied by the kernel tracer as it's not supported at the moment. We
493 * do an early check here to warn the user.
494 */
495 if (opt_filter && opt_kernel) {
496 switch (opt_event_type) {
497 case LTTNG_EVENT_ALL:
498 case LTTNG_EVENT_TRACEPOINT:
499 case LTTNG_EVENT_SYSCALL:
500 break;
501 case LTTNG_EVENT_PROBE:
502 case LTTNG_EVENT_USERSPACE_PROBE:
503 case LTTNG_EVENT_FUNCTION:
504 ERR("Filter expressions are not supported for %s events",
505 get_event_type_str(opt_event_type));
506 ret = CMD_ERROR;
507 goto error;
508 default:
509 ret = CMD_UNDEFINED;
510 goto error;
511 }
512 }
513
85076754 514 channel_name = opt_channel_name;
ae856491 515
cd80958d
DG
516 handle = lttng_create_handle(session_name, &dom);
517 if (handle == NULL) {
518 ret = -1;
519 goto error;
520 }
1aef21b6 521
89476427
JRJ
522 /* Prepare Mi */
523 if (lttng_opt_mi) {
524 /* Open a events element */
525 ret = mi_lttng_writer_open_element(writer, config_element_events);
526 if (ret) {
527 ret = CMD_ERROR;
528 goto error;
529 }
530 }
531
cd80958d 532 if (opt_enable_all) {
8c9ae521 533 /* Default setup for enable all */
75e8c5ab 534 if (opt_kernel) {
91744e14
FD
535 ev->type = opt_event_type;
536 strcpy(ev->name, "*");
300b8fd5 537 /* kernel loglevels not implemented */
91744e14 538 ev->loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
75e8c5ab 539 } else {
91744e14
FD
540 ev->type = LTTNG_EVENT_TRACEPOINT;
541 strcpy(ev->name, "*");
542 ev->loglevel_type = opt_loglevel_type;
300b8fd5 543 if (opt_loglevel) {
7e8f2e9c
JG
544 int name_search_ret;
545
0e115563 546 assert(opt_userspace || opt_jul || opt_log4j || opt_python);
7e8f2e9c 547
b2064f54 548 if (opt_userspace) {
7e8f2e9c
JG
549 enum lttng_loglevel loglevel;
550
551 name_search_ret = loglevel_name_to_value(opt_loglevel, &loglevel);
552 ev->loglevel = (int) loglevel;
b2064f54 553 } else if (opt_jul) {
7e8f2e9c
JG
554 enum lttng_loglevel_jul loglevel;
555
556 name_search_ret = loglevel_jul_name_to_value(opt_loglevel, &loglevel);
557 ev->loglevel = (int) loglevel;
5cdb6027 558 } else if (opt_log4j) {
7e8f2e9c
JG
559 enum lttng_loglevel_log4j loglevel;
560
561 name_search_ret = loglevel_log4j_name_to_value(opt_loglevel, &loglevel);
562 ev->loglevel = (int) loglevel;
7fefa907
JG
563 } else {
564 /* python domain. */
7e8f2e9c
JG
565 enum lttng_loglevel_python loglevel;
566
567 name_search_ret = loglevel_python_name_to_value(opt_loglevel, &loglevel);
568 ev->loglevel = (int) loglevel;
b2064f54 569 }
7e8f2e9c
JG
570
571 if (name_search_ret == -1) {
300b8fd5 572 ERR("Unknown loglevel %s", opt_loglevel);
2f70b271 573 ret = -LTTNG_ERR_INVALID;
300b8fd5
MD
574 goto error;
575 }
22e25b71 576 } else {
0e115563 577 assert(opt_userspace || opt_jul || opt_log4j || opt_python);
b2064f54 578 if (opt_userspace) {
91744e14 579 ev->loglevel = -1;
34aa3685 580 } else if (opt_jul) {
91744e14 581 ev->loglevel = LTTNG_LOGLEVEL_JUL_ALL;
34aa3685 582 } else if (opt_log4j) {
91744e14 583 ev->loglevel = LTTNG_LOGLEVEL_LOG4J_ALL;
0e115563 584 } else if (opt_python) {
91744e14 585 ev->loglevel = LTTNG_LOGLEVEL_PYTHON_DEBUG;
b2064f54 586 }
300b8fd5 587 }
75e8c5ab 588 }
8c9ae521 589
7ed70bc9 590 if (opt_exclude) {
9f449915
PP
591 ret = create_exclusion_list_and_validate("*",
592 opt_exclude, &exclusion_list);
593 if (ret) {
594 ret = CMD_ERROR;
7ed70bc9
JI
595 goto error;
596 }
502bbe89 597
91744e14 598 ev->exclusion = 1;
502bbe89 599 warn_on_truncated_exclusion_names(exclusion_list,
9f449915 600 &warn);
7ed70bc9 601 }
025faf73 602 if (!opt_filter) {
7ed70bc9 603 ret = lttng_enable_event_with_exclusions(handle,
91744e14 604 ev, channel_name,
7ed70bc9 605 NULL,
9f449915
PP
606 exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0,
607 exclusion_list);
025faf73
DG
608 if (ret < 0) {
609 switch (-ret) {
610 case LTTNG_ERR_KERN_EVENT_EXIST:
611 WARN("Kernel events already enabled (channel %s, session %s)",
85076754 612 print_channel_name(channel_name), session_name);
89476427 613 warn = 1;
025faf73 614 break;
45d5d421
CB
615 case LTTNG_ERR_TRACE_ALREADY_STARTED:
616 {
617 const char *msg = "The command tried to enable an event in a new domain for a session that has already been started once.";
618 ERR("Events: %s (channel %s, session %s)",
619 msg,
620 print_channel_name(channel_name),
621 session_name);
622 error = 1;
623 break;
624 }
025faf73
DG
625 default:
626 ERR("Events: %s (channel %s, session %s)",
85076754
MD
627 lttng_strerror(ret),
628 ret == -LTTNG_ERR_NEED_CHANNEL_NAME
629 ? print_raw_channel_name(channel_name)
630 : print_channel_name(channel_name),
631 session_name);
89476427 632 error = 1;
025faf73
DG
633 break;
634 }
635 goto end;
42224349 636 }
8c9ae521 637
025faf73
DG
638 switch (opt_event_type) {
639 case LTTNG_EVENT_TRACEPOINT:
67b58630 640 if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) {
9f449915 641 char *exclusion_string = print_exclusions(exclusion_list);
5ef79758
MD
642
643 if (!exclusion_string) {
644 PERROR("Cannot allocate exclusion_string");
645 error = 1;
646 goto end;
647 }
9c48cab3 648 MSG("All %s tracepoints%s are enabled in channel %s for loglevel %s",
b9dfb167 649 get_domain_str(dom.type),
9c48cab3 650 exclusion_string,
85076754 651 print_channel_name(channel_name),
025faf73 652 opt_loglevel);
9c48cab3 653 free(exclusion_string);
025faf73 654 } else {
9f449915 655 char *exclusion_string = print_exclusions(exclusion_list);
5ef79758
MD
656
657 if (!exclusion_string) {
658 PERROR("Cannot allocate exclusion_string");
659 error = 1;
660 goto end;
661 }
9c48cab3 662 MSG("All %s tracepoints%s are enabled in channel %s",
b9dfb167 663 get_domain_str(dom.type),
9c48cab3 664 exclusion_string,
85076754 665 print_channel_name(channel_name));
9c48cab3 666 free(exclusion_string);
025faf73
DG
667 }
668 break;
669 case LTTNG_EVENT_SYSCALL:
670 if (opt_kernel) {
6e911cad
MD
671 MSG("All %s system calls are enabled in channel %s",
672 get_domain_str(dom.type),
85076754 673 print_channel_name(channel_name));
025faf73
DG
674 }
675 break;
676 case LTTNG_EVENT_ALL:
67b58630 677 if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) {
9f449915 678 char *exclusion_string = print_exclusions(exclusion_list);
5ef79758
MD
679
680 if (!exclusion_string) {
681 PERROR("Cannot allocate exclusion_string");
682 error = 1;
683 goto end;
684 }
9c48cab3 685 MSG("All %s events%s are enabled in channel %s for loglevel %s",
b9dfb167 686 get_domain_str(dom.type),
9c48cab3 687 exclusion_string,
85076754 688 print_channel_name(channel_name),
025faf73 689 opt_loglevel);
9c48cab3 690 free(exclusion_string);
025faf73 691 } else {
9f449915 692 char *exclusion_string = print_exclusions(exclusion_list);
5ef79758
MD
693
694 if (!exclusion_string) {
695 PERROR("Cannot allocate exclusion_string");
696 error = 1;
697 goto end;
698 }
9c48cab3 699 MSG("All %s events%s are enabled in channel %s",
b9dfb167 700 get_domain_str(dom.type),
9c48cab3 701 exclusion_string,
85076754 702 print_channel_name(channel_name));
9c48cab3 703 free(exclusion_string);
025faf73
DG
704 }
705 break;
706 default:
707 /*
708 * We should not be here since lttng_enable_event should have
709 * failed on the event type.
710 */
711 goto error;
57064ada 712 }
f3ed775e 713 }
89476427 714
025faf73 715 if (opt_filter) {
91744e14 716 command_ret = lttng_enable_event_with_exclusions(handle, ev, channel_name,
9f449915
PP
717 opt_filter,
718 exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0,
719 exclusion_list);
89476427
JRJ
720 if (command_ret < 0) {
721 switch (-command_ret) {
16363652 722 case LTTNG_ERR_FILTER_EXIST:
85076754 723 WARN("Filter on all events is already enabled"
16363652 724 " (channel %s, session %s)",
85076754 725 print_channel_name(channel_name), session_name);
89476427 726 warn = 1;
16363652 727 break;
45d5d421
CB
728 case LTTNG_ERR_TRACE_ALREADY_STARTED:
729 {
730 const char *msg = "The command tried to enable an event in a new domain for a session that has already been started once.";
731 ERR("All events: %s (channel %s, session %s, filter \'%s\')",
732 msg,
733 print_channel_name(channel_name),
734 session_name, opt_filter);
735 error = 1;
736 break;
737 }
16363652 738 default:
85076754 739 ERR("All events: %s (channel %s, session %s, filter \'%s\')",
da3d7d0e
JRJ
740 lttng_strerror(command_ret),
741 command_ret == -LTTNG_ERR_NEED_CHANNEL_NAME
85076754
MD
742 ? print_raw_channel_name(channel_name)
743 : print_channel_name(channel_name),
744 session_name, opt_filter);
89476427 745 error = 1;
16363652
DG
746 break;
747 }
89476427 748 error_holder = command_ret;
16363652 749 } else {
91744e14 750 ev->filter = 1;
16363652
DG
751 MSG("Filter '%s' successfully set", opt_filter);
752 }
753 }
89476427
JRJ
754
755 if (lttng_opt_mi) {
756 /* The wildcard * is used for kernel and ust domain to
757 * represent ALL. We copy * in event name to force the wildcard use
758 * for kernel domain
759 *
760 * Note: this is strictly for semantic and printing while in
761 * machine interface mode.
762 */
91744e14 763 strcpy(ev->name, "*");
89476427
JRJ
764
765 /* If we reach here the events are enabled */
766 if (!error && !warn) {
91744e14 767 ev->enabled = 1;
89476427 768 } else {
91744e14 769 ev->enabled = 0;
89476427
JRJ
770 success = 0;
771 }
91744e14 772 ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
89476427
JRJ
773 if (ret) {
774 ret = CMD_ERROR;
775 goto error;
776 }
777
778 /* print exclusion */
9f449915 779 ret = mi_print_exclusion(exclusion_list);
89476427
JRJ
780 if (ret) {
781 ret = CMD_ERROR;
782 goto error;
783 }
784
785 /* Success ? */
786 ret = mi_lttng_writer_write_element_bool(writer,
787 mi_lttng_element_command_success, success);
788 if (ret) {
789 ret = CMD_ERROR;
790 goto error;
791 }
792
793 /* Close event element */
794 ret = mi_lttng_writer_close_element(writer);
795 if (ret) {
796 ret = CMD_ERROR;
797 goto error;
798 }
799 }
800
8c9ae521 801 goto end;
f3ed775e
DG
802 }
803
804 /* Strip event list */
805 event_name = strtok(opt_event_list, ",");
806 while (event_name != NULL) {
6181537c 807 /* Copy name and type of the event */
91744e14
FD
808 strncpy(ev->name, event_name, LTTNG_SYMBOL_NAME_LEN);
809 ev->name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
810 ev->type = opt_event_type;
6181537c 811
f3ed775e
DG
812 /* Kernel tracer action */
813 if (opt_kernel) {
814 DBG("Enabling kernel event %s for channel %s",
85076754
MD
815 event_name,
816 print_channel_name(channel_name));
f3ed775e
DG
817
818 switch (opt_event_type) {
29c62722
MD
819 case LTTNG_EVENT_ALL: /* Enable tracepoints and syscalls */
820 /* If event name differs from *, select tracepoint. */
91744e14
FD
821 if (strcmp(ev->name, "*")) {
822 ev->type = LTTNG_EVENT_TRACEPOINT;
29c62722
MD
823 }
824 break;
e6ddca71 825 case LTTNG_EVENT_TRACEPOINT:
f3ed775e 826 break;
7d29a247 827 case LTTNG_EVENT_PROBE:
91744e14 828 ret = parse_probe_opts(ev, opt_probe);
49d4e302 829 if (ret) {
cf0e5467 830 ERR("Unable to parse probe options");
91744e14 831 ret = CMD_ERROR;
0d63dd19
DG
832 goto error;
833 }
f3ed775e 834 break;
dcabc190 835 case LTTNG_EVENT_USERSPACE_PROBE:
0c4e727b
JR
836 assert(ev->type == LTTNG_EVENT_USERSPACE_PROBE);
837
838 ret = parse_userspace_probe_opts(opt_userspace_probe, &uprobe_loc);
dcabc190 839 if (ret) {
36aa2f64
FD
840 switch (ret) {
841 case CMD_UNSUPPORTED:
842 /*
843 * Error message describing
844 * what is not supported was
845 * printed in the function.
846 */
847 break;
848 case CMD_ERROR:
849 default:
850 ERR("Unable to parse userspace probe options");
851 break;
852 }
dcabc190
FD
853 goto error;
854 }
0c4e727b
JR
855
856 ret = lttng_event_set_userspace_probe_location(ev, uprobe_loc);
857 if (ret) {
858 WARN("Failed to set probe location on event");
859 ret = CMD_ERROR;
860 goto error;
861 }
862
863 /* Ownership of the uprobe location was transferred to the event. */
864 uprobe_loc = NULL;
dcabc190 865 break;
f3ed775e 866 case LTTNG_EVENT_FUNCTION:
91744e14 867 ret = parse_probe_opts(ev, opt_function);
49d4e302 868 if (ret) {
8f0d098b 869 ERR("Unable to parse function probe options");
91744e14 870 ret = CMD_ERROR;
8f0d098b
MD
871 goto error;
872 }
873 break;
a54bd42d 874 case LTTNG_EVENT_SYSCALL:
91744e14 875 ev->type = LTTNG_EVENT_SYSCALL;
c6aa2d41 876 break;
f3ed775e 877 default:
1ab1ea0b 878 ret = CMD_UNDEFINED;
f3ed775e
DG
879 goto error;
880 }
0cda4f28 881
0cda4f28 882 /* kernel loglevels not implemented */
91744e14 883 ev->loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
f3ed775e 884 } else if (opt_userspace) { /* User-space tracer action */
300b8fd5 885 DBG("Enabling UST event %s for channel %s, loglevel %s", event_name,
85076754 886 print_channel_name(channel_name), opt_loglevel ? : "<all>");
2bdd86d4
MD
887
888 switch (opt_event_type) {
889 case LTTNG_EVENT_ALL: /* Default behavior is tracepoint */
2bdd86d4
MD
890 /* Fall-through */
891 case LTTNG_EVENT_TRACEPOINT:
e4baff1e 892 /* Copy name and type of the event */
91744e14
FD
893 ev->type = LTTNG_EVENT_TRACEPOINT;
894 strncpy(ev->name, event_name, LTTNG_SYMBOL_NAME_LEN);
895 ev->name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
2bdd86d4
MD
896 break;
897 case LTTNG_EVENT_PROBE:
898 case LTTNG_EVENT_FUNCTION:
2bdd86d4 899 case LTTNG_EVENT_SYSCALL:
dcabc190 900 case LTTNG_EVENT_USERSPACE_PROBE:
2bdd86d4 901 default:
cc62c0c0 902 ERR("Event type not available for user-space tracing");
4ce78777 903 ret = CMD_UNSUPPORTED;
2bdd86d4
MD
904 goto error;
905 }
0cda4f28 906
7ed70bc9 907 if (opt_exclude) {
91744e14 908 ev->exclusion = 1;
d5dd17fd
JI
909 if (opt_event_type != LTTNG_EVENT_ALL && opt_event_type != LTTNG_EVENT_TRACEPOINT) {
910 ERR("Exclusion option can only be used with tracepoint events");
911 ret = CMD_ERROR;
912 goto error;
913 }
7ed70bc9 914 /* Free previously allocated items */
9f449915
PP
915 strutils_free_null_terminated_array_of_strings(
916 exclusion_list);
917 exclusion_list = NULL;
918 ret = create_exclusion_list_and_validate(
919 event_name, opt_exclude,
920 &exclusion_list);
921 if (ret) {
922 ret = CMD_ERROR;
7ed70bc9
JI
923 goto error;
924 }
502bbe89
PP
925
926 warn_on_truncated_exclusion_names(
9f449915 927 exclusion_list, &warn);
7ed70bc9
JI
928 }
929
91744e14 930 ev->loglevel_type = opt_loglevel_type;
ed7f4083 931 if (opt_loglevel) {
7e8f2e9c
JG
932 enum lttng_loglevel loglevel;
933 const int name_search_ret = loglevel_name_to_value(opt_loglevel, &loglevel);
934
935 if (name_search_ret == -1) {
8005f29a 936 ERR("Unknown loglevel %s", opt_loglevel);
2f70b271 937 ret = -LTTNG_ERR_INVALID;
8005f29a
MD
938 goto error;
939 }
7e8f2e9c
JG
940
941 ev->loglevel = (int) loglevel;
22e25b71 942 } else {
91744e14 943 ev->loglevel = -1;
ed7f4083 944 }
0e115563 945 } else if (opt_jul || opt_log4j || opt_python) {
b9dfb167
DG
946 if (opt_event_type != LTTNG_EVENT_ALL &&
947 opt_event_type != LTTNG_EVENT_TRACEPOINT) {
5cdb6027 948 ERR("Event type not supported for domain.");
b9dfb167
DG
949 ret = CMD_UNSUPPORTED;
950 goto error;
951 }
b2064f54 952
91744e14 953 ev->loglevel_type = opt_loglevel_type;
b2064f54 954 if (opt_loglevel) {
7e8f2e9c
JG
955 int name_search_ret;
956
5cdb6027 957 if (opt_jul) {
7e8f2e9c
JG
958 enum lttng_loglevel_jul loglevel;
959
960 name_search_ret = loglevel_jul_name_to_value(opt_loglevel, &loglevel);
961 ev->loglevel = (int) loglevel;
5cdb6027 962 } else if (opt_log4j) {
7e8f2e9c
JG
963 enum lttng_loglevel_log4j loglevel;
964
965 name_search_ret = loglevel_log4j_name_to_value(opt_loglevel, &loglevel);
966 ev->loglevel = (int) loglevel;
7fefa907
JG
967 } else {
968 /* python domain. */
7e8f2e9c
JG
969 enum lttng_loglevel_python loglevel;
970
971 name_search_ret = loglevel_python_name_to_value(opt_loglevel, &loglevel);
972 ev->loglevel = (int) loglevel;
5cdb6027 973 }
7e8f2e9c
JG
974
975 if (name_search_ret) {
b2064f54
DG
976 ERR("Unknown loglevel %s", opt_loglevel);
977 ret = -LTTNG_ERR_INVALID;
978 goto error;
979 }
980 } else {
5cdb6027 981 if (opt_jul) {
91744e14 982 ev->loglevel = LTTNG_LOGLEVEL_JUL_ALL;
5cdb6027 983 } else if (opt_log4j) {
91744e14 984 ev->loglevel = LTTNG_LOGLEVEL_LOG4J_ALL;
0e115563 985 } else if (opt_python) {
91744e14 986 ev->loglevel = LTTNG_LOGLEVEL_PYTHON_DEBUG;
5cdb6027 987 }
b2064f54 988 }
91744e14
FD
989 ev->type = LTTNG_EVENT_TRACEPOINT;
990 strncpy(ev->name, event_name, LTTNG_SYMBOL_NAME_LEN);
991 ev->name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
f3ed775e 992 } else {
3ecec76a 993 assert(0);
f3ed775e
DG
994 }
995
025faf73 996 if (!opt_filter) {
9c48cab3
JI
997 char *exclusion_string;
998
89476427 999 command_ret = lttng_enable_event_with_exclusions(handle,
91744e14 1000 ev, channel_name,
9f449915
PP
1001 NULL,
1002 exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0,
1003 exclusion_list);
1004 exclusion_string = print_exclusions(exclusion_list);
5ef79758
MD
1005 if (!exclusion_string) {
1006 PERROR("Cannot allocate exclusion_string");
1007 error = 1;
1008 goto end;
1009 }
89476427 1010 if (command_ret < 0) {
025faf73 1011 /* Turn ret to positive value to handle the positive error code */
89476427 1012 switch (-command_ret) {
025faf73 1013 case LTTNG_ERR_KERN_EVENT_EXIST:
9c48cab3 1014 WARN("Kernel event %s%s already enabled (channel %s, session %s)",
85076754 1015 event_name,
9c48cab3 1016 exclusion_string,
85076754 1017 print_channel_name(channel_name), session_name);
89476427 1018 warn = 1;
025faf73 1019 break;
45d5d421
CB
1020 case LTTNG_ERR_TRACE_ALREADY_STARTED:
1021 {
1022 const char *msg = "The command tried to enable an event in a new domain for a session that has already been started once.";
1023 ERR("Event %s%s: %s (channel %s, session %s)", event_name,
1024 exclusion_string,
1025 msg,
1026 print_channel_name(channel_name),
1027 session_name);
1028 error = 1;
1029 break;
1030 }
dcabc190
FD
1031 case LTTNG_ERR_SDT_PROBE_SEMAPHORE:
1032 ERR("SDT probes %s guarded by semaphores are not supported (channel %s, session %s)",
1033 event_name, print_channel_name(channel_name),
1034 session_name);
1035 error = 1;
1036 break;
025faf73 1037 default:
9c48cab3
JI
1038 ERR("Event %s%s: %s (channel %s, session %s)", event_name,
1039 exclusion_string,
da3d7d0e
JRJ
1040 lttng_strerror(command_ret),
1041 command_ret == -LTTNG_ERR_NEED_CHANNEL_NAME
85076754
MD
1042 ? print_raw_channel_name(channel_name)
1043 : print_channel_name(channel_name),
1044 session_name);
89476427 1045 error = 1;
025faf73
DG
1046 break;
1047 }
89476427 1048 error_holder = command_ret;
025faf73 1049 } else {
8274eeba
AB
1050 switch (dom.type) {
1051 case LTTNG_DOMAIN_KERNEL:
1052 case LTTNG_DOMAIN_UST:
49ceaa70 1053 MSG("%s event %s%s created in channel %s",
8274eeba
AB
1054 get_domain_str(dom.type),
1055 event_name,
1056 exclusion_string,
1057 print_channel_name(channel_name));
1058 break;
1059 case LTTNG_DOMAIN_JUL:
1060 case LTTNG_DOMAIN_LOG4J:
1061 case LTTNG_DOMAIN_PYTHON:
1062 /*
1063 * Don't print the default channel
1064 * name for agent domains.
1065 */
895707da 1066 MSG("%s event %s%s enabled",
8274eeba
AB
1067 get_domain_str(dom.type),
1068 event_name,
1069 exclusion_string);
1070 break;
1071 default:
1072 assert(0);
49ceaa70 1073 }
42224349 1074 }
9c48cab3 1075 free(exclusion_string);
6181537c 1076 }
025faf73
DG
1077
1078 if (opt_filter) {
9c48cab3
JI
1079 char *exclusion_string;
1080
89476427 1081 /* Filter present */
91744e14 1082 ev->filter = 1;
89476427 1083
91744e14 1084 command_ret = lttng_enable_event_with_exclusions(handle, ev, channel_name,
9f449915
PP
1085 opt_filter,
1086 exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0,
1087 exclusion_list);
1088 exclusion_string = print_exclusions(exclusion_list);
5ef79758
MD
1089 if (!exclusion_string) {
1090 PERROR("Cannot allocate exclusion_string");
1091 error = 1;
1092 goto end;
1093 }
89476427
JRJ
1094 if (command_ret < 0) {
1095 switch (-command_ret) {
7671f53c 1096 case LTTNG_ERR_FILTER_EXIST:
9c48cab3 1097 WARN("Filter on event %s%s is already enabled"
7671f53c 1098 " (channel %s, session %s)",
85076754 1099 event_name,
9c48cab3 1100 exclusion_string,
85076754 1101 print_channel_name(channel_name), session_name);
89476427 1102 warn = 1;
7671f53c 1103 break;
45d5d421
CB
1104 case LTTNG_ERR_TRACE_ALREADY_STARTED:
1105 {
1106 const char *msg = "The command tried to enable an event in a new domain for a session that has already been started once.";
91744e14 1107 ERR("Event %s%s: %s (channel %s, session %s, filter \'%s\')", ev->name,
45d5d421
CB
1108 exclusion_string,
1109 msg,
1110 print_channel_name(channel_name),
1111 session_name, opt_filter);
1112 error = 1;
1113 break;
1114 }
7671f53c 1115 default:
91744e14 1116 ERR("Event %s%s: %s (channel %s, session %s, filter \'%s\')", ev->name,
9c48cab3 1117 exclusion_string,
da3d7d0e
JRJ
1118 lttng_strerror(command_ret),
1119 command_ret == -LTTNG_ERR_NEED_CHANNEL_NAME
85076754
MD
1120 ? print_raw_channel_name(channel_name)
1121 : print_channel_name(channel_name),
1122 session_name, opt_filter);
89476427 1123 error = 1;
7671f53c
CB
1124 break;
1125 }
89476427
JRJ
1126 error_holder = command_ret;
1127
16363652 1128 } else {
9c48cab3
JI
1129 MSG("Event %s%s: Filter '%s' successfully set",
1130 event_name, exclusion_string,
1131 opt_filter);
53a80697 1132 }
9c48cab3 1133 free(exclusion_string);
53a80697 1134 }
6181537c 1135
89476427
JRJ
1136 if (lttng_opt_mi) {
1137 if (command_ret) {
1138 success = 0;
91744e14 1139 ev->enabled = 0;
89476427 1140 } else {
91744e14 1141 ev->enabled = 1;
89476427
JRJ
1142 }
1143
91744e14 1144 ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
89476427
JRJ
1145 if (ret) {
1146 ret = CMD_ERROR;
1147 goto error;
1148 }
1149
1150 /* print exclusion */
9f449915 1151 ret = mi_print_exclusion(exclusion_list);
89476427
JRJ
1152 if (ret) {
1153 ret = CMD_ERROR;
1154 goto error;
1155 }
1156
1157 /* Success ? */
1158 ret = mi_lttng_writer_write_element_bool(writer,
1159 mi_lttng_element_command_success, success);
1160 if (ret) {
1161 ret = CMD_ERROR;
1162 goto end;
1163 }
1164
1165 /* Close event element */
1166 ret = mi_lttng_writer_close_element(writer);
1167 if (ret) {
1168 ret = CMD_ERROR;
1169 goto end;
1170 }
1171 }
1172
f3ed775e
DG
1173 /* Next event */
1174 event_name = strtok(NULL, ",");
89476427
JRJ
1175 /* Reset warn, error and success */
1176 success = 1;
f3ed775e
DG
1177 }
1178
8c9ae521 1179end:
89476427
JRJ
1180 /* Close Mi */
1181 if (lttng_opt_mi) {
1182 /* Close events element */
1183 ret = mi_lttng_writer_close_element(writer);
1184 if (ret) {
1185 ret = CMD_ERROR;
1186 goto error;
1187 }
1188 }
f3ed775e 1189error:
ae856491
DG
1190 if (warn) {
1191 ret = CMD_WARNING;
1192 }
89476427
JRJ
1193 if (error) {
1194 ret = CMD_ERROR;
1195 }
cd80958d 1196 lttng_destroy_handle(handle);
9f449915 1197 strutils_free_null_terminated_array_of_strings(exclusion_list);
0c4e727b 1198 lttng_userspace_probe_location_destroy(uprobe_loc);
7ed70bc9 1199
89476427
JRJ
1200 /* Overwrite ret with error_holder if there was an actual error with
1201 * enabling an event.
1202 */
1203 ret = error_holder ? error_holder : ret;
1204
91744e14 1205 lttng_event_destroy(ev);
f3ed775e
DG
1206 return ret;
1207}
1208
1209/*
6181537c 1210 * Add event to trace session
f3ed775e
DG
1211 */
1212int cmd_enable_events(int argc, const char **argv)
1213{
89476427 1214 int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
f3ed775e 1215 static poptContext pc;
cd80958d 1216 char *session_name = NULL;
68c7f6e5 1217 const char *leftover = NULL;
de044b7a 1218 int event_type = -1;
f3ed775e
DG
1219
1220 pc = poptGetContext(NULL, argc, argv, long_options, 0);
1221 poptReadDefaultConfig(pc, 0);
1222
1223 /* Default event type */
7a3d1328 1224 opt_event_type = LTTNG_EVENT_ALL;
f3ed775e
DG
1225
1226 while ((opt = poptGetNextOpt(pc)) != -1) {
1227 switch (opt) {
1228 case OPT_HELP:
4ba92f18 1229 SHOW_HELP();
f3ed775e 1230 goto end;
f3ed775e 1231 case OPT_TRACEPOINT:
e6ddca71 1232 opt_event_type = LTTNG_EVENT_TRACEPOINT;
f3ed775e 1233 break;
cf0e5467 1234 case OPT_PROBE:
7d29a247 1235 opt_event_type = LTTNG_EVENT_PROBE;
f3ed775e 1236 break;
dcabc190
FD
1237 case OPT_USERSPACE_PROBE:
1238 opt_event_type = LTTNG_EVENT_USERSPACE_PROBE;
1239 break;
f3ed775e
DG
1240 case OPT_FUNCTION:
1241 opt_event_type = LTTNG_EVENT_FUNCTION;
8f0d098b 1242 break;
a54bd42d
MD
1243 case OPT_SYSCALL:
1244 opt_event_type = LTTNG_EVENT_SYSCALL;
0133c199 1245 break;
eeac7d46
MD
1246 case OPT_USERSPACE:
1247 opt_userspace = 1;
eeac7d46 1248 break;
0cda4f28 1249 case OPT_LOGLEVEL:
8005f29a 1250 opt_loglevel_type = LTTNG_EVENT_LOGLEVEL_RANGE;
0cda4f28
MD
1251 opt_loglevel = poptGetOptArg(pc);
1252 break;
1253 case OPT_LOGLEVEL_ONLY:
8005f29a 1254 opt_loglevel_type = LTTNG_EVENT_LOGLEVEL_SINGLE;
0cda4f28 1255 opt_loglevel = poptGetOptArg(pc);
13dce3b7 1256 break;
679b4943
SM
1257 case OPT_LIST_OPTIONS:
1258 list_cmd_options(stdout, long_options);
679b4943 1259 goto end;
53a80697
MD
1260 case OPT_FILTER:
1261 break;
fac3366c
JI
1262 case OPT_EXCLUDE:
1263 break;
f3ed775e 1264 default:
f3ed775e
DG
1265 ret = CMD_UNDEFINED;
1266 goto end;
1267 }
de044b7a
DG
1268
1269 /* Validate event type. Multiple event type are not supported. */
1270 if (event_type == -1) {
1271 event_type = opt_event_type;
1272 } else {
1273 if (event_type != opt_event_type) {
1274 ERR("Multiple event type not supported.");
1275 ret = CMD_ERROR;
1276 goto end;
1277 }
1278 }
f3ed775e
DG
1279 }
1280
3ecec76a 1281 ret = print_missing_or_multiple_domains(
3533d06b
JG
1282 opt_kernel + opt_userspace + opt_jul + opt_log4j +
1283 opt_python,
1284 true);
3ecec76a
PP
1285 if (ret) {
1286 ret = CMD_ERROR;
1287 goto end;
1288 }
1289
89476427
JRJ
1290 /* Mi check */
1291 if (lttng_opt_mi) {
1292 writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
1293 if (!writer) {
1294 ret = -LTTNG_ERR_NOMEM;
1295 goto end;
1296 }
1297
1298 /* Open command element */
1299 ret = mi_lttng_writer_command_open(writer,
1300 mi_lttng_element_command_enable_event);
1301 if (ret) {
1302 ret = CMD_ERROR;
1303 goto end;
1304 }
1305
1306 /* Open output element */
1307 ret = mi_lttng_writer_open_element(writer,
1308 mi_lttng_element_command_output);
1309 if (ret) {
1310 ret = CMD_ERROR;
1311 goto end;
1312 }
1313 }
1314
f3ed775e
DG
1315 opt_event_list = (char*) poptGetArg(pc);
1316 if (opt_event_list == NULL && opt_enable_all == 0) {
1317 ERR("Missing event name(s).\n");
ca1c3607 1318 ret = CMD_ERROR;
f3ed775e
DG
1319 goto end;
1320 }
1321
68c7f6e5
JD
1322 leftover = poptGetArg(pc);
1323 if (leftover) {
1324 ERR("Unknown argument: %s", leftover);
1325 ret = CMD_ERROR;
1326 goto end;
1327 }
1328
cd80958d
DG
1329 if (!opt_session_name) {
1330 session_name = get_session_name();
1331 if (session_name == NULL) {
89476427
JRJ
1332 command_ret = CMD_ERROR;
1333 success = 0;
1334 goto mi_closing;
cd80958d
DG
1335 }
1336 } else {
1337 session_name = opt_session_name;
1338 }
1339
89476427
JRJ
1340 command_ret = enable_events(session_name);
1341 if (command_ret) {
1342 success = 0;
1343 goto mi_closing;
1344 }
1345
1346mi_closing:
1347 /* Mi closing */
1348 if (lttng_opt_mi) {
1349 /* Close output element */
1350 ret = mi_lttng_writer_close_element(writer);
1351 if (ret) {
1352 ret = CMD_ERROR;
1353 goto end;
1354 }
1355
1356 ret = mi_lttng_writer_write_element_bool(writer,
1357 mi_lttng_element_command_success, success);
1358 if (ret) {
1359 ret = CMD_ERROR;
1360 goto end;
1361 }
1362
1363 /* Command element close */
1364 ret = mi_lttng_writer_command_close(writer);
1365 if (ret) {
1366 ret = CMD_ERROR;
1367 goto end;
1368 }
1369 }
f3ed775e
DG
1370
1371end:
89476427
JRJ
1372 /* Mi clean-up */
1373 if (writer && mi_lttng_writer_destroy(writer)) {
1374 /* Preserve original error code */
1375 ret = ret ? ret : LTTNG_ERR_MI_IO_FAIL;
1376 }
1377
cd80958d
DG
1378 if (opt_session_name == NULL) {
1379 free(session_name);
1380 }
1381
89476427
JRJ
1382 /* Overwrite ret if an error occurred in enable_events */
1383 ret = command_ret ? command_ret : ret;
1384
ca1c3607 1385 poptFreeContext(pc);
f3ed775e
DG
1386 return ret;
1387}
9f449915 1388
This page took 0.137558 seconds and 4 git commands to generate.