Add Eduardo's email to copyright header files
[MonkeyD.git] / src / memory.c
bloba4d15769458f60aac0d6b9acd685663be240c841
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 char *aux = 0;
67 if ((aux = realloc(ptr, size)) == NULL) {
68 perror("realloc");
69 return NULL;
72 return (void *) 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; 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 /* Error messages */
138 mk_pointer_set(&request_error_msg_400, ERROR_MSG_400);
139 mk_pointer_set(&request_error_msg_403, ERROR_MSG_403);
140 mk_pointer_set(&request_error_msg_404, ERROR_MSG_404);
141 mk_pointer_set(&request_error_msg_405, ERROR_MSG_405);
142 mk_pointer_set(&request_error_msg_408, ERROR_MSG_408);
143 mk_pointer_set(&request_error_msg_411, ERROR_MSG_411);
144 mk_pointer_set(&request_error_msg_500, ERROR_MSG_500);
145 mk_pointer_set(&request_error_msg_501, ERROR_MSG_501);
146 mk_pointer_set(&request_error_msg_505, ERROR_MSG_505);
148 /* Short server response headers */
149 mk_pointer_set(&mk_header_short_date, MK_HEADER_SHORT_DATE);
150 mk_pointer_set(&mk_header_short_location, MK_HEADER_SHORT_LOCATION);
151 mk_pointer_set(&mk_header_short_ct, MK_HEADER_SHORT_CT);
153 /* Request vars */
154 mk_pointer_set(&mk_crlf, MK_CRLF);
155 mk_pointer_set(&mk_endblock, MK_ENDBLOCK);
157 /* Client headers */
158 mk_pointer_set(&mk_rh_accept, RH_ACCEPT);
159 mk_pointer_set(&mk_rh_accept_charset, RH_ACCEPT_CHARSET);
160 mk_pointer_set(&mk_rh_accept_encoding, RH_ACCEPT_ENCODING);
161 mk_pointer_set(&mk_rh_accept_language, RH_ACCEPT_LANGUAGE);
162 mk_pointer_set(&mk_rh_connection, RH_CONNECTION);
163 mk_pointer_set(&mk_rh_cookie, RH_COOKIE);
164 mk_pointer_set(&mk_rh_content_length, RH_CONTENT_LENGTH);
165 mk_pointer_set(&mk_rh_content_range, RH_CONTENT_RANGE);
166 mk_pointer_set(&mk_rh_content_type, RH_CONTENT_TYPE);
167 mk_pointer_set(&mk_rh_if_modified_since, RH_IF_MODIFIED_SINCE);
168 mk_pointer_set(&mk_rh_host, RH_HOST);
169 mk_pointer_set(&mk_rh_last_modified, RH_LAST_MODIFIED);
170 mk_pointer_set(&mk_rh_last_modified_since, RH_LAST_MODIFIED_SINCE);
171 mk_pointer_set(&mk_rh_referer, RH_REFERER);
172 mk_pointer_set(&mk_rh_range, RH_RANGE);
173 mk_pointer_set(&mk_rh_user_agent, RH_USER_AGENT);
175 /* Server response first header */
176 mk_pointer_set(&mk_hr_http_ok, MK_HR_HTTP_OK);
177 mk_pointer_set(&mk_hr_http_partial, MK_HR_HTTP_PARTIAL);
178 mk_pointer_set(&mk_hr_redir_moved, MK_HR_REDIR_MOVED);
179 mk_pointer_set(&mk_hr_redir_moved_t, MK_HR_REDIR_MOVED_T);
180 mk_pointer_set(&mk_hr_not_modified, MK_HR_NOT_MODIFIED);
181 mk_pointer_set(&mk_hr_client_bad_request, MK_HR_CLIENT_BAD_REQUEST);
182 mk_pointer_set(&mk_hr_client_forbidden, MK_HR_CLIENT_FORBIDDEN);
183 mk_pointer_set(&mk_hr_client_not_found, MK_HR_CLIENT_NOT_FOUND);
184 mk_pointer_set(&mk_hr_client_method_not_allowed,
185 MK_HR_CLIENT_METHOD_NOT_ALLOWED);
186 mk_pointer_set(&mk_hr_client_request_timeout,
187 MK_HR_CLIENT_REQUEST_TIMEOUT);
188 mk_pointer_set(&mk_hr_client_length_required,
189 MK_HR_CLIENT_LENGTH_REQUIRED);
190 mk_pointer_set(&mk_hr_server_internal_error, MK_HR_SERVER_INTERNAL_ERROR);
191 mk_pointer_set(&mk_hr_server_not_implemented,
192 MK_HR_SERVER_NOT_IMPLEMENTED);
193 mk_pointer_set(&mk_hr_server_http_version_unsup,
194 MK_HR_SERVER_HTTP_VERSION_UNSUP);
196 /* Server response normal headers */
197 mk_pointer_set(&mk_header_conn_ka, MK_HEADER_CONN_KA);
198 mk_pointer_set(&mk_header_conn_close, MK_HEADER_CONN_CLOSE);
199 mk_pointer_set(&mk_header_accept_ranges, MK_HEADER_ACCEPT_RANGES);
200 mk_pointer_set(&mk_header_te_chunked, MK_HEADER_TE_CHUNKED);
201 mk_pointer_set(&mk_header_last_modified, MK_HEADER_LAST_MODIFIED);
203 mk_http_status_list_init();
204 mk_iov_separators_init();
205 // mk_palm_set_env();
208 /* Server */
209 mk_pointer_set(&mk_monkey_protocol, HTTP_PROTOCOL_11_STR);
210 // mk_pointer_set(&mk_monkey_port, config->port);
212 /* Logfile */
213 mk_pointer_set(&mk_logfile_iov_dash, MK_LOGFILE_IOV_DASH);
215 /* HTTP */
216 mk_pointer_set(&mk_http_method_get_p, HTTP_METHOD_GET_STR);
217 mk_pointer_set(&mk_http_method_post_p, HTTP_METHOD_POST_STR);
218 mk_pointer_set(&mk_http_method_head_p, HTTP_METHOD_HEAD_STR);
219 mk_pointer_reset(&mk_http_method_null_p);
221 mk_pointer_set(&mk_http_protocol_09_p, HTTP_PROTOCOL_09_STR);
222 mk_pointer_set(&mk_http_protocol_10_p, HTTP_PROTOCOL_10_STR);
223 mk_pointer_set(&mk_http_protocol_11_p, HTTP_PROTOCOL_11_STR);
224 mk_pointer_reset(&mk_http_protocol_null_p);
226 /* User Home */
227 mk_pointer_set(&mk_user_home, MK_USER_HOME);