X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=loadcfg.c;h=5de202cfc4928ab2afccd93f4c4fcba93a642fff;hb=7ac4648ff14080c7d5f46e7d1d54cfc85d654d1f;hp=ac8684835ef744db68f986390ecd90fae628a45d;hpb=a63e355db41838804a61f8c39fe9227d4978d9a0;p=privoxy.git diff --git a/loadcfg.c b/loadcfg.c index ac868483..5de202cf 100644 --- a/loadcfg.c +++ b/loadcfg.c @@ -1,4 +1,4 @@ -const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.116 2011/07/08 13:29:39 fabiankeil Exp $"; +const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.124 2012/03/04 11:51:25 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loadcfg.c,v $ @@ -72,6 +72,7 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.116 2011/07/08 13:29:39 fabiankei #endif +#include "project.h" #include "loadcfg.h" #include "list.h" #include "jcc.h" @@ -87,17 +88,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.116 2011/07/08 13:29:39 fabiankei const char loadcfg_h_rcs[] = LOADCFG_H_VERSION; -/* - * Fix a problem with Solaris. There should be no effect on other - * platforms. - * Solaris's isspace() is a macro which uses it's argument directly - * as an array index. Therefore we need to make sure that high-bit - * characters generate +ve values, and ideally we also want to make - * the argument match the declared parameter type of "int". - */ -#define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) -#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) - #ifdef FEATURE_TOGGLE /* Privoxy is enabled by default. */ int global_toggle_state = 1; @@ -128,56 +118,56 @@ static struct file_list *current_configfile = NULL; * console and GUI specific options last). */ -#define hash_actions_file 1196306641ul /* "actionsfile" */ -#define hash_accept_intercepted_requests 1513024973ul /* "accept-intercepted-requests" */ -#define hash_admin_address 4112573064ul /* "admin-address" */ -#define hash_allow_cgi_request_crunching 258915987ul /* "allow-cgi-request-crunching" */ -#define hash_buffer_limit 1881726070ul /* "buffer-limit */ -#define hash_compression_level 2464423563ul /* "compression-level" */ -#define hash_confdir 1978389ul /* "confdir" */ -#define hash_connection_sharing 1348841265ul /* "connection-sharing" */ -#define hash_debug 78263ul /* "debug" */ -#define hash_default_server_timeout 2530089913ul /* "default-server-timeout" */ -#define hash_deny_access 1227333715ul /* "deny-access" */ -#define hash_enable_edit_actions 2517097536ul /* "enable-edit-actions" */ -#define hash_enable_compression 3943696946ul /* "enable-compression" */ -#define hash_enable_remote_toggle 2979744683ul /* "enable-remote-toggle" */ -#define hash_enable_remote_http_toggle 110543988ul /* "enable-remote-http-toggle" */ -#define hash_enforce_blocks 1862427469ul /* "enforce-blocks" */ -#define hash_filterfile 250887266ul /* "filterfile" */ -#define hash_forward 2029845ul /* "forward" */ -#define hash_forward_socks4 3963965521ul /* "forward-socks4" */ -#define hash_forward_socks4a 2639958518ul /* "forward-socks4a" */ -#define hash_forward_socks5 3963965522ul /* "forward-socks5" */ -#define hash_forwarded_connect_retries 101465292ul /* "forwarded-connect-retries" */ -#define hash_handle_as_empty_returns_ok 1444873247ul /* "handle-as-empty-doc-returns-ok" */ -#define hash_hostname 10308071ul /* "hostname" */ -#define hash_keep_alive_timeout 3878599515ul /* "keep-alive-timeout" */ -#define hash_listen_address 1255650842ul /* "listen-address" */ -#define hash_logdir 422889ul /* "logdir" */ -#define hash_logfile 2114766ul /* "logfile" */ -#define hash_max_client_connections 3595884446ul /* "max-client-connections" */ -#define hash_permit_access 3587953268ul /* "permit-access" */ -#define hash_proxy_info_url 3903079059ul /* "proxy-info-url" */ -#define hash_single_threaded 4250084780ul /* "single-threaded" */ -#define hash_socket_timeout 1809001761ul /* "socket-timeout" */ -#define hash_split_large_cgi_forms 671658948ul /* "split-large-cgi-forms" */ -#define hash_suppress_blocklists 1948693308ul /* "suppress-blocklists" */ -#define hash_templdir 11067889ul /* "templdir" */ -#define hash_toggle 447966ul /* "toggle" */ -#define hash_trust_info_url 430331967ul /* "trust-info-url" */ -#define hash_trustfile 56494766ul /* "trustfile" */ -#define hash_usermanual 1416668518ul /* "user-manual" */ -#define hash_activity_animation 1817904738ul /* "activity-animation" */ -#define hash_close_button_minimizes 3651284693ul /* "close-button-minimizes" */ -#define hash_hide_console 2048809870ul /* "hide-console" */ -#define hash_log_buffer_size 2918070425ul /* "log-buffer-size" */ -#define hash_log_font_name 2866730124ul /* "log-font-name" */ -#define hash_log_font_size 2866731014ul /* "log-font-size" */ -#define hash_log_highlight_messages 4032101240ul /* "log-highlight-messages" */ -#define hash_log_max_lines 2868344173ul /* "log-max-lines" */ -#define hash_log_messages 2291744899ul /* "log-messages" */ -#define hash_show_on_task_bar 215410365ul /* "show-on-task-bar" */ +#define hash_actions_file 1196306641U /* "actionsfile" */ +#define hash_accept_intercepted_requests 1513024973U /* "accept-intercepted-requests" */ +#define hash_admin_address 4112573064U /* "admin-address" */ +#define hash_allow_cgi_request_crunching 258915987U /* "allow-cgi-request-crunching" */ +#define hash_buffer_limit 1881726070U /* "buffer-limit */ +#define hash_compression_level 2464423563U /* "compression-level" */ +#define hash_confdir 1978389U /* "confdir" */ +#define hash_connection_sharing 1348841265U /* "connection-sharing" */ +#define hash_debug 78263U /* "debug" */ +#define hash_default_server_timeout 2530089913U /* "default-server-timeout" */ +#define hash_deny_access 1227333715U /* "deny-access" */ +#define hash_enable_edit_actions 2517097536U /* "enable-edit-actions" */ +#define hash_enable_compression 3943696946U /* "enable-compression" */ +#define hash_enable_remote_toggle 2979744683U /* "enable-remote-toggle" */ +#define hash_enable_remote_http_toggle 110543988U /* "enable-remote-http-toggle" */ +#define hash_enforce_blocks 1862427469U /* "enforce-blocks" */ +#define hash_filterfile 250887266U /* "filterfile" */ +#define hash_forward 2029845U /* "forward" */ +#define hash_forward_socks4 3963965521U /* "forward-socks4" */ +#define hash_forward_socks4a 2639958518U /* "forward-socks4a" */ +#define hash_forward_socks5 3963965522U /* "forward-socks5" */ +#define hash_forwarded_connect_retries 101465292U /* "forwarded-connect-retries" */ +#define hash_handle_as_empty_returns_ok 1444873247U /* "handle-as-empty-doc-returns-ok" */ +#define hash_hostname 10308071U /* "hostname" */ +#define hash_keep_alive_timeout 3878599515U /* "keep-alive-timeout" */ +#define hash_listen_address 1255650842U /* "listen-address" */ +#define hash_logdir 422889U /* "logdir" */ +#define hash_logfile 2114766U /* "logfile" */ +#define hash_max_client_connections 3595884446U /* "max-client-connections" */ +#define hash_permit_access 3587953268U /* "permit-access" */ +#define hash_proxy_info_url 3903079059U /* "proxy-info-url" */ +#define hash_single_threaded 4250084780U /* "single-threaded" */ +#define hash_socket_timeout 1809001761U /* "socket-timeout" */ +#define hash_split_large_cgi_forms 671658948U /* "split-large-cgi-forms" */ +#define hash_suppress_blocklists 1948693308U /* "suppress-blocklists" */ +#define hash_templdir 11067889U /* "templdir" */ +#define hash_toggle 447966U /* "toggle" */ +#define hash_trust_info_url 430331967U /* "trust-info-url" */ +#define hash_trustfile 56494766U /* "trustfile" */ +#define hash_usermanual 1416668518U /* "user-manual" */ +#define hash_activity_animation 1817904738U /* "activity-animation" */ +#define hash_close_button_minimizes 3651284693U /* "close-button-minimizes" */ +#define hash_hide_console 2048809870U /* "hide-console" */ +#define hash_log_buffer_size 2918070425U /* "log-buffer-size" */ +#define hash_log_font_name 2866730124U /* "log-font-name" */ +#define hash_log_font_size 2866731014U /* "log-font-size" */ +#define hash_log_highlight_messages 4032101240U /* "log-highlight-messages" */ +#define hash_log_max_lines 2868344173U /* "log-max-lines" */ +#define hash_log_messages 2291744899U /* "log-messages" */ +#define hash_show_on_task_bar 215410365U /* "show-on-task-bar" */ static void savearg(char *command, char *argument, struct configuration_spec * config); @@ -229,7 +219,10 @@ static void unload_configfile (void * data) freez(config->templdir); freez(config->hostname); - freez(config->haddr); + for (i = 0; i < MAX_LISTENING_SOCKETS; i++) + { + freez(config->haddr[i]); + } freez(config->logfile); for (i = 0; i < MAX_AF_FILES; i++) @@ -438,7 +431,7 @@ struct configuration_spec * load_config(void) struct forward_spec *cur_fwd; int vec_count; char *vec[3]; - unsigned long directive_hash; + unsigned int directive_hash; strlcpy(tmp, buf, sizeof(tmp)); @@ -473,9 +466,9 @@ struct configuration_spec * load_config(void) /* Make sure the command field is lower case */ for (p = cmd; *p; p++) { - if (ijb_isupper(*p)) + if (privoxy_isupper(*p)) { - *p = (char)ijb_tolower(*p); + *p = (char)privoxy_tolower(*p); } } @@ -551,7 +544,7 @@ struct configuration_spec * load_config(void) * *************************************************************************/ case hash_confdir : freez(config->confdir); - config->confdir = make_path( NULL, arg); + config->confdir = make_path(NULL, arg); break; /* ************************************************************************* @@ -1066,8 +1059,23 @@ struct configuration_spec * load_config(void) * listen-address [ip][:port] * *************************************************************************/ case hash_listen_address : - freez(config->haddr); - config->haddr = strdup(arg); + i = 0; + while ((i < MAX_LISTENING_SOCKETS) && (NULL != config->haddr[i])) + { + i++; + } + + if (i >= MAX_LISTENING_SOCKETS) + { + log_error(LOG_LEVEL_FATAL, "Too many 'listen-address' directives in config file - limit is %d.\n" + "(You can increase this limit by changing MAX_LISTENING_SOCKETS in project.h and recompiling).", + MAX_LISTENING_SOCKETS); + } + config->haddr[i] = strdup(arg); + if (NULL == config->haddr[i]) + { + log_error(LOG_LEVEL_FATAL, "Out of memory while copying listening address"); + } break; /* ************************************************************************* @@ -1436,12 +1444,12 @@ struct configuration_spec * load_config(void) break; /* *************************************************************************/ - } /* end switch( hash_string(cmd) ) */ + } /* end switch(hash_string(cmd)) */ /* Save the argument for the show-status page. */ savearg(cmd, arg, config); freez(buf); - } /* end while ( read_config_line(...) ) */ + } /* end while (read_config_line(...)) */ fclose(configfp); @@ -1507,14 +1515,14 @@ struct configuration_spec * load_config(void) log_error(LOG_LEVEL_FATAL, "Out of memory loading config - insufficient memory for config->proxy_args"); } - if (config->actions_file[0]) + if (config->re_filterfile[0]) { - add_loader(load_action_files, config); + add_loader(load_re_filterfiles, config); } - if (config->re_filterfile[0]) + if (config->actions_file[0]) { - add_loader(load_re_filterfiles, config); + add_loader(load_action_files, config); } #ifdef FEATURE_TRUST @@ -1524,39 +1532,45 @@ struct configuration_spec * load_config(void) } #endif /* def FEATURE_TRUST */ - if ( NULL == config->haddr ) + if (NULL == config->haddr[0]) { - config->haddr = strdup( HADDR_DEFAULT ); + config->haddr[0] = strdup(HADDR_DEFAULT); + if (NULL == config->haddr[0]) + { + log_error(LOG_LEVEL_FATAL, "Out of memory while copying default listening address"); + } } - if ( NULL != config->haddr ) + for (i = 0; i < MAX_LISTENING_SOCKETS && NULL != config->haddr[i]; i++) { - if ((*config->haddr == '[') - && (NULL != (p = strchr(config->haddr, ']'))) + if ((*config->haddr[i] == '[') + && (NULL != (p = strchr(config->haddr[i], ']'))) && (p[1] == ':') - && (0 < (config->hport = atoi(p + 2)))) + && (0 < (config->hport[i] = atoi(p + 2)))) { *p = '\0'; - memmove((void *)config->haddr, config->haddr + 1, - (size_t)(p - config->haddr)); + memmove((void *)config->haddr[i], config->haddr[i] + 1, + (size_t)(p - config->haddr[i])); } - else if (NULL != (p = strchr(config->haddr, ':')) - && (0 < (config->hport = atoi(p + 1)))) + else if (NULL != (p = strchr(config->haddr[i], ':')) + && (0 < (config->hport[i] = atoi(p + 1)))) { *p = '\0'; } else { - log_error(LOG_LEVEL_FATAL, "invalid bind port spec %s", config->haddr); + log_error(LOG_LEVEL_FATAL, "invalid bind port spec %s", config->haddr[i]); /* Never get here - LOG_LEVEL_FATAL causes program exit */ } - if (*config->haddr == '\0') + if (*config->haddr[i] == '\0') { /* - * Only the port specified. We stored it in config->hport + * Only the port specified. We stored it in config->hport[i] * and don't need its text representation anymore. + * Use config->hport[i] == 0 to iterate listening addresses since + * now. */ - freez(config->haddr); + freez(config->haddr[i]); } } @@ -1600,30 +1614,34 @@ struct configuration_spec * load_config(void) struct configuration_spec * oldcfg = (struct configuration_spec *) current_configfile->f; /* - * Check if config->haddr,hport == oldcfg->haddr,hport + * Check if config->haddr[i],hport[i] == oldcfg->haddr[i],hport[i] * * The following could be written more compactly as a single, * (unreadably long) if statement. */ config->need_bind = 0; - if (config->hport != oldcfg->hport) - { - config->need_bind = 1; - } - else if (config->haddr == NULL) + + for (i = 0; i < MAX_LISTENING_SOCKETS; i++) { - if (oldcfg->haddr != NULL) + if (config->hport[i] != oldcfg->hport[i]) + { + config->need_bind = 1; + } + else if (config->haddr[i] == NULL) + { + if (oldcfg->haddr[i] != NULL) + { + config->need_bind = 1; + } + } + else if (oldcfg->haddr[i] == NULL) + { + config->need_bind = 1; + } + else if (0 != strcmp(config->haddr[i], oldcfg->haddr[i])) { config->need_bind = 1; } - } - else if (oldcfg->haddr == NULL) - { - config->need_bind = 1; - } - else if (0 != strcmp(config->haddr, oldcfg->haddr)) - { - config->need_bind = 1; } current_configfile->unloader = unload_configfile; @@ -1690,7 +1708,7 @@ static void savearg(char *command, char *argument, struct configuration_spec * c return; } - if ( (NULL != argument) && ('\0' != *argument) ) + if ((NULL != argument) && ('\0' != *argument)) { s = html_encode(argument); if (NULL == s)