* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#define _LGPL_SOURCE
#include <stdio.h>
#include <stdlib.h>
struct ltt_ust_event *event;
const struct ltt_ust_ht_key *key;
int ev_loglevel_value;
+ int ll_match;
assert(node);
assert(_key);
}
/* Event loglevel value and type. */
- if (event->attr.loglevel_type == key->loglevel_type) {
- /* Same loglevel type. */
- if (key->loglevel_type != LTTNG_UST_LOGLEVEL_ALL) {
- /*
- * Loglevel value must also match since the loglevel
- * type is not all.
- */
- if (ev_loglevel_value != key->loglevel_value) {
- goto no_match;
- }
- }
- } else {
- /* Loglevel type is different: no match. */
+ ll_match = loglevels_match(event->attr.loglevel_type,
+ ev_loglevel_value, key->loglevel_type,
+ key->loglevel_value, LTTNG_UST_LOGLEVEL_ALL);
+
+ if (!ll_match) {
goto no_match;
}
return luc;
}
+/*
+ * Validates an exclusion list.
+ *
+ * Returns 0 if valid, negative value if invalid.
+ */
+static int validate_exclusion(struct lttng_event_exclusion *exclusion)
+{
+ size_t i;
+ int ret = 0;
+
+ assert(exclusion);
+
+ for (i = 0; i < exclusion->count; ++i) {
+ size_t j;
+ const char *name_a =
+ LTTNG_EVENT_EXCLUSION_NAME_AT(exclusion, i);
+
+ for (j = 0; j < i; ++j) {
+ const char *name_b =
+ LTTNG_EVENT_EXCLUSION_NAME_AT(exclusion, j);
+
+ if (!strncmp(name_a, name_b, LTTNG_SYMBOL_NAME_LEN)) {
+ /* Match! */
+ ret = -1;
+ goto end;
+ }
+ }
+ }
+
+end:
+ return ret;
+}
+
/*
* Allocate and initialize a ust event. Set name and event type.
* We own filter_expression, filter, and exclusion.
assert(ev);
+ if (exclusion && validate_exclusion(exclusion)) {
+ goto error;
+ }
+
lue = zmalloc(sizeof(struct ltt_ust_event));
if (lue == NULL) {
PERROR("ust event zmalloc");