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