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