-const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.105 2009/09/06 14:15:46 fabiankeil Exp $";
+const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.111 2010/08/14 23:28:52 ler762 Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/loadcfg.c,v $
#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_remote_toggle 2979744683ul /* "enable-remote-toggle" */
#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" */
list_remove_all(config->trust_info);
#endif /* def FEATURE_TRUST */
- for (i = 0; i < MAX_AF_FILES; i++)
- {
- freez(config->re_filterfile[i]);
- }
-
freez(config);
}
*********************************************************************/
struct configuration_spec * load_config(void)
{
- char buf[BUFFER_SIZE];
+ char *buf = NULL;
char *p, *q;
FILE *configfp = NULL;
struct configuration_spec * config = NULL;
config->max_client_connections = 0;
config->socket_timeout = 300; /* XXX: Should be a macro. */
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+ config->default_server_timeout = 0;
config->keep_alive_timeout = DEFAULT_KEEP_ALIVE_TIMEOUT;
config->feature_flags &= ~RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE;
config->feature_flags &= ~RUNTIME_FEATURE_CONNECTION_SHARING;
config->feature_flags &= ~RUNTIME_FEATURE_CGI_TOGGLE;
config->feature_flags &= ~RUNTIME_FEATURE_SPLIT_LARGE_FORMS;
config->feature_flags &= ~RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS;
+ config->feature_flags &= ~RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK;
configfp = fopen(configfile, "r");
if (NULL == configfp)
/* Never get here - LOG_LEVEL_FATAL causes program exit */
}
- while (read_config_line(buf, sizeof(buf), configfp, &linenum) != NULL)
+ while (read_config_line(configfp, &linenum, &buf) != NULL)
{
char cmd[BUFFER_SIZE];
char arg[BUFFER_SIZE];
}
/* Copy the argument into arg */
- strlcpy(arg, p, sizeof(arg));
+ if (strlcpy(arg, p, sizeof(arg)) >= sizeof(arg))
+ {
+ log_error(LOG_LEVEL_FATAL, "Config line too long: %s", buf);
+ }
/* Should never happen, but check this anyway */
if (*cmd == '\0')
{
+ freez(buf);
continue;
}
config->debug |= atoi(arg);
break;
+/* *************************************************************************
+ * default-server-timeout timeout
+ * *************************************************************************/
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+ case hash_default_server_timeout :
+ if (*arg != '\0')
+ {
+ int timeout = atoi(arg);
+ if (0 < timeout)
+ {
+ config->default_server_timeout = (unsigned int)timeout;
+ }
+ else
+ {
+ log_error(LOG_LEVEL_FATAL,
+ "Invalid default-server-timeout value: %s", arg);
+ }
+ }
+ break;
+#endif
+
/* *************************************************************************
* deny-access source-ip[/significant-bits] [dest-ip[/significant-bits]]
* *************************************************************************/
config->forwarded_connect_retries = atoi(arg);
break;
+/* *************************************************************************
+ * handle-as-empty-doc-returns-ok 0|1
+ *
+ * Workaround for firefox hanging on blocked javascript pages.
+ * Block with the "+handle-as-empty-document" flag and set the
+ * "handle-as-empty-doc-returns-ok" run-time config flag so that
+ * Privoxy returns a 200/OK status instead of a 403/Forbidden status
+ * to the browser for blocked pages.
+ ***************************************************************************/
+ case hash_handle_as_empty_returns_ok:
+ if ((*arg != '\0') && (0 != atoi(arg)))
+ {
+ config->feature_flags |= RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK;
+ }
+ else
+ {
+ config->feature_flags &= ~RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK;
+ }
+ break;
+
/* *************************************************************************
* hostname hostname-to-show-on-cgi-pages
* *************************************************************************/
* In logdir by default
* *************************************************************************/
case hash_logfile :
- if (!no_daemon)
+ if (daemon_mode)
{
logfile = make_path(config->logdir, arg);
if (NULL == logfile)
/* Save the argument for the show-status page. */
savearg(cmd, arg, config);
-
+ freez(buf);
} /* end while ( read_config_line(...) ) */
fclose(configfp);
freez(config->logfile);
- if (!no_daemon)
+ if (daemon_mode)
{
if (NULL != logfile)
{
}
}
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+ if (config->default_server_timeout > config->keep_alive_timeout)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Reducing the default-server-timeout from %d to the keep-alive-timeout %d.",
+ config->default_server_timeout, config->keep_alive_timeout);
+ config->default_server_timeout = config->keep_alive_timeout;
+ }
+#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
+
#ifdef FEATURE_CONNECTION_SHARING
if (config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE)
{
#if defined(_WIN32) && !defined (_WIN_CONSOLE)
g_default_actions_file = config->actions_file[1]; /* FIXME Hope this is default.action */
- g_user_actions_file = config->actions_file[2]; /* FIXME Hope this is user.action */
- g_re_filterfile = config->re_filterfile[0]; /* FIXME Hope this is default.filter */
+ g_user_actions_file = config->actions_file[2]; /* FIXME Hope this is user.action */
+ g_default_filterfile = config->re_filterfile[0]; /* FIXME Hope this is default.filter */
+ g_user_filterfile = config->re_filterfile[1]; /* FIXME Hope this is user.filter */
#ifdef FEATURE_TRUST
g_trustfile = config->trustfile;