replaced 'activate' with 'schedule'
[rxpd] / 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 struct rxpd_base;
58 struct rxpd_file;
59 struct rxpd_rule;
60 struct rxpd_socket;
61 struct rxpd_buffer;
62 struct rxpd_connection;
63
64 struct rxpd_base
65 {
66   char* rulesdir;
67   psplayroot files;
68
69   llist sockets_pending;
70   llist sockets_active;
71   llist connections_pending;
72   llist connections_active;
73 };
74
75
76 struct rxpd_base*
77 rxpd_init (char* rulesdir);
78
79 void
80 rxpd_destroy (void);
81
82
83
84 //
85 struct rxpd_rule
86 {
87   llist node;
88   char* string;
89   regex_t rx;
90 };
91
92 struct rxpd_rule*
93 rxpd_rule_new (const char* buf);
94
95 void
96 rxpd_rule_delete (struct rxpd_rule*);
97
98
99
100 //
101 struct rxpd_file
102 {
103   psplay node;
104   //TODO later     struct stat last_stat;
105   llist rules;
106 };
107
108 struct rxpd_file*
109 rxpd_file_new (struct rxpd_base* base, const char* filename);
110
111 void
112 rxpd_file_delete (PSplay file);
113
114 int
115 rxpd_file_load (struct rxpd_file* self);
116
117 int
118 rxpd_file_cmp (const void* A, const void* B);
119
120
121 //
122
123 struct rxpd_socket
124 {
125   llist node;
126   int fd;
127   struct event ev;
128   struct rxpd_base* base;
129 };
130
131
132 struct rxpd_socket*
133 rxpd_socket_new_tcp4 (struct rxpd_base* base, const char* addr, unsigned short port);
134
135 //struct rxpd_socket*
136 //rxpd_socket_new_unix (struct rxpd_base* base, const char* name);
137
138 void
139 rxpd_socket_delete (struct rxpd_socket* self);
140
141 void
142 rxpd_socket_accept (int sock, short event, void* ptr);
143
144 struct rxpd_socket*
145 rxpd_socket_schedule (struct rxpd_socket* self);
146
147 struct rxpd_socket*
148 rxpd_socket_suspend (struct rxpd_socket* self);
149
150
151 //
152
153 enum rxpd_buffer_state_e
154   {
155     RXPD_OK,            // operational
156     RXPD_EOF,           // connection closed
157     RXPD_ERROR          // some other error
158   };
159
160 struct rxpd_buffer
161 {
162   struct rxpd_connection* conn;
163   enum rxpd_buffer_state_e state;
164   char* eol;
165   char* eob;
166   char buffer[4096];
167 };
168
169 struct rxpd_buffer*
170 rxpd_buffer_init (struct rxpd_buffer* self, struct rxpd_connection* conn);
171
172 char*
173 rxpd_buffer_readline (struct rxpd_buffer* self, int again);
174
175 inline static enum rxpd_buffer_state_e
176 rxpd_buffer_state (struct rxpd_buffer* self)
177 {
178   return self->state;
179 }
180
181
182 //
183 struct rxpd_connection
184 {
185   llist node;
186   int fd;
187   struct event ev;
188   struct rxpd_base* base;
189   struct rxpd_file* file;
190
191   struct sockaddr peer_addr;
192
193   struct rxpd_buffer in;
194   struct rxpd_buffer out;
195 };
196
197
198 struct rxpd_connection*
199 rxpd_connection_new (struct rxpd_base* base, int accept_fd);
200
201 void
202 rxpd_connection_delete (struct rxpd_connection* self);
203
204
205 struct rxpd_connection*
206 rxpd_connection_schedule (struct rxpd_connection* self);
207
208
209 struct rxpd_connection*
210 rxpd_connection_suspend (struct rxpd_connection* self);
211
212
213 int
214 rxpd_connection_readline (struct rxpd_connection* self);
215
216 void
217 rxpd_connection_parse_cmd (int fd, short event, void* ptr);
218
219 /* generate prototypes for each defined command */
220 #define RXPD_CMD(cmd) void rxpd_connection_cmd_##cmd (int fd, short event, void* ptr);
221 RXPD_COMMANDS
222 #undef RXPD_CMD
223
224
225 #endif