]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib, lib-master: Replace event_[un]set_global_debug_send_filter() with event_global_d...
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 22 Dec 2025 12:36:46 +0000 (14:36 +0200)
committermarkus.valentin <markus.valentin@open-xchange.com>
Mon, 16 Feb 2026 09:50:14 +0000 (10:50 +0100)
This allows registering multiple debug send filters.

src/lib-master/stats-client.c
src/lib/event-log.c
src/lib/event-log.h
src/lib/lib-event.c

index fd3efa7a26e87d61842c205fece32118503f93ec..2a965272804ddc7ad9c644b53af4cc30dda542d3 100644 (file)
@@ -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);
index 911c05e78fa189e3b47208be5a0333a8882e81ff..5a6c564a860d85370be31e1c829ce21730141018 100644 (file)
@@ -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);
+}
index 9be86b7e69adec794dc971344981a6719da03f2b..fe3fcf05603aa5c47d4c47d8059328d8dcfd7db6 100644 (file)
@@ -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
index 30c4c687a3177925da6fe5c91036a62bb97394fb..3af9d9066f70a17e205768acbb10ed2c3254eae5 100644 (file)
@@ -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",