New CLEAR command, removes all rules from a list
[rxpd] / src / rxpd.h
1 /*
2     rxpd.h - regex policy daemon
3
4   Copyright (C)
5     2007,               Christian Thaeter <ct@pipapo.org>
6
7   This program is free software; you can redistribute it and/or
8   modify it under the terms of the GNU General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 #ifndef RXPD_H
22 #define RXPD_H
23
24 #define _GNU_SOURCE
25
26 #include "llist.h"
27 #include "psplay.h"
28
29 #include <errno.h>
30 #include <string.h>
31 #include <stdlib.h>
32 #include <stdarg.h>
33 #include <unistd.h>
34 #include <regex.h>
35 #include <syslog.h>
36 #include <signal.h>
37 #include <sys/stat.h>
38 #include <sys/time.h>
39 #include <sys/types.h>
40 #include <sys/socket.h>
41 #include <sys/resource.h>
42 #include <netinet/in.h>
43 #include <arpa/inet.h>
44 #include <fcntl.h>
45 #include <pth.h>
46 #include <time.h>
47 #include <netdb.h>
48 #include <pwd.h>
49 #include <grp.h>
50
51 #define RXPD_COMMANDS                                           \
52   RXPD_CMD(CHECK,       "data against regular expressions")     \
53   RXPD_CMD(APPEND,      "new rules to a list")                  \
54   RXPD_CMD(PREPEND,     "new rules in front of a list")         \
55   RXPD_CMD(REMOVE,      "rules from a list")                    \
56   RXPD_CMD(REPLACE,     "a rule in a list with new rules")      \
57   RXPD_CMD(CLEAR,       "list rules in memory")                 \
58   RXPD_CMD(DELETE,      "a list from disk")                     \
59   RXPD_CMD(LOAD,        "a list from disk")                     \
60   RXPD_CMD(SAVE,        "a list to disk")                       \
61   RXPD_CMD(FETCH,       "a list from a remote server")          \
62   RXPD_CMD(UPDATE,      "atimes from other lists")              \
63   RXPD_CMD(MERGE,       "new rules from from other lists")      \
64   RXPD_CMD(EXPIRE,      "aged rules from a list")               \
65   RXPD_CMD(FILTER,      "rules in a list")                      \
66   RXPD_CMD(DUMP,        "rules in a list")                      \
67   RXPD_CMD(LIST,        "all existing lists")                   \
68   RXPD_CMD(VERSION,     "of this rxpd is "PACKAGE_VERSION)      \
69   RXPD_CMD(HELP,        "is what you see right now")            \
70   RXPD_CMD(SHUTDOWN,    "the daemon")
71
72 #define RXPD_CMD(cmd, _) RXPD_CMD_##cmd,
73 enum rxpd_cmd_e {RXPD_COMMANDS};
74 #undef RXPD_CMD
75
76 /*
77  * characters which are absolutely not allowed in rule filenames
78  * for finer control use policies, note that this are arbitary
79  * decisions also reserving some chars for later extension
80  */
81 #define RXPD_FILE_ILG_CHARS "&?<>|: \t\n\r*?\\"
82
83 /*
84  * Call a cooperative pth_yield every this much expensive interations
85  * not implemented yet
86  * A higher number favors throughput, lower number improves latency
87  */
88 #define RXPD_YIELD_EVERY 500
89
90 #define RXPD_PREFIXCMP(str, pfx) (!strncmp (str, pfx, sizeof (pfx)-1))
91
92 struct rxpd_base;
93 struct rxpd_file;
94 struct rxpd_rule;
95 struct rxpd_socket;
96 struct rxpd_buffer;
97 struct rxpd_connection;
98
99 struct rxpd_base
100 {
101   char* basedir;
102
103   int verbosity;
104   int regflags;
105   int daemonize;
106   const char* locale;
107   const char* user;
108
109   struct rxpd_file* policy;
110
111   pth_t main;
112
113   // TODO
114   //FILE* -l log      log hits to logfile
115
116   psplayroot files;
117   llist sockets;
118 };
119
120 struct rxpd_base*
121 rxpd_init (void);
122
123 void
124 rxpd_destroy (void);
125
126 void
127 rxpd_log (struct rxpd_base*, int level, const char* fmt, ...);
128
129 void
130 rxpd_fail (struct rxpd_base*, const char* fmt, ...);
131
132 void
133 rxpd_die (const char* fmt, ...);
134
135 void*
136 rxpd_malloc (size_t size);
137
138 char*
139 rxpd_strdup (const char* str);
140
141 void
142 rxpd_enter_personality (struct rxpd_base* self);
143
144 void
145 rxpd_signalloop (struct rxpd_base* self);
146
147 //
148 struct rxpd_rule
149 {
150   llist node;
151   char* string;
152   time_t atime;
153   struct rxpd_base* base;
154   regex_t rx;
155 };
156
157 struct rxpd_rule*
158 rxpd_rule_new (const char* buf, struct rxpd_base* base);
159
160 struct rxpd_rule*
161 rxpd_rule_copy (const struct rxpd_rule* src);
162
163 struct rxpd_rule*
164 rxpd_rule_activate (struct rxpd_rule* self);
165
166 struct rxpd_rule*
167 rxpd_rule_comment (struct rxpd_rule* self, const char* comment);
168
169 void
170 rxpd_rule_delete (struct rxpd_rule* self);
171
172
173
174 //
175 struct rxpd_file
176 {
177   psplay node;          // key points to basename part of filename
178   //TODO later     struct stat last_stat;
179   struct rxpd_base* base;
180   pth_rwlock_t lock;
181   llist rules;
182 };
183
184 struct rxpd_file*
185 rxpd_file_new (struct rxpd_base* base, const char* filename);
186
187 void
188 rxpd_file_delete (struct rxpd_file* file);
189
190 struct rxpd_file*
191 rxpd_file_rules_delete (struct rxpd_file* self);
192
193 int
194 rxpd_file_load (struct rxpd_file* self);
195
196 int
197 rxpd_file_save (struct rxpd_file* self);
198
199 struct rxpd_file*
200 rxpd_file_dump (struct rxpd_file* self, struct rxpd_buffer* out);
201
202 int
203 rxpd_file_cmp (const void* A, const void* B);
204
205
206 //
207
208 struct rxpd_socket
209 {
210   llist node;
211   int fd;
212   pth_event_t ev;
213   struct rxpd_base* base;
214   pth_t accepter;
215   int (*rxpd_socket_addr)(struct rxpd_connection* conn, char* dst, const char* pfx, size_t size);
216   llist connections;
217 };
218
219
220 struct rxpd_socket*
221 rxpd_socket_new_tcp4 (struct rxpd_base* base, const char* addr, unsigned short port);
222
223 int
224 rxpd_socket_tcp4addr (struct rxpd_connection* conn, char* dst, const char* pfx, size_t size);
225
226 //TODO
227 //struct rxpd_socket*
228 //rxpd_socket_new_unix (struct rxpd_base* base, const char* name);
229
230 void
231 rxpd_socket_delete (struct rxpd_socket* self);
232
233 void *
234 rxpd_socket_accept (void* ptr);
235
236 struct rxpd_socket*
237 rxpd_socket_spawn (struct rxpd_socket* self);
238
239 struct rxpd_socket*
240 rxpd_socket_join (struct rxpd_socket* self);
241
242 struct rxpd_socket*
243 rxpd_socket_cancel (struct rxpd_socket* self);
244
245 //
246
247 enum rxpd_buffer_state_e
248   {
249     RXPD_OK,            // operational
250     RXPD_EOF,           // connection closed
251     RXPD_ERROR          // some other error
252   };
253
254 struct rxpd_buffer
255 {
256   int fd;
257   enum rxpd_buffer_state_e state;
258   char* eol;
259   char* eob;
260   char buffer[4096];
261 };
262
263 struct rxpd_buffer*
264 rxpd_buffer_init (struct rxpd_buffer* self, int fd);
265
266 char*
267 rxpd_buffer_readline (struct rxpd_buffer* self);
268
269 int
270 rxpd_buffer_printf (struct rxpd_buffer* self, const char* fmt, ...);
271
272 inline static enum rxpd_buffer_state_e
273 rxpd_buffer_state (struct rxpd_buffer* self)
274 {
275   return self->state;
276 }
277
278
279 //
280 struct rxpd_connection
281 {
282   llist node;
283   int fd;
284   pth_t connecter;
285   struct rxpd_file* file;
286   struct rxpd_socket* socket;
287   char* tmp_str;
288   llist tmp_list;
289
290   struct rxpd_buffer in;
291   struct rxpd_buffer out;
292 };
293
294
295 struct rxpd_connection*
296 rxpd_connection_new (struct rxpd_socket* socket, int fd);
297
298 void
299 rxpd_connection_delete (struct rxpd_connection* self);
300
301 struct rxpd_connection*
302 rxpd_connection_spawn (struct rxpd_connection* self);
303
304 struct rxpd_connection*
305 rxpd_connection_cancel (struct rxpd_connection* self);
306
307 int
308 rxpd_connection_readline (struct rxpd_connection* self);
309
310 int
311 rxpd_connection_check_policy (struct rxpd_connection* self, char* line);
312
313 void*
314 rxpd_connection_parse_cmd (void* ptr);
315
316 /* generate prototypes for each defined command */
317 #define RXPD_CMD(cmd, _) void rxpd_connection_cmd_##cmd (struct rxpd_connection* self);
318 RXPD_COMMANDS
319 #undef RXPD_CMD
320
321
322 #endif