-const char jcc_rcs[] = "$Id: jcc.c,v 1.110 2006/12/13 14:52:53 etresoft Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.111 2006/12/23 16:15:06 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
*
* Revisions :
* $Log: jcc.c,v $
+ * 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.
*
#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__)
* 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.
*
#endif
{
int argc_pos = 0;
-#ifdef HAVE_RANDOM
- unsigned int random_seed;
-#endif /* ifdef HAVE_RANDOM */
+ int random_seed;
#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 */
+ random_seed = (int)time(NULL);
#ifdef HAVE_RANDOM
- random_seed = (unsigned int)time(NULL);
srandom(random_seed);
+#else
+ srand(random_seed);
#endif /* ifdef HAVE_RANDOM */
/*
#ifndef JCC_H_INCLUDED
#define JCC_H_INCLUDED
-#define JCC_H_VERSION "$Id: jcc.h,v 1.18 2006/11/13 19:05:51 fabiankeil Exp $"
+#define JCC_H_VERSION "$Id: jcc.h,v 1.19 2006/12/06 19:41:39 fabiankeil Exp $"
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.h,v $
*
* Revisions :
* $Log: jcc.h,v $
+ * Revision 1.19 2006/12/06 19:41:39 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.18 2006/11/13 19:05:51 fabiankeil
* Make pthread mutex locking more generic. Instead of
* checking for OSX and OpenBSD, check for FEATURE_PTHREAD
#ifndef HAVE_GETHOSTBYNAME_R
extern pthread_mutex_t gethostbyname_mutex;
#endif /* ndef HAVE_GETHOSTBYNAME_R */
+
+#ifndef HAVE_RANDOM
+extern pthread_mutex_t rand_mutex;
+#endif /* ndef HAVE_RANDOM */
+
#endif /* FEATURE_PTHREAD */
/* Functions */
-const char miscutil_rcs[] = "$Id: miscutil.c,v 1.43 2006/09/23 13:26:38 roro Exp $";
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.44 2006/11/07 12:46:43 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/miscutil.c,v $
*
* Revisions :
* $Log: miscutil.c,v $
+ * Revision 1.44 2006/11/07 12:46:43 fabiankeil
+ * Silence compiler warning on NetBSD 3.1.
+ *
* Revision 1.43 2006/09/23 13:26:38 roro
* Replace TABs by spaces in source code.
*
long int pick_from_range(long int range)
{
long int number;
-#ifndef HAVE_RANDOM
- unsigned int weak_seed;
-
- weak_seed = (unsigned int)((unsigned int)time(NULL) | (unsigned int)range);
- srand(weak_seed);
+#ifdef HAVE_RANDOM
+ number = random() % range + 1;
+#elif defined(FEATURE_PTHREAD)
+ pthread_mutex_lock(&rand_mutex);
+ number = rand() % (long int)(range + 1);
+ pthread_mutex_unlock(&rand_mutex);
+#else
+#ifdef _WIN32
/*
- * Some rand implementations aren't that random and return mostly
- * lower numbers. Low entropy doesn't matter for the header times,
- * but higher "random" factors are prefered.
+ * On Windows and mingw32 srand() has to be called in every
+ * rand()-using thread, but can cause crashes if it's not
+ * mutex protected.
+ *
+ * Currently we don't have mutexes for mingw32, and for
+ * our purpose this cludge is probably preferable to crashes.
*/
- number = (rand() * 12345) % (long int)(range + 1);
- /* Overflows don't matter either, positive numbers do. */
- if(number<0)
- {
- number*= -1;
- }
+ log_error(LOG_LEVEL_INFO, "No thread-safe PRNG available? Using weak \'randomization\' factor.");
+ number = (range + GetCurrentThreadId() % range) / 2;
#else
- number = random() % range + 1;
-#endif /* (ifndef HAVE_RANDOM) */
+ /*
+ * XXX: Which platforms reach this and are there
+ * better options than just using rand() and hoping
+ * that it's safe?
+ */
+ log_error(LOG_LEVEL_INFO, "No thread-safe PRNG available? Header time randomization might cause "
+ "crashes, predictable results or even combine these fine options.");
+ number = rand() % (long int)(range + 1);
+#endif /* def _WIN32 */
+
+#endif /* (def HAVE_RANDOM) */
+
return (number);
}