]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add global core filter, which allows core dumping on matching events
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 16 Apr 2018 11:00:51 +0000 (14:00 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Wed, 25 Apr 2018 08:03:39 +0000 (11:03 +0300)
src/lib/event-log.c
src/lib/event-log.h

index 75b75b62554b167e101f78e25fce7e4424bb2a56..7f4074e76dc943e67567fdab4c9ab05d67d78b2d 100644 (file)
@@ -7,6 +7,7 @@
 
 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;
 
 #undef e_error
 void e_error(struct event *event,
@@ -120,6 +121,10 @@ event_want_debug_log(struct event *event, const char *source_filename,
            event_filter_match_source(global_debug_log_filter, event,
                                      source_filename, source_linenum, &ctx))
                return TRUE;
+       if (global_core_log_filter != NULL &&
+           event_filter_match_source(global_core_log_filter, event,
+                                     source_filename, source_linenum, &ctx))
+               return TRUE;
        return FALSE;
 }
 
@@ -167,6 +172,11 @@ event_logv_type(struct event *event, enum log_type log_type,
                str_vprintfa(log_prefix_str, fmt, args);
                event_send(event, &ctx, "%s", str_c(log_prefix_str));
        }
+       if (global_core_log_filter != NULL &&
+           event_filter_match_source(global_core_log_filter, event,
+                                     event->source_filename,
+                                     event->source_linenum, &ctx))
+               abort();
        errno = old_errno;
 }
 
@@ -229,3 +239,21 @@ void event_unset_global_debug_send_filter(void)
        if (global_debug_send_filter != NULL)
                event_filter_unref(&global_debug_send_filter);
 }
+
+void event_set_global_core_log_filter(struct event_filter *filter)
+{
+       event_unset_global_core_log_filter();
+       global_core_log_filter = filter;
+       event_filter_ref(global_core_log_filter);
+}
+
+struct event_filter *event_get_global_core_log_filter(void)
+{
+       return global_core_log_filter;
+}
+
+void event_unset_global_core_log_filter(void)
+{
+       if (global_core_log_filter != NULL)
+               event_filter_unref(&global_core_log_filter);
+}
index 9c8e8558b73bb6b7853efcb00a9678683e2f1c3e..8813e86a88aca72b27483761ffad0402264648ee 100644 (file)
@@ -75,4 +75,11 @@ struct event_filter *event_get_global_debug_send_filter(void);
 /* Unset global debug send filter, if one exists. */
 void event_unset_global_debug_send_filter(void);
 
+/* Set/replace the global core filter, which abort()s on matching events. */
+void event_set_global_core_log_filter(struct event_filter *filter);
+/* Return the current global core filter. */
+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);
+
 #endif