clang-tidy: add Chrome-inspired checks
[lttng-tools.git] / src / common / event-rule / kernel-syscall.cpp
CommitLineData
e6a39346
JR
1/*
2 * Copyright (C) 2019 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
c9e313bc
SM
8#include <common/credentials.hpp>
9#include <common/error.hpp>
10#include <common/hashtable/hashtable.hpp>
11#include <common/hashtable/utils.hpp>
12#include <common/macros.hpp>
13#include <common/mi-lttng.hpp>
14#include <common/payload-view.hpp>
15#include <common/payload.hpp>
16#include <common/runas.hpp>
17#include <common/string-utils/string-utils.hpp>
28ab034a 18
c9e313bc
SM
19#include <lttng/event-rule/event-rule-internal.hpp>
20#include <lttng/event-rule/kernel-syscall-internal.hpp>
e6a39346
JR
21
22#define IS_SYSCALL_EVENT_RULE(rule) \
4f7da553 23 (lttng_event_rule_get_type(rule) == LTTNG_EVENT_RULE_TYPE_KERNEL_SYSCALL)
e6a39346 24
4f7da553 25static void lttng_event_rule_kernel_syscall_destroy(struct lttng_event_rule *rule)
e6a39346 26{
4f7da553 27 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346 28
cd9adb8b 29 if (rule == nullptr) {
e6a39346
JR
30 return;
31 }
32
0114db0e 33 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
34
35 free(syscall->pattern);
36 free(syscall->filter_expression);
37 free(syscall->internal_filter.filter);
38 free(syscall->internal_filter.bytecode);
39 free(syscall);
40}
41
28ab034a 42static bool lttng_event_rule_kernel_syscall_validate(const struct lttng_event_rule *rule)
e6a39346
JR
43{
44 bool valid = false;
4f7da553 45 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346
JR
46
47 if (!rule) {
48 goto end;
49 }
50
0114db0e 51 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
52
53 /* Required field. */
54 if (!syscall->pattern) {
55 ERR("Invalid syscall event rule: a pattern must be set.");
56 goto end;
57 }
58
59 valid = true;
60end:
61 return valid;
62}
63
28ab034a
JG
64static int lttng_event_rule_kernel_syscall_serialize(const struct lttng_event_rule *rule,
65 struct lttng_payload *payload)
e6a39346
JR
66{
67 int ret;
68 size_t pattern_len, filter_expression_len;
4f7da553
JR
69 struct lttng_event_rule_kernel_syscall *syscall;
70 struct lttng_event_rule_kernel_syscall_comm syscall_comm;
e6a39346
JR
71
72 if (!rule || !IS_SYSCALL_EVENT_RULE(rule)) {
73 ret = -1;
74 goto end;
75 }
76
77 DBG("Serializing syscall event rule");
0114db0e 78 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
79
80 pattern_len = strlen(syscall->pattern) + 1;
81
cd9adb8b 82 if (syscall->filter_expression != nullptr) {
e6a39346
JR
83 filter_expression_len = strlen(syscall->filter_expression) + 1;
84 } else {
85 filter_expression_len = 0;
86 }
87
88 syscall_comm.pattern_len = pattern_len;
89 syscall_comm.filter_expression_len = filter_expression_len;
f6a5af19 90 syscall_comm.emission_site = syscall->emission_site;
e6a39346 91
28ab034a 92 ret = lttng_dynamic_buffer_append(&payload->buffer, &syscall_comm, sizeof(syscall_comm));
e6a39346
JR
93 if (ret) {
94 goto end;
95 }
96
28ab034a 97 ret = lttng_dynamic_buffer_append(&payload->buffer, syscall->pattern, pattern_len);
e6a39346
JR
98 if (ret) {
99 goto end;
100 }
101
28ab034a
JG
102 ret = lttng_dynamic_buffer_append(
103 &payload->buffer, syscall->filter_expression, filter_expression_len);
e6a39346
JR
104end:
105 return ret;
106}
107
4f7da553 108static bool lttng_event_rule_kernel_syscall_is_equal(const struct lttng_event_rule *_a,
28ab034a 109 const struct lttng_event_rule *_b)
e6a39346
JR
110{
111 bool is_equal = false;
4f7da553 112 struct lttng_event_rule_kernel_syscall *a, *b;
e6a39346 113
0114db0e
JG
114 a = lttng::utils::container_of(_a, &lttng_event_rule_kernel_syscall::parent);
115 b = lttng::utils::container_of(_b, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
116
117 if (!!a->filter_expression != !!b->filter_expression) {
118 goto end;
119 }
120
a0377dfe
FD
121 LTTNG_ASSERT(a->pattern);
122 LTTNG_ASSERT(b->pattern);
e6a39346
JR
123 if (strcmp(a->pattern, b->pattern)) {
124 goto end;
125 }
126
127 if (a->filter_expression && b->filter_expression) {
128 if (strcmp(a->filter_expression, b->filter_expression)) {
129 goto end;
130 }
131 } else if (!!a->filter_expression != !!b->filter_expression) {
132 /* One is set and not the other. */
133 goto end;
134 }
135
136 is_equal = true;
137end:
138 return is_equal;
139}
140
28ab034a
JG
141static enum lttng_error_code
142lttng_event_rule_kernel_syscall_generate_filter_bytecode(struct lttng_event_rule *rule,
143 const struct lttng_credentials *creds)
e6a39346
JR
144{
145 int ret;
146 enum lttng_error_code ret_code = LTTNG_OK;
4f7da553 147 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346
JR
148 enum lttng_event_rule_status status;
149 const char *filter;
cd9adb8b 150 struct lttng_bytecode *bytecode = nullptr;
e6a39346 151
a0377dfe 152 LTTNG_ASSERT(rule);
e6a39346 153
0114db0e 154 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
155
156 /* Generate the filter bytecode. */
4f7da553 157 status = lttng_event_rule_kernel_syscall_get_filter(rule, &filter);
e6a39346 158 if (status == LTTNG_EVENT_RULE_STATUS_UNSET) {
cd9adb8b 159 filter = nullptr;
e6a39346
JR
160 } else if (status != LTTNG_EVENT_RULE_STATUS_OK) {
161 ret_code = LTTNG_ERR_FILTER_INVAL;
162 goto end;
163 }
164
165 if (filter && filter[0] == '\0') {
166 ret_code = LTTNG_ERR_FILTER_INVAL;
167 goto end;
168 }
169
cd9adb8b 170 if (filter == nullptr) {
e6a39346
JR
171 /* Nothing to do. */
172 ret = LTTNG_OK;
173 goto end;
174 }
175
176 syscall->internal_filter.filter = strdup(filter);
cd9adb8b 177 if (syscall->internal_filter.filter == nullptr) {
e6a39346
JR
178 ret_code = LTTNG_ERR_NOMEM;
179 goto end;
180 }
181
28ab034a 182 ret = run_as_generate_filter_bytecode(syscall->internal_filter.filter, creds, &bytecode);
e6a39346
JR
183 if (ret) {
184 ret_code = LTTNG_ERR_FILTER_INVAL;
185 }
186
187 syscall->internal_filter.bytecode = bytecode;
cd9adb8b 188 bytecode = nullptr;
e6a39346
JR
189
190end:
191 free(bytecode);
192 return ret_code;
193}
194
28ab034a
JG
195static const char *
196lttng_event_rule_kernel_syscall_get_internal_filter(const struct lttng_event_rule *rule)
e6a39346 197{
4f7da553 198 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346 199
a0377dfe 200 LTTNG_ASSERT(rule);
0114db0e 201 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
202
203 return syscall->internal_filter.filter;
204}
205
2b00d462 206static const struct lttng_bytecode *
28ab034a 207lttng_event_rule_kernel_syscall_get_internal_filter_bytecode(const struct lttng_event_rule *rule)
e6a39346 208{
4f7da553 209 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346 210
a0377dfe 211 LTTNG_ASSERT(rule);
0114db0e 212 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
213
214 return syscall->internal_filter.bytecode;
215}
216
993578ff 217static enum lttng_event_rule_generate_exclusions_status
28ab034a
JG
218lttng_event_rule_kernel_syscall_generate_exclusions(const struct lttng_event_rule *rule
219 __attribute__((unused)),
220 struct lttng_event_exclusion **exclusions)
e6a39346 221{
993578ff 222 /* Unsupported. */
cd9adb8b 223 *exclusions = nullptr;
993578ff 224 return LTTNG_EVENT_RULE_GENERATE_EXCLUSIONS_STATUS_NONE;
e6a39346
JR
225}
226
28ab034a 227static unsigned long lttng_event_rule_kernel_syscall_hash(const struct lttng_event_rule *rule)
959e3c66
JR
228{
229 unsigned long hash;
4f7da553 230 struct lttng_event_rule_kernel_syscall *syscall_rule =
28ab034a 231 lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
959e3c66 232
28ab034a 233 hash = hash_key_ulong((void *) LTTNG_EVENT_RULE_TYPE_KERNEL_SYSCALL, lttng_ht_seed);
959e3c66
JR
234 hash ^= hash_key_str(syscall_rule->pattern, lttng_ht_seed);
235 if (syscall_rule->filter_expression) {
28ab034a 236 hash ^= hash_key_str(syscall_rule->filter_expression, lttng_ht_seed);
959e3c66
JR
237 }
238
239 return hash;
240}
241
28ab034a
JG
242static enum lttng_error_code
243lttng_event_rule_kernel_syscall_mi_serialize(const struct lttng_event_rule *rule,
244 struct mi_writer *writer)
6a751b95
JR
245{
246 int ret;
247 enum lttng_error_code ret_code;
248 enum lttng_event_rule_status status;
249
250 enum lttng_event_rule_kernel_syscall_emission_site site_type;
cd9adb8b
JG
251 const char *filter = nullptr;
252 const char *name_pattern = nullptr;
253 const char *site_type_str = nullptr;
6a751b95 254
a0377dfe
FD
255 LTTNG_ASSERT(rule);
256 LTTNG_ASSERT(writer);
257 LTTNG_ASSERT(IS_SYSCALL_EVENT_RULE(rule));
6a751b95 258
28ab034a 259 status = lttng_event_rule_kernel_syscall_get_name_pattern(rule, &name_pattern);
a0377dfe
FD
260 LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK);
261 LTTNG_ASSERT(name_pattern);
6a751b95
JR
262
263 status = lttng_event_rule_kernel_syscall_get_filter(rule, &filter);
a0377dfe 264 LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK ||
28ab034a 265 status == LTTNG_EVENT_RULE_STATUS_UNSET);
6a751b95
JR
266
267 site_type = lttng_event_rule_kernel_syscall_get_emission_site(rule);
268
269 switch (site_type) {
270 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY_EXIT:
271 site_type_str = mi_lttng_event_rule_kernel_syscall_emission_site_entry_exit;
272 break;
273 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY:
274 site_type_str = mi_lttng_event_rule_kernel_syscall_emission_site_entry;
275 break;
276 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_EXIT:
277 site_type_str = mi_lttng_event_rule_kernel_syscall_emission_site_exit;
278 break;
279 default:
280 abort();
281 break;
282 }
283
284 /* Open event rule kernel syscall element. */
28ab034a 285 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_event_rule_kernel_syscall);
6a751b95
JR
286 if (ret) {
287 goto mi_error;
288 }
289
290 /* Emission site. */
28ab034a
JG
291 ret = mi_lttng_writer_write_element_string(
292 writer, mi_lttng_element_event_rule_kernel_syscall_emission_site, site_type_str);
6a751b95
JR
293 if (ret) {
294 goto mi_error;
295 }
296
297 /* Name pattern. */
28ab034a
JG
298 ret = mi_lttng_writer_write_element_string(
299 writer, mi_lttng_element_event_rule_name_pattern, name_pattern);
6a751b95
JR
300 if (ret) {
301 goto mi_error;
302 }
303
304 /* Filter. */
cd9adb8b 305 if (filter != nullptr) {
28ab034a
JG
306 ret = mi_lttng_writer_write_element_string(
307 writer, mi_lttng_element_event_rule_filter_expression, filter);
6a751b95
JR
308 if (ret) {
309 goto mi_error;
310 }
311 }
312
313 /* Close event rule kernel syscall. */
314 ret = mi_lttng_writer_close_element(writer);
315 if (ret) {
316 goto mi_error;
317 }
318
319 ret_code = LTTNG_OK;
320 goto end;
321
322mi_error:
323 ret_code = LTTNG_ERR_MI_IO_FAIL;
324end:
325 return ret_code;
326}
327
4f7da553 328struct lttng_event_rule *lttng_event_rule_kernel_syscall_create(
28ab034a 329 enum lttng_event_rule_kernel_syscall_emission_site emission_site)
e6a39346 330{
cd9adb8b 331 struct lttng_event_rule *rule = nullptr;
4f7da553 332 struct lttng_event_rule_kernel_syscall *syscall_rule;
67d38b93 333 enum lttng_event_rule_status status;
e6a39346 334
57739a6b 335 /* Validate the emission site type */
f6a5af19 336 switch (emission_site) {
4f7da553
JR
337 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY_EXIT:
338 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY:
339 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_EXIT:
57739a6b
JR
340 break;
341 default:
342 /* Invalid emission type */
343 goto end;
344 }
345
64803277 346 syscall_rule = zmalloc<lttng_event_rule_kernel_syscall>();
e6a39346
JR
347 if (!syscall_rule) {
348 goto end;
349 }
350
351 rule = &syscall_rule->parent;
28ab034a 352 lttng_event_rule_init(&syscall_rule->parent, LTTNG_EVENT_RULE_TYPE_KERNEL_SYSCALL);
4f7da553
JR
353 syscall_rule->parent.validate = lttng_event_rule_kernel_syscall_validate;
354 syscall_rule->parent.serialize = lttng_event_rule_kernel_syscall_serialize;
355 syscall_rule->parent.equal = lttng_event_rule_kernel_syscall_is_equal;
356 syscall_rule->parent.destroy = lttng_event_rule_kernel_syscall_destroy;
e6a39346 357 syscall_rule->parent.generate_filter_bytecode =
28ab034a
JG
358 lttng_event_rule_kernel_syscall_generate_filter_bytecode;
359 syscall_rule->parent.get_filter = lttng_event_rule_kernel_syscall_get_internal_filter;
e6a39346 360 syscall_rule->parent.get_filter_bytecode =
28ab034a 361 lttng_event_rule_kernel_syscall_get_internal_filter_bytecode;
e6a39346 362 syscall_rule->parent.generate_exclusions =
28ab034a 363 lttng_event_rule_kernel_syscall_generate_exclusions;
4f7da553 364 syscall_rule->parent.hash = lttng_event_rule_kernel_syscall_hash;
6a751b95 365 syscall_rule->parent.mi_serialize = lttng_event_rule_kernel_syscall_mi_serialize;
67d38b93
JR
366
367 /* Default pattern is '*'. */
4f7da553 368 status = lttng_event_rule_kernel_syscall_set_name_pattern(rule, "*");
67d38b93
JR
369 if (status != LTTNG_EVENT_RULE_STATUS_OK) {
370 lttng_event_rule_destroy(rule);
cd9adb8b 371 rule = nullptr;
67d38b93
JR
372 }
373
57739a6b 374 /* Emission site type */
f6a5af19 375 syscall_rule->emission_site = emission_site;
57739a6b 376
e6a39346
JR
377end:
378 return rule;
379}
380
28ab034a
JG
381ssize_t lttng_event_rule_kernel_syscall_create_from_payload(struct lttng_payload_view *view,
382 struct lttng_event_rule **_event_rule)
e6a39346
JR
383{
384 ssize_t ret, offset = 0;
385 enum lttng_event_rule_status status;
4f7da553 386 const struct lttng_event_rule_kernel_syscall_comm *syscall_comm;
e6a39346 387 const char *pattern;
cd9adb8b 388 const char *filter_expression = nullptr;
e6a39346 389 struct lttng_buffer_view current_buffer_view;
cd9adb8b 390 struct lttng_event_rule *rule = nullptr;
e6a39346
JR
391
392 if (!_event_rule) {
393 ret = -1;
394 goto end;
395 }
396
397 if (view->buffer.size < sizeof(*syscall_comm)) {
398 ERR("Failed to initialize from malformed event rule syscall: buffer too short to contain header");
399 ret = -1;
400 goto end;
401 }
402
28ab034a
JG
403 current_buffer_view =
404 lttng_buffer_view_from_view(&view->buffer, offset, sizeof(*syscall_comm));
3e6e0df2 405 if (!lttng_buffer_view_is_valid(&current_buffer_view)) {
e6a39346
JR
406 ret = -1;
407 goto end;
408 }
409
3e6e0df2 410 syscall_comm = (typeof(syscall_comm)) current_buffer_view.data;
28ab034a
JG
411 rule = lttng_event_rule_kernel_syscall_create(
412 (lttng_event_rule_kernel_syscall_emission_site) syscall_comm->emission_site);
e6a39346
JR
413 if (!rule) {
414 ERR("Failed to create event rule syscall");
415 ret = -1;
416 goto end;
417 }
418
419 /* Skip to payload. */
420 offset += current_buffer_view.size;
421
422 /* Map the pattern. */
28ab034a
JG
423 current_buffer_view =
424 lttng_buffer_view_from_view(&view->buffer, offset, syscall_comm->pattern_len);
3e6e0df2 425 if (!lttng_buffer_view_is_valid(&current_buffer_view)) {
e6a39346
JR
426 ret = -1;
427 goto end;
428 }
429
3e6e0df2 430 pattern = current_buffer_view.data;
28ab034a
JG
431 if (!lttng_buffer_view_contains_string(
432 &current_buffer_view, pattern, syscall_comm->pattern_len)) {
e6a39346
JR
433 ret = -1;
434 goto end;
435 }
436
437 /* Skip after the pattern. */
438 offset += syscall_comm->pattern_len;
439
440 if (!syscall_comm->filter_expression_len) {
441 goto skip_filter_expression;
442 }
443
444 /* Map the filter_expression. */
28ab034a
JG
445 current_buffer_view = lttng_buffer_view_from_view(
446 &view->buffer, offset, syscall_comm->filter_expression_len);
3e6e0df2 447 if (!lttng_buffer_view_is_valid(&current_buffer_view)) {
e6a39346
JR
448 ret = -1;
449 goto end;
450 }
451
3e6e0df2 452 filter_expression = current_buffer_view.data;
28ab034a
JG
453 if (!lttng_buffer_view_contains_string(
454 &current_buffer_view, filter_expression, syscall_comm->filter_expression_len)) {
e6a39346
JR
455 ret = -1;
456 goto end;
457 }
458
459 /* Skip after the pattern. */
460 offset += syscall_comm->filter_expression_len;
461
462skip_filter_expression:
463
4f7da553 464 status = lttng_event_rule_kernel_syscall_set_name_pattern(rule, pattern);
e6a39346
JR
465 if (status != LTTNG_EVENT_RULE_STATUS_OK) {
466 ERR("Failed to set event rule syscall pattern");
467 ret = -1;
468 goto end;
469 }
470
471 if (filter_expression) {
28ab034a 472 status = lttng_event_rule_kernel_syscall_set_filter(rule, filter_expression);
e6a39346
JR
473 if (status != LTTNG_EVENT_RULE_STATUS_OK) {
474 ERR("Failed to set event rule syscall pattern");
475 ret = -1;
476 goto end;
477 }
478 }
479
480 *_event_rule = rule;
cd9adb8b 481 rule = nullptr;
e6a39346
JR
482 ret = offset;
483end:
484 lttng_event_rule_destroy(rule);
485 return ret;
486}
487
28ab034a
JG
488enum lttng_event_rule_status
489lttng_event_rule_kernel_syscall_set_name_pattern(struct lttng_event_rule *rule, const char *pattern)
e6a39346 490{
cd9adb8b 491 char *pattern_copy = nullptr;
4f7da553 492 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346
JR
493 enum lttng_event_rule_status status = LTTNG_EVENT_RULE_STATUS_OK;
494
28ab034a 495 if (!rule || !IS_SYSCALL_EVENT_RULE(rule) || !pattern || strlen(pattern) == 0) {
e6a39346
JR
496 status = LTTNG_EVENT_RULE_STATUS_INVALID;
497 goto end;
498 }
499
0114db0e 500 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
501 pattern_copy = strdup(pattern);
502 if (!pattern_copy) {
503 status = LTTNG_EVENT_RULE_STATUS_ERROR;
504 goto end;
505 }
506
40fd2ccf
JR
507 strutils_normalize_star_glob_pattern(pattern_copy);
508
509 free(syscall->pattern);
e6a39346
JR
510
511 syscall->pattern = pattern_copy;
cd9adb8b 512 pattern_copy = nullptr;
e6a39346
JR
513end:
514 return status;
515}
516
28ab034a
JG
517enum lttng_event_rule_status
518lttng_event_rule_kernel_syscall_get_name_pattern(const struct lttng_event_rule *rule,
519 const char **pattern)
e6a39346 520{
4f7da553 521 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346
JR
522 enum lttng_event_rule_status status = LTTNG_EVENT_RULE_STATUS_OK;
523
524 if (!rule || !IS_SYSCALL_EVENT_RULE(rule) || !pattern) {
525 status = LTTNG_EVENT_RULE_STATUS_INVALID;
526 goto end;
527 }
528
0114db0e 529 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
530 if (!syscall->pattern) {
531 status = LTTNG_EVENT_RULE_STATUS_UNSET;
532 goto end;
533 }
534
535 *pattern = syscall->pattern;
536end:
537 return status;
538}
539
28ab034a
JG
540enum lttng_event_rule_status
541lttng_event_rule_kernel_syscall_set_filter(struct lttng_event_rule *rule, const char *expression)
e6a39346 542{
cd9adb8b 543 char *expression_copy = nullptr;
4f7da553 544 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346
JR
545 enum lttng_event_rule_status status = LTTNG_EVENT_RULE_STATUS_OK;
546
547 /* TODO: validate that the passed expression is valid. */
548
28ab034a 549 if (!rule || !IS_SYSCALL_EVENT_RULE(rule) || !expression || strlen(expression) == 0) {
e6a39346
JR
550 status = LTTNG_EVENT_RULE_STATUS_INVALID;
551 goto end;
552 }
553
0114db0e 554 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
555 expression_copy = strdup(expression);
556 if (!expression_copy) {
557 status = LTTNG_EVENT_RULE_STATUS_ERROR;
558 goto end;
559 }
560
561 if (syscall->filter_expression) {
562 free(syscall->filter_expression);
563 }
564
565 syscall->filter_expression = expression_copy;
cd9adb8b 566 expression_copy = nullptr;
e6a39346
JR
567end:
568 return status;
569}
570
28ab034a
JG
571enum lttng_event_rule_status
572lttng_event_rule_kernel_syscall_get_filter(const struct lttng_event_rule *rule,
573 const char **expression)
e6a39346 574{
4f7da553 575 struct lttng_event_rule_kernel_syscall *syscall;
e6a39346
JR
576 enum lttng_event_rule_status status = LTTNG_EVENT_RULE_STATUS_OK;
577
578 if (!rule || !IS_SYSCALL_EVENT_RULE(rule) || !expression) {
579 status = LTTNG_EVENT_RULE_STATUS_INVALID;
580 goto end;
581 }
582
0114db0e 583 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
e6a39346
JR
584 if (!syscall->filter_expression) {
585 status = LTTNG_EVENT_RULE_STATUS_UNSET;
586 goto end;
587 }
588
589 *expression = syscall->filter_expression;
590end:
591 return status;
592}
4f7da553 593extern enum lttng_event_rule_kernel_syscall_emission_site
28ab034a 594lttng_event_rule_kernel_syscall_get_emission_site(const struct lttng_event_rule *rule)
57739a6b 595{
4f7da553
JR
596 enum lttng_event_rule_kernel_syscall_emission_site emission_site =
597 LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_UNKNOWN;
598 struct lttng_event_rule_kernel_syscall *syscall;
57739a6b
JR
599
600 if (!rule || !IS_SYSCALL_EVENT_RULE(rule)) {
601 goto end;
602 }
603
0114db0e 604 syscall = lttng::utils::container_of(rule, &lttng_event_rule_kernel_syscall::parent);
f6a5af19 605 emission_site = syscall->emission_site;
57739a6b
JR
606
607end:
f6a5af19 608 return emission_site;
57739a6b
JR
609}
610
4f7da553 611const char *lttng_event_rule_kernel_syscall_emission_site_str(
28ab034a 612 enum lttng_event_rule_kernel_syscall_emission_site emission_site)
57739a6b 613{
f6a5af19 614 switch (emission_site) {
4f7da553 615 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY:
57739a6b 616 return "entry";
4f7da553 617 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY_EXIT:
57739a6b 618 return "entry+exit";
4f7da553 619 case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_EXIT:
57739a6b
JR
620 return "exit";
621 default:
622 return "???";
623 }
624}
This page took 0.071933 seconds and 4 git commands to generate.