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