aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil/map.h
blob: ce49bacbbd430ef60eea8d4d17caf69751bee902 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#ifndef RSPAMD_MAP_H
#define RSPAMD_MAP_H

#include "config.h"
#include "contrib/libev/ev.h"

#include "ucl.h"
#include "mem_pool.h"
#include "radix.h"
#include "dns.h"

#ifdef  __cplusplus
extern "C" {
#endif

/**
 * Maps API is designed to load lists data from different dynamic sources.
 * It monitor files and HTTP locations for modifications and reload them if they are
 * modified.
 */
struct map_cb_data;
struct rspamd_worker;

/**
 * Callback types
 */
typedef gchar *(*map_cb_t) (gchar *chunk, gint len,
							struct map_cb_data *data, gboolean final);

typedef void (*map_fin_cb_t) (struct map_cb_data *data, void **target);

typedef void (*map_dtor_t) (struct map_cb_data *data);

typedef gboolean (*rspamd_map_traverse_cb) (gconstpointer key,
											gconstpointer value, gsize hits, gpointer ud);

typedef void (*rspamd_map_traverse_function) (void *data,
											  rspamd_map_traverse_cb cb,
											  gpointer cbdata, gboolean reset_hits);

/**
 * Common map object
 */
struct rspamd_config;
struct rspamd_map;

/**
 * Callback data for async load
 */
struct map_cb_data {
	struct rspamd_map *map;
	gint state;
	void *prev_data;
	void *cur_data;
};

/**
 * Returns TRUE if line looks like a map definition
 * @param map_line
 * @return
 */
gboolean rspamd_map_is_map (const gchar *map_line);

/**
 * Add map from line
 */
struct rspamd_map *rspamd_map_add (struct rspamd_config *cfg,
								   const gchar *map_line,
								   const gchar *description,
								   map_cb_t read_callback,
								   map_fin_cb_t fin_callback,
								   map_dtor_t dtor,
								   void **user_data,
								   struct rspamd_worker *worker);

/**
 * Add map from ucl
 */
struct rspamd_map *rspamd_map_add_from_ucl (struct rspamd_config *cfg,
											const ucl_object_t *obj,
											const gchar *description,
											map_cb_t read_callback,
											map_fin_cb_t fin_callback,
											map_dtor_t dtor,
											void **user_data,
											struct rspamd_worker *worker);

enum rspamd_map_watch_type {
	RSPAMD_MAP_WATCH_MIN = 9,
	RSPAMD_MAP_WATCH_PRIMARY_CONTROLLER,
	RSPAMD_MAP_WATCH_SCANNER,
	RSPAMD_MAP_WATCH_WORKER,
	RSPAMD_MAP_WATCH_MAX
};

/**
 * Start watching of maps by adding events to libevent event loop
 */
void rspamd_map_watch (struct rspamd_config *cfg,
					   struct ev_loop *event_loop,
					   struct rspamd_dns_resolver *resolver,
					   struct rspamd_worker *worker,
					   enum rspamd_map_watch_type how);

/**
 * Preloads maps where all backends are file
 * @param cfg
 */
void rspamd_map_preload (struct rspamd_config *cfg);

/**
 * Remove all maps watched (remove events)
 */
void rspamd_map_remove_all (struct rspamd_config *cfg);

/**
 * Get traverse function for specific map
 * @param map
 * @return
 */
rspamd_map_traverse_function rspamd_map_get_traverse_function (struct rspamd_map *map);

/**
 * Perform map traverse
 * @param map
 * @param cb
 * @param cbdata
 * @param reset_hits
 * @return
 */
void rspamd_map_traverse (struct rspamd_map *map, rspamd_map_traverse_cb cb,
						  gpointer cbdata, gboolean reset_hits);

#ifdef  __cplusplus
}
#endif

#endif