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