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