From edddfbd949a2dc53eb4d3a107d76e7eae6de319e Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 16 Apr 2018 14:00:51 +0300 Subject: [PATCH] lib: Add global core filter, which allows core dumping on matching events --- src/lib/event-log.c | 28 ++++++++++++++++++++++++++++ src/lib/event-log.h | 7 +++++++ 2 files changed, 35 insertions(+) diff --git a/src/lib/event-log.c b/src/lib/event-log.c index 75b75b6255..7f4074e76d 100644 --- a/src/lib/event-log.c +++ b/src/lib/event-log.c @@ -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); +} diff --git a/src/lib/event-log.h b/src/lib/event-log.h index 9c8e8558b7..8813e86a88 100644 --- a/src/lib/event-log.h +++ b/src/lib/event-log.h @@ -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