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