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