513205a3882e492866c478bc0104dff888ed6a51
[middleman.git] / include / proto.h
1 #ifndef PROTO_H
2 #define PROTO_H
3
4 #include "flags.h"
5 #include "../config.h"
6 #include "../pcre/pcre.h"
7 #include "../pcre/pcreposix.h"
8 #include <pthread.h>
9
10 #ifdef HAVE_POLL
11 #include <sys/poll.h>
12 #endif
13
14 #if defined(HAVE_GZOPEN) && defined(HAVE_ZLIB_H)
15 #define HAVE_ZLIB 1
16 #endif
17
18 #include "compat.h"
19 #include "settings.h"
20 #include "types.h"
21 #include "macros.h"
22
23 #undef strncpy
24 #define strncpy(a,b,c) dont_use_strncpy()
25 #undef strncat
26 #define strncat(a,b,c) dont_use_strncat()
27
28 /* main.c */
29 void config();
30 int config_load(int, char *);
31 int config_save(char *);
32 int process_new(CONNECTION *);
33 void process_entry(CONNECTION *);
34 void mainloop();
35 void show_help(char **);
36 int pid_check(char *);
37
38 /* mem.c */
39 void *xmalloc(int size);
40 void *xrealloc(void *, int);
41 void xfree(void *);
42
43 /* xml.c */
44 XML_LIST *xml_load(XML_LIST *, char *);
45 XML_LIST *xml_list_add(XML_LIST *, char *, int);
46 void xml_list_free(XML_LIST *);
47 XML_LIST *xml_section(XML_LIST *, char *);
48 int xml_save(XML_LIST *, char *);
49
50 /* access.c */
51 ACCESS_LIST *access_load(ACCESS_LIST *, XML_LIST *);
52 void access_free(ACCESS_LIST *);
53 void access_ll_free(struct ACCESS_LIST_LIST *);
54 int access_check(ACCESS_LIST *, CONNECTION *, char *, char *);
55 XML_LIST *access_xml(ACCESS_LIST *, XML_LIST *);
56 void access_ll_insert(struct ACCESS_LIST_LIST *, char *, char *, char *, char *, char *, char *);
57 struct ACCESS_LIST_LIST *access_ll_new(struct ACCESS_LIST_LIST *);
58 struct ACCESS_LIST_LIST *access_ll_delete(struct ACCESS_LIST_LIST *);
59
60 /* header.c */
61 HEADER *header_new();
62 HEADER_LIST *header_load(HEADER_LIST *, XML_LIST *);
63 XML_LIST *header_xml(HEADER_LIST *, XML_LIST *);
64 void header_free(HEADER_LIST *);
65 void header_ll_free(struct HEADER_LIST_LIST *);
66 void header_ll_insert(struct HEADER_LIST_LIST *, char *, char *, char *, char *);
67 struct HEADER_LIST_LIST *header_ll_new(struct HEADER_LIST_LIST *);
68 struct HEADER_LIST_LIST *header_ll_delete(struct HEADER_LIST_LIST *);
69 struct HTTP_HEADER_LIST *header_list_insert(struct HTTP_HEADER_LIST *, char *, char *);
70 struct HTTP_HEADER_LIST *header_list_dup(struct HTTP_HEADER_LIST *);
71 HEADER *http_header_parse_request(char *);
72 HEADER *http_header_parse_response(char *);
73 HEADER *http_header_dup(HEADER *);
74 void http_header_list_parse(HEADER *, char *);
75 void http_header_free(HEADER *);
76 void http_header_list_free(struct HTTP_HEADER_LIST *);
77 struct HTTP_HEADER_LIST *header_filter(HEADER_LIST *, CONNECTION *);
78 char *header_get(CONNECTION *, int, int);
79 void header_send(HEADER *, CONNECTION *, int, int);
80 int bad_header(char *, int);
81 struct url_command_t **url_command_parse(char *);
82 char *url_command_create(struct url_command_t **);
83 void url_command_free(struct url_command_t **);
84 char *url_command_add(CONNECTION *, char *);
85
86 /* filter.c */
87 FILTER_LIST *filter_load(FILTER_LIST *, XML_LIST *);
88 void filter_free(FILTER_LIST *);
89 void filter_ll_free(struct FILTER_LIST_LIST *);
90 XML_LIST *filter_xml(FILTER_LIST *, XML_LIST *);
91 struct FILTER_LIST_LIST *filter_check(FILTER_LIST *, CONNECTION *);
92 FILEBUF *filter_get(FILTER_LIST *, char *);
93 void filter_ll_insert(struct FILTER_LIST_LIST *, char *, char *, char *, char *);
94 struct FILTER_LIST_LIST *filter_ll_delete(struct FILTER_LIST_LIST *);
95 struct FILTER_LIST_LIST *filter_ll_new(struct FILTER_LIST_LIST *);
96
97 /* cookies.c */
98 COOKIE_LIST *cookie_load(COOKIE_LIST *, XML_LIST *);
99 XML_LIST *cookie_xml(COOKIE_LIST *, XML_LIST *);
100 void cookie_free(COOKIE_LIST *);
101 void cookie_ll_free(struct COOKIE_LIST_LIST *);
102 void cookie_ll_insert(struct COOKIE_LIST_LIST *, char *, char *, char *);
103 struct COOKIE_LIST_LIST *cookie_ll_new(struct COOKIE_LIST_LIST *);
104 struct COOKIE_LIST_LIST *cookie_ll_delete(struct COOKIE_LIST_LIST *);
105 int cookie_check(COOKIE_LIST *, int, CONNECTION *);
106
107 /* misc.c */
108 char *s_strncpy(char *, char *, size_t);
109 char *s_strncat(char *, char *, size_t);
110 char *s_strcasestr(char *, char *);
111 void filebuf_free(FILEBUF *);
112 char *code_to_error(int);
113 char *xstrdup(char *);
114 char *xstrndup(char *, int);
115 char *error_to_template(int);
116 void hostent_free(HOSTENT *);
117 int isip(char *);
118 void string_tolower(char *);
119 FILEBUF *filebuf_new();
120 void filebuf_add(FILEBUF *, const char *, int);
121 void filebuf_resize(FILEBUF *, int);
122 void filebuf_addf(FILEBUF *, const char *, ...);
123 void filebuf_replace(FILEBUF *, int, int, char *);
124 void filebuf_shorten(FILEBUF *);
125 int filebuf_gzip(FILEBUF *);
126 int filebuf_ungzip(FILEBUF *);
127 char *string_to_html(char *, int);
128 int filebuf_save(FILEBUF *, char *);
129 char *url_encode(char *, int);
130 char *url_decode(char *, int);
131 char *string_to_xml(char *);
132 char **string_break(char *, char);
133 int filebuf_read(FILEBUF *, char *);
134
135 /* base64.c */
136 void to64frombits(unsigned char *, const unsigned char *, int);
137 int from64tobits(char *, const char *);
138
139 /* regexp.c */
140 regex_t *reg_compile(char *, int);
141 void reg_free(regex_t *);
142 int reg_exec(regex_t *, char *);
143 regex_sub_t *reg_sub_compile(char *, int);
144 regmatch_sub_t *reg_sub_exec(regex_sub_t *, char *);
145 char *reg_sub_parse(regmatch_sub_t *, char *);
146 void reg_sub_match_free(regmatch_sub_t *);
147 void reg_sub_free(regex_sub_t *);
148 void reg_replace(FILEBUF *, regex_sub_t *, char *);
149 void string_replace(FILEBUF *, char *, char *);
150
151 /* network.c */
152 void net_init();
153 int net_listen(int, char *);
154 CONNECTION *net_accept(int);
155 void net_close(CONNECTION *);
156 void net_listen_closeall();
157 int net_connect(char *, int);
158 int net_proxy(CONNECTION *, int);
159 int net_transfer(CONNECTION *, int, int);
160 NETWORK *network_load(NETWORK *, XML_LIST *);
161 XML_LIST *network_xml(NETWORK *, XML_LIST *);
162 void network_free(NETWORK *);
163 void listen_list_insert(struct LISTEN_LIST *, char *, char *);
164 struct LISTEN_LIST *listen_list_delete(struct LISTEN_LIST *);
165 struct LISTEN_LIST *listen_list_new(struct LISTEN_LIST *);
166 void network_check(NETWORK *);
167 void net_filebuf_read(FILEBUF *, CONNECTION *, int, int);
168 int net_filebuf_send(FILEBUF *, CONNECTION *, int);
169 int net_socks4(CONNECTION *, char *, int);
170 int putsock(SOCKET *, char *, ...);
171 HOSTENT *net_dns(char *);
172
173 /* socket.c */
174 SOCKET *sock_new(int);
175 void sock_close(SOCKET *);
176 int sock_read(SOCKET *, void *, int);
177 int sock_write(SOCKET *, void *, int);
178 int sock_getline(SOCKET *, char *, int);
179 void sock_flush(SOCKET *);
180 void sock_resize(SOCKET *, int, int);
181 void sock_clear(SOCKET *, int);
182
183 /* protocol.c */
184 int protocol_start(CONNECTION *);
185 int protocol_reconnect(CONNECTION *);
186 int protocol_http(CONNECTION *);
187 int protocol_connect(CONNECTION *);
188 unsigned int next_chunksize(CONNECTION *, int);
189 FILEBUF *http_transfer_filebuf(CONNECTION *, int);
190 void http_transfer_discard(CONNECTION *, int);
191 void http_transfer(CONNECTION *, int);
192 int proxy_authenticate(CONNECTION *);
193 int send_ntlm_response(CONNECTION *);
194 int send_basic_response(CONNECTION *);
195
196 /* template.c */
197 TEMPLATES *templates_load(TEMPLATES *, XML_LIST *);
198 XML_LIST *templates_xml(TEMPLATES *, XML_LIST *);
199 void templates_free(TEMPLATES *);
200 void templates_list_free(struct TEMPLATE_LIST *);
201 void template_list_insert(struct TEMPLATE_LIST *, char *, char *, char *, char *, char *, char *);
202 struct TEMPLATE_LIST *template_list_new(struct TEMPLATE_LIST *);
203 struct TEMPLATE_LIST *template_list_delete(struct TEMPLATE_LIST *);
204 FILEBUF *template_get(TEMPLATES *, CONNECTION *, char *);
205 int template_send(TEMPLATES *, char *, CONNECTION *, int);
206
207 /* rewrite.c */
208 REWRITE_LIST *rewrite_load(REWRITE_LIST *, XML_LIST *);
209 XML_LIST *rewrite_xml(REWRITE_LIST *, XML_LIST *);
210 void rewrite_free(REWRITE_LIST *);
211 void rewrite_list_free(struct REWRITE_LIST_LIST *);
212 int rewrite_do(REWRITE_LIST *, CONNECTION *, FILEBUF *, int, int);
213 void rewrite_list_insert(struct REWRITE_LIST_LIST *, char *, char *, char *, char *, char *, char *, char *);
214 struct REWRITE_LIST_LIST *rewrite_list_delete(struct REWRITE_LIST_LIST *);
215 struct REWRITE_LIST_LIST *rewrite_list_new(struct REWRITE_LIST_LIST *);
216
217 /* log.c */
218 void putlog(int, char *, ...);
219 void logbuffer_add(LOGBUFFER *, char *);
220 void logbuffer_clear(LOGBUFFER *);
221 void logbuffer_resize(LOGBUFFER *, int);
222
223 /* signal.c */
224 void signal_setup();
225
226 /* compat.c */
227 HOSTENT *p_gethostbyname(char *);
228 int p_poll(struct pollfd *, int, int);
229 int p_setenv(char *, char *, int);
230 void p_clearenv();
231
232 /* external.c */
233 EXTERNAL *external_load(EXTERNAL *, XML_LIST *);
234 XML_LIST *external_xml(EXTERNAL *, XML_LIST *);
235 void external_free(EXTERNAL *);
236 void external_list_free(struct EXTERNAL_LIST_LIST *);
237 void external_list_insert(struct EXTERNAL_LIST_LIST *, char *, char *, char *, char *, char *, char *, char *);
238 struct EXTERNAL_LIST_LIST *external_list_delete(struct EXTERNAL_LIST_LIST *);
239 struct EXTERNAL_LIST_LIST *external_list_new(struct EXTERNAL_LIST_LIST *);
240 struct EXTERNAL_LIST_LIST *external_find(EXTERNAL *, CONNECTION *);
241 FILEBUF *external_exec(CONNECTION *, char *, FILEBUF *, int);
242 char *external_getmime(FILEBUF *);
243 char *env_header_format(char *, char *);
244
245 /* mime.c */
246 MIME_LIST *mime_load(MIME_LIST *, XML_LIST *);
247 XML_LIST *mime_xml(MIME_LIST *, XML_LIST *);
248 void mime_free(MIME_LIST *);
249 void mime_ll_free(struct MIME_LIST_LIST *);
250 void mime_ll_insert(struct MIME_LIST_LIST *, char *, char *, char *, char *, char *);
251 struct MIME_LIST_LIST *mime_ll_delete(struct MIME_LIST_LIST *);
252 struct MIME_LIST_LIST *mime_ll_new(struct MIME_LIST_LIST *);
253 struct MIME_LIST_LIST *mime_check(MIME_LIST *, CONNECTION *);
254
255 /* hash.c */
256 unsigned int hash_key(int, char *);
257 HASH_TABLE *hash_create(int);
258 void hash_insert(HASH_TABLE *, char *, void *);
259 void hash_purge(HASH_TABLE *, char *);
260 char *hash_search(HASH_TABLE *, char *);
261 void hash_destroy(HASH_TABLE *);
262 int hash_expire(HASH_TABLE *, unsigned int);
263
264 /* redirect.c */
265 REDIRECT_LIST *redirect_load(REDIRECT_LIST *, XML_LIST *);
266 XML_LIST *redirect_xml(REDIRECT_LIST *, XML_LIST *);
267 struct REDIRECT_LIST_LIST *redirect_list_new(struct REDIRECT_LIST_LIST *);
268 void redirect_list_insert(struct REDIRECT_LIST_LIST *, char *, char *, char *, char *, char *, char *, char *);
269 void redirect_free(REDIRECT_LIST *);
270 void redirect_list_free(struct REDIRECT_LIST_LIST *);
271 struct REDIRECT_LIST_LIST *redirect_list_delete(struct REDIRECT_LIST_LIST *);
272 int redirect_do(REDIRECT_LIST *, CONNECTION *, int);
273
274 /* forward.c */
275 FORWARD_LIST *forward_load(FORWARD_LIST *, XML_LIST *);
276 XML_LIST *forward_xml(FORWARD_LIST *, XML_LIST *);
277 struct FORWARD_LIST_LIST *forward_list_new(struct FORWARD_LIST_LIST *);
278 void forward_list_insert(struct FORWARD_LIST_LIST *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *);
279 struct FORWARD_LIST_LIST *forward_list_delete(struct FORWARD_LIST_LIST *);
280 void forward_list_free(struct FORWARD_LIST_LIST *);
281 void forward_free(FORWARD_LIST *);
282 int forward_do(FORWARD_LIST *, CONNECTION *);
283
284 /* keywords.c */
285 KEYWORD_LIST *keyword_load(KEYWORD_LIST *, XML_LIST *);
286 XML_LIST *keyword_xml(KEYWORD_LIST *, XML_LIST *);
287 struct KEYWORD_LIST_LIST *keyword_list_new(struct KEYWORD_LIST_LIST *);
288 void keyword_list_insert(struct KEYWORD_LIST_LIST *, char *, char *, char *, char *, char *, char *);
289 struct KEYWORD_LIST_LIST *keyword_list_delete(struct KEYWORD_LIST_LIST *);
290 void keyword_list_free(struct KEYWORD_LIST_LIST *);
291 void keyword_free(KEYWORD_LIST *);
292 int keyword_check(KEYWORD_LIST *, CONNECTION *, FILEBUF *, int);
293
294 /* interface.c */
295 struct cgi_args_t *cgi_parse_request(char *);
296 void cgi_args_free(struct cgi_args_t *);
297 void interface_handle_request(CONNECTION *);
298 void interface_page_connections(FILEBUF *, struct cgi_args_t *, CONNECTION *);
299 void interface_page_dnscache(FILEBUF *, struct cgi_args_t *, CONNECTION *);
300 void interface_page_headers(FILEBUF *, struct cgi_args_t *, CONNECTION *);
301 void interface_page_save(FILEBUF *, struct cgi_args_t *, CONNECTION *);
302 void interface_page_load(FILEBUF *, struct cgi_args_t *, CONNECTION *);
303 void interface_page_log(FILEBUF *, struct cgi_args_t *, CONNECTION *);
304 void interface_page_config(FILEBUF *, struct cgi_args_t *, CONNECTION *);
305 void interface_page_config_filter(FILEBUF *, struct cgi_args_t *, CONNECTION *);
306 void interface_page_config_filter_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
307 void interface_page_config_filter_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
308 void interface_page_config_header(FILEBUF *, struct cgi_args_t *, CONNECTION *);
309 void interface_page_config_header_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
310 void interface_page_config_header_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
311 void interface_page_config_access(FILEBUF *, struct cgi_args_t *, CONNECTION *);
312 void interface_page_config_access_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
313 void interface_page_config_access_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
314 void interface_page_config_rewrite(FILEBUF *, struct cgi_args_t *, CONNECTION *);
315 void interface_page_config_rewrite_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
316 void interface_page_config_rewrite_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
317 void interface_page_config_mime(FILEBUF *, struct cgi_args_t *, CONNECTION *);
318 void interface_page_config_mime_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
319 void interface_page_config_mime_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
320 void interface_page_config_cookies(FILEBUF *, struct cgi_args_t *, CONNECTION *);
321 void interface_page_config_cookies_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
322 void interface_page_config_cookies_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
323 void interface_page_config_external(FILEBUF *, struct cgi_args_t *, CONNECTION *);
324 void interface_page_config_external_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
325 void interface_page_config_external_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
326 void interface_page_config_templates(FILEBUF *, struct cgi_args_t *, CONNECTION *);
327 void interface_page_config_templates_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
328 void interface_page_config_templates_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
329 void interface_page_config_network(FILEBUF *, struct cgi_args_t *, CONNECTION *);
330 void interface_page_config_redirect(FILEBUF *, struct cgi_args_t *, CONNECTION *);
331 void interface_page_config_redirect_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
332 void interface_page_config_redirect_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
333 void interface_page_config_forward(FILEBUF *, struct cgi_args_t *, CONNECTION *);
334 void interface_page_config_forward_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
335 void interface_page_config_forward_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
336 void interface_page_config_keywords(FILEBUF *, struct cgi_args_t *, CONNECTION *);
337 void interface_page_config_keywords_dialog(FILEBUF *, struct cgi_args_t *, CONNECTION *);
338 void interface_page_config_keywords_action(FILEBUF *, struct cgi_args_t *, CONNECTION *);
339 void filter_check_show(CONNECTION *);
340 void mime_check_show(CONNECTION *);
341 void score_show(CONNECTION *, int);
342
343 #endif                          /* PROTO_H */