summaryrefslogtreecommitdiff
path: root/www/privoxy/patches/patch-ag
blob: e7ea35aa42babb37f54955e34113208040e22fc1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$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))