X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fevent-rule%2Fkernel-syscall.c;h=f9e2792a65081e234fea8638ca64a29fae844065;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=a2a77a3c4d83af12a7bf23a1cafe951d5706648f;hpb=4f7da553ae57a6c947da2b9668c06418b2d50e99;p=lttng-tools.git diff --git a/src/common/event-rule/kernel-syscall.c b/src/common/event-rule/kernel-syscall.c index a2a77a3c4..f9e2792a6 100644 --- a/src/common/event-rule/kernel-syscall.c +++ b/src/common/event-rule/kernel-syscall.c @@ -5,15 +5,15 @@ * */ -#include #include #include +#include +#include #include -#include +#include #include +#include #include -#include -#include #include #include #include @@ -121,8 +121,8 @@ static bool lttng_event_rule_kernel_syscall_is_equal(const struct lttng_event_ru goto end; } - assert(a->pattern); - assert(b->pattern); + LTTNG_ASSERT(a->pattern); + LTTNG_ASSERT(b->pattern); if (strcmp(a->pattern, b->pattern)) { goto end; } @@ -152,7 +152,7 @@ static enum lttng_error_code lttng_event_rule_kernel_syscall_generate_filter_byt const char *filter; struct lttng_bytecode *bytecode = NULL; - assert(rule); + LTTNG_ASSERT(rule); syscall = container_of(rule, struct lttng_event_rule_kernel_syscall, parent); @@ -201,7 +201,7 @@ static const char *lttng_event_rule_kernel_syscall_get_internal_filter( { struct lttng_event_rule_kernel_syscall *syscall; - assert(rule); + LTTNG_ASSERT(rule); syscall = container_of(rule, struct lttng_event_rule_kernel_syscall, parent); return syscall->internal_filter.filter; @@ -213,7 +213,7 @@ lttng_event_rule_kernel_syscall_get_internal_filter_bytecode( { struct lttng_event_rule_kernel_syscall *syscall; - assert(rule); + LTTNG_ASSERT(rule); syscall = container_of(rule, struct lttng_event_rule_kernel_syscall, parent); return syscall->internal_filter.bytecode; @@ -247,6 +247,95 @@ lttng_event_rule_kernel_syscall_hash( return hash; } +static enum lttng_error_code lttng_event_rule_kernel_syscall_mi_serialize( + const struct lttng_event_rule *rule, struct mi_writer *writer) +{ + int ret; + enum lttng_error_code ret_code; + enum lttng_event_rule_status status; + + enum lttng_event_rule_kernel_syscall_emission_site site_type; + const char *filter = NULL; + const char *name_pattern = NULL; + const char *site_type_str = NULL; + + LTTNG_ASSERT(rule); + LTTNG_ASSERT(writer); + LTTNG_ASSERT(IS_SYSCALL_EVENT_RULE(rule)); + + status = lttng_event_rule_kernel_syscall_get_name_pattern( + rule, &name_pattern); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK); + LTTNG_ASSERT(name_pattern); + + status = lttng_event_rule_kernel_syscall_get_filter(rule, &filter); + LTTNG_ASSERT(status == LTTNG_EVENT_RULE_STATUS_OK || + status == LTTNG_EVENT_RULE_STATUS_UNSET); + + site_type = lttng_event_rule_kernel_syscall_get_emission_site(rule); + + switch (site_type) { + case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY_EXIT: + site_type_str = mi_lttng_event_rule_kernel_syscall_emission_site_entry_exit; + break; + case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY: + site_type_str = mi_lttng_event_rule_kernel_syscall_emission_site_entry; + break; + case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_EXIT: + site_type_str = mi_lttng_event_rule_kernel_syscall_emission_site_exit; + break; + default: + abort(); + break; + } + + /* Open event rule kernel syscall element. */ + ret = mi_lttng_writer_open_element( + writer, mi_lttng_element_event_rule_kernel_syscall); + if (ret) { + goto mi_error; + } + + /* Emission site. */ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_event_rule_kernel_syscall_emission_site, + site_type_str); + if (ret) { + goto mi_error; + } + + /* Name pattern. */ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_event_rule_name_pattern, name_pattern); + if (ret) { + goto mi_error; + } + + /* Filter. */ + if (filter != NULL) { + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_event_rule_filter_expression, + filter); + if (ret) { + goto mi_error; + } + } + + /* Close event rule kernel syscall. */ + ret = mi_lttng_writer_close_element(writer); + if (ret) { + goto mi_error; + } + + ret_code = LTTNG_OK; + goto end; + +mi_error: + ret_code = LTTNG_ERR_MI_IO_FAIL; +end: + return ret_code; +} + struct lttng_event_rule *lttng_event_rule_kernel_syscall_create( enum lttng_event_rule_kernel_syscall_emission_site emission_site) @@ -287,6 +376,7 @@ struct lttng_event_rule *lttng_event_rule_kernel_syscall_create( syscall_rule->parent.generate_exclusions = lttng_event_rule_kernel_syscall_generate_exclusions; syscall_rule->parent.hash = lttng_event_rule_kernel_syscall_hash; + syscall_rule->parent.mi_serialize = lttng_event_rule_kernel_syscall_mi_serialize; /* Default pattern is '*'. */ status = lttng_event_rule_kernel_syscall_set_name_pattern(rule, "*");