]> git.ipfire.org Git - people/ms/ipfire-3.x.git/blame - bind/patches/bind97-rh714049.patch
bind: Rework package.
[people/ms/ipfire-3.x.git] / bind / patches / bind97-rh714049.patch
CommitLineData
ac29baf9
SS
1diff -up bind-9.7.3-P3/bin/nsupdate/nsupdate.c.rh714049 bind-9.7.3-P3/bin/nsupdate/nsupdate.c
2--- bind-9.7.3-P3/bin/nsupdate/nsupdate.c.rh714049 2011-08-12 14:17:39.520175003 +0200
3+++ bind-9.7.3-P3/bin/nsupdate/nsupdate.c 2011-08-12 15:11:01.812173573 +0200
4@@ -109,6 +109,13 @@ extern int h_errno;
5
6 #define DNSDEFAULTPORT 53
7
8+/*
9+ * Assume that bind9_getaddresses returns IPv6 and IPv4 addrs
10+ * so when master server is not reachable via IPv6
11+ * we can switch to IPv4.
12+ */
13+#define MAX_SERVERADDRS 4
14+
15 static isc_uint16_t dnsport = DNSDEFAULTPORT;
16
17 #ifndef RESOLV_CONF
18@@ -151,6 +158,8 @@ static isc_sockaddr_t *servers;
19 static int ns_inuse = 0;
20 static int ns_total = 0;
21 static isc_sockaddr_t *userserver = NULL;
22+static int curserver = 0;
23+static int userservers = 0;
24 static isc_sockaddr_t *localaddr = NULL;
25 static isc_sockaddr_t *serveraddr = NULL;
26 static isc_sockaddr_t tempaddr;
27@@ -703,7 +712,8 @@ doshutdown(void) {
28 isc_task_detach(&global_task);
29
30 if (userserver != NULL)
31- isc_mem_put(mctx, userserver, sizeof(isc_sockaddr_t));
32+ isc_mem_put(mctx, userserver,
33+ MAX_SERVERADDRS * sizeof(isc_sockaddr_t));
34
35 if (localaddr != NULL)
36 isc_mem_put(mctx, localaddr, sizeof(isc_sockaddr_t));
37@@ -914,17 +924,21 @@ setup_system(void) {
38 }
39
40 static void
41-get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
42+get_addresses(char *host, in_port_t port, isc_sockaddr_t *sockaddr, int *naddrs) {
43 int count;
44 isc_result_t result;
45
46 isc_app_block();
47- result = bind9_getaddresses(host, port, sockaddr, 1, &count);
48+ result = bind9_getaddresses(host, port, sockaddr,
49+ (naddrs == NULL) ? 1 : MAX_SERVERADDRS, &count);
50 isc_app_unblock();
51 if (result != ISC_R_SUCCESS)
52 fatal("couldn't get address for '%s': %s",
53 host, isc_result_totext(result));
54- INSIST(count == 1);
55+ if (naddrs == NULL)
56+ INSIST(count == 1);
57+ else
58+ *naddrs = count;
59 }
60
61 #define PARSE_ARGS_FMT "dDML:y:ghlovk:p:rR::t:u:"
62@@ -1364,12 +1378,14 @@ evaluate_server(char *cmdline) {
63 }
64
65 if (userserver == NULL) {
66- userserver = isc_mem_get(mctx, sizeof(isc_sockaddr_t));
67+ userserver = isc_mem_get(mctx,
68+ MAX_SERVERADDRS * sizeof(isc_sockaddr_t));
69 if (userserver == NULL)
70 fatal("out of memory");
71 }
72
73- get_address(server, (in_port_t)port, userserver);
74+ memset(userserver, 0, MAX_SERVERADDRS * sizeof(isc_sockaddr_t));
75+ get_addresses(server, (in_port_t)port, userserver, &userservers);
76
77 return (STATUS_MORE);
78 }
79@@ -2207,19 +2223,25 @@ recvsoa(isc_task_t *task, isc_event_t *e
80
81 if (eresult != ISC_R_SUCCESS) {
82 char addrbuf[ISC_SOCKADDR_FORMATSIZE];
83+ isc_sockaddr_t *server;
84
85 isc_sockaddr_format(addr, addrbuf, sizeof(addrbuf));
86 fprintf(stderr, "; Communication with %s failed: %s\n",
87 addrbuf, isc_result_totext(eresult));
88- if (userserver != NULL)
89- fatal("could not talk to specified name server");
90- else if (++ns_inuse >= lwconf->nsnext)
91+ if (userserver != NULL) {
92+ if (++curserver == MAX_SERVERADDRS)
93+ fatal("could not talk to specified name server");
94+ else
95+ ddebug("recvsoa: trying next server");
96+ } else if (++ns_inuse >= lwconf->nsnext)
97 fatal("could not talk to any default name server");
98 ddebug("Destroying request [%p]", request);
99 dns_request_destroy(&request);
100 dns_message_renderreset(soaquery);
101 dns_message_settsigkey(soaquery, NULL);
102- sendrequest(localaddr, &servers[ns_inuse], soaquery, &request);
103+ server = (userserver != NULL) ? &userserver[curserver] :
104+ &servers[ns_inuse];
105+ sendrequest(localaddr, server, soaquery, &request);
106 isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t));
107 isc_event_free(&event);
108 setzoneclass(dns_rdataclass_none);
109@@ -2351,7 +2373,7 @@ recvsoa(isc_task_t *task, isc_event_t *e
110 }
111
112 if (userserver != NULL)
113- serveraddr = userserver;
114+ serveraddr = &userserver[curserver];
115 else {
116 char serverstr[DNS_NAME_MAXTEXT+1];
117 isc_buffer_t buf;
118@@ -2360,7 +2382,7 @@ recvsoa(isc_task_t *task, isc_event_t *e
119 result = dns_name_totext(&master, ISC_TRUE, &buf);
120 check_result(result, "dns_name_totext");
121 serverstr[isc_buffer_usedlength(&buf)] = 0;
122- get_address(serverstr, dnsport, &tempaddr);
123+ get_addresses(serverstr, dnsport, &tempaddr, NULL);
124 serveraddr = &tempaddr;
125 }
126 dns_rdata_freestruct(&soa);
127@@ -2464,9 +2486,9 @@ start_gssrequest(dns_name_t *master)
128 fatal("out of memory");
129 }
130 if (userserver == NULL)
131- get_address(namestr, dnsport, kserver);
132+ get_addresses(namestr, dnsport, kserver, NULL);
133 else
134- (void)memcpy(kserver, userserver, sizeof(isc_sockaddr_t));
135+ (void)memcpy(kserver, &userserver[curserver], sizeof(isc_sockaddr_t));
136
137 dns_fixedname_init(&fname);
138 servname = dns_fixedname_name(&fname);
139@@ -2594,15 +2616,17 @@ recvgss(isc_task_t *task, isc_event_t *e
140 isc_sockaddr_format(addr, addrbuf, sizeof(addrbuf));
141 fprintf(stderr, "; Communication with %s failed: %s\n",
142 addrbuf, isc_result_totext(eresult));
143- if (userserver != NULL)
144+ if (userserver != NULL) {
145 fatal("could not talk to specified name server");
146- else if (++ns_inuse >= lwconf->nsnext)
147+ } else if (++ns_inuse >= lwconf->nsnext)
148 fatal("could not talk to any default name server");
149 ddebug("Destroying request [%p]", request);
150 dns_request_destroy(&request);
151 dns_message_renderreset(tsigquery);
152- sendrequest(localaddr, &servers[ns_inuse], tsigquery,
153- &request);
154+ sendrequest(localaddr,
155+ (userserver != NULL) ? &userserver[curserver] :
156+ &servers[ns_inuse],
157+ tsigquery, &request);
158 isc_mem_put(mctx, reqinfo, sizeof(nsu_gssinfo_t));
159 isc_event_free(&event);
160 return;