X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jcc.c;h=73cdbcbbd85c03064ae5255e30497f6ab2708d38;hb=e8bde4a89b3b85515513257ab6944fcfb683252c;hp=7f7206e70d504456bc0865d4f5e5b3d093909463;hpb=10ac37096f04f01d06838fe5b2ce5a23d085f1df;p=privoxy.git diff --git a/jcc.c b/jcc.c index 7f7206e7..73cdbcbb 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.98 2006/08/24 11:01:34 fabiankeil Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.106 2006/11/06 19:58:23 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -33,6 +33,39 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.98 2006/08/24 11:01:34 fabiankeil Exp $"; * * Revisions : * $Log: jcc.c,v $ + * Revision 1.106 2006/11/06 19:58:23 fabiankeil + * Move pthread.h inclusion from jcc.c to jcc.h. + * Fixes build on x86-freebsd1 (FreeBSD 5.4-RELEASE). + * + * Revision 1.105 2006/11/06 14:26:02 fabiankeil + * Don't exit after receiving the second SIGHUP on Solaris. + * + * Fixes BR 1052235, but the same problem may exist on other + * systems. Once 3.0.6 is out we should use sigset() + * where available and see if it breaks anything. + * + * Revision 1.104 2006/09/23 13:26:38 roro + * Replace TABs by spaces in source code. + * + * Revision 1.103 2006/09/21 12:54:43 fabiankeil + * Fix +redirect{}. Didn't work with -fast-redirects. + * + * Revision 1.102 2006/09/06 13:03:04 fabiankeil + * Respond with 400 and a short text message + * if the client tries to use Privoxy as FTP proxy. + * + * Revision 1.101 2006/09/06 09:23:37 fabiankeil + * Make number of retries in case of forwarded-connect problems + * a config file option (forwarded-connect-retries) and use 0 as + * default. + * + * Revision 1.100 2006/09/03 19:42:59 fabiankeil + * Set random(3) seed. + * + * Revision 1.99 2006/09/02 15:36:42 fabiankeil + * Follow the OpenBSD port's lead and protect the resolve + * functions on OpenBSD as well. + * * Revision 1.98 2006/08/24 11:01:34 fabiankeil * --user fix. Only use the user as group if no group is specified. * Solves BR 1492612. Thanks to Spinor S. and David Laight. @@ -653,10 +686,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.98 2006/08/24 11:01:34 fabiankeil Exp $"; #include #include -#ifdef FEATURE_PTHREAD -#include -#endif /* def FEATURE_PTHREAD */ - #ifdef _WIN32 # ifndef FEATURE_PTHREAD # ifndef STRICT @@ -765,24 +794,25 @@ static int32 server_thread(void *data); #define sleep(N) DosSleep(((N) * 100)) #endif -#if defined(OSX_DARWIN) || defined(__OpenBSD__) -#ifdef OSX_DARWIN -/* - * Hit OSX over the head with a hammer. Protect all *_r functions. - */ +#ifdef FEATURE_PTHREAD +pthread_mutex_t log_mutex; +pthread_mutex_t log_init_mutex; + +#ifndef HAVE_GMTIME_R pthread_mutex_t gmtime_mutex; +#endif /* ndef HAVE_GMTIME_R */ + +#ifndef HAVE_LOCALTIME_R pthread_mutex_t localtime_mutex; -#endif /* def OSX_DARWIN */ -/* - * Protect only the resolve functions for OpenBSD. - */ +#endif /* ndef HAVE_GMTIME_R */ + +#ifndef HAVE_GETHOSTBYADDR_R pthread_mutex_t gethostbyaddr_mutex; -pthread_mutex_t gethostbyname_mutex; -#endif /* defined(OSX_DARWIN) || defined(__OpenBSD__) */ +#endif /* ndef HAVE_GETHOSTBYADDR_R */ -#ifdef FEATURE_PTHREAD -pthread_mutex_t log_mutex; -pthread_mutex_t log_init_mutex; +#ifndef HAVE_GETHOSTBYNAME_R +pthread_mutex_t gethostbyname_mutex; +#endif /* ndef HAVE_GETHOSTBYNAME_R */ #endif /* FEATURE_PTHREAD */ #if defined(unix) || defined(__EMX__) @@ -901,7 +931,8 @@ static void chat(struct client_state *csp) int server_body; int ms_iis5_hack = 0; int byte_count = 0; - unsigned int socks_retries = 0; + unsigned int forwarded_connect_retries = 0; + unsigned int max_forwarded_connect_retries = csp->config->forwarded_connect_retries; const struct forward_spec * fwd; struct http_request *http; int len; /* for buffer sizes */ @@ -984,6 +1015,18 @@ static void chat(struct client_state *csp) return; } + if (!strncmpic(http->cmd, "GET ftp://", 10)) + { + strcpy(buf, FTP_RESPONSE); + write_socket(csp->cfd, buf, strlen(buf)); + + log_error(LOG_LEVEL_ERROR, "%s tried to use Privoxy as FTP proxy: %s", + csp->ip_addr_str, http->cmd); + + free_http_request(http); + return; + } + /* decide how to route the HTTP request */ if ((fwd = forward_url(http, csp)) == NULL) @@ -1210,8 +1253,7 @@ static void chat(struct client_state *csp) /* ..or a fast redirect kicked in */ #ifdef FEATURE_FAST_REDIRECTS - || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && - (NULL != (rsp = redirect_url(csp)))) + || ( NULL != (rsp = redirect_url(csp))) #endif /* def FEATURE_FAST_REDIRECTS */ )) ) @@ -1261,10 +1303,10 @@ static void chat(struct client_state *csp) /* here we connect to the server, gateway, or the forwarder */ while ( (csp->sfd = forwarded_connect(fwd, http, csp)) - && (errno == EINVAL) && (socks_retries++ < 3)) + && (errno == EINVAL) && (forwarded_connect_retries++ < max_forwarded_connect_retries)) { - log_error(LOG_LEVEL_ERROR, "failed request #%u to connect to %s. Trying again.", - socks_retries, http->hostport); + log_error(LOG_LEVEL_ERROR, "failed request #%u to connect to %s. Trying again.", + forwarded_connect_retries, http->hostport); } if (csp->sfd == JB_INVALID_SOCKET) @@ -1887,6 +1929,9 @@ int main(int argc, const char *argv[]) #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; @@ -2031,23 +2076,35 @@ int main(int argc, const char *argv[]) InitWin32(); #endif -#if defined(OSX_DARWIN) || defined(__OpenBSD__) +#ifdef FEATURE_PTHREAD /* * Prepare global mutex semaphores */ -#ifdef OSX_DARWIN + pthread_mutex_init(&log_mutex,0); + pthread_mutex_init(&log_init_mutex,0); + +#ifndef HAVE_GMTIME_R pthread_mutex_init(&gmtime_mutex,0); +#endif /* ndef HAVE_GMTIME_R */ + +#ifndef HAVE_LOCALTIME_R pthread_mutex_init(&localtime_mutex,0); -#endif /* def OSX_DARWIN */ +#endif /* ndef HAVE_GMTIME_R */ + +#ifndef HAVE_GETHOSTBYADDR_R pthread_mutex_init(&gethostbyaddr_mutex,0); - pthread_mutex_init(&gethostbyname_mutex,0); -#endif /* defined(OSX_DARWIN) || defined(__OpenBSD__) */ +#endif /* ndef HAVE_GETHOSTBYADDR_R */ -#ifdef FEATURE_PTHREAD - pthread_mutex_init(&log_mutex,0); - pthread_mutex_init(&log_init_mutex,0); +#ifndef HAVE_GETHOSTBYNAME_R + pthread_mutex_init(&gethostbyname_mutex,0); +#endif /* ndef HAVE_GETHOSTBYNAME_R */ #endif /* FEATURE_PTHREAD */ +#ifdef HAVE_RANDOM + random_seed = (unsigned int)time(NULL); + srandom(random_seed); +#endif /* ifdef HAVE_RANDOM */ + /* * Unix signal handling * @@ -2063,7 +2120,11 @@ int main(int argc, const char *argv[]) for (idx = 0; catched_signals[idx] != 0; idx++) { +#ifdef sun /* FIXME: Is it safe to check for HAVE_SIGSET instead? */ + if (sigset(catched_signals[idx], sig_handler) == SIG_ERR) +#else if (signal(catched_signals[idx], sig_handler) == SIG_ERR) +#endif /* ifdef sun */ { log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", catched_signals[idx]); }