69 lines
2.3 KiB
Text
69 lines
2.3 KiB
Text
$NetBSD: patch-ag,v 1.5 2013/08/30 16:56:09 joerg Exp $
|
|
|
|
--- jbsockets.c.orig 2011-12-10 17:26:30.000000000 +0000
|
|
+++ jbsockets.c
|
|
@@ -1240,7 +1240,14 @@ unsigned long resolve_hostname_to_ip(con
|
|
{
|
|
struct sockaddr_in inaddr;
|
|
struct hostent *hostp;
|
|
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
|
|
+#if defined(__NetBSD__)
|
|
+ struct hostent result;
|
|
+ struct sockaddr_in raddr;
|
|
+ struct sockaddr_in *rlist[2];
|
|
+
|
|
+ memset(&result, '\0', sizeof(struct hostent));
|
|
+#endif
|
|
+#if (defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS)) && !defined(__NetBSD__)
|
|
struct hostent result;
|
|
#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
|
|
char hbuf[HOSTENT_BUFFER_SIZE];
|
|
@@ -1260,7 +1267,7 @@ unsigned long resolve_hostname_to_ip(con
|
|
if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1)
|
|
{
|
|
unsigned int dns_retries = 0;
|
|
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS)
|
|
+#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) && !defined(__NetBSD__)
|
|
while (gethostbyname_r(host, &result, hbuf,
|
|
HOSTENT_BUFFER_SIZE, &hostp, &thd_err)
|
|
&& (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))
|
|
@@ -1291,6 +1298,39 @@ unsigned long resolve_hostname_to_ip(con
|
|
{
|
|
hostp = NULL;
|
|
}
|
|
+#elif defined(__NetBSD__)
|
|
+ /* mjl */
|
|
+ {
|
|
+ struct addrinfo *resp = NULL;
|
|
+ struct addrinfo hints;
|
|
+
|
|
+ hostp = NULL;
|
|
+ memset(&hints, '\0', sizeof(struct addrinfo));
|
|
+ hints.ai_family = AF_INET;
|
|
+
|
|
+ while (getaddrinfo(host, NULL, &hints, &resp) == EAI_AGAIN
|
|
+ && (dns_retries++ < MAX_DNS_RETRIES))
|
|
+ {
|
|
+ log_error(LOG_LEVEL_ERROR,
|
|
+ "Timeout #%u while trying to resolve %s. Trying again.",
|
|
+ dns_retries, host);
|
|
+ }
|
|
+
|
|
+ if(resp)
|
|
+ {
|
|
+ result.h_addrtype = resp->ai_family;
|
|
+ memcpy(&raddr, &((struct sockaddr_in *) resp->ai_addr)
|
|
+ ->sin_addr, sizeof(struct sockaddr_in));
|
|
+ /* set up fake hostent */
|
|
+ rlist[0] = &raddr;
|
|
+ rlist[1] = NULL;
|
|
+ result.h_addr_list = (char **)rlist;
|
|
+ hostp = &result;
|
|
+
|
|
+ freeaddrinfo(resp);
|
|
+ }
|
|
+ }
|
|
+
|
|
#elif defined(MUTEX_LOCKS_AVAILABLE)
|
|
privoxy_mutex_lock(&resolver_mutex);
|
|
while (NULL == (hostp = gethostbyname(host))
|