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