-const char jcc_rcs[] = "$Id: jcc.c,v 1.108 2006/11/28 15:38:51 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.117 2006/12/31 17:56:37 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
*
* Revisions :
* $Log: jcc.c,v $
+ * Revision 1.117 2006/12/31 17:56:37 fabiankeil
+ * Added config option accept-intercepted-requests
+ * and disabled it by default.
+ *
+ * Revision 1.116 2006/12/29 19:08:22 fabiankeil
+ * Reverted parts of my last commit
+ * to keep error handling working.
+ *
+ * Revision 1.115 2006/12/29 17:38:57 fabiankeil
+ * Fixed gcc43 conversion warnings.
+ *
+ * Revision 1.114 2006/12/27 18:52:02 fabiankeil
+ * Fix -pedantic ISO C warning about converting
+ * from function pointer to object pointer.
+ *
+ * Revision 1.113 2006/12/26 17:38:50 fabiankeil
+ * Silence compiler warning I introduced with my last commit.
+ *
+ * Revision 1.112 2006/12/26 17:31:41 fabiankeil
+ * Mutex protect rand() if POSIX threading
+ * is used, warn the user if that's not possible
+ * and stop using it on _WIN32 where it could
+ * cause crashes.
+ *
+ * Revision 1.111 2006/12/23 16:15:06 fabiankeil
+ * Don't prevent core dumps by catching SIGABRT.
+ * It's rude and makes debugging unreasonable painful.
+ *
+ * Revision 1.110 2006/12/13 14:52:53 etresoft
+ * Fix build failure on MacOS X. Global symbols can be either static or extern, but not both.
+ *
+ * Revision 1.109 2006/12/06 19:41:40 fabiankeil
+ * Privoxy is now able to run as intercepting
+ * proxy in combination with any packet filter
+ * that does the port redirection. The destination
+ * is extracted from the "Host:" header which
+ * should be available for nearly all requests.
+ *
+ * Moved HTTP snipplets into jcc.c.
+ * Added error message for gopher proxy requests.
+ *
* Revision 1.108 2006/11/28 15:38:51 fabiankeil
* Only unlink the pidfile if it's actually used.
*
* Windows service integration
*
* Revision 1.95 2006/08/03 02:46:41 david__schmidt
- * Incorporate Fabian Keil's patch work:\rhttp://www.fabiankeil.de/sourcecode/privoxy/
+ * Incorporate Fabian Keil's patch work:
+http://www.fabiankeil.de/sourcecode/privoxy/
*
* Revision 1.94 2006/07/18 14:48:46 david__schmidt
* Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
#ifndef HAVE_GETHOSTBYNAME_R
pthread_mutex_t gethostbyname_mutex;
#endif /* ndef HAVE_GETHOSTBYNAME_R */
+
+#ifndef HAVE_RANDOM
+pthread_mutex_t rand_mutex;
+#endif /* ndef HAVE_RANDOM */
+
#endif /* FEATURE_PTHREAD */
#if defined(unix) || defined(__EMX__)
"(copyright_or_otherwise)_applying_to_any_cookie._";
/* HTTP snipplets. */
-static const char CSUCCEED[] =
+const char CSUCCEED[] =
"HTTP/1.0 200 Connection established\n"
"Proxy-Agent: Privoxy/" VERSION "\r\n\r\n";
-static const char CHEADER[] =
+const char CHEADER[] =
"HTTP/1.0 400 Invalid header received from browser\r\n"
"Connection: close\r\n\r\n"
"Invalid header received from browser.";
-static const char CFORBIDDEN[] =
+const char CFORBIDDEN[] =
"HTTP/1.0 403 Connection not allowable\r\n"
"X-Hint: If you read this message interactively, then you know why this happens ,-)\r\n"
"Connection: close\r\n\r\n";
-static const char FTP_RESPONSE[] =
+const char FTP_RESPONSE[] =
"HTTP/1.0 400 Invalid request received from browser\r\n"
"Connection: close\r\n\r\n"
"Invalid request. Privoxy doesn't support FTP.\r\n";
-static const char GOPHER_RESPONSE[] =
+const char GOPHER_RESPONSE[] =
"HTTP/1.0 400 Invalid request received from browser\r\n"
"Connection: close\r\n\r\n"
"Invalid request. Privoxy doesn't support gopher.\r\n";
-static const char MISSING_DESTINATION_RESPONSE[] =
+const char MISSING_DESTINATION_RESPONSE[] =
"HTTP/1.0 400 Bad request received from browser\r\n"
"Connection: close\r\n\r\n"
"Bad request. Privoxy was unable to extract the destination.\r\n";
* Function : sig_handler
*
* Description : Signal handler for different signals.
- * Exit gracefully on ABRT, TERM and INT
+ * Exit gracefully on TERM and INT
* or set a flag that will cause the errlog
* to be reopened by the main thread on HUP.
*
{
switch(the_signal)
{
- case SIGABRT:
case SIGTERM:
case SIGINT:
log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal);
jb_socket maxfd;
int server_body;
int ms_iis5_hack = 0;
- int byte_count = 0;
- unsigned int forwarded_connect_retries = 0;
- unsigned int max_forwarded_connect_retries = csp->config->forwarded_connect_retries;
+ size_t byte_count = 0;
+ int forwarded_connect_retries = 0;
+ int max_forwarded_connect_retries = csp->config->forwarded_connect_retries;
const struct forward_spec * fwd;
struct http_request *http;
- int len; /* for buffer sizes */
+ int len; /* for buffer sizes (and negative error codes) */
#ifdef FEATURE_KILL_POPUPS
int block_popups; /* bool, 1==will block popups */
int block_popups_now = 0; /* bool, 1==currently blocking popups */
{
/*
* Intercepted or invalid request without domain
- * inside the request line. Try to get it another way.
+ * inside the request line. Try to get it another way,
+ * unless accept-intercepted-requests is disabled.
*/
- if (JB_ERR_OK == get_destination_from_headers(headers, http))
+ if (!(csp->config->feature_flags & RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS))
+ {
+ log_error(LOG_LEVEL_ERROR, "%s's request: \'%s\' is invalid."
+ " Privoxy isn't configured to accept intercepted requests.",
+ csp->ip_addr_str, http->cmd);
+ log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 400 0", csp->ip_addr_str, http->cmd);
+
+ strcpy(buf, CHEADER);
+ write_socket(csp->cfd, buf, strlen(buf));
+ free_http_request(http);
+ destroy_list(headers);
+ return;
+ }
+ else if (JB_ERR_OK == get_destination_from_headers(headers, http))
{
/* Split the domain we just got for pattern matching */
init_domain_components(http);
*/
if (NULL == (p = (*content_filter)(csp)))
{
- csp->content_length = csp->iob->eod - csp->iob->cur;
+ csp->content_length = (size_t)(csp->iob->eod - csp->iob->cur);
}
hdr = sed(server_patterns_light, NULL, csp);
* This is NOT the body, so
* Let's pretend the server just sent us a blank line.
*/
- len = sprintf(buf, "\r\n");
+ snprintf(buf, sizeof(buf), "\r\n");
+ len = (int)strlen(buf);
/*
* Now, let the normal header parsing algorithm below do its
if (write_socket(csp->cfd, hdr, hdrlen)
|| ((flushed = flush_socket(csp->cfd, csp)) < 0)
- || (write_socket(csp->cfd, buf, (size_t) len)))
+ || (write_socket(csp->cfd, buf, (size_t)len)))
{
log_error(LOG_LEVEL_CONNECT, "Flush header and buffers to client failed: %E");
return;
}
- byte_count += hdrlen + flushed + len;
+ byte_count += hdrlen + (size_t)(flushed + len);
freez(hdr);
content_filter = NULL;
server_body = 1;
return;
}
}
- byte_count += len;
+ byte_count += (size_t)len;
continue;
}
else
return;
}
- byte_count += len;
+ byte_count += (size_t)len;
}
/* we're finished with the server's header */
#endif
{
int argc_pos = 0;
-#ifdef HAVE_RANDOM
unsigned int random_seed;
-#endif /* ifdef HAVE_RANDOM */
#ifdef unix
struct passwd *pw = NULL;
struct group *grp = NULL;
#ifndef HAVE_GETHOSTBYNAME_R
pthread_mutex_init(&gethostbyname_mutex,0);
#endif /* ndef HAVE_GETHOSTBYNAME_R */
+
+#ifndef HAVE_RANDOM
+ pthread_mutex_init(&rand_mutex,0);
+#endif /* ndef HAVE_RANDOM */
+
#endif /* FEATURE_PTHREAD */
-#ifdef HAVE_RANDOM
random_seed = (unsigned int)time(NULL);
+#ifdef HAVE_RANDOM
srandom(random_seed);
+#else
+ srand(random_seed);
#endif /* ifdef HAVE_RANDOM */
/*
#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
{
int idx;
- const int catched_signals[] = { SIGABRT, SIGTERM, SIGINT, SIGHUP, 0 };
+ const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP, 0 };
const int ignored_signals[] = { SIGPIPE, 0 };
for (idx = 0; catched_signals[idx] != 0; idx++)
* We *are* in a windows console app.
* Print a verbose messages about FAQ's and such
*/
- printf(win32_blurb);
+ printf("%s", win32_blurb);
# endif /* def _WIN_CONSOLE */
#endif /* def _WIN32 */
pthread_attr_init(&attrs);
pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
errno = pthread_create(&the_thread, &attrs,
- (void*)serve, csp);
+ (void * (*)(void *))serve, csp);
child_id = errno ? -1 : 0;
pthread_attr_destroy(&attrs);
}
#define SELECTED_ONE_OPTION
csp->cfd = ReleaseSocket(csp->cfd, -1);
- if((child_id = (int)CreateNewProcTags(
- NP_Entry, (ULONG)server_thread,
- NP_Output, Output(),
- NP_CloseOutput, FALSE,
- NP_Name, (ULONG)"privoxy child",
- NP_StackSize, 200*1024,
- TAG_DONE)))
+#ifdef __amigaos4__
+ child_id = (int)CreateNewProcTags(NP_Entry, (ULONG)server_thread,
+ NP_Output, Output(),
+ NP_CloseOutput, FALSE,
+ NP_Name, (ULONG)"privoxy child",
+ NP_Child, TRUE,
+ TAG_DONE);
+#else
+ child_id = (int)CreateNewProcTags(NP_Entry, (ULONG)server_thread,
+ NP_Output, Output(),
+ NP_CloseOutput, FALSE,
+ NP_Name, (ULONG)"privoxy child",
+ NP_StackSize, 200*1024,
+ TAG_DONE);
+#endif
+ if(0 != child_id)
{
childs++;
((struct Task *)child_id)->tc_UserData = csp;
log_error(LOG_LEVEL_ERROR, "can't fork: %E");
- sprintf(buf , "Privoxy: can't fork: errno = %d", errno);
+ snprintf(buf , sizeof(buf), "Privoxy: can't fork: errno = %d", errno);
write_socket(csp->cfd, buf, strlen(buf));
close_socket(csp->cfd);