diff options
author | Arno Töll <arno@debian.org> | 2012-11-21 23:04:05 +0100 |
---|---|---|
committer | Arno Töll <arno@debian.org> | 2012-11-21 23:04:05 +0100 |
commit | e787ca6640e45e5c28913d149b0ecd9810930b8a (patch) | |
tree | 0864b0dfde2872cf629fc0402f9dd2b8ef6c5f9c /src/configfile.c | |
parent | 6c8b72678daa33f7e9df2a97d6404380e1b2e8ca (diff) | |
download | lighttpd-e787ca6640e45e5c28913d149b0ecd9810930b8a.tar.gz |
Imported Upstream version 1.4.8upstream/1.4.8
Diffstat (limited to 'src/configfile.c')
-rw-r--r-- | src/configfile.c | 825 |
1 files changed, 310 insertions, 515 deletions
diff --git a/src/configfile.c b/src/configfile.c index a03c9bd..e9080c3 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -1,12 +1,3 @@ -#include "server.h" -#include "log.h" -#include "stream.h" -#include "plugin.h" - -#include "configparser.h" -#include "configfile.h" -#include "proc_open.h" - #include <sys/stat.h> #include <stdlib.h> @@ -16,16 +7,27 @@ #include <string.h> #include <stdio.h> #include <ctype.h> -#include <limits.h> #include <assert.h> +#include "server.h" +#include "log.h" +#include "stream.h" +#include "plugin.h" +#ifdef USE_LICENSE +#include "license.h" +#endif + +#include "configparser.h" +#include "configfile.h" +#include "proc_open.h" + static int config_insert(server *srv) { size_t i; int ret = 0; buffer *stat_cache_string; - - config_values_t cv[] = { + + config_values_t cv[] = { { "server.bind", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 0 */ { "server.errorlog", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 1 */ { "server.errorfile-prefix", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 2 */ @@ -36,78 +38,48 @@ static int config_insert(server *srv) { { "server.tag", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 7 */ { "server.use-ipv6", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 8 */ { "server.modules", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_SERVER }, /* 9 */ - + { "server.event-handler", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 10 */ { "server.pid-file", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 11 */ - { "server.max-request-size", NULL, T_CONFIG_INT, T_CONFIG_SCOPE_CONNECTION }, /* 12 */ + { "server.max-request-size", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 12 */ { "server.max-worker", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 13 */ { "server.document-root", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 14 */ - { "server.force-lowercase-filenames", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER },/* 15 */ + { "server.force-lower-case-files", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 15 */ { "debug.log-condition-handling", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 16 */ - { "server.max-keep-alive-requests", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION },/* 17 */ + { "server.max-keep-alive-requests", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 17 */ { "server.name", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 18 */ { "server.max-keep-alive-idle", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 19 */ - + { "server.max-read-idle", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 20 */ { "server.max-write-idle", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 21 */ { "server.error-handler-404", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 22 */ { "server.max-fds", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 23 */ -#ifdef HAVE_LSTAT { "server.follow-symlink", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 24 */ -#else - { "server.follow-symlink", - "Your system lacks lstat(). We can not differ symlinks from files." - "Please remove server.follow-symlinks from your config.", - T_CONFIG_UNSUPPORTED, T_CONFIG_SCOPE_UNSET }, /* 24 */ -#endif { "server.kbytes-per-second", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 25 */ { "connection.kbytes-per-second", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 26 */ { "mimetype.use-xattr", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 27 */ { "mimetype.assign", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, /* 28 */ { "ssl.pemfile", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 29 */ - + { "ssl.engine", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 30 */ - + { "debug.log-file-not-found", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 31 */ { "debug.log-request-handling", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 32 */ { "debug.log-response-header", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 33 */ { "debug.log-request-header", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 34 */ - { "debug.log-ssl-noise", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 35 */ - - { "server.protocol-http11", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 36 */ - { "debug.log-request-header-on-error", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 37 */ - { "debug.log-state-handling", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 38 */ - { "ssl.ca-file", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 39 */ - - { "server.errorlog-use-syslog", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 40 */ - { "server.range-requests", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 41 */ - { "server.stat-cache-engine", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 42 */ - { "server.max-connections", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 43 */ - { "server.network-backend", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 44 */ - { "server.upload-dirs", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, /* 45 */ - { "server.core-files", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 46 */ - { "ssl.cipher-list", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 47 */ - { "ssl.use-sslv2", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 48 */ - { "etag.use-inode", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 49 */ - { "etag.use-mtime", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 50 */ - { "etag.use-size", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 51 */ - { "server.reject-expect-100-with-417", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 52 */ - { "debug.log-timeouts", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 53 */ - { "server.defer-accept", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION }, /* 54 */ - { "server.breakagelog", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 55 */ - { "ssl.verifyclient.activate", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 56 */ - { "ssl.verifyclient.enforce", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 57 */ - { "ssl.verifyclient.depth", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 58 */ - { "ssl.verifyclient.username", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 59 */ - { "ssl.verifyclient.exportcert", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 60 */ - - { "server.set-v6only", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 61 */ - { "ssl.use-sslv3", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 62 */ - { "ssl.dh-file", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 63 */ - { "ssl.ec-curve", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 64 */ - { "ssl.disable-client-renegotiation", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER },/* 65 */ - { "ssl.honor-cipher-order", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 66 */ - + + { "server.protocol-http11", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 35 */ + { "debug.log-request-header-on-error", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 36 */ + { "debug.log-state-handling", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 37 */ + { "ssl.ca-file", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 38 */ + + { "server.errorlog-use-syslog", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 39 */ + { "server.range-requests", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 40 */ + { "server.stat-cache-engine", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 41 */ + { "server.max-connections", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 42 */ + { "server.network-backend", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 43 */ + { "server.upload-dirs", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, /* 44 */ + { "server.host", "use server.bind instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, { "server.docroot", "use server.document-root instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, { "server.virtual-root", "load mod_simple_vhost and use simple-vhost.server-root instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, @@ -116,12 +88,11 @@ static int config_insert(server *srv) { { "server.userid", "use server.username instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, { "server.groupid", "use server.groupname instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, { "server.use-keep-alive", "use server.max-keep-alive-requests = 0 instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, - { "server.force-lower-case-files", "use server.force-lowercase-filenames instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, - + { NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } }; - + /* 0 */ cv[0].destination = srv->srvconf.bindhost; cv[1].destination = srv->srvconf.errorlog_file; @@ -129,36 +100,32 @@ static int config_insert(server *srv) { cv[4].destination = srv->srvconf.username; cv[5].destination = srv->srvconf.groupname; cv[6].destination = &(srv->srvconf.port); - + cv[9].destination = srv->srvconf.modules; cv[10].destination = srv->srvconf.event_handler; cv[11].destination = srv->srvconf.pid_file; - + cv[13].destination = &(srv->srvconf.max_worker); cv[23].destination = &(srv->srvconf.max_fds); - cv[37].destination = &(srv->srvconf.log_request_header_on_error); - cv[38].destination = &(srv->srvconf.log_state_handling); - - cv[40].destination = &(srv->srvconf.errorlog_use_syslog); - + cv[36].destination = &(srv->srvconf.log_request_header_on_error); + cv[37].destination = &(srv->srvconf.log_state_handling); + + cv[39].destination = &(srv->srvconf.errorlog_use_syslog); + stat_cache_string = buffer_init(); - cv[42].destination = stat_cache_string; - cv[44].destination = srv->srvconf.network_backend; - cv[45].destination = srv->srvconf.upload_tempdirs; - cv[46].destination = &(srv->srvconf.enable_cores); - - cv[43].destination = &(srv->srvconf.max_conns); + cv[41].destination = stat_cache_string; + cv[43].destination = srv->srvconf.network_backend; + cv[44].destination = srv->srvconf.upload_tempdirs; + + cv[42].destination = &(srv->srvconf.max_conns); cv[12].destination = &(srv->srvconf.max_request_size); - cv[52].destination = &(srv->srvconf.reject_expect_100_with_417); - cv[55].destination = srv->srvconf.breakagelog_file; - srv->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *)); assert(srv->config_storage); - + for (i = 0; i < srv->config_context->used; i++) { specific_config *s; - + s = calloc(1, sizeof(specific_config)); assert(s); s->document_root = buffer_init(); @@ -168,9 +135,6 @@ static int config_insert(server *srv) { s->ssl_ca_file = buffer_init(); s->error_handler = buffer_init(); s->server_tag = buffer_init(); - s->ssl_cipher_list = buffer_init(); - s->ssl_dh_file = buffer_init(); - s->ssl_ec_curve = buffer_init(); s->errorfile_prefix = buffer_init(); s->max_keep_alive_requests = 16; s->max_keep_alive_idle = 5; @@ -178,43 +142,25 @@ static int config_insert(server *srv) { s->max_write_idle = 360; s->use_xattr = 0; s->is_ssl = 0; - s->ssl_honor_cipher_order = 1; - s->ssl_use_sslv2 = 0; - s->ssl_use_sslv3 = 1; s->use_ipv6 = 0; - s->set_v6only = 1; - s->defer_accept = 0; -#ifdef HAVE_LSTAT s->follow_symlink = 1; -#endif s->kbytes_per_second = 0; s->allow_http11 = 1; - s->etag_use_inode = 1; - s->etag_use_mtime = 1; - s->etag_use_size = 1; s->range_requests = 1; - s->force_lowercase_filenames = (i == 0) ? 2 : 0; /* we wan't to detect later if user changed this for global section */ + s->force_lower_case = 0; s->global_kbytes_per_second = 0; s->global_bytes_per_second_cnt = 0; s->global_bytes_per_second_cnt_ptr = &s->global_bytes_per_second_cnt; - s->ssl_verifyclient = 0; - s->ssl_verifyclient_enforce = 1; - s->ssl_verifyclient_username = buffer_init(); - s->ssl_verifyclient_depth = 9; - s->ssl_verifyclient_export_cert = 0; - s->ssl_disable_client_renegotiation = 1; - + cv[2].destination = s->errorfile_prefix; - + cv[7].destination = s->server_tag; cv[8].destination = &(s->use_ipv6); - cv[61].destination = &(s->set_v6only); - cv[54].destination = &(s->defer_accept); - - + + /* 13 max-worker */ cv[14].destination = s->document_root; - cv[15].destination = &(s->force_lowercase_filenames); + cv[15].destination = &(s->force_lower_case); cv[16].destination = &(s->log_condition_handling); cv[17].destination = &(s->max_keep_alive_requests); cv[18].destination = s->server_name; @@ -222,9 +168,7 @@ static int config_insert(server *srv) { cv[20].destination = &(s->max_read_idle); cv[21].destination = &(s->max_write_idle); cv[22].destination = s->error_handler; -#ifdef HAVE_LSTAT cv[24].destination = &(s->follow_symlink); -#endif /* 23 -> max-fds */ cv[25].destination = &(s->global_kbytes_per_second); cv[26].destination = &(s->kbytes_per_second); @@ -232,75 +176,48 @@ static int config_insert(server *srv) { cv[28].destination = s->mimetypes; cv[29].destination = s->ssl_pemfile; cv[30].destination = &(s->is_ssl); - + cv[31].destination = &(s->log_file_not_found); cv[32].destination = &(s->log_request_handling); cv[33].destination = &(s->log_response_header); cv[34].destination = &(s->log_request_header); - cv[35].destination = &(s->log_ssl_noise); - cv[53].destination = &(s->log_timeouts); - - cv[36].destination = &(s->allow_http11); - cv[39].destination = s->ssl_ca_file; - cv[41].destination = &(s->range_requests); - - cv[47].destination = s->ssl_cipher_list; - cv[48].destination = &(s->ssl_use_sslv2); - cv[62].destination = &(s->ssl_use_sslv3); - cv[63].destination = s->ssl_dh_file; - cv[64].destination = s->ssl_ec_curve; - cv[66].destination = &(s->ssl_honor_cipher_order); - - cv[49].destination = &(s->etag_use_inode); - cv[50].destination = &(s->etag_use_mtime); - cv[51].destination = &(s->etag_use_size); - - /* ssl.verify */ - cv[56].destination = &(s->ssl_verifyclient); - cv[57].destination = &(s->ssl_verifyclient_enforce); - cv[58].destination = &(s->ssl_verifyclient_depth); - cv[59].destination = s->ssl_verifyclient_username; - cv[60].destination = &(s->ssl_verifyclient_export_cert); - cv[65].destination = &(s->ssl_disable_client_renegotiation); - + + cv[35].destination = &(s->allow_http11); + cv[38].destination = s->ssl_ca_file; + cv[40].destination = &(s->range_requests); + srv->config_storage[i] = s; - + if (0 != (ret = config_insert_values_global(srv, ((data_config *)srv->config_context->data[i])->value, cv))) { break; } } - + if (buffer_is_empty(stat_cache_string)) { srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_SIMPLE; } else if (buffer_is_equal_string(stat_cache_string, CONST_STR_LEN("simple"))) { srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_SIMPLE; -#ifdef HAVE_FAM_H } else if (buffer_is_equal_string(stat_cache_string, CONST_STR_LEN("fam"))) { srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_FAM; -#endif } else if (buffer_is_equal_string(stat_cache_string, CONST_STR_LEN("disable"))) { srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_NONE; } else { - log_error_write(srv, __FILE__, __LINE__, "sb", - "server.stat-cache-engine can be one of \"disable\", \"simple\"," -#ifdef HAVE_FAM_H - " \"fam\"," -#endif - " but not:", stat_cache_string); + log_error_write(srv, __FILE__, __LINE__, "sb", + "server.stat-cache-engine can be one of \"disable\", \"simple\", \"fam\", but not:", stat_cache_string); ret = HANDLER_ERROR; } - + buffer_free(stat_cache_string); - + return ret; - + } #define PATCH(x) con->conf.x = s->x int config_setup_connection(server *srv, connection *con) { specific_config *s = srv->config_storage[0]; - + PATCH(allow_http11); PATCH(mimetypes); PATCH(document_root); @@ -311,71 +228,48 @@ int config_setup_connection(server *srv, connection *con) { PATCH(use_xattr); PATCH(error_handler); PATCH(errorfile_prefix); -#ifdef HAVE_LSTAT PATCH(follow_symlink); -#endif PATCH(server_tag); PATCH(kbytes_per_second); PATCH(global_kbytes_per_second); PATCH(global_bytes_per_second_cnt); - + con->conf.global_bytes_per_second_cnt_ptr = &s->global_bytes_per_second_cnt; buffer_copy_string_buffer(con->server_name, s->server_name); - + PATCH(log_request_header); PATCH(log_response_header); PATCH(log_request_handling); PATCH(log_condition_handling); PATCH(log_file_not_found); - PATCH(log_ssl_noise); - PATCH(log_timeouts); - + PATCH(range_requests); - PATCH(force_lowercase_filenames); + PATCH(force_lower_case); PATCH(is_ssl); - + PATCH(ssl_pemfile); -#ifdef USE_OPENSSL - PATCH(ssl_ctx); -#endif PATCH(ssl_ca_file); - PATCH(ssl_cipher_list); - PATCH(ssl_dh_file); - PATCH(ssl_ec_curve); - PATCH(ssl_honor_cipher_order); - PATCH(ssl_use_sslv2); - PATCH(ssl_use_sslv3); - PATCH(etag_use_inode); - PATCH(etag_use_mtime); - PATCH(etag_use_size); - - PATCH(ssl_verifyclient); - PATCH(ssl_verifyclient_enforce); - PATCH(ssl_verifyclient_depth); - PATCH(ssl_verifyclient_username); - PATCH(ssl_verifyclient_export_cert); - PATCH(ssl_disable_client_renegotiation); - return 0; } int config_patch_connection(server *srv, connection *con, comp_key_t comp) { size_t i, j; - - con->conditional_is_valid[comp] = 1; - + /* skip the first, the global context */ for (i = 1; i < srv->config_context->used; i++) { data_config *dc = (data_config *)srv->config_context->data[i]; specific_config *s = srv->config_storage[i]; - + + /* not our stage */ + if (comp != dc->comp) continue; + /* condition didn't match */ if (!config_check_cond(srv, con, dc)) continue; - + /* merge config */ for (j = 0; j < dc->value->used; j++) { data_unset *du = dc->value->data[j]; - + if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.document-root"))) { PATCH(document_root); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.range-requests"))) { @@ -396,37 +290,14 @@ int config_patch_connection(server *srv, connection *con, comp_key_t comp) { PATCH(max_read_idle); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("mimetype.use-xattr"))) { PATCH(use_xattr); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("etag.use-inode"))) { - PATCH(etag_use_inode); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("etag.use-mtime"))) { - PATCH(etag_use_mtime); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("etag.use-size"))) { - PATCH(etag_use_size); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.pemfile"))) { PATCH(ssl_pemfile); -#ifdef USE_OPENSSL - PATCH(ssl_ctx); -#endif } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.ca-file"))) { PATCH(ssl_ca_file); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.honor-cipher-order"))) { - PATCH(ssl_honor_cipher_order); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.use-sslv2"))) { - PATCH(ssl_use_sslv2); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.use-sslv3"))) { - PATCH(ssl_use_sslv3); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.cipher-list"))) { - PATCH(ssl_cipher_list); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.engine"))) { PATCH(is_ssl); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.dh-file"))) { - PATCH(ssl_dh_file); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.ec-curve"))) { - PATCH(ssl_ec_curve); -#ifdef HAVE_LSTAT } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.follow-symlink"))) { PATCH(follow_symlink); -#endif } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.name"))) { buffer_copy_string_buffer(con->server_name, s->server_name); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.tag"))) { @@ -443,38 +314,18 @@ int config_patch_connection(server *srv, connection *con, comp_key_t comp) { PATCH(log_condition_handling); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("debug.log-file-not-found"))) { PATCH(log_file_not_found); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("debug.log-ssl-noise"))) { - PATCH(log_ssl_noise); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("debug.log-timeouts"))) { - PATCH(log_timeouts); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.protocol-http11"))) { PATCH(allow_http11); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.force-lowercase-filenames"))) { - PATCH(force_lowercase_filenames); + } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.force-lower-case-files"))) { + PATCH(force_lower_case); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.kbytes-per-second"))) { PATCH(global_kbytes_per_second); PATCH(global_bytes_per_second_cnt); con->conf.global_bytes_per_second_cnt_ptr = &s->global_bytes_per_second_cnt; - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.verifyclient.activate"))) { - PATCH(ssl_verifyclient); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.verifyclient.enforce"))) { - PATCH(ssl_verifyclient_enforce); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.verifyclient.depth"))) { - PATCH(ssl_verifyclient_depth); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.verifyclient.username"))) { - PATCH(ssl_verifyclient_username); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.verifyclient.exportcert"))) { - PATCH(ssl_verifyclient_export_cert); - } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.disable-client-renegotiation"))) { - PATCH(ssl_disable_client_renegotiation); } } } - - con->etag_flags = (con->conf.etag_use_mtime ? ETAG_USE_MTIME : 0) | - (con->conf.etag_use_inode ? ETAG_USE_INODE : 0) | - (con->conf.etag_use_size ? ETAG_USE_SIZE : 0); - + return 0; } #undef PATCH @@ -482,15 +333,15 @@ int config_patch_connection(server *srv, connection *con, comp_key_t comp) { typedef struct { int foo; int bar; - + const buffer *source; const char *input; size_t offset; size_t size; - + int line_pos; int line; - + int in_key; int in_brace; int in_cond; @@ -498,8 +349,8 @@ typedef struct { #if 0 static int tokenizer_open(server *srv, tokenizer_t *t, buffer *basedir, const char *fn) { - if (buffer_is_empty(basedir) || - (fn[0] == '/' || fn[0] == '\\') || + if (buffer_is_empty(basedir) && + (fn[0] == '/' || fn[0] == '\\') && (fn[0] == '.' && (fn[1] == '/' || fn[1] == '\\'))) { t->file = buffer_init_string(fn); } else { @@ -508,7 +359,7 @@ static int tokenizer_open(server *srv, tokenizer_t *t, buffer *basedir, const ch } if (0 != stream_open(&(t->s), t->file)) { - log_error_write(srv, __FILE__, __LINE__, "sbss", + log_error_write(srv, __FILE__, __LINE__, "sbss", "opening configfile ", t->file, "failed:", strerror(errno)); buffer_free(t->file); return -1; @@ -519,7 +370,7 @@ static int tokenizer_open(server *srv, tokenizer_t *t, buffer *basedir, const ch t->size = t->s.size; t->line = 1; t->line_pos = 1; - + t->in_key = 1; t->in_brace = 0; t->in_cond = 0; @@ -547,7 +398,7 @@ static int config_skip_newline(tokenizer_t *t) { static int config_skip_comment(tokenizer_t *t) { int i; assert(t->input[t->offset] == '#'); - for (i = 1; t->input[t->offset + i] && + for (i = 1; t->input[t->offset + i] && (t->input[t->offset + i] != '\n' && t->input[t->offset + i] != '\r'); i++); t->offset += i; @@ -557,96 +408,96 @@ static int config_skip_comment(tokenizer_t *t) { static int config_tokenizer(server *srv, tokenizer_t *t, int *token_id, buffer *token) { int tid = 0; size_t i; - + for (tid = 0; tid == 0 && t->offset < t->size && t->input[t->offset] ; ) { char c = t->input[t->offset]; const char *start = NULL; - + switch (c) { - case '=': + case '=': if (t->in_brace) { if (t->input[t->offset + 1] == '>') { t->offset += 2; - - buffer_copy_string_len(token, CONST_STR_LEN("=>")); - + + buffer_copy_string(token, "=>"); + tid = TK_ARRAY_ASSIGN; } else { - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "use => for assignments in arrays"); return -1; } } else if (t->in_cond) { if (t->input[t->offset + 1] == '=') { t->offset += 2; - - buffer_copy_string_len(token, CONST_STR_LEN("==")); - + + buffer_copy_string(token, "=="); + tid = TK_EQ; } else if (t->input[t->offset + 1] == '~') { t->offset += 2; - - buffer_copy_string_len(token, CONST_STR_LEN("=~")); - + + buffer_copy_string(token, "=~"); + tid = TK_MATCH; } else { - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, - "only =~ and == are allowed in the condition"); + "line:", t->line, "pos:", t->line_pos, + "only =~ and == are allow in the condition"); return -1; } t->in_key = 1; t->in_cond = 0; } else if (t->in_key) { tid = TK_ASSIGN; - + buffer_copy_string_len(token, t->input + t->offset, 1); - + t->offset++; t->line_pos++; } else { - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "unexpected equal-sign: ="); return -1; } - + break; - case '!': + case '!': if (t->in_cond) { if (t->input[t->offset + 1] == '=') { t->offset += 2; - - buffer_copy_string_len(token, CONST_STR_LEN("!=")); - + + buffer_copy_string(token, "!="); + tid = TK_NE; } else if (t->input[t->offset + 1] == '~') { t->offset += 2; - - buffer_copy_string_len(token, CONST_STR_LEN("!~")); - + + buffer_copy_string(token, "!~"); + tid = TK_NOMATCH; } else { - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, - "only !~ and != are allowed in the condition"); + "line:", t->line, "pos:", t->line_pos, + "only !~ and != are allow in the condition"); return -1; } t->in_key = 1; t->in_cond = 0; } else { - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "unexpected exclamation-marks: !"); return -1; } - + break; case '\t': case ' ': @@ -682,208 +533,214 @@ static int config_tokenizer(server *srv, tokenizer_t *t, int *token_id, buffer * } t->in_key = 1; tid = TK_EOL; - buffer_copy_string_len(token, CONST_STR_LEN("(EOL)")); + buffer_copy_string(token, "(EOL)"); } else { config_skip_newline(t); t->line_pos = 1; - t->line++; + t->line++; } break; case ',': if (t->in_brace > 0) { tid = TK_COMMA; - - buffer_copy_string_len(token, CONST_STR_LEN("(COMMA)")); + + buffer_copy_string(token, "(COMMA)"); } - + t->offset++; t->line_pos++; break; case '"': /* search for the terminating " */ start = t->input + t->offset + 1; - buffer_copy_string_len(token, CONST_STR_LEN("")); - + buffer_copy_string(token, ""); + for (i = 1; t->input[t->offset + i]; i++) { if (t->input[t->offset + i] == '\\' && t->input[t->offset + i + 1] == '"') { - + buffer_append_string_len(token, start, t->input + t->offset + i - start); - + start = t->input + t->offset + i + 1; - + /* skip the " */ i++; continue; } - - + + if (t->input[t->offset + i] == '"') { tid = TK_STRING; - + buffer_append_string_len(token, start, t->input + t->offset + i - start); - + break; } } if (t->input[t->offset + i] == '\0') { /* ERROR */ - - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "missing closing quote"); - + return -1; } - + t->offset += i + 1; t->line_pos += i + 1; - + break; case '(': t->offset++; t->in_brace++; - + tid = TK_LPARAN; - - buffer_copy_string_len(token, CONST_STR_LEN("(")); + + buffer_copy_string(token, "("); break; case ')': t->offset++; t->in_brace--; - + tid = TK_RPARAN; - - buffer_copy_string_len(token, CONST_STR_LEN(")")); + + buffer_copy_string(token, ")"); break; case '$': t->offset++; - + tid = TK_DOLLAR; t->in_cond = 1; t->in_key = 0; - - buffer_copy_string_len(token, CONST_STR_LEN("$")); - + + buffer_copy_string(token, "$"); + break; case '+': if (t->input[t->offset + 1] == '=') { t->offset += 2; - buffer_copy_string_len(token, CONST_STR_LEN("+=")); + buffer_copy_string(token, "+="); tid = TK_APPEND; } else { t->offset++; tid = TK_PLUS; - buffer_copy_string_len(token, CONST_STR_LEN("+")); + buffer_copy_string(token, "+"); } break; case '{': t->offset++; - + tid = TK_LCURLY; - - buffer_copy_string_len(token, CONST_STR_LEN("{")); - + + buffer_copy_string(token, "{"); + break; - + case '}': t->offset++; - + tid = TK_RCURLY; - - buffer_copy_string_len(token, CONST_STR_LEN("}")); - + + buffer_copy_string(token, "}"); + break; case '[': t->offset++; - + tid = TK_LBRACKET; - - buffer_copy_string_len(token, CONST_STR_LEN("[")); - + + buffer_copy_string(token, "["); + break; - + case ']': t->offset++; - + tid = TK_RBRACKET; - - buffer_copy_string_len(token, CONST_STR_LEN("]")); - + + buffer_copy_string(token, "]"); + break; case '#': t->line_pos += config_skip_comment(t); - + break; default: if (t->in_cond) { - for (i = 0; t->input[t->offset + i] && + for (i = 0; t->input[t->offset + i] && (isalpha((unsigned char)t->input[t->offset + i]) ); i++); - + if (i && t->input[t->offset + i]) { tid = TK_SRVVARNAME; buffer_copy_string_len(token, t->input + t->offset, i); - + t->offset += i; t->line_pos += i; } else { /* ERROR */ - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "invalid character in condition"); return -1; } } else if (isdigit((unsigned char)c)) { /* take all digits */ for (i = 0; t->input[t->offset + i] && isdigit((unsigned char)t->input[t->offset + i]); i++); - + /* was there it least a digit ? */ - if (i) { + if (i && t->input[t->offset + i]) { tid = TK_INTEGER; - + buffer_copy_string_len(token, t->input + t->offset, i); - + t->offset += i; t->line_pos += i; + } else { + /* ERROR */ + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + "source:", t->source, + "line:", t->line, "pos:", t->line_pos, + "unexpected EOF"); + + return -1; } } else { /* the key might consist of [-.0-9a-z] */ - for (i = 0; t->input[t->offset + i] && - (isalnum((unsigned char)t->input[t->offset + i]) || + for (i = 0; t->input[t->offset + i] && + (isalnum((unsigned char)t->input[t->offset + i]) || t->input[t->offset + i] == '.' || t->input[t->offset + i] == '_' || /* for env.* */ t->input[t->offset + i] == '-' ); i++); - + if (i && t->input[t->offset + i]) { buffer_copy_string_len(token, t->input + t->offset, i); - + if (strcmp(token->ptr, "include") == 0) { tid = TK_INCLUDE; } else if (strcmp(token->ptr, "include_shell") == 0) { tid = TK_INCLUDE_SHELL; - } else if (strcmp(token->ptr, "global") == 0) { - tid = TK_GLOBAL; } else if (strcmp(token->ptr, "else") == 0) { tid = TK_ELSE; } else { tid = TK_LKEY; } - + t->offset += i; t->line_pos += i; } else { /* ERROR */ - log_error_write(srv, __FILE__, __LINE__, "sbsdsds", + log_error_write(srv, __FILE__, __LINE__, "sbsdsds", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "invalid character in variable name"); return -1; } @@ -891,16 +748,16 @@ static int config_tokenizer(server *srv, tokenizer_t *t, int *token_id, buffer * break; } } - + if (tid) { *token_id = tid; #if 0 - log_error_write(srv, __FILE__, __LINE__, "sbsdsdbdd", + log_error_write(srv, __FILE__, __LINE__, "sbsdsdbdd", "source:", t->source, "line:", t->line, "pos:", t->line_pos, token, token->used - 1, tid); #endif - + return 1; } else if (t->offset < t->size) { fprintf(stderr, "%s.%d: %d, %s\n", @@ -922,7 +779,7 @@ static int config_parse(server *srv, config_t *context, tokenizer_t *t) { while((1 == (ret = config_tokenizer(srv, t, &token_id, token))) && context->ok) { buffer_copy_string_buffer(lasttoken, token); configparser(pParser, token_id, token, context); - + token = buffer_init(); } buffer_free(token); @@ -935,14 +792,14 @@ static int config_parse(server *srv, config_t *context, tokenizer_t *t) { } } configparserFree(pParser, free); - + if (ret == -1) { - log_error_write(srv, __FILE__, __LINE__, "sb", - "configfile parser failed at:", lasttoken); + log_error_write(srv, __FILE__, __LINE__, "sb", + "configfile parser failed:", lasttoken); } else if (context->ok == 0) { - log_error_write(srv, __FILE__, __LINE__, "sbsdsdsb", + log_error_write(srv, __FILE__, __LINE__, "sbsdsdsb", "source:", t->source, - "line:", t->line, "pos:", t->line_pos, + "line:", t->line, "pos:", t->line_pos, "parser failed somehow near here:", lasttoken); ret = -1; } @@ -959,7 +816,7 @@ static int tokenizer_init(tokenizer_t *t, const buffer *source, const char *inpu t->offset = 0; t->line = 1; t->line_pos = 1; - + t->in_key = 1; t->in_brace = 0; t->in_cond = 0; @@ -972,8 +829,8 @@ int config_parse_file(server *srv, config_t *context, const char *fn) { int ret; buffer *filename; - if (buffer_is_empty(context->basedir) || - (fn[0] == '/' || fn[0] == '\\') || + if (buffer_is_empty(context->basedir) && + (fn[0] == '/' || fn[0] == '\\') && (fn[0] == '.' && (fn[1] == '/' || fn[1] == '\\'))) { filename = buffer_init_string(fn); } else { @@ -982,14 +839,9 @@ int config_parse_file(server *srv, config_t *context, const char *fn) { } if (0 != stream_open(&s, filename)) { - if (s.size == 0) { - /* the file was empty, nothing to parse */ - ret = 0; - } else { - log_error_write(srv, __FILE__, __LINE__, "sbss", - "opening configfile ", filename, "failed:", strerror(errno)); - ret = -1; - } + log_error_write(srv, __FILE__, __LINE__, "sbss", + "opening configfile ", filename, "failed:", strerror(errno)); + ret = -1; } else { tokenizer_init(&t, filename, s.start, s.size); ret = config_parse(srv, context, &t); @@ -1000,39 +852,16 @@ int config_parse_file(server *srv, config_t *context, const char *fn) { return ret; } -static char* getCWD() { - char *s, *s1; - size_t len; -#ifdef PATH_MAX - len = PATH_MAX; -#else - len = 4096; -#endif - - s = malloc(len); - if (!s) return NULL; - while (NULL == getcwd(s, len)) { - if (errno != ERANGE || SSIZE_MAX - len < len) return NULL; - len *= 2; - s1 = realloc(s, len); - if (!s1) { - free(s); - return NULL; - } - s = s1; - } - return s; -} - int config_parse_cmd(server *srv, config_t *context, const char *cmd) { + proc_handler_t proc; tokenizer_t t; int ret; buffer *source; buffer *out; - char *oldpwd; + char oldpwd[PATH_MAX]; - if (NULL == (oldpwd = getCWD())) { - log_error_write(srv, __FILE__, __LINE__, "s", + if (NULL == getcwd(oldpwd, sizeof(oldpwd))) { + log_error_write(srv, __FILE__, __LINE__, "s", "cannot get cwd", strerror(errno)); return -1; } @@ -1044,8 +873,8 @@ int config_parse_cmd(server *srv, config_t *context, const char *cmd) { chdir(context->basedir->ptr); } - if (0 != proc_open_buffer(cmd, NULL, out, NULL)) { - log_error_write(srv, __FILE__, __LINE__, "sbss", + if (0 != proc_open_buffer(&proc, cmd, NULL, out, NULL)) { + log_error_write(srv, __FILE__, __LINE__, "sbss", "opening", source, "failed:", strerror(errno)); ret = -1; } else { @@ -1056,7 +885,6 @@ int config_parse_cmd(server *srv, config_t *context, const char *cmd) { buffer_free(source); buffer_free(out); chdir(oldpwd); - free(oldpwd); return ret; } @@ -1077,7 +905,6 @@ int config_read(server *srv, const char *fn) { config_t context; data_config *dc; data_integer *dpid; - data_string *dcwd; int ret; char *pos; data_array *modules; @@ -1085,18 +912,20 @@ int config_read(server *srv, const char *fn) { context_init(srv, &context); context.all_configs = srv->config_context; + pos = strrchr(fn, #ifdef __WIN32 - pos = strrchr(fn, '\\'); + '\\' #else - pos = strrchr(fn, '/'); + '/' #endif + ); if (pos) { buffer_copy_string_len(context.basedir, fn, pos - fn + 1); fn = pos + 1; } - + dc = data_config_init(); - buffer_copy_string_len(dc->key, CONST_STR_LEN("global")); + buffer_copy_string(dc->key, "global"); assert(context.all_configs->used == 0); dc->context_ndx = context.all_configs->used; @@ -1107,17 +936,9 @@ int config_read(server *srv, const char *fn) { srv->config = dc->value; dpid = data_integer_init(); dpid->value = getpid(); - buffer_copy_string_len(dpid->key, CONST_STR_LEN("var.PID")); + buffer_copy_string(dpid->key, "var.PID"); array_insert_unique(srv->config, (data_unset *)dpid); - - dcwd = data_string_init(); - buffer_prepare_copy(dcwd->value, 1024); - if (NULL != getcwd(dcwd->value->ptr, dcwd->value->size - 1)) { - dcwd->value->used = strlen(dcwd->value->ptr) + 1; - buffer_copy_string_len(dcwd->key, CONST_STR_LEN("var.CWD")); - array_insert_unique(srv->config, (data_unset *)dcwd); - } - + ret = config_parse_file(srv, &context, fn); /* remains nothing if parser is ok */ @@ -1133,7 +954,7 @@ int config_read(server *srv, const char *fn) { } else { return -1; } - + if (NULL != (modules = (data_array *)array_get_element(srv->config, "server.modules"))) { data_string *ds; data_array *prepends; @@ -1148,7 +969,7 @@ int config_read(server *srv, const char *fn) { /* prepend default modules */ if (NULL == array_get_element(modules->value, "mod_indexfile")) { ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN("mod_indexfile")); + buffer_copy_string(ds->value, "mod_indexfile"); array_insert_unique(prepends->value, (data_unset *)ds); } @@ -1161,42 +982,22 @@ int config_read(server *srv, const char *fn) { /* append default modules */ if (NULL == array_get_element(modules->value, "mod_dirlisting")) { ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN("mod_dirlisting")); + buffer_copy_string(ds->value, "mod_dirlisting"); array_insert_unique(modules->value, (data_unset *)ds); } if (NULL == array_get_element(modules->value, "mod_staticfile")) { ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN("mod_staticfile")); + buffer_copy_string(ds->value, "mod_staticfile"); array_insert_unique(modules->value, (data_unset *)ds); } - } else { - data_string *ds; - - modules = data_array_init(); - - /* server.modules is not set */ - ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN("mod_indexfile")); - array_insert_unique(modules->value, (data_unset *)ds); - - ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN("mod_dirlisting")); - array_insert_unique(modules->value, (data_unset *)ds); - - ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN("mod_staticfile")); - array_insert_unique(modules->value, (data_unset *)ds); - - buffer_copy_string_len(modules->key, CONST_STR_LEN("server.modules")); - array_insert_unique(srv->config, (data_unset *)modules); } - + if (0 != config_insert(srv)) { return -1; } - + return 0; } @@ -1204,50 +1005,48 @@ int config_set_defaults(server *srv) { size_t i; specific_config *s = srv->config_storage[0]; struct stat st1, st2; - - struct ev_map { fdevent_handler_t et; const char *name; } event_handlers[] = - { - /* - epoll is most reliable + + struct ev_map { fdevent_handler_t et; const char *name; } event_handlers[] = + { + /* - poll is most reliable * - select works everywhere + * - linux-* are experimental */ -#ifdef USE_LINUX_EPOLL - { FDEVENT_HANDLER_LINUX_SYSEPOLL, "linux-sysepoll" }, -#endif #ifdef USE_POLL { FDEVENT_HANDLER_POLL, "poll" }, #endif #ifdef USE_SELECT { FDEVENT_HANDLER_SELECT, "select" }, #endif -#ifdef USE_LIBEV - { FDEVENT_HANDLER_LIBEV, "libev" }, +#ifdef USE_LINUX_EPOLL + { FDEVENT_HANDLER_LINUX_SYSEPOLL, "linux-sysepoll" }, +#endif +#ifdef USE_LINUX_SIGIO + { FDEVENT_HANDLER_LINUX_RTSIG, "linux-rtsig" }, #endif #ifdef USE_SOLARIS_DEVPOLL { FDEVENT_HANDLER_SOLARIS_DEVPOLL,"solaris-devpoll" }, #endif -#ifdef USE_SOLARIS_PORT - { FDEVENT_HANDLER_SOLARIS_PORT, "solaris-eventports" }, -#endif #ifdef USE_FREEBSD_KQUEUE { FDEVENT_HANDLER_FREEBSD_KQUEUE, "freebsd-kqueue" }, { FDEVENT_HANDLER_FREEBSD_KQUEUE, "kqueue" }, #endif { FDEVENT_HANDLER_UNSET, NULL } }; - - - if (buffer_is_empty(s->document_root)) { - log_error_write(srv, __FILE__, __LINE__, "s", - "a default document-root has to be set"); - - return -1; - } - + + + if (buffer_is_empty(s->document_root)) { + log_error_write(srv, __FILE__, __LINE__, "s", + "a default document-root has to be set"); + + return -1; + } + if (buffer_is_empty(srv->srvconf.changeroot)) { - if (-1 == stat(s->document_root->ptr, &st1)) { - log_error_write(srv, __FILE__, __LINE__, "sb", + if (-1 == stat(s->document_root->ptr, &st1)) { + log_error_write(srv, __FILE__, __LINE__, "sb", "base-docroot doesn't exist:", - s->document_root); + s->document_root); return -1; } @@ -1255,91 +1054,87 @@ int config_set_defaults(server *srv) { buffer_copy_string_buffer(srv->tmp_buf, srv->srvconf.changeroot); buffer_append_string_buffer(srv->tmp_buf, s->document_root); - if (-1 == stat(srv->tmp_buf->ptr, &st1)) { - log_error_write(srv, __FILE__, __LINE__, "sb", + if (-1 == stat(srv->tmp_buf->ptr, &st1)) { + log_error_write(srv, __FILE__, __LINE__, "sb", "base-docroot doesn't exist:", - srv->tmp_buf); + srv->tmp_buf); return -1; } - + } + + buffer_copy_string_buffer(srv->tmp_buf, s->document_root); - buffer_copy_string_buffer(srv->tmp_buf, s->document_root); - - buffer_to_lower(srv->tmp_buf); - - if (2 == s->force_lowercase_filenames) { /* user didn't configure it in global section? */ - s->force_lowercase_filenames = 0; /* default to 0 */ + buffer_to_lower(srv->tmp_buf); - if (0 == stat(srv->tmp_buf->ptr, &st1)) { - int is_lower = 0; + if (0 == stat(srv->tmp_buf->ptr, &st1)) { + int is_lower = 0; - is_lower = buffer_is_equal(srv->tmp_buf, s->document_root); + is_lower = buffer_is_equal(srv->tmp_buf, s->document_root); - /* lower-case existed, check upper-case */ - buffer_copy_string_buffer(srv->tmp_buf, s->document_root); + /* lower-case existed, check upper-case */ + buffer_copy_string_buffer(srv->tmp_buf, s->document_root); - buffer_to_upper(srv->tmp_buf); + buffer_to_upper(srv->tmp_buf); - /* we have to handle the special case that upper and lower-casing results in the same filename - * as in server.document-root = "/" or "/12345/" */ + /* we have to handle the special case that upper and lower-casing results in the same filename + * as in server.document-root = "/" or "/12345/" */ - if (is_lower && buffer_is_equal(srv->tmp_buf, s->document_root)) { - /* lower-casing and upper-casing didn't result in - * an other filename, no need to stat(), - * just assume it is case-sensitive. */ + if (is_lower && buffer_is_equal(srv->tmp_buf, s->document_root)) { + /* lower-casing and upper-casing didn't result in + * an other filename, no need to stat(), + * just assume it is case-sensitive. */ - s->force_lowercase_filenames = 0; - } else if (0 == stat(srv->tmp_buf->ptr, &st2)) { - - /* upper case exists too, doesn't the FS handle this ? */ - - /* upper and lower have the same inode -> case-insensitve FS */ - - if (st1.st_ino == st2.st_ino) { - /* upper and lower have the same inode -> case-insensitve FS */ - - s->force_lowercase_filenames = 1; - } - } - } - } + s->force_lower_case = 0; + } else if (0 == stat(srv->tmp_buf->ptr, &st2)) { + /* upper case exists too, doesn't the FS handle this ? */ + + /* upper and lower have the same inode -> case-insensitve FS */ + + if (st1.st_ino == st2.st_ino) { + /* upper and lower have the same inode -> case-insensitve FS */ + + s->force_lower_case = 1; + } + } + } + if (srv->srvconf.port == 0) { srv->srvconf.port = s->is_ssl ? 443 : 80; } - + if (srv->srvconf.event_handler->used == 0) { /* choose a good default - * - * the event_handler list is sorted by 'goodness' + * + * the event_handler list is sorted by 'goodness' * taking the first available should be the best solution */ srv->event_handler = event_handlers[0].et; - + if (FDEVENT_HANDLER_UNSET == srv->event_handler) { - log_error_write(srv, __FILE__, __LINE__, "s", + log_error_write(srv, __FILE__, __LINE__, "s", "sorry, there is no event handler for this system"); - + return -1; } } else { /* * User override */ - + for (i = 0; event_handlers[i].name; i++) { if (0 == strcmp(event_handlers[i].name, srv->srvconf.event_handler->ptr)) { srv->event_handler = event_handlers[i].et; break; } } - + if (FDEVENT_HANDLER_UNSET == srv->event_handler) { - log_error_write(srv, __FILE__, __LINE__, "sb", - "the selected event-handler in unknown or not supported:", + log_error_write(srv, __FILE__, __LINE__, "sb", + "the selected event-handler in unknown or not supported:", srv->srvconf.event_handler ); - + return -1; } } @@ -1347,19 +1142,19 @@ int config_set_defaults(server *srv) { if (s->is_ssl) { if (buffer_is_empty(s->ssl_pemfile)) { /* PEM file is require */ - - log_error_write(srv, __FILE__, __LINE__, "s", + + log_error_write(srv, __FILE__, __LINE__, "s", "ssl.pemfile has to be set"); return -1; } - + #ifndef USE_OPENSSL - log_error_write(srv, __FILE__, __LINE__, "s", + log_error_write(srv, __FILE__, __LINE__, "s", "ssl support is missing, recompile with --with-openssl"); - + return -1; #endif } - + return 0; } |