X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fevent-rule%2Ftracepoint.c;h=a82151a254c6db6d5118754911fef55bfb55b8b4;hp=f750af47f8ced8e496462daa9acd6a9b70b32e56;hb=959e3c66727698e58a8788aceeda5820b3c938ba;hpb=3e6e0df2f8f9f23d252c2508b6d741916dfcc4b3 diff --git a/src/common/event-rule/tracepoint.c b/src/common/event-rule/tracepoint.c index f750af47f..a82151a25 100644 --- a/src/common/event-rule/tracepoint.c +++ b/src/common/event-rule/tracepoint.c @@ -6,11 +6,14 @@ */ #include +#include #include #include #include #include #include +#include +#include #include #include @@ -357,7 +360,8 @@ end: static enum lttng_error_code lttng_event_rule_tracepoint_generate_filter_bytecode( - struct lttng_event_rule *rule, uid_t uid, gid_t gid) + struct lttng_event_rule *rule, + const struct lttng_credentials *creds) { int ret; enum lttng_error_code ret_code; @@ -429,7 +433,7 @@ lttng_event_rule_tracepoint_generate_filter_bytecode( } ret = run_as_generate_filter_bytecode( - tracepoint->internal_filter.filter, uid, gid, + tracepoint->internal_filter.filter, creds, &bytecode); if (ret) { ret_code = LTTNG_ERR_FILTER_INVAL; @@ -540,6 +544,48 @@ static void destroy_lttng_exclusions_element(void *ptr) free(ptr); } +static unsigned long lttng_event_rule_tracepoint_hash( + const struct lttng_event_rule *rule) +{ + unsigned long hash; + unsigned int i, exclusion_count; + enum lttng_event_rule_status status; + struct lttng_event_rule_tracepoint *tp_rule = + container_of(rule, typeof(*tp_rule), parent); + + hash = hash_key_ulong((void *) LTTNG_EVENT_RULE_TYPE_TRACEPOINT, + lttng_ht_seed); + hash ^= hash_key_ulong((void *) tp_rule->domain, lttng_ht_seed); + hash ^= hash_key_str(tp_rule->pattern, lttng_ht_seed); + + if (tp_rule->filter_expression) { + hash ^= hash_key_str(tp_rule->filter_expression, lttng_ht_seed); + } + + hash ^= hash_key_ulong((void *) tp_rule->loglevel.type, + lttng_ht_seed); + if (tp_rule->loglevel.type != LTTNG_EVENT_LOGLEVEL_ALL) { + hash ^= hash_key_ulong( + (void *) (unsigned long) tp_rule->loglevel.value, + lttng_ht_seed); + } + + status = lttng_event_rule_tracepoint_get_exclusions_count(rule, + &exclusion_count); + assert(status == LTTNG_EVENT_RULE_STATUS_OK); + + for (i = 0; i < exclusion_count; i++) { + const char *exclusion; + + status = lttng_event_rule_tracepoint_get_exclusion_at_index( + rule, i, &exclusion); + assert(status == LTTNG_EVENT_RULE_STATUS_OK); + hash ^= hash_key_str(exclusion, lttng_ht_seed); + } + + return hash; +} + struct lttng_event_rule *lttng_event_rule_tracepoint_create( enum lttng_domain_type domain_type) { @@ -569,6 +615,7 @@ struct lttng_event_rule *lttng_event_rule_tracepoint_create( lttng_event_rule_tracepoint_get_internal_filter_bytecode; tp_rule->parent.generate_exclusions = lttng_event_rule_tracepoint_generate_exclusions; + tp_rule->parent.hash = lttng_event_rule_tracepoint_hash; tp_rule->domain = domain_type; tp_rule->loglevel.type = LTTNG_EVENT_LOGLEVEL_ALL;