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
|
#ifndef RSPAMD_MAP_H
#define RSPAMD_MAP_H
#include "config.h"
#include <event.h>
#include "mem_pool.h"
#include "radix.h"
/**
* 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.
*/
enum fetch_proto {
MAP_PROTO_FILE,
MAP_PROTO_HTTP,
};
struct map_cb_data;
/**
* Callback types
*/
typedef gchar * (*map_cb_t)(rspamd_mempool_t *pool, gchar *chunk, gint len,
struct map_cb_data *data);
typedef void (*map_fin_cb_t)(rspamd_mempool_t *pool, struct map_cb_data *data);
/**
* Common map object
*/
struct rspamd_config;
struct rspamd_map {
rspamd_mempool_t *pool;
struct rspamd_config *cfg;
enum fetch_proto protocol;
map_cb_t read_callback;
map_fin_cb_t fin_callback;
void **user_data;
struct event ev;
struct timeval tv;
struct event_base *ev_base;
void *map_data;
gchar *uri;
gchar *description;
guint32 id;
guint32 checksum;
/* Shared lock for temporary disabling of map reading (e.g. when this map is written by UI) */
gint *locked;
};
/**
* Callback data for async load
*/
struct map_cb_data {
struct rspamd_map *map;
gint state;
void *prev_data;
void *cur_data;
};
/**
* Check map protocol
*/
gboolean rspamd_map_check_proto (const gchar *map_line, gint *res, const gchar **pos);
/**
* Add map from line
*/
gboolean 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,
void **user_data);
/**
* Start watching of maps by adding events to libevent event loop
*/
void rspamd_map_watch (struct rspamd_config *cfg, struct event_base *ev_base);
/**
* Remove all maps watched (remove events)
*/
void rspamd_map_remove_all (struct rspamd_config *cfg);
typedef void (*insert_func) (gpointer st, gconstpointer key,
gconstpointer value);
/**
* Common callbacks for frequent types of lists
*/
/**
* Radix list is a list like ip/mask
*/
gchar * rspamd_radix_read (rspamd_mempool_t *pool,
gchar *chunk,
gint len,
struct map_cb_data *data);
void rspamd_radix_fin (rspamd_mempool_t *pool, struct map_cb_data *data);
/**
* Host list is an ordinal list of hosts or domains
*/
gchar * rspamd_hosts_read (rspamd_mempool_t *pool,
gchar *chunk,
gint len,
struct map_cb_data *data);
void rspamd_hosts_fin (rspamd_mempool_t *pool, struct map_cb_data *data);
/**
* Kv list is an ordinal list of keys and values separated by whitespace
*/
gchar * rspamd_kv_list_read (rspamd_mempool_t *pool,
gchar *chunk,
gint len,
struct map_cb_data *data);
void rspamd_kv_list_fin (rspamd_mempool_t *pool, struct map_cb_data *data);
/**
* FSM for lists parsing (support comments, blank lines and partial replies)
*/
gchar * rspamd_parse_abstract_list (rspamd_mempool_t * pool,
gchar * chunk,
gint len,
struct map_cb_data *data,
insert_func func);
#endif
|