Changeset 277
- Timestamp:
- 04/21/06 14:13:07 (3 years ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/Makefile.am (modified) (1 diff)
- cherokee/trunk/admin/index.php (modified) (1 diff)
- cherokee/trunk/cherokee/Makefile.am (modified) (1 diff)
- cherokee/trunk/cherokee/config_entry.c (modified) (2 diffs)
- cherokee/trunk/cherokee/config_entry.h (modified) (1 diff)
- cherokee/trunk/cherokee/config_node.c (modified) (2 diffs)
- cherokee/trunk/cherokee/config_node.h (modified) (1 diff)
- cherokee/trunk/cherokee/handler.h (modified) (1 diff)
- cherokee/trunk/cherokee/handler_dirlist.c (modified) (14 diffs)
- cherokee/trunk/cherokee/handler_dirlist.h (modified) (3 diffs)
- cherokee/trunk/cherokee/virtual_server.c (modified) (6 diffs)
- cherokee/trunk/configure.in (modified) (1 diff)
- cherokee/trunk/icons/Makefile.am (modified) (1 diff)
- cherokee/trunk/themes (added)
- cherokee/trunk/themes/Makefile.am (added)
- cherokee/trunk/themes/default_entry.html (added)
- cherokee/trunk/themes/default_footer.html (added)
- cherokee/trunk/themes/default_header.html (added)
- cherokee/trunk/themes/default_theme.css (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r275 r277 1 2006-04-21 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 3 * themes/Makefile.am, themes/default_theme.css, 4 themes/default_header.html, themes/default_footer.html, 5 themes/default_entry.html: Added default theme for dirlist. 6 7 * cherokee/handler_dirlist.c, cherokee/handler_dirlist.c: Almost 8 rewritten: removed hardcoded HTML. Now it supports themes. 9 1 10 2006-04-17 Alvaro Lopez Ortega <alvaro@alobbs.com> 11 12 * cherokee/config_entry.c (cherokee_config_entry_set_handler_prop) 13 (cherokee_config_entry_set_validator_prop): Removed. Not longer 14 needed. 2 15 3 16 * cherokee/thread.c (process_active_connections): There was an cherokee/trunk/Makefile.am
r269 r277 1 1 ## Cherokee: Makefile.am -*- makefile -*- 2 2 3 SUBDIRS = m4 contrib www doc icons qa cherokee cget windows3 SUBDIRS = m4 contrib www doc icons themes qa cherokee cget windows 4 4 bin_SCRIPTS = cherokee-config 5 5 SUFFIXES = .sample.pre .sample cherokee/trunk/admin/index.php
r257 r277 1 <?php 2 echo "<h1>hi</h1>"; 1 <?php /* -*- Mode: PHP; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 2 3 /* Cherokee 4 * 5 * Authors: 6 * Alvaro Lopez Ortega <alvaro@alobbs.com> 7 * 8 * Copyright (C) 2001-2006 Alvaro Lopez Ortega 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of version 2 of the GNU General Public 12 * License as published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 22 * USA 23 */ 24 25 class Configuration 26 { 27 function Configuration() 28 { 29 } 30 31 function Load ($filename) 32 { 33 echo "".$filename; 34 } 35 } 36 37 function main() 38 { 39 $default_config = '/etc/cherokee/cherokee.conf'; 40 41 session_start(); 42 43 echo "session es: " . $_SESSION["config"] . "<br />"; 44 45 if ($_SESSION["config"] == null) 46 { 47 $conf = new Configuration(); 48 $conf->Load ($default_config); 49 50 $_SESSION["config"] = $conf; 51 } 52 53 session_write_close(); 54 } 55 56 main(); 3 57 ?> cherokee/trunk/cherokee/Makefile.am
r269 r277 10 10 -DCHEROKEE_DATADIR=\""$(cherokeedatadir)"\" \ 11 11 -DCHEROKEE_CONFDIR=\""$(sysconfdir)/cherokee"\" \ 12 -DCHEROKEE_ICONSDIR=\""$(prefix)/share/cherokee/icons"\" 12 -DCHEROKEE_ICONSDIR=\""$(prefix)/share/cherokee/icons"\" \ 13 -DCHEROKEE_THEMEDIR=\""$(prefix)/share/cherokee/themes"\" 13 14 14 15 # cherokee/trunk/cherokee/config_entry.c
r269 r277 76 76 { 77 77 if (entry->handler_properties != NULL) { 78 cherokee_typed_table_free (entry->handler_properties); 78 if (entry->handler_properties->free == NULL) { 79 SHOULDNT_HAPPEN; 80 } 81 82 entry->handler_properties->free (entry->handler_properties); 79 83 entry->handler_properties = NULL; 80 84 } … … 108 112 free (entry); 109 113 return ret_ok; 110 }111 112 113 static ret_t114 entry_set_prop (prop_table_types_t table_type, cherokee_config_entry_t *entry, char *prop_name, cherokee_typed_table_types_t type, void *value, cherokee_table_free_item_t free_func)115 {116 ret_t ret;117 cherokee_table_t **table;118 119 /* Choose the table120 */121 switch (table_type) {122 case table_handler:123 table = &entry->handler_properties;124 break;125 case table_validator:126 table = &entry->validator_properties;127 break;128 }129 130 /* Create the table on demand to save memory131 */132 if (*table == NULL) {133 ret = cherokee_table_new (table);134 if (unlikely(ret != ret_ok)) return ret;135 }136 137 /* Add the property138 */139 switch (type) {140 case typed_int:141 return cherokee_typed_table_add_int (*table, prop_name, POINTER_TO_INT(value));142 case typed_str:143 return cherokee_typed_table_add_str (*table, prop_name, value);144 case typed_data:145 return cherokee_typed_table_add_data (*table, prop_name, value, free_func);146 case typed_list:147 return cherokee_typed_table_add_list (*table, prop_name, value, free_func);148 default:149 SHOULDNT_HAPPEN;150 }151 152 return ret_error;153 }154 155 156 ret_t157 cherokee_config_entry_set_handler_prop (cherokee_config_entry_t *entry, char *prop_name, cherokee_typed_table_types_t type, void *value, cherokee_table_free_item_t free_func)158 {159 return entry_set_prop (table_handler, entry, prop_name, type, value, free_func);160 }161 162 163 ret_t164 cherokee_config_entry_set_validator_prop (cherokee_config_entry_t *entry, char *prop_name, cherokee_typed_table_types_t type, void *value, cherokee_table_free_item_t free_func)165 {166 return entry_set_prop (table_validator, entry, prop_name, type, value, free_func);167 114 } 168 115 cherokee/trunk/cherokee/config_entry.h
r269 r277 41 41 /* Parent table_entry 42 42 */ 43 void *parent;44 cuint_t priority;43 void *parent; 44 cuint_t priority; 45 45 46 46 /* Properties 47 47 */ 48 cherokee_buffer_t *document_root;49 cherokee_boolean_t only_secure;50 void *access;48 cherokee_buffer_t *document_root; 49 cherokee_boolean_t only_secure; 50 void *access; 51 51 52 52 /* Handler 53 53 */ 54 handler_func_new_t handler_new_func;55 cherokee_http_method_t handler_methods;56 cherokee_ table_t*handler_properties;54 handler_func_new_t handler_new_func; 55 cherokee_http_method_t handler_methods; 56 cherokee_handler_props_t *handler_properties; 57 57 58 58 /* Validator 59 59 */ 60 validator_func_new_t validator_new_func;61 cherokee_table_t *validator_properties;60 validator_func_new_t validator_new_func; 61 cherokee_table_t *validator_properties; 62 62 63 cherokee_buffer_t *auth_realm; 64 cherokee_http_auth_t authentication; 65 cherokee_table_t *users; 66 63 cherokee_buffer_t *auth_realm; 64 cherokee_http_auth_t authentication; 65 cherokee_table_t *users; 67 66 } cherokee_config_entry_t; 68 67 cherokee/trunk/cherokee/config_node.c
r272 r277 26 26 #include "config_node.h" 27 27 #include "util.h" 28 #include "list_ext.h" 28 29 29 30 #define ENTRIES "config" … … 415 416 } 416 417 418 419 static ret_t 420 convert_to_list_step (char *entry, void *data) 421 { 422 return cherokee_list_add_tail ((list_t *)data, strdup(entry)); 423 } 424 425 ret_t 426 cherokee_config_node_convert_list (cherokee_config_node_t *conf, const char *key, list_t *list) 427 { 428 return cherokee_config_node_read_list (conf, key, convert_to_list_step, list); 429 } cherokee/trunk/cherokee/config_node.h
r272 r277 71 71 /* Convenience functions: value retrieving 72 72 */ 73 ret_t cherokee_config_node_read (cherokee_config_node_t *conf, const char *key, cherokee_buffer_t **buf); 74 ret_t cherokee_config_node_read_path (cherokee_config_node_t *conf, const char *key, cherokee_buffer_t **buf); 75 ret_t cherokee_config_node_read_int (cherokee_config_node_t *conf, const char *key, int *num); 76 ret_t cherokee_config_node_read_list (cherokee_config_node_t *conf, const char *key, 77 cherokee_config_node_list_func_t func, void *param); 73 ret_t cherokee_config_node_read (cherokee_config_node_t *conf, const char *key, cherokee_buffer_t **buf); 74 ret_t cherokee_config_node_read_path (cherokee_config_node_t *conf, const char *key, cherokee_buffer_t **buf); 75 ret_t cherokee_config_node_read_int (cherokee_config_node_t *conf, const char *key, int *num); 76 ret_t cherokee_config_node_read_list (cherokee_config_node_t *conf, const char *key, 77 cherokee_config_node_list_func_t func, void *param); 78 79 ret_t cherokee_config_node_convert_list (cherokee_config_node_t *conf, const char *key, list_t *list); 78 80 79 81 CHEROKEE_END_DECLS cherokee/trunk/cherokee/handler.h
r251 r277 77 77 void *connection; 78 78 cherokee_handler_support_t support; 79 } cherokee_handler_t; 79 80 80 } cherokee_handler_t; 81 typedef struct { 82 void (*free) (void *itself); 83 } cherokee_handler_props_t; 84 81 85 82 86 #define HANDLER(x) ((cherokee_handler_t *)(x)) cherokee/trunk/cherokee/handler_dirlist.c
r273 r277 63 63 64 64 65 static ret_t 66 config_add_header_file (char *key, void *param) 67 { 68 return cherokee_list_add_tail (LIST(param), strdup(key)); 69 } 65 66 static ret_t 67 load_theme_load_file (cherokee_buffer_t *theme_path, char *file, cherokee_buffer_t *output) 68 { 69 cherokee_buffer_t path = CHEROKEE_BUF_INIT; 70 71 cherokee_buffer_add_buffer (&path, theme_path); 72 cherokee_buffer_add (&path, file, strlen(file)); 73 74 cherokee_buffer_clean (output); 75 cherokee_buffer_read_file (output, path.buf); 76 77 cherokee_buffer_mrproper (&path); 78 return ret_ok; 79 } 80 81 static ret_t 82 parse_if (cherokee_buffer_t *buf, char *if_entry, cherokee_boolean_t show) 83 { 84 char *begin; 85 char *end; 86 cherokee_buffer_t token = CHEROKEE_BUF_INIT; 87 88 cherokee_buffer_add_str (&token, "%if "); 89 cherokee_buffer_add (&token, if_entry, strlen(if_entry)); 90 cherokee_buffer_add_str (&token, "%"); 91 92 begin = strstr (buf->buf, token.buf); 93 if (begin == NULL) goto error; 94 95 end = strstr (begin, "%fi%"); 96 if (end == NULL) goto error; 97 98 if (show) { 99 cherokee_buffer_remove_chunk (buf, end - buf->buf, 4); 100 cherokee_buffer_remove_chunk (buf, begin - buf->buf, token.len); 101 } else { 102 cherokee_buffer_remove_chunk (buf, begin - buf->buf, (end+4) - begin); 103 } 104 105 cherokee_buffer_mrproper (&token); 106 return ret_ok; 107 error: 108 cherokee_buffer_mrproper (&token); 109 return ret_error; 110 } 111 112 static ret_t 113 parse_macros_in_buffer (cherokee_buffer_t *buf, cherokee_handler_dirlist_props_t *props) 114 { 115 parse_if (buf, "size", props->show_size); 116 parse_if (buf, "date", props->show_date); 117 parse_if (buf, "user", props->show_user); 118 parse_if (buf, "group", props->show_group); 119 120 return ret_ok; 121 } 122 123 static ret_t 124 load_theme (cherokee_buffer_t *theme_path, cherokee_handler_dirlist_props_t *props) 125 { 126 load_theme_load_file (theme_path, "header.html", &props->header); 127 load_theme_load_file (theme_path, "footer.html", &props->footer); 128 load_theme_load_file (theme_path, "entry.html", &props->entry); 129 load_theme_load_file (theme_path, "theme.css", &props->css); 130 131 /* Check it 132 */ 133 if ((cherokee_buffer_is_empty (&props->header) || 134 cherokee_buffer_is_empty (&props->entry) || 135 cherokee_buffer_is_empty (&props->footer))) 136 return ret_error; 137 138 /* Parse conditional blocks 139 */ 140 parse_macros_in_buffer (&props->header, props); 141 parse_macros_in_buffer (&props->footer, props); 142 parse_macros_in_buffer (&props->entry, props); 143 144 return ret_ok; 145 } 146 147 static void 148 cherokee_handler_dirlist_props_free (void *props) 149 { 150 // TODO 151 ; 152 } 153 70 154 71 155 ret_t 72 cherokee_handler_dirlist_configure (cherokee_config_node_t *conf, cherokee_server_t *srv, cherokee_table_t **props) 73 { 74 ret_t ret; 75 list_t *i; 156 cherokee_handler_dirlist_configure (cherokee_config_node_t *conf, cherokee_server_t *srv, cherokee_handler_dirlist_props_t **_props) 157 { 158 ret_t ret; 159 list_t *i; 160 cherokee_handler_dirlist_props_t *props; 161 char *theme = NULL; 162 cherokee_buffer_t theme_path = CHEROKEE_BUF_INIT; 163 164 if (*_props == NULL) { 165 CHEROKEE_NEW_STRUCT (n,handler_dirlist_props); 166 167 n->props.free = cherokee_handler_dirlist_props_free; 168 n->show_size = true; 169 n->show_date = true; 170 n->show_user = false; 171 n->show_group = false; 172 173 cherokee_buffer_init (&n->header); 174 cherokee_buffer_init (&n->footer); 175 cherokee_buffer_init (&n->entry); 176 cherokee_buffer_init (&n->css); 177 178 INIT_LIST_HEAD (&n->notice_files); 179 180 *_props = n; 181 } 182 183 props = *_props; 76 184 77 185 cherokee_config_node_foreach (i, conf) { 78 186 cherokee_config_node_t *subconf = CONFIG_NODE(i); 79 187 80 ret = cherokee_typed_table_instance (props); 81 if (ret != ret_ok) return ret; 82 83 if (equal_buf_str (&subconf->key, "bgcolor") || 84 equal_buf_str (&subconf->key, "text") || 85 equal_buf_str (&subconf->key, "link") || 86 equal_buf_str (&subconf->key, "vlink") || 87 equal_buf_str (&subconf->key, "alink") || 88 equal_buf_str (&subconf->key, "background")) 89 { 90 ret = cherokee_typed_table_add_str (*props, subconf->key.buf, strdup(subconf->val.buf)); 91 if (ret != ret_ok) return ret; 92 93 } else if (equal_buf_str (&subconf->key, "size") || 94 equal_buf_str (&subconf->key, "date") || 95 equal_buf_str (&subconf->key, "owner") || 96 equal_buf_str (&subconf->key, "group")) 97 { 98 ret = cherokee_typed_table_add_str (*props, subconf->key.buf, strdup(subconf->val.buf)); 99 if (ret != ret_ok) return ret; 100 101 } else if (equal_buf_str (&subconf->key, "header_file")) { 102 list_t list = LIST_HEAD_INIT(list); 103 104 ret = cherokee_config_node_read_list (subconf, NULL, config_add_header_file, &list); 105 if (ret != ret_ok) return ret; 106 107 ret = cherokee_typed_table_add_list (*props, subconf->key.buf, &list, free); 108 if (ret != ret_ok) return ret; 109 110 } else if (equal_buf_str (&subconf->key, "show_header_file")) { 111 ret = cherokee_typed_table_add_int (*props, subconf->key.buf, atoi(subconf->val.buf)); 112 if (ret != ret_ok) return ret; 113 } 114 } 115 116 return ret_ok; 188 /* Convert the properties 189 */ 190 if (equal_buf_str (&subconf->key, "size")) { 191 props->show_size = atoi (subconf->val.buf); 192 } else if (equal_buf_str (&subconf->key, "date")) { 193 props->show_date = atoi (subconf->val.buf); 194 } else if (equal_buf_str (&subconf->key, "user")) { 195 props->show_user = atoi (subconf->val.buf); 196 } else if (equal_buf_str (&subconf->key, "group")) { 197 props->show_group = atoi (subconf->val.buf); 198 199 } else if (equal_buf_str (&subconf->key, "theme")) { 200 theme = subconf->val.buf; 201 202 } else if (equal_buf_str (&subconf->key, "notice_files")) { 203 ret = cherokee_config_node_convert_list (subconf, NULL, &props->notice_files); 204 if (unlikely (ret != ret_ok)) return ret; 205 } 206 } 207 208 /* Load the theme 209 */ 210 if (theme == NULL) 211 theme = "default"; 212 213 ret = cherokee_buffer_add_va (&theme_path, CHEROKEE_THEMEDIR"/%s/", theme); 214 if (ret != ret_ok) return ret; 215 216 ret = load_theme (&theme_path, props); 217 if (ret != ret_ok) { 218 PRINT_MSG ("Couldn't load theme '%s': %s\n", theme, theme_path.buf); 219 return ret; 220 } 221 222 cherokee_buffer_mrproper (&theme_path); 223 return ret_ok; 224 } 225 226 227 static cherokee_boolean_t 228 is_header_file (cherokee_handler_dirlist_t *dhdl, char *filename) 229 { 230 list_t *i; 231 232 list_for_each (i, &dhdl->props->notice_files) 233 { 234 if (strcmp (filename, LIST_ITEM_INFO(i)) == 0) 235 return true; 236 } 237 238 return false; 117 239 } 118 240 119 241 120 242 ret_t 121 generate_file_entry ( DIR *dir, cherokee_buffer_t *path, cherokee_handler_dirlist_t *dhdl, file_entry_t **ret_entry)243 generate_file_entry (cherokee_handler_dirlist_t *dhdl, DIR *dir, cherokee_buffer_t *path, file_entry_t **ret_entry) 122 244 { 123 245 int re; … … 127 249 struct dirent *entry; 128 250 129 /* Get the memory130 */131 251 #ifdef _PC_NAME_MAX 132 252 extra = pathconf(path->buf, _PC_NAME_MAX); … … 134 254 extra = PATH_MAX; 135 255 #endif 256 257 /* New object 258 */ 136 259 n = (file_entry_t *) malloc (sizeof(file_entry_t) + path->len + extra + 3); 137 260 if (unlikely(n == NULL)) return ret_nomem; 138 261 139 /* Read a new directory entry140 */141 cherokee_readdir (dir, &n->info, &entry);142 if (entry == NULL) return ret_eof;143 144 /* Initialization145 */146 262 INIT_LIST_HEAD(&n->list_entry); 147 263 148 /* Build the local path, stat and clean 149 */ 150 name = (char *)entry->d_name; 151 n->name_len = strlen(name); 152 cherokee_buffer_add (path, name, n->name_len); 153 154 /* Check the filename size 155 */ 156 if (n->name_len > dhdl->longest_filename) 157 dhdl->longest_filename = n->name_len; 158 159 /* Path 160 */ 161 re = cherokee_stat (path->buf, &n->stat); 162 if (re < 0) { 264 for (;;) { 265 /* Read a new directory entry 266 */ 267 cherokee_readdir (dir, &n->info, &entry); 268 if (entry == NULL) { 269 free (n); 270 return ret_eof; 271 } 272 273 name = (char *)entry->d_name; 274 n->name_len = strlen(name); 275 276 /* Skip some files 277 */ 278 if ((name[0] == '.') || 279 (name[0] == '#') || 280 (name[n->name_len-1] == '~') || 281 is_header_file (dhdl, name)) 282 { 283 continue; 284 } 285 286 /* Build the local path, stat and clean 287 */ 288 cherokee_buffer_add (path, name, n->name_len); 289 290 /* Check the filename size 291 */ 292 if (n->name_len > dhdl->longest_filename) 293 dhdl->longest_filename = n->name_len; 294 295 /* Path 296 */ 297 re = cherokee_stat (path->buf, &n->stat); 298 if (re < 0) { 299 cherokee_buffer_drop_endding (path, n->name_len); 300 301 free (n); 302 return ret_error; 303 } 304 305 /* Clean up and exit 306 */ 163 307 cherokee_buffer_drop_endding (path, n->name_len); 164 free (n); 165 166 return ret_error; 167 } 168 169 /* Clean up and exit 170 */ 171 cherokee_buffer_drop_endding (path, n->name_len); 172 173 *ret_entry = n; 174 return ret_ok; 308 309 *ret_entry = n; 310 return ret_ok; 311 } 312 313 return ret_eof; 175 314 } 176 315 177 316 178 317 ret_t 179 cherokee_handler_dirlist_new (cherokee_handler_t **hdl, void *cnt, cherokee_ table_t *properties)318 cherokee_handler_dirlist_new (cherokee_handler_t **hdl, void *cnt, cherokee_handler_props_t *properties) 180 319 { 181 320 ret_t ret; … … 206 345 INIT_LIST_HEAD (&n->dirs); 207 346 347 /* State 348 */ 349 n->dir_ptr = NULL; 350 n->file_ptr = NULL; 351 n->longest_filename = 0; 352 n->serve_css = false; 353 208 354 /* Choose the sorting key 209 355 */ 210 n->sort = Name_Down; 356 n->phase = dirlist_phase_add_header; 357 n->sort = Name_Down; 211 358 ret = cherokee_table_get (HANDLER_CONN(n)->arguments, "order", (void **) &value); 212 359 if (ret == ret_ok) { … … 219 366 } 220 367 221 /* State 222 */ 223 n->page_header = false; 224 n->dir_ptr = NULL; 225 n->file_ptr = NULL; 226 n->longest_filename = 0; 368 ret = cherokee_table_get (HANDLER_CONN(n)->arguments, "css", (void **) &value); 369 if (ret == ret_ok) { 370 n->serve_css = true; 371 } 227 372 228 373 /* Properties 229 374 */ 230 n->show_size = 1; 231 n->show_date = 1; 232 n->show_owner = 0; 233 n->show_group = 0; 234 235 /* Eyecandy 236 */ 237 n->bgcolor = "FFFFFF"; 238 n->text = "000000"; 239 n->link = "0000AA"; 240 n->vlink = "0000CC"; 241 n->alink = "0022EE"; 242 n->background = NULL; 243 n->header_file = NULL; 244 n->header_file_ref = NULL; 245 n->build_headers = true; 375 n->props = (cherokee_handler_dirlist_props_t *) properties; 246 376 247 377 cherokee_buffer_init (&n->header); 248 249 /* Read the properties 250 */ 251 if (properties) { 252 cherokee_typed_table_get_str (properties, "bgcolor", &n->bgcolor); 253 cherokee_typed_table_get_str (properties, "text", &n->text); 254 cherokee_typed_table_get_str (properties, "link", &n->link); 255 cherokee_typed_table_get_str (properties, "vlink", &n->vlink); 256 cherokee_typed_table_get_str (properties, "alink", &n->alink); 257 cherokee_typed_table_get_str (properties, "background", &n->background); 258 259 cherokee_typed_table_get_int (properties, "size", &n->show_size); 260 cherokee_typed_table_get_int (properties, "date", &n->show_date); 261 cherokee_typed_table_get_int (properties, "owner", &n->show_owner); 262 cherokee_typed_table_get_int (properties, "group", &n->show_group); 263 264 cherokee_typed_table_get_list (properties, "header_file", &n->header_file); 265 266 cherokee_typed_table_get_int (properties, "show_header_file", &n->build_headers); 378 cherokee_buffer_init (&n->public_dir); 379 cherokee_buffer_init (&n->server_software); 380 381 /* Check the theme 382 */ 383 if (cherokee_buffer_is_empty (&n->props->header) || 384 cherokee_buffer_is_empty (&n->props->entry) || 385 cherokee_buffer_is_empty (&n->props->footer)) 386 { 387 PRINT_ERROR_S ("The theme is incomplete\n"); 388 return ret_error; 267 389 } 268 390 … … 278 400 279 401 cherokee_buffer_mrproper (&dhdl->header); 402 cherokee_buffer_mrproper (&dhdl->public_dir); 403 cherokee_buffer_mrproper (&dhdl->server_software); 280 404 281 405 list_for_each_safe (i, tmp, &dhdl->dirs) { … … 319 443 } 320 444 321 static void322 read_header_file (cherokee_handler_dirlist_t *dhdl)323 {324 ret_t ret;325 list_t *i;326 cherokee_connection_t *conn = HANDLER_CONN(dhdl);327 328 list_for_each (i, dhdl->header_file) {329 cuint_t filename_len;330 char *filename = LIST_ITEM_INFO(i);331 332 filename_len = strlen(filename);333 cherokee_buffer_clean (&dhdl->header);334 335 if (filename[0] != '/') {336 cherokee_buffer_add_buffer (&conn->local_directory, &conn->request); /* do */337 cherokee_buffer_add (&conn->local_directory, filename, filename_len);338 339 ret = cherokee_buffer_read_file (&dhdl->header, conn->local_directory.buf);340 341 cherokee_buffer_drop_endding (&conn->local_directory, conn->request.len + filename_len); /* undo */342 } else {343 ret = cherokee_buffer_read_file (&dhdl->header, filename);344 }345 346 if (ret == ret_ok) {347 dhdl->header_file_ref = filename;348 return;349 }350 }351 }352 353 354 445 static int 355 446 cmp_name_down (list_t *a, list_t *b) … … 407 498 408 499 static void 409 list_sort_by_type (list_t *list, cherokee_ sort_t sort)500 list_sort_by_type (list_t *list, cherokee_dirlist_sort_t sort) 410 501 { 411 502 switch (sort) { … … 454 545 ret_t ret; 455 546 456 ret = generate_file_entry (dir, &conn->local_directory, dhdl, &item); 457 if (ret == ret_eof) break; 458 if (ret == ret_error) continue; 547 ret = generate_file_entry (dhdl, dir, &conn->local_directory, &item); 548 if (ret == ret_eof) 549 break; 550 if ((ret == ret_nomem) || 551 (ret == ret_error)) 552 continue; 459 553 460 554 if (S_ISDIR(item->stat.st_mode)) { … … 481 575 */ 482 576 if (! list_empty(&dhdl->dirs)) { 483 cherokee_ sort_t sort = dhdl->sort;577 cherokee_dirlist_sort_t sort = dhdl->sort; 484 578 485 579 if (sort == Size_Down) sort = Name_Down; … … 491 585 492 586 return ret_ok; 493 }494 495 496 497 ret_t498 cherokee_handler_dirlist_init (cherokee_handler_dirlist_t *dhdl)499 {500 ret_t ret;501 502 /* The request must end with a slash..503 */504 ret = check_request_finish_with_slash (dhdl);505 if (ret != ret_ok) return ret;506 507 /* Maybe read the header file508 */509 if (dhdl->header_file != NULL) {510 read_header_file (dhdl);511 }512 513 /* Build de local request514 */515 ret = build_file_list (dhdl);516 if (unlikely(ret < ret_ok)) return ret;517 518 return ret_ok;519 587 } 520 588 … … 542 610 543 611 static ret_t 544 render_page_header (cherokee_handler_dirlist_t *dhdl, cherokee_buffer_t *buffer) 545 { 546 cherokee_connection_t *conn; 547 cherokee_icons_t *icons; 548 cherokee_buffer_t path = CHEROKEE_BUF_INIT; 549 550 // CHEROKEE_NEW(path,buffer); 551 552 conn = HANDLER_CONN(dhdl); 553 icons = HANDLER_SRV(dhdl)->icons; 554 555 if (dhdl->build_headers) { 556 cherokee_buffer_add_str (buffer, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">" CRLF); 557 558 /* Step 1: 559 * Build the public path 560 */ 561 build_public_path (dhdl, &path); 562 563 /* Add some HTML: title and body begin 564 */ 565 cherokee_buffer_add_str (buffer, "<html><head><title>Index of "); 566 cherokee_buffer_add_buffer (buffer, &path); 567 cherokee_buffer_add_str (buffer, "</title></head><body"); 568 569 cherokee_buffer_add_va (buffer, " bgcolor=\"%s\" text=\"%s\" link=\"%s\" vlink=\"%s\" alink=\"%s\"", 570 dhdl->bgcolor, dhdl->text, dhdl->link, dhdl->vlink, dhdl->alink); 571 572 if (dhdl->background) { 573 cherokee_buffer_add_va (buffer, " background=\"%s\"", dhdl->background); 612 read_notice_file (cherokee_handler_dirlist_t *dhdl) 613 { 614 ret_t ret; 615 list_t *i; 616 cherokee_connection_t *conn = HANDLER_CONN(dhdl); 617 618 list_for_each (i, &dhdl->props->notice_files) { 619 cuint_t filename_len; 620 char *filename = LIST_ITEM_INFO(i); 621 622 filename_len = strlen(filename); 623 cherokee_buffer_clean (&dhdl->header); 624 625 if (filename[0] != '/') { 626 cherokee_buffer_add_buffer (&conn->local_directory, &conn->request); /* do */ 627 cherokee_buffer_add (&conn->local_directory, filename, filename_len); 628 629 ret = cherokee_buffer_read_file (&dhdl->header, conn->local_directory.buf); 630 cherokee_buffer_drop_endding (&conn->local_directory, conn->request.len + filename_len); /* undo */ 631 } else { 632 ret = cherokee_buffer_read_file (&dhdl->header, filename); 574 633 } 575 576 cherokee_buffer_add_str (buffer, "><h1>Index of "); 577 cherokee_buffer_add_buffer (buffer, &path); 578 cherokee_buffer_add_str (buffer, "</h1>"); 579 634 635 if (ret == ret_ok) 636 break; 637 } 638 639 return ret_ok; 640 } 641 642 643 ret_t 644 cherokee_handler_dirlist_init (cherokee_handler_dirlist_t *dhdl) 645 { 646 ret_t ret; 647 cuint_t port; 648 cherokee_connection_t *conn = HANDLER_CONN(dhdl); 649 cherokee_server_t *srv = HANDLER_SRV(dhdl); 650 651 /* The request must end with a slash.. 652 */ 653 ret = check_request_finish_with_slash (dhdl); 654 if (ret != ret_ok) return ret; 655 656 if (! list_empty (&dhdl->props->notice_files)) { 657 ret = read_notice_file (dhdl); 658 if (ret != ret_ok) return ret; 659 } 660 661 /* Build de local request 662 */ 663 ret = build_file_list (dhdl); 664 if (unlikely(ret < ret_ok)) return ret; 665 666 /* Build public dir string 667 */ 668 ret = build_public_path (dhdl, &dhdl->public_dir); 669 if (unlikely (ret != ret_ok)) return ret; 670 671 /* Server software string 672 */ 673 if (conn->socket.is_tls == non_TLS) 674 port = srv->port; 675 else 676 port = srv->port_tls; 677 678 switch (srv->server_token) { 679 case cherokee_version_product: 680 cherokee_buffer_add_version (&dhdl->server_software, port, ver_full_html); 681 case cherokee_version_minor: 682 case cherokee_version_minimal: 683 case cherokee_version_os: 684 case cherokee_version_full: 6