EXPIRE command
[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 #include "llist.h"
25 #include "psplay.h"
26
27 #include <errno.h>
28 #include <string.h>
29 #include <stdlib.h>
30 #include <stdarg.h>
31 #include <unistd.h>
32 #include <regex.h>
33 #include <syslog.h>
34 #include <sys/stat.h>
35 #include <sys/time.h>
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <netinet/in.h>
39 #include <arpa/inet.h>
40 #include <event.h>
41 #include <time.h>
42
43 #define RXPD_COMMANDS                                           \
44   RXPD_CMD(CHECK,       "data against regular expressions")     \
45   RXPD_CMD(APPEND,      "new rules to a list")                  \
46   RXPD_CMD(PREPEND,     "new rules in front of a list")         \
47   RXPD_CMD(REMOVE,      "rules from a list")                    \
48   RXPD_CMD(REPLACE,     "a rule in a list with new rules")      \
49   RXPD_CMD(LOAD,        "a list from disk")                     \
50   RXPD_CMD(SAVE,        "a list to disk")                       \
51   RXPD_CMD(EXPIRE,      "aged rules from a list")               \
52   RXPD_CMD(DUMP,        "rules in a list")                      \
53   RXPD_CMD(LIST,        "all existing lists")                   \
54   RXPD_CMD(VERSION,     "of this rxpd is "PACKAGE_STRING)       \
55   RXPD_CMD(HELP,        "is what you see right now")            \
56   RXPD_CMD(SHUTDOWN,    "the daemon")
57
58 #define RXPD_CMD(cmd, _) RXPD_CMD_##cmd,
59 enum rxpd_cmd_e {RXPD_COMMANDS};
60 #undef RXPD_CMD
61
62 /*
63  * characters which are absolutely not allowed in rule filenames
64  * for finer control use policies
65  */
66 #define RXPD_FILE_ILG_CHARS "/: \t\n*?\\"
67
68 struct rxpd_base;
69 struct rxpd_file;
70 struct rxpd_rule;
71 struct rxpd_socket;
72 struct rxpd_buffer;
73 struct rxpd_connection;
74
75 struct rxpd_base
76 {
77   char* basedir;
78
79   int verbosity;
80   int regflags;
81   int daemonize;
82
83   struct rxpd_file* policy;
84   struct event_base* eventbase;
85
86   // TODO
87   //FILE* -l log      log hits to logfile
88
89   psplayroot files;
90   llist sockets;
91 };
92
93 struct rxpd_base*
94 rxpd_init (struct event_base* eventbase);
95
96 void
97 rxpd_destroy (void);
98
99 void
100 rxpd_log (struct rxpd_base*, int level, const char* fmt, ...);
101
102 void
103 rxpd_die (const char* fmt, ...);
104
105 void*
106 rxpd_malloc (size_t size);
107
108 char*
109 rxpd_strdup (const char* str);
110
111
112 //
113 struct rxpd_rule
114 {
115   llist node;
116   char* string;
117   time_t atime;
118   regex_t rx;
119 };
120
121 struct rxpd_rule*
122 rxpd_rule_new (const char* buf);
123
124 void
125 rxpd_rule_delete (struct rxpd_rule*);
126
127
128
129 //
130 struct rxpd_file
131 {
132   psplay node;          // key points to basename part of filename
133   const char* filename; // full filename
134   //TODO later     struct stat last_stat;
135   struct rxpd_base* base;
136   llist rules;
137 };
138
139 struct rxpd_file*
140 rxpd_file_new (struct rxpd_base* base, const char* filename);
141
142 void
143 rxpd_file_delete (PSplay file);
144
145 int
146 rxpd_file_load (struct rxpd_file* self);
147
148 int
149 rxpd_file_save (struct rxpd_file* self);
150
151 int
152 rxpd_file_cmp (const void* A, const void* B);
153
154
155 //
156
157 struct rxpd_socket
158 {
159   llist node;
160   int fd;
161   struct event ev;
162   struct rxpd_base* base;
163   int (*rxpd_socket_addr)(struct rxpd_connection* conn, char* dst, const char* pfx, size_t size);
164 };
165
166
167 struct rxpd_socket*
168 rxpd_socket_new_tcp4 (struct rxpd_base* base, const char* addr, unsigned short port);
169
170 int
171 rxpd_socket_tcp4addr (struct rxpd_connection* conn, char* dst, const char* pfx, size_t size);
172
173 //TODO
174 //struct rxpd_socket*
175 //rxpd_socket_new_unix (struct rxpd_base* base, const char* name);
176
177 void
178 rxpd_socket_delete (struct rxpd_socket* self);
179
180 void
181 rxpd_socket_accept (int sock, short event, void* ptr);
182
183 struct rxpd_socket*
184 rxpd_socket_schedule (struct rxpd_socket* self);
185
186 struct rxpd_socket*
187 rxpd_socket_suspend (struct rxpd_socket* self);
188
189
190 //
191
192 enum rxpd_buffer_state_e
193   {
194     RXPD_OK,            // operational
195     RXPD_EOF,           // connection closed
196     RXPD_ERROR          // some other error
197   };
198
199 struct rxpd_buffer
200 {
201   struct rxpd_connection* conn;
202   enum rxpd_buffer_state_e state;
203   char* eol;
204   char* eob;
205   char buffer[4096];
206 };
207
208 struct rxpd_buffer*
209 rxpd_buffer_init (struct rxpd_buffer* self, struct rxpd_connection* conn);
210
211 char*
212 rxpd_buffer_readline (struct rxpd_buffer* self, int again);
213
214 int
215 rxpd_buffer_printf (struct rxpd_buffer* self, const char* fmt, ...);
216
217 inline static enum rxpd_buffer_state_e
218 rxpd_buffer_state (struct rxpd_buffer* self)
219 {
220   return self->state;
221 }
222
223
224 //
225 struct rxpd_connection
226 {
227   int fd;
228   struct event ev;
229   struct rxpd_file* file;
230   struct rxpd_socket* socket;
231   char* tmp_str;
232   llist tmp_list;
233
234   struct rxpd_buffer in;
235   struct rxpd_buffer out;
236 };
237
238
239 struct rxpd_connection*
240 rxpd_connection_new (struct rxpd_socket* socket, int accept_fd);
241
242 void
243 rxpd_connection_delete (struct rxpd_connection* self);
244
245 struct rxpd_connection*
246 rxpd_connection_schedule (struct rxpd_connection* self);
247
248 int
249 rxpd_connection_readline (struct rxpd_connection* self);
250
251 int
252 rxpd_connection_check_policy (struct rxpd_connection* self, char* line);
253
254 void
255 rxpd_connection_parse_cmd (int fd, short event, void* ptr);
256
257 /* generate prototypes for each defined command */
258 #define RXPD_CMD(cmd, _) void rxpd_connection_cmd_##cmd (int fd, short event, void* ptr);
259 RXPD_COMMANDS
260 #undef RXPD_CMD
261
262
263 #endif