From 196ec2df2bce805b8c26582f10f2964a8d1da443 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Fri, 17 Feb 2017 04:26:59 -0500 Subject: [PATCH] Add support for star globbing patterns in event names This patch adds support for full star-only globbing patterns used in the event names (enabler names). strutils_star_glob_match() is always used to perform the match when the enabler is LTTNG_ENABLER_STAR_GLOB. This enabler is set when it is detected that its name contains at least one non-escaped star with strutils_is_star_glob_pattern(). While exclusions could be checked before the enabler name match to this date, they must now be checked after we know there's a match because the intersection of exclusion names and event event name is not always checked on the LTTng-tools side (too much complexity for too little gain). The match itself is performed by strutils_star_glob_match(), the same function that the filter interpreter uses. Signed-off-by: Philippe Proulx Signed-off-by: Mathieu Desnoyers --- include/lttng/ust-events.h | 2 +- liblttng-ust/lttng-events.c | 62 +++++++++++++++++++----------------- liblttng-ust/lttng-ust-abi.c | 13 +++++--- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 0b2291b3..6b7bd00e 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -342,7 +342,7 @@ struct lttng_probe_desc { /* Data structures used by the tracer. */ enum lttng_enabler_type { - LTTNG_ENABLER_WILDCARD, + LTTNG_ENABLER_STAR_GLOB, LTTNG_ENABLER_EVENT, }; diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 4c0e1091..fa54a025 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include "clock.h" @@ -55,6 +56,7 @@ #include "lttng-ust-uuid.h" #include "tracepoint-internal.h" +#include "string-utils.h" #include "lttng-tracer.h" #include "lttng-tracer-core.h" #include "lttng-ust-statedump.h" @@ -626,16 +628,15 @@ exist: } static -int lttng_desc_match_wildcard_enabler(const struct lttng_event_desc *desc, +int lttng_desc_match_star_glob_enabler(const struct lttng_event_desc *desc, struct lttng_enabler *enabler) { int loglevel = 0; unsigned int has_loglevel = 0; - assert(enabler->type == LTTNG_ENABLER_WILDCARD); - /* Compare excluding final '*' */ - if (strncmp(desc->name, enabler->event_param.name, - strlen(enabler->event_param.name) - 1)) + assert(enabler->type == LTTNG_ENABLER_STAR_GLOB); + if (!strutils_star_glob_match(enabler->event_param.name, -1ULL, + desc->name, -1ULL)) return 0; if (desc->loglevel) { loglevel = *(*desc->loglevel); @@ -675,34 +676,35 @@ static int lttng_desc_match_enabler(const struct lttng_event_desc *desc, struct lttng_enabler *enabler) { - struct lttng_ust_excluder_node *excluder; - - /* If event matches with an excluder, return 'does not match' */ - cds_list_for_each_entry(excluder, &enabler->excluder_head, node) { - int count; - - for (count = 0; count < excluder->excluder.count; count++) { - int found, len; - char *excluder_name; - - excluder_name = (char *) (excluder->excluder.names) - + count * LTTNG_UST_SYM_NAME_LEN; - len = strnlen(excluder_name, LTTNG_UST_SYM_NAME_LEN); - if (len > 0 && excluder_name[len - 1] == '*') { - found = !strncmp(desc->name, excluder_name, - len - 1); - } else { - found = !strncmp(desc->name, excluder_name, - LTTNG_UST_SYM_NAME_LEN - 1); - } - if (found) { - return 0; + switch (enabler->type) { + case LTTNG_ENABLER_STAR_GLOB: + { + struct lttng_ust_excluder_node *excluder; + + if (!lttng_desc_match_star_glob_enabler(desc, enabler)) { + return 0; + } + + /* + * If the matching event matches with an excluder, + * return 'does not match' + */ + cds_list_for_each_entry(excluder, &enabler->excluder_head, node) { + int count; + + for (count = 0; count < excluder->excluder.count; count++) { + int len; + char *excluder_name; + + excluder_name = (char *) (excluder->excluder.names) + + count * LTTNG_UST_SYM_NAME_LEN; + len = strnlen(excluder_name, LTTNG_UST_SYM_NAME_LEN); + if (len > 0 && strutils_star_glob_match(excluder_name, len, desc->name, -1ULL)) + return 0; } } + return 1; } - switch (enabler->type) { - case LTTNG_ENABLER_WILDCARD: - return lttng_desc_match_wildcard_enabler(desc, enabler); case LTTNG_ENABLER_EVENT: return lttng_desc_match_event_enabler(desc, enabler); default: diff --git a/liblttng-ust/lttng-ust-abi.c b/liblttng-ust/lttng-ust-abi.c index 4fbf15c6..24769a7d 100644 --- a/liblttng-ust/lttng-ust-abi.c +++ b/liblttng-ust/lttng-ust-abi.c @@ -50,6 +50,7 @@ #include #include #include "lttng-tracer.h" +#include "string-utils.h" #include "../libringbuffer/shm.h" #include "../libringbuffer/frontend_types.h" @@ -210,7 +211,7 @@ int lttng_ust_objd_unref(int id, int is_owner) } if ((--obj->u.s.f_count) == 1) { const struct lttng_ust_objd_ops *ops = objd_ops(id); - + if (ops->release) ops->release(id); objd_free(id); @@ -880,10 +881,14 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg, { struct lttng_ust_event *event_param = (struct lttng_ust_event *) arg; - if (event_param->name[strlen(event_param->name) - 1] == '*') { - /* If ends with wildcard, create wildcard. */ + + if (strutils_is_star_glob_pattern(event_param->name)) { + /* + * If the event name is a star globbing pattern, + * we create the special star globbing enabler. + */ return lttng_abi_create_enabler(objd, event_param, - owner, LTTNG_ENABLER_WILDCARD); + owner, LTTNG_ENABLER_STAR_GLOB); } else { return lttng_abi_create_enabler(objd, event_param, owner, LTTNG_ENABLER_EVENT); -- 2.34.1