Coverage Report

Created: 2026-01-09 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib/lib-event-private.h
Line
Count
Source
1
#ifndef LIB_EVENT_PRIVATE_H
2
#define LIB_EVENT_PRIVATE_H
3
4
#include <sys/resource.h>
5
6
struct event_pointer {
7
  const char *key;
8
  void *value;
9
};
10
11
struct event {
12
  /* linked list of all events, newest first */
13
  struct event *prev, *next;
14
15
  int refcount;
16
  pool_t pool;
17
  struct event *parent;
18
  uint64_t id;
19
20
  /* Avoid sending the event to stats over and over.  The 'change_id'
21
     increments every time something about this event changes.  If
22
     'sent_to_stats_id' matches 'change_id', we skip sending this
23
     event out.  If it doesn't match, we send it and set
24
     'sent_to_stats_id' to 'change_id'. sent_to_stats_id=0 is reserved
25
     for "event hasn't been sent". 'change_id' can never be 0. */
26
  uint32_t change_id;
27
  uint32_t sent_to_stats_id;
28
29
  char *log_prefix;
30
  unsigned int log_prefixes_dropped;
31
  /* sending_debug_log can be used if this value matches
32
     event_filter_replace_counter. */
33
  unsigned int debug_level_checked_filter_counter;
34
  event_log_prefix_callback_t *log_prefix_callback;
35
  void *log_prefix_callback_context;
36
  event_log_message_callback_t *log_message_callback;
37
  void *log_message_callback_context;
38
  ARRAY(struct event_pointer) pointers;
39
  /* If the event's log level is at least this high, log it. If it's
40
     lower, check for debug log filters etc. */
41
  enum log_type min_log_level;
42
43
  bool log_prefix_from_system_pool:1;
44
  bool log_prefix_replace:1;
45
  bool passthrough:1;
46
  bool forced_debug:1;
47
  bool forced_never_debug:1;
48
  bool always_log_source:1;
49
  bool sending_debug_log:1;
50
  bool disable_callbacks:1;
51
52
/* Fields that are exported & imported: */
53
  struct timeval tv_created_ioloop;
54
  struct timeval tv_created;
55
  struct timeval tv_last_sent;
56
  struct rusage ru_last;
57
58
  const char *source_filename;
59
  unsigned int source_linenum;
60
61
  /* This is the event's name while it's being sent. It'll be removed
62
     after the event is sent. */
63
  char *sending_name;
64
65
  ARRAY(struct event_category *) categories;
66
  ARRAY(struct event_field) fields;
67
};
68
69
enum event_callback_type {
70
  /* Event was just created */
71
  EVENT_CALLBACK_TYPE_CREATE,
72
  /* Event is being sent */
73
  EVENT_CALLBACK_TYPE_SEND,
74
  /* Event is being freed */
75
  EVENT_CALLBACK_TYPE_FREE,
76
};
77
78
/* Returns TRUE if the event should continue to the next handler. Unless
79
   stopped, the final handler logs the event if it matches the log filter. */
80
typedef bool event_callback_t(struct event *event,
81
            enum event_callback_type type,
82
            struct failure_context *ctx,
83
            const char *fmt, va_list args);
84
/* Called when category is registered or unregistered. The parent category
85
   is always already registered. */
86
typedef void event_category_callback_t(struct event_category *category);
87
88
void event_send(struct event *event, struct failure_context *ctx,
89
    const char *fmt, ...) ATTR_FORMAT(3, 4);
90
void event_vsend(struct event *event, struct failure_context *ctx,
91
     const char *fmt, va_list args) ATTR_FORMAT(3, 0);
92
93
struct event *events_get_head(void);
94
95
/* Find event category by name. This only finds registered categories. */
96
struct event_category *event_category_find_registered(const char *name);
97
/* Return all registered categories. */
98
struct event_category *const *
99
event_get_registered_categories(unsigned int *count_r);
100
101
/* Register callback to be called for event's different states. */
102
void event_register_callback(event_callback_t *callback);
103
void event_unregister_callback(event_callback_t *callback);
104
105
/* Register callback to be called whenever categories are registered or
106
   unregistered. */
107
void event_category_register_callback(event_category_callback_t *callback);
108
void event_category_unregister_callback(event_category_callback_t *callback);
109
110
static inline void event_recalculate_debug_level(struct event *event)
111
0
{
112
0
  event->debug_level_checked_filter_counter =
113
0
    event_filter_replace_counter - 1;
114
0
}
Unexecuted instantiation: event-log.c:event_recalculate_debug_level
Unexecuted instantiation: lib-event.c:event_recalculate_debug_level
Unexecuted instantiation: event-filter.c:event_recalculate_debug_level
Unexecuted instantiation: event-filter-parser.c:event_recalculate_debug_level
115
116
#endif