From: Timo Sirainen Date: Mon, 22 Dec 2025 12:36:46 +0000 (+0200) Subject: lib, lib-master: Replace event_[un]set_global_debug_send_filter() with event_global_d... X-Git-Tag: 2.4.3~181 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da968ce90667bdb899b7f09294d8e2de431ae468;p=thirdparty%2Fdovecot%2Fcore.git lib, lib-master: Replace event_[un]set_global_debug_send_filter() with event_global_debug_send_filter_register() This allows registering multiple debug send filters. --- diff --git a/src/lib-master/stats-client.c b/src/lib-master/stats-client.c index fd3efa7a26..2a96527280 100644 --- a/src/lib-master/stats-client.c +++ b/src/lib-master/stats-client.c @@ -31,6 +31,7 @@ struct stats_client { }; static struct connection_list *stats_clients; +struct event_filter **stats_event_filter = NULL; static void stats_client_connect(struct stats_client *client); @@ -77,7 +78,10 @@ stats_client_handshake(struct stats_client *client, const char *const *args) event_filter_unref(&client->filter); client->filter = filter; - event_set_global_debug_send_filter(client->filter); + + if (stats_event_filter == NULL) + stats_event_filter = event_global_debug_send_filter_register(); + *stats_event_filter = filter; return 1; } @@ -426,7 +430,10 @@ stats_client_init_unittest(buffer_t *buf, const char *filter) client->filter = event_filter_create(); if (!event_filter_import(client->filter, filter, &error)) i_panic("Failed to import unit test event filter: %s", error); - event_set_global_debug_send_filter(client->filter); + + if (stats_event_filter == NULL) + stats_event_filter = event_global_debug_send_filter_register(); + *stats_event_filter = client->filter; return client; } @@ -458,7 +465,12 @@ void stats_client_deinit(struct stats_client **_client) stats_client_wait(client, STATS_CLIENT_DEINIT_WAIT); } + if (stats_event_filter != NULL) { + i_assert(*stats_event_filter == client->filter); + *stats_event_filter = NULL; + } event_filter_unref(&client->filter); + connection_deinit(&client->conn); timeout_remove(&client->to_reconnect); o_stream_unref(&client->conn.output); diff --git a/src/lib/event-log.c b/src/lib/event-log.c index 911c05e78f..5a6c564a86 100644 --- a/src/lib/event-log.c +++ b/src/lib/event-log.c @@ -1,6 +1,7 @@ /* Copyright (c) 2017-2018 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "array.h" #include "str.h" #include "event-filter.h" #include "lib-event-private.h" @@ -8,8 +9,8 @@ unsigned int event_filter_replace_counter = 1; static struct event_filter *global_debug_log_filter = NULL; -static struct event_filter *global_debug_send_filter = NULL; static struct event_filter *global_core_log_filter = NULL; +static ARRAY(struct event_filter *) global_debug_send_filters; #undef e_error void e_error(struct event *event, @@ -319,10 +320,12 @@ bool event_want_level(struct event *event, enum log_type level, return TRUE; /* see if debug send filtering matches */ - if (global_debug_send_filter != NULL) { + struct event_filter *filter; + array_foreach_elem(&global_debug_send_filters, filter) { struct failure_context ctx = { .type = LOG_TYPE_DEBUG }; - if (event_filter_match_source(global_debug_send_filter, event, + if (filter != NULL && + event_filter_match_source(filter, event, source_filename, source_linenum, &ctx)) return TRUE; @@ -449,17 +452,13 @@ void event_unset_global_debug_log_filter(void) event_filter_replace_counter++; } -void event_set_global_debug_send_filter(struct event_filter *filter) +struct event_filter **event_global_debug_send_filter_register(void) { - event_unset_global_debug_send_filter(); - global_debug_send_filter = filter; - event_filter_ref(global_debug_send_filter); - event_filter_replace_counter++; + return array_append_space(&global_debug_send_filters); } -void event_unset_global_debug_send_filter(void) +void event_global_debug_send_filter_updated(void) { - event_filter_unref(&global_debug_send_filter); event_filter_replace_counter++; } @@ -481,3 +480,16 @@ void event_unset_global_core_log_filter(void) event_filter_unref(&global_core_log_filter); event_filter_replace_counter++; } + +void event_log_init(void) +{ + i_array_init(&global_debug_send_filters, 2); +} + +void event_log_deinit(void) +{ + struct event_filter *filter; + array_foreach_elem(&global_debug_send_filters, filter) + event_filter_unref(&filter); + array_free(&global_debug_send_filters); +} diff --git a/src/lib/event-log.h b/src/lib/event-log.h index 9be86b7e69..fe3fcf0560 100644 --- a/src/lib/event-log.h +++ b/src/lib/event-log.h @@ -120,11 +120,11 @@ struct event_filter *event_get_global_debug_log_filter(void); /* Unset global debug log filter, if one exists. */ void event_unset_global_debug_log_filter(void); -/* Set the global filter to sending debug events. The debug events are also - sent if they match the global debug log filter. */ -void event_set_global_debug_send_filter(struct event_filter *filter); -/* Unset global debug send filter, if one exists. */ -void event_unset_global_debug_send_filter(void); +/* Register a pointer for updating the global filter to send debug events. + The debug events are also sent if they match the global debug log filter. */ +struct event_filter **event_global_debug_send_filter_register(void); +/* Call when the debug send filter has been updated. */ +void event_global_debug_send_filter_updated(void); /* Set/replace the global core filter, which abort()s on matching events. */ void event_set_global_core_log_filter(struct event_filter *filter); @@ -133,4 +133,7 @@ struct event_filter *event_get_global_core_log_filter(void); /* Unset the global core filter, if one exists. */ void event_unset_global_core_log_filter(void); +void event_log_init(void); +void event_log_deinit(void); + #endif diff --git a/src/lib/lib-event.c b/src/lib/lib-event.c index 30c4c687a3..3af9d9066f 100644 --- a/src/lib/lib-event.c +++ b/src/lib/lib-event.c @@ -1901,6 +1901,7 @@ void lib_event_init(void) i_array_init(&event_registered_categories, 32); #endif i_array_init(&event_registered_categories_representative, 16); + event_log_init(); } void lib_event_deinit(void) @@ -1910,8 +1911,8 @@ void lib_event_deinit(void) struct event_category *category; #endif + event_log_deinit(); event_unset_global_debug_log_filter(); - event_unset_global_debug_send_filter(); event_unset_global_core_log_filter(); for (struct event *event = events; event != NULL; event = event->next) { i_warning("Event %p leaked (parent=%p): %s:%u",