## DP: adapted to the 3.0 branch of privoxy by Roland Rosenfeld
## DP: adapted to 3.0.4 by higuita, but i'm no programmer, so i hope i
## DP: didnt broke anything :)
+## DP: adapted to 3.0.6 by Petr Písa?? petrp@users.sf.net found on
+## DP: http://xpisar.wz.cz/privoxy-ipv6/ Use privoxy-3.0.6-stable-ipv6.diff.bz2
+## DP: and stripped
@DPATCH@
diff -urNad privoxy~/GNUmakefile.in privoxy/GNUmakefile.in
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
-@@ -2221,7 +2224,6 @@
+@@ -2259,7 +2262,6 @@
*********************************************************************/
struct map *default_exports(const struct client_state *csp, const char *caller)
{
jb_err err;
struct map * exports;
int local_help_exists = 0;
-@@ -2257,8 +2259,7 @@
+@@ -2295,8 +2297,7 @@
if (!err) err = map_block_killer(exports, "can-toggle");
#endif
- snprintf(buf, 20, "%d", csp->config->hport);
- if (!err) err = map(exports, "my-port", 1, buf, 1);
-+ if (!err) err = map(exports, "my-port", 1, csp->my_port_str, 1);
++ if (!err) err = map(exports, "my-port", 1, csp->my_port_str, 1);
if(!strcmp(CODE_STATUS, "stable"))
{
diff -urNad privoxy~/errlog.c privoxy/errlog.c
--- privoxy~/errlog.c
+++ privoxy/errlog.c
-@@ -739,6 +739,13 @@
+@@ -746,6 +746,13 @@
break;
case 'E':
/* Non-standard: Print error code from errno */
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
-@@ -465,6 +468,9 @@
+@@ -471,6 +474,9 @@
#include <ctype.h>
#include <string.h>
#include <assert.h>
#ifndef _WIN32
#ifndef __OS2__
-@@ -499,17 +505,119 @@
+@@ -505,17 +511,119 @@
const char filters_h_rcs[] = FILTERS_H_VERSION;
/*********************************************************************
*
* Function : block_acl
-@@ -539,7 +647,7 @@
+@@ -545,7 +653,7 @@
/* search the list */
while (acl != NULL)
{
{
if (dst == NULL)
{
-@@ -549,8 +657,8 @@
+@@ -555,8 +663,8 @@
return(0);
}
}
{
if (acl->action == ACL_PERMIT)
{
-@@ -569,81 +677,249 @@
+@@ -575,81 +683,249 @@
}
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
-@@ -275,6 +279,7 @@
+@@ -285,6 +289,7 @@
#include "jbsockets.h"
#include "filters.h"
#include "errlog.h"
const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION;
-@@ -287,141 +292,194 @@
+@@ -297,141 +302,194 @@
* that this is allowed according to ACL.
*
* Parameters :
}
-@@ -561,55 +619,30 @@
+@@ -571,55 +629,30 @@
/*********************************************************************
*
#ifdef _WIN32
if (fd == JB_INVALID_SOCKET)
-@@ -635,8 +668,17 @@
+@@ -645,8 +678,17 @@
*/
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
#endif /* ndef _WIN32 */
{
#ifdef _WIN32
errno = WSAGetLastError();
-@@ -655,7 +697,7 @@
+@@ -665,7 +707,7 @@
}
}
{
if (errno != EINTR)
{
-@@ -663,7 +705,11 @@
+@@ -673,7 +715,11 @@
}
}
return 0;
}
-@@ -671,6 +717,91 @@
+@@ -681,6 +727,91 @@
/*********************************************************************
*
+ "There may be another Privoxy or some other "
+ "proxy running on port %s",
+ log_host, port, numeric_hostname, numeric_port, numeric_port);
-+ break;
++ break;
+ case -2 :
+ log_error(LOG_LEVEL_ERROR, "can't bind to %s:%s (%s:%s): "
+ "Out of memory",
+ log_host, port, numeric_hostname, numeric_port);
-+ break;
++ break;
+ default :
+ log_error(LOG_LEVEL_ERROR, "can't bind to %s:%s: because %E",
+ log_host, numeric_port);
* Function : accept_connection
*
* Description : Accepts a connection on a socket. Socket must have
-@@ -687,8 +818,7 @@
+@@ -697,8 +828,7 @@
*********************************************************************/
int accept_connection(struct client_state * csp, jb_socket fd)
{
jb_socket afd;
#if defined(_WIN32) || defined(__OS2__) || defined(__APPLE_CC__) || defined(AMIGA)
/* Wierdness - fix a warning. */
-@@ -696,15 +826,7 @@
+@@ -706,15 +836,7 @@
#else
socklen_t c_length, s_length;
#endif
c_length = s_length = sizeof(client);
-@@ -724,6 +846,12 @@
+@@ -734,6 +856,12 @@
return 0;
}
#endif
/*
* Determine the IP-Adress that the client used to reach us
-@@ -731,49 +859,50 @@
+@@ -741,49 +869,50 @@
*/
if (!getsockname(afd, (struct sockaddr *) &server, &s_length))
{
+ log_error(LOG_LEVEL_ERROR, "accept: Could not get my own hostname because %E");
+ strncpy(hostname,"unknown host",NI_MAXHOST);
}
--#elif defined(OSX_DARWIN) || defined(__OpenBSD__)
+-#elif FEATURE_PTHREAD
- pthread_mutex_lock(&gethostbyaddr_mutex);
- host = gethostbyaddr((const char *)&server.sin_addr,
- sizeof(server.sin_addr), AF_INET);
return 1;
-@@ -784,108 +913,42 @@
+@@ -794,108 +923,48 @@
*
* Function : resolve_hostname_to_ip
*
-{
- struct sockaddr_in inaddr;
- struct hostent *hostp;
-- unsigned int dns_retries = 0;
++addr_list *resolve_hostname_to_ip(const char *host, const char *port, int pf)
++ {
++ /* TODO
++ * Do all supported platforms have "getaddrinfo"?
++ */
++
++ struct addrinfo hints, *res0;
++ int result;
+ unsigned int dns_retries = 0;
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
- struct hostent result;
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
- struct hostent_data hdata;
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5)_ARGS */
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
--
+
- if ((host == NULL) || (*host == '\0'))
- {
- return(INADDR_ANY);
- {
- hostp = NULL;
- }
--#elif defined(OSX_DARWIN) || defined(__OpenBSD__)
+-#elif FEATURE_PTHREAD
- pthread_mutex_lock(&gethostbyname_mutex);
- while ( NULL == (hostp = gethostbyname(host))
- && (h_errno == TRY_AGAIN) && (dns_retries++ < 10) )
- (char *) hostp->h_addr,
- sizeof(inaddr.sin_addr)
- );
-- }
-- return(inaddr.sin_addr.s_addr);
--
--}
--
-+addr_list *resolve_hostname_to_ip(const char *host, const char *port, int pf)
-+ {
-+ /* TODO
-+ * Do all supported platforms have "getaddrinfo"?
-+ */
-+
-+ struct addrinfo hints, *res0;
-+ int result;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = pf;
+ hints.ai_socktype = SOCK_STREAM;
+
-+ result = getaddrinfo(host, port, &hints, &res0);
++ while ((result = getaddrinfo(host, port, &hints, &res0))
++ && (result == EAI_AGAIN) && (dns_retries++ < 10)) {
++ log_error(LOG_LEVEL_ERROR, "Timeout #%u while trying to resolve %s. Trying again.",
++ dns_retries, host);
+ }
+- return(inaddr.sin_addr.s_addr);
+-
+-}
+-
+ if ( result != 0 )
+ {
+ log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s because %s", host,gai_strerror(result));
diff -urNad privoxy~/jcc.c privoxy/jcc.c
--- privoxy~/jcc.c
+++ privoxy/jcc.c
-@@ -744,6 +744,7 @@
+@@ -767,6 +767,7 @@
#include "cgi.h"
#include "loadcfg.h"
#include "urlmatch.h"
const char jcc_h_rcs[] = JCC_H_VERSION;
const char project_h_rcs[] = PROJECT_H_VERSION;
-@@ -2304,61 +2305,78 @@
+@@ -2338,61 +2339,78 @@
* Returns : Port that was opened.
*
*********************************************************************/
+ "proxy running on port %s",
+ (NULL != bs->haddr) ? bs->haddr : "INADDR_ANY",
+ bs->hport, bs->hport);
-+ break;
++ break;
case -2 :
- log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: "
"The hostname is not resolvable",
- (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport);
+ (NULL != bs->haddr) ? bs->haddr : "INADDR_ANY", bs->hport);
-+ break;
++ break;
default :
- log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: because %E",
}
-@@ -2387,12 +2405,18 @@
+@@ -2421,12 +2439,18 @@
static void listen_loop(void)
{
struct client_state *csp = NULL;
#ifdef FEATURE_GRACEFUL_TERMINATION
while (!g_terminate)
-@@ -2466,14 +2490,55 @@
+@@ -2500,14 +2524,55 @@
* that this will hurt people's feelings.
*/
{
log_error(LOG_LEVEL_CONNECT, "accept failed: %E");
-@@ -2491,6 +2556,8 @@
+@@ -2525,6 +2590,8 @@
log_error(LOG_LEVEL_CONNECT, "OK");
}
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
-@@ -402,6 +405,7 @@
+@@ -408,6 +411,7 @@
#include "encode.h"
#include "urlmatch.h"
#include "cgi.h"
const char loadcfg_h_rcs[] = LOADCFG_H_VERSION;
-@@ -521,8 +525,8 @@
+@@ -527,8 +531,8 @@
struct forward_spec * next_fwd = cur_fwd->next;
free_url_spec(cur_fwd->url);
free(cur_fwd);
cur_fwd = next_fwd;
}
-@@ -539,7 +543,16 @@
+@@ -545,7 +549,16 @@
freez(config->confdir);
freez(config->logdir);
freez(config->logfile);
for (i = 0; i < MAX_AF_FILES; i++)
-@@ -606,6 +619,28 @@
+@@ -612,6 +625,28 @@
* Returns : The configuration_spec, or NULL on error.
*
*********************************************************************/
struct configuration_spec * load_config(void)
{
char buf[BUFFER_SIZE];
-@@ -637,12 +672,7 @@
+@@ -643,12 +678,7 @@
fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config));
if (config==NULL)
/*
* This is backwards from how it's usually done.
-@@ -659,7 +689,7 @@
+@@ -665,7 +695,7 @@
* Set to defaults
*/
config->multi_threaded = 1;
config->buffer_limit = 4096 * 1024;
config->usermanual = strdup(USER_MANUAL_URL);
config->proxy_args = strdup("");
-@@ -678,9 +708,6 @@
+@@ -684,9 +714,6 @@
char cmd[BUFFER_SIZE];
char arg[BUFFER_SIZE];
char tmp[BUFFER_SIZE];
struct forward_spec *cur_fwd;
int vec_count;
char *vec[3];
-@@ -791,74 +818,23 @@
+@@ -797,74 +824,23 @@
* *************************************************************************/
#ifdef FEATURE_ACL
case hash_deny_access:
- vec[0]);
+ case 1:
+ config->acl = add_to_acl_list(config->acl, ACL_DENY, vec[0], NULL, &config->proxy_args);
-+ break;
++ break;
+ case 2:
+ config->acl = add_to_acl_list(config->acl, ACL_DENY, vec[0], vec[1], &config->proxy_args);
-+ break;
++ break;
+ default:
+ log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
+ "deny-access directive in configuration file.");
#endif /* def FEATURE_ACL */
/* *************************************************************************
-@@ -978,16 +954,18 @@
+@@ -984,16 +960,18 @@
if (strcmp(p, ".") != 0)
{
cur_fwd->forward_port = 8000;
}
}
-@@ -1041,15 +1019,27 @@
+@@ -1047,15 +1025,27 @@
if (strcmp(p, ".") != 0)
{
cur_fwd->gateway_port = 1080;
}
}
-@@ -1059,16 +1049,26 @@
+@@ -1065,16 +1055,26 @@
if (strcmp(p, ".") != 0)
{
cur_fwd->forward_port = 8000;
}
}
-@@ -1120,16 +1120,30 @@
+@@ -1126,16 +1126,30 @@
/* Parse the SOCKS proxy host[:port] */
p = vec[1];
}
/* Parse the parent HTTP proxy host[:port] */
-@@ -1137,16 +1151,26 @@
+@@ -1143,16 +1157,26 @@
if (strcmp(p, ".") != 0)
{
cur_fwd->forward_port = 8000;
}
}
-@@ -1179,10 +1203,49 @@
+@@ -1185,10 +1209,49 @@
* listen-address [ip][:port]
* *************************************************************************/
case hash_listen_address :
/* *************************************************************************
* logdir directory-name
* *************************************************************************/
-@@ -1205,75 +1268,21 @@
+@@ -1211,75 +1274,21 @@
* *************************************************************************/
#ifdef FEATURE_ACL
case hash_permit_access:
- vec[0]);
+ case 1:
+ config->acl = add_to_acl_list(config->acl, ACL_PERMIT, vec[0], NULL, &config->proxy_args);
-+ break;
++ break;
+ case 2:
+ config->acl = add_to_acl_list(config->acl, ACL_PERMIT, vec[0], vec[1], &config->proxy_args);
-+ break;
++ break;
+ default:
+ log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
+ "permit-access directive in configuration file.");
continue;
#endif /* def FEATURE_ACL */
-@@ -1513,32 +1522,33 @@
+@@ -1519,32 +1528,33 @@
}
#endif /* def FEATURE_COOKIE_JAR */
}
/*
-@@ -1580,31 +1590,29 @@
+@@ -1586,31 +1596,29 @@
struct configuration_spec * oldcfg = (struct configuration_spec *)
current_configfile->f;
/*
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
-@@ -1929,6 +1932,167 @@
+@@ -1951,6 +1954,167 @@
return JB_ERR_OK;
}
diff -urNad privoxy~/project.h privoxy/project.h
--- privoxy~/project.h
+++ privoxy/project.h
-@@ -598,6 +598,20 @@
+@@ -607,6 +607,20 @@
#endif /* ndef _WIN32 */
/**
* A standard error code. This should be JB_ERR_OK or one of the JB_ERR_xxx
-@@ -667,19 +681,6 @@
+@@ -681,19 +695,6 @@
*/
#define FOREVER 1
/* Forward def for struct client_state */
struct configuration_spec;
-@@ -758,13 +759,16 @@
+@@ -772,13 +773,16 @@
char *ver; /**< Protocol version */
int status; /**< HTTP Status */
of host's IP. NULL before connect_to() */
char *dbuffer; /**< Buffer with '\0'-delimited domain name. */
-@@ -1144,13 +1148,16 @@
+@@ -1158,13 +1162,16 @@
As a string. */
char *ip_addr_str;
/** Client PC's IP address, as reported by the accept() function.
/** Our hostname. I.e. the reverse DNS of the IP address that the client
used to reach us, as a string. */
char *my_hostname;
-@@ -1325,18 +1332,33 @@
+@@ -1339,18 +1346,33 @@
/** Connection type. Must be SOCKS_NONE, SOCKS_4, or SOCKS_4A. */
int type;
/** Next entry in the linked list. */
struct forward_spec *next;
};
-@@ -1345,7 +1367,7 @@
+@@ -1359,7 +1381,7 @@
/**
* Initializer for a static struct forward_spec.
*/
/**
-@@ -1374,7 +1396,8 @@
+@@ -1388,7 +1410,8 @@
*/
struct access_control_addr
{
unsigned long mask; /**< The network mask as an integer. */
unsigned long port; /**< The port number. */
};
-@@ -1409,6 +1432,17 @@
+@@ -1423,6 +1446,17 @@
/** configuration_spec::feature_flags: HTTP-header-based toggle. */
#define RUNTIME_FEATURE_HTTP_TOGGLE 4
/**
* Data loaded from the configuration file.
*
-@@ -1472,11 +1506,13 @@
+@@ -1486,11 +1520,13 @@
#endif /* def FEATURE_COOKIE_JAR */
return JB_ERR_MEMORY;
}
-+ http->host_port_malloc = buf;
++ http->host_port_malloc = buf;
+
/* check if url contains username and/or password */
- host = strchr(buf, '@');
else
{
/* No port specified. */
-- http->port = (http->ssl ? 443 : 80);
+ http->port_str = (http->ssl ? "143" : "80");
-+ http->port = (http->ssl ? 443 : 80);
+ http->port = (http->ssl ? 443 : 80);
}
- http->host = strdup(host);
assert(url);
assert(buf);
-@@ -685,22 +679,25 @@
+@@ -685,21 +679,24 @@
{
return JB_ERR_MEMORY;
}
+ }
+ url->pathlen = strlen(url->path);
+ *p = '\0';
++ }
++ else
++ {
++ url->path = NULL;
++ url->pathlen = 0;
}
- url->pathlen = strlen(url->path);
- *p = '\0';
- {
- url->path = NULL;
- url->pathlen = 0;
-- }
-+ else
-+ {
-+ url->path = NULL;
-+ url->pathlen = 0;
-+ }
-+ }
+ }
if (url->path)
{
- int errcode;
-@@ -739,15 +736,12 @@
+@@ -739,14 +736,11 @@
return JB_ERR_PARSE;
}
}
{
- *p++ = '\0';
- url->port = atoi(p);
-- }
+ char *p;
+ parse_ip(buf,&buf,&p);
+ url->port = atoi(p);
-+ }
+ }
if (buf[0] != '\0')
- {
@@ -779,12 +773,13 @@
return JB_ERR_MEMORY;
}