%{
#include "lib.h"
+#include "wildcard-match.h"
#include "lib-event-private.h"
#include "event-filter-private.h"
i_unreached();
case EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD:
node->str = p_strdup(state->pool, b);
+ if (wildcard_is_literal(node->str))
+ node->type = EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT;
state->has_event_name = TRUE;
break;
case EVENT_FILTER_NODE_TYPE_EVENT_SOURCE_LOCATION: {
node->field.value.intmax = INT_MIN;
}
break;
+ case EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT:
+ i_unreached();
}
return node;
EVENT_FILTER_NODE_TYPE_LOGIC = 1, /* children */
/* leaf nodes */
+ EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT, /* str */
EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD, /* str */
EVENT_FILTER_NODE_TYPE_EVENT_SOURCE_LOCATION, /* str + int */
EVENT_FILTER_NODE_TYPE_EVENT_CATEGORY, /* cat */
node->type = EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD;
node->op = EVENT_FILTER_OP_CMP_EQ;
node->str = p_strdup(filter->pool, query->name);
+ if (wildcard_is_literal(query->name))
+ node->type = EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT;
add_node(filter->pool, &expr, node, EVENT_FILTER_OP_AND);
}
}
str_append_c(dest, ')');
break;
+ case EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT:
case EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD:
str_append(dest, "event");
str_append(dest, event_filter_export_query_expr_op(node->op));
switch (node->type) {
case EVENT_FILTER_NODE_TYPE_LOGIC:
i_unreached();
+ case EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT:
+ return (event->sending_name != NULL) &&
+ strcmp(event->sending_name, node->str) == 0;
case EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD:
return (event->sending_name != NULL) &&
wildcard_match(event->sending_name, node->str);
event_filter_query_update_category(query, node->children[0], category, add);
event_filter_query_update_category(query, node->children[1], category, add);
break;
+ case EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT:
case EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD:
case EVENT_FILTER_NODE_TYPE_EVENT_SOURCE_LOCATION:
case EVENT_FILTER_NODE_TYPE_EVENT_FIELD: