]>
Commit | Line | Data |
---|---|---|
ac29baf9 SS |
1 | diff -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; |