Security Plugin: set http status for URL rule match
[MonkeyD.git] / src / memory.c
blob2e19f6685489f73564125acc1c624b6ea9e33a9a
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 /* Monkey HTTP Daemon
4 * ------------------
5 * Copyright (C) 2001-2009, Eduardo Silva P. <edsiper@gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
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 Library General Public License for more details.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #define _GNU_SOURCE
23 #include <string.h>
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <pthread.h>
28 #include "monkey.h"
29 #include "config.h"
30 #include "memory.h"
31 #include "request.h"
32 #include "header.h"
33 #include "http.h"
34 #include "iov.h"
35 #include "user.h"
37 void *mk_mem_malloc(size_t size)
39 void *aux = 0;
41 if ((aux = malloc(size)) == NULL) {
42 perror("malloc");
43 return NULL;
46 return aux;
49 extern void *mk_mem_malloc_z(size_t size)
51 char *buf = 0;
53 buf = mk_mem_malloc(size);
54 if (!buf) {
55 return NULL;
58 bzero(buf, size);
60 return buf;
63 void *mk_mem_realloc(void *ptr, size_t size)
65 void *aux = 0;
67 if ((aux = realloc(ptr, size)) == NULL) {
68 perror("realloc");
69 return NULL;
72 return aux;
75 void mk_mem_free(void *ptr)
77 free(ptr);
80 mk_pointer mk_pointer_create(char *buf, long init, long end)
82 mk_pointer p;
84 mk_pointer_reset(&p);
85 p.data = buf + init;
87 if (init != end) {
88 p.len = (end - init);
90 else {
91 p.len = 1;
94 return p;
97 void mk_pointer_reset(mk_pointer * p)
99 p->data = NULL;
100 p->len = 0;
103 void mk_pointer_free(mk_pointer * p)
105 mk_mem_free(p->data);
106 p->len = 0;
109 char *mk_pointer_to_buf(mk_pointer p)
111 char *buf;
113 buf = strndup(p.data, p.len);
114 return (char *) buf;
117 void mk_pointer_print(mk_pointer p)
119 int i;
121 printf("\nDEBUG MK_POINTER: '");
122 for (i = 0; i < p.len && p.data != NULL; i++) {
123 printf("%c", p.data[i]);
125 printf("'");
126 fflush(stdout);
129 void mk_pointer_set(mk_pointer * p, char *data)
131 p->data = data;
132 p->len = strlen(data);
135 void mk_mem_pointers_init()
137 /* Short server response headers */
138 mk_pointer_set(&mk_header_short_date, MK_HEADER_SHORT_DATE);
139 mk_pointer_set(&mk_header_short_location, MK_HEADER_SHORT_LOCATION);
140 mk_pointer_set(&mk_header_short_ct, MK_HEADER_SHORT_CT);
142 /* Request vars */
143 mk_pointer_set(&mk_crlf, MK_CRLF);
144 mk_pointer_set(&mk_endblock, MK_ENDBLOCK);
146 /* Client headers */
147 mk_pointer_set(&mk_rh_accept, RH_ACCEPT);
148 mk_pointer_set(&mk_rh_accept_charset, RH_ACCEPT_CHARSET);
149 mk_pointer_set(&mk_rh_accept_encoding, RH_ACCEPT_ENCODING);
150 mk_pointer_set(&mk_rh_accept_language, RH_ACCEPT_LANGUAGE);
151 mk_pointer_set(&mk_rh_connection, RH_CONNECTION);
152 mk_pointer_set(&mk_rh_cookie, RH_COOKIE);
153 mk_pointer_set(&mk_rh_content_length, RH_CONTENT_LENGTH);
154 mk_pointer_set(&mk_rh_content_range, RH_CONTENT_RANGE);
155 mk_pointer_set(&mk_rh_content_type, RH_CONTENT_TYPE);
156 mk_pointer_set(&mk_rh_if_modified_since, RH_IF_MODIFIED_SINCE);
157 mk_pointer_set(&mk_rh_host, RH_HOST);
158 mk_pointer_set(&mk_rh_last_modified, RH_LAST_MODIFIED);
159 mk_pointer_set(&mk_rh_last_modified_since, RH_LAST_MODIFIED_SINCE);
160 mk_pointer_set(&mk_rh_referer, RH_REFERER);
161 mk_pointer_set(&mk_rh_range, RH_RANGE);
162 mk_pointer_set(&mk_rh_user_agent, RH_USER_AGENT);
164 /* Server response first header */
165 mk_pointer_set(&mk_hr_http_ok, MK_HR_HTTP_OK);
166 mk_pointer_set(&mk_hr_http_partial, MK_HR_HTTP_PARTIAL);
167 mk_pointer_set(&mk_hr_redir_moved, MK_HR_REDIR_MOVED);
168 mk_pointer_set(&mk_hr_redir_moved_t, MK_HR_REDIR_MOVED_T);
169 mk_pointer_set(&mk_hr_not_modified, MK_HR_NOT_MODIFIED);
170 mk_pointer_set(&mk_hr_client_bad_request, MK_HR_CLIENT_BAD_REQUEST);
171 mk_pointer_set(&mk_hr_client_forbidden, MK_HR_CLIENT_FORBIDDEN);
172 mk_pointer_set(&mk_hr_client_not_found, MK_HR_CLIENT_NOT_FOUND);
173 mk_pointer_set(&mk_hr_client_method_not_allowed,
174 MK_HR_CLIENT_METHOD_NOT_ALLOWED);
175 mk_pointer_set(&mk_hr_client_request_timeout,
176 MK_HR_CLIENT_REQUEST_TIMEOUT);
177 mk_pointer_set(&mk_hr_client_length_required,
178 MK_HR_CLIENT_LENGTH_REQUIRED);
179 mk_pointer_set(&mk_hr_client_request_entity_too_large,
180 MK_HR_CLIENT_REQUEST_ENTITY_TOO_LARGE);
181 mk_pointer_set(&mk_hr_server_internal_error, MK_HR_SERVER_INTERNAL_ERROR);
182 mk_pointer_set(&mk_hr_server_not_implemented,
183 MK_HR_SERVER_NOT_IMPLEMENTED);
184 mk_pointer_set(&mk_hr_server_http_version_unsup,
185 MK_HR_SERVER_HTTP_VERSION_UNSUP);
187 /* Server response normal headers */
188 mk_pointer_set(&mk_header_conn_ka, MK_HEADER_CONN_KA);
189 mk_pointer_set(&mk_header_conn_close, MK_HEADER_CONN_CLOSE);
190 mk_pointer_set(&mk_header_content_length, MK_HEADER_CONTENT_LENGTH);
191 mk_pointer_set(&mk_header_accept_ranges, MK_HEADER_ACCEPT_RANGES);
192 mk_pointer_set(&mk_header_te_chunked, MK_HEADER_TE_CHUNKED);
193 mk_pointer_set(&mk_header_last_modified, MK_HEADER_LAST_MODIFIED);
195 mk_http_status_list_init();
196 mk_iov_separators_init();
198 /* Server */
199 mk_pointer_set(&mk_monkey_protocol, HTTP_PROTOCOL_11_STR);
201 /* HTTP */
202 mk_pointer_set(&mk_http_method_get_p, HTTP_METHOD_GET_STR);
203 mk_pointer_set(&mk_http_method_post_p, HTTP_METHOD_POST_STR);
204 mk_pointer_set(&mk_http_method_head_p, HTTP_METHOD_HEAD_STR);
205 mk_pointer_reset(&mk_http_method_null_p);
207 mk_pointer_set(&mk_http_protocol_09_p, HTTP_PROTOCOL_09_STR);
208 mk_pointer_set(&mk_http_protocol_10_p, HTTP_PROTOCOL_10_STR);
209 mk_pointer_set(&mk_http_protocol_11_p, HTTP_PROTOCOL_11_STR);
210 mk_pointer_reset(&mk_http_protocol_null_p);
212 /* User Home */
213 mk_pointer_set(&mk_user_home, MK_USER_HOME);