-const char jcc_rcs[] = "$Id: jcc.c,v 1.374 2011/11/06 11:58:51 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.389 2012/10/12 11:19:35 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
* Purpose : Main file. Contains main() method, main loop, and
* the main connection-handling function.
*
- * Copyright : Written by and Copyright (C) 2001-2010 the
+ * Copyright : Written by and Copyright (C) 2001-2012 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
case SIGINT:
log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal);
#if defined(unix)
- if(pidfile)
+ if (pidfile)
{
unlink(pidfile);
}
}
+/*********************************************************************
+ *
+ * Function : log_applied_actions
+ *
+ * Description : Logs the applied actions if LOG_LEVEL_ACTIONS is
+ * enabled.
+ *
+ * Parameters :
+ * 1 : actions = Current action spec to log
+ *
+ * Returns : Nothing.
+ *
+ *********************************************************************/
+static void log_applied_actions(const struct current_action_spec *actions)
+{
+ /*
+ * The conversion to text requires lots of memory allocations so
+ * we only do the conversion if the user is actually interested.
+ */
+ if (debug_level_is_enabled(LOG_LEVEL_ACTIONS))
+ {
+ char *actions_as_text = actions_to_line_of_text(actions);
+ log_error(LOG_LEVEL_ACTIONS, "%s", actions_as_text);
+ freez(actions_as_text);
+ }
+}
+
+
/*********************************************************************
*
* Function : send_crunch_response
status_code[3] = '\0';
/* Log that the request was crunched and why. */
+ log_applied_actions(csp->action);
log_error(LOG_LEVEL_CRUNCH, "%s: %s", crunch_reason(rsp), http->url);
log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" %s %u",
csp->ip_addr_str, http->ocmd, status_code, rsp->content_length);
* Downgrade http version from 1.1 to 1.0
* if +downgrade action applies.
*/
- if ( (csp->action->flags & ACTION_DOWNGRADE)
+ if ((csp->action->flags & ACTION_DOWNGRADE)
&& (!strcmpic(http->ver, "HTTP/1.1")))
{
freez(http->ver);
- http->ver = strdup("HTTP/1.0");
-
- if (http->ver == NULL)
- {
- log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version");
- }
+ http->ver = strdup_or_die("HTTP/1.0");
}
/*
else
{
/* XXX: ocmd is a misleading name */
- http->ocmd = strdup(http->cmd);
- if (http->ocmd == NULL)
- {
- log_error(LOG_LEVEL_FATAL,
- "Out of memory copying rewritten HTTP request line");
- }
+ http->ocmd = strdup_or_die(http->cmd);
}
return err;
assert(NULL != http->host);
server_connection->sfd = sfd;
- server_connection->host = strdup(http->host);
- if (NULL == server_connection->host)
- {
- log_error(LOG_LEVEL_FATAL, "Out of memory saving socket.");
- }
+ server_connection->host = strdup_or_die(http->host);
server_connection->port = http->port;
assert(NULL != fwd);
server_connection->forwarder_type = fwd->type;
if (NULL != fwd->gateway_host)
{
- server_connection->gateway_host = strdup(fwd->gateway_host);
- if (NULL == server_connection->gateway_host)
- {
- log_error(LOG_LEVEL_FATAL, "Out of memory saving gateway_host.");
- }
+ server_connection->gateway_host = strdup_or_die(fwd->gateway_host);
}
else
{
if (NULL != fwd->forward_host)
{
- server_connection->forward_host = strdup(fwd->forward_host);
- if (NULL == server_connection->forward_host)
- {
- log_error(LOG_LEVEL_FATAL, "Out of memory saving forward_host.");
- }
+ server_connection->forward_host = strdup_or_die(fwd->forward_host);
}
else
{
{
if (!data_is_available(csp->cfd, csp->config->socket_timeout))
{
- log_error(LOG_LEVEL_CONNECT,
- "Stopped waiting for the request line. Timeout: %d.",
- csp->config->socket_timeout);
- write_socket(csp->cfd, CLIENT_CONNECTION_TIMEOUT_RESPONSE,
- strlen(CLIENT_CONNECTION_TIMEOUT_RESPONSE));
+ if (socket_is_still_alive(csp->cfd))
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "No request line on socket %d received in time. Timeout: %d.",
+ csp->cfd, csp->config->socket_timeout);
+ write_socket(csp->cfd, CLIENT_CONNECTION_TIMEOUT_RESPONSE,
+ strlen(CLIENT_CONNECTION_TIMEOUT_RESPONSE));
+ }
+ else
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "The client side of the connection on socket %d got "
+ "closed without sending a complete request line.", csp->cfd);
+ }
return NULL;
}
/*
* Save a copy of the original request for logging
*/
- http->ocmd = strdup(http->cmd);
- if (http->ocmd == NULL)
- {
- log_error(LOG_LEVEL_FATAL,
- "Out of memory copying HTTP request line");
- }
+ http->ocmd = strdup_or_die(http->cmd);
enlist(csp->headers, http->cmd);
/* Append the previously read headers */
/* Assume persistence until further notice */
csp->flags |= CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE;
}
+
+ if (csp->http->ssl == 0)
+ {
+ csp->expected_client_content_length = get_expected_content_length(csp->headers);
+ verify_request_length(csp);
+ }
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
err = sed(csp, FILTER_CLIENT_HEADERS);
return JB_ERR_PARSE;
}
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
- if (csp->http->ssl == 0)
- {
- verify_request_length(csp);
- }
-#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
-
return JB_ERR_OK;
}
return;
}
+ log_applied_actions(csp->action);
log_error(LOG_LEVEL_GPC, "%s%s", http->hostport, http->path);
if (fwd->forward_host)
*/
watch_client_socket = 0;
log_error(LOG_LEVEL_CONNECT,
- "Stopping to watch the client socket. "
- "There's already another request waiting.");
+ "Stopping to watch the client socket %d. "
+ "There's already another request waiting.",
+ csp->cfd);
continue;
}
/*
* we can parse the headers we just continue here.
*/
log_error(LOG_LEVEL_CONNECT,
- "Continuing buffering headers. Bytes most recently read: %d.",
- len);
+ "Continuing buffering server headers from socket %d. "
+ "Bytes most recently read: %d.", csp->cfd, len);
continue;
}
}
#endif /* def FEATURE_CONNECTION_SHARING */
int continue_chatting = 0;
+ log_error(LOG_LEVEL_CONNECT, "Accepted connection from %s on socket %d",
+ csp->ip_addr_str, csp->cfd);
+
do
{
unsigned int latency;
remember_connection(&csp->server_connection);
csp->server_connection.sfd = JB_INVALID_SOCKET;
- close_socket(csp->cfd);
+ drain_and_close_socket(csp->cfd);
csp->cfd = JB_INVALID_SOCKET;
privoxy_mutex_lock(&connection_reuse_mutex);
if (!monitor_thread_running)
if (csp->cfd != JB_INVALID_SOCKET)
{
- close_socket(csp->cfd);
+ log_error(LOG_LEVEL_CONNECT, "Closing client socket %d. "
+ "Keep-alive: %u, Socket alive: %u. Data available: %u.",
+ csp->cfd, 0 != (csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE),
+ socket_is_still_alive(csp->cfd), data_is_available(csp->cfd, 0));
+ drain_and_close_socket(csp->cfd);
}
csp->flags &= ~CSP_FLAG_ACTIVE;
const char *pName = argv[argc_pos] + 9;
if (*pName == ':')
pName++;
- exit( (install_service(pName)) ? 0 : 1 );
+ exit((install_service(pName)) ? 0 : 1);
}
else if (strncmp(argv[argc_pos], "--uninstall", 11) == 0)
{
pName++;
exit((uninstall_service(pName)) ? 0 : 1);
}
- else if (strcmp(argv[argc_pos], "--service" ) == 0)
+ else if (strcmp(argv[argc_pos], "--service") == 0)
{
bRunAsService = TRUE;
w32_set_service_cwd();
usage(argv[0]);
}
- else if(strcmp(argv[argc_pos], "--version") == 0)
+ else if (strcmp(argv[argc_pos], "--version") == 0)
{
printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n");
exit(0);
#if defined(unix)
- else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0)
+ else if (strcmp(argv[argc_pos], "--no-daemon") == 0)
{
set_debug_level(LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO);
daemon_mode = 0;
}
- else if (strcmp(argv[argc_pos], "--pidfile" ) == 0)
+ else if (strcmp(argv[argc_pos], "--pidfile") == 0)
{
if (++argc_pos == argc) usage(argv[0]);
- pidfile = strdup(argv[argc_pos]);
+ pidfile = strdup_or_die(argv[argc_pos]);
}
- else if (strcmp(argv[argc_pos], "--user" ) == 0)
+ else if (strcmp(argv[argc_pos], "--user") == 0)
{
char *user_arg;
char *group_name;
if (++argc_pos == argc) usage(argv[argc_pos]);
- user_arg = strdup(argv[argc_pos]);
- if (NULL == user_arg)
- {
- log_error(LOG_LEVEL_FATAL,
- "Out of memory splitting --user argument '%s'.", argv[argc_pos]);
- }
+ user_arg = strdup_or_die(argv[argc_pos]);
group_name = strchr(user_arg, '.');
if (NULL != group_name)
{
freez(user_arg);
}
- else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup" ) == 0)
+ else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup") == 0)
{
if (++argc_pos == argc) usage(argv[0]);
- pre_chroot_nslookup_to_load_resolver = strdup(argv[argc_pos]);
+ pre_chroot_nslookup_to_load_resolver = strdup_or_die(argv[argc_pos]);
}
- else if (strcmp(argv[argc_pos], "--chroot" ) == 0)
+ else if (strcmp(argv[argc_pos], "--chroot") == 0)
{
do_chroot = 1;
}
show_version(Argv[0]);
#if defined(unix)
- if ( *configfile != '/' )
+ if (*configfile != '/')
{
char cwd[BUFFER_SIZE];
char *abs_file;
if (NULL == getcwd(cwd, sizeof(cwd)))
{
perror("failed to get current working directory");
- exit( 1 );
+ exit(1);
}
+ basedir = strdup_or_die(cwd);
/* XXX: why + 5? */
abs_file_size = strlen(cwd) + strlen(configfile) + 5;
- basedir = strdup(cwd);
-
- if (NULL == basedir ||
- NULL == (abs_file = malloc(abs_file_size)))
- {
- perror("malloc failed");
- exit( 1 );
- }
+ abs_file = malloc_or_die(abs_file_size);
strlcpy(abs_file, basedir, abs_file_size);
- strlcat(abs_file, "/", abs_file_size );
+ strlcat(abs_file, "/", abs_file_size);
strlcat(abs_file, configfile, abs_file_size);
configfile = abs_file;
}
int fd;
pid_t pid = fork();
- if ( pid < 0 ) /* error */
+ if (pid < 0) /* error */
{
perror("fork");
- exit( 3 );
+ exit(3);
}
- else if ( pid != 0 ) /* parent */
+ else if (pid != 0) /* parent */
{
int status;
pid_t wpid;
* must check for errors
* child died due to missing files aso
*/
- sleep( 1 );
- wpid = waitpid( pid, &status, WNOHANG );
- if ( wpid != 0 )
+ sleep(1);
+ wpid = waitpid(pid, &status, WNOHANG);
+ if (wpid != 0)
{
- exit( 1 );
+ exit(1);
}
- exit( 0 );
+ exit(0);
}
/* child */
log_error(LOG_LEVEL_CONNECT, "accept failed: %E");
#ifdef AMIGA
- if(!childs)
+ if (!childs)
{
exit(1);
}
freez(csp_list);
continue;
}
- else
- {
- log_error(LOG_LEVEL_CONNECT,
- "accepted connection from %s on socket %d",
- csp->ip_addr_str, csp->cfd);
- }
csp->flags |= CSP_FLAG_ACTIVE;
csp->server_connection.sfd = JB_INVALID_SOCKET;
NP_StackSize, 200*1024,
TAG_DONE);
#endif
- if(0 != child_id)
+ if (0 != child_id)
{
childs++;
((struct Task *)child_id)->tc_UserData = csp;
int child_status;
#if !defined(_WIN32) && !defined(__CYGWIN__)
- wait( &child_status );
+ wait(&child_status);
/*
* Evaluate child's return code: If the child has