1 |
commit: 75e23df8c331b7498d1f27a82bf0d048f627bb3d |
2 |
Author: Amy Winston <amynka <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun May 29 18:50:25 2016 +0000 |
4 |
Commit: Amy Winston <amynka <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun May 29 18:57:29 2016 +0000 |
6 |
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=75e23df8 |
7 |
|
8 |
sys-auth/nss-mdns: revbump, add ipv6 patch bug #584286 |
9 |
|
10 |
Package-Manager: portage-2.2.28 |
11 |
RepoMan-Options: --force |
12 |
|
13 |
sys-auth/nss-mdns/files/nss-mdns-0.10-ipv6.patch | 528 +++++++++++++++++++++ |
14 |
...mdns-0.10-r2.ebuild => nss-mdns-0.10-r3.ebuild} | 5 +- |
15 |
2 files changed, 531 insertions(+), 2 deletions(-) |
16 |
|
17 |
diff --git a/sys-auth/nss-mdns/files/nss-mdns-0.10-ipv6.patch b/sys-auth/nss-mdns/files/nss-mdns-0.10-ipv6.patch |
18 |
new file mode 100644 |
19 |
index 0000000..6d6dbc9 |
20 |
--- /dev/null |
21 |
+++ b/sys-auth/nss-mdns/files/nss-mdns-0.10-ipv6.patch |
22 |
@@ -0,0 +1,528 @@ |
23 |
+diff -u src/avahi.c src/avahi.c |
24 |
+--- src/avahi.c 2006-04-29 05:14:09.000000000 +0800 |
25 |
++++ src/avahi.c 2013-01-04 10:00:05.025558790 +0800 |
26 |
+@@ -26,6 +26,7 @@ |
27 |
+ #include <sys/socket.h> |
28 |
+ #include <string.h> |
29 |
+ #include <stdio.h> |
30 |
++#include <stdlib.h> |
31 |
+ #include <sys/types.h> |
32 |
+ #include <arpa/inet.h> |
33 |
+ #include <sys/un.h> |
34 |
+@@ -34,6 +35,7 @@ |
35 |
+ |
36 |
+ #include "avahi.h" |
37 |
+ #include "util.h" |
38 |
++#include "query.h" |
39 |
+ |
40 |
+ #define WHITESPACE " \t" |
41 |
+ |
42 |
+@@ -93,7 +95,8 @@ |
43 |
+ p = ln+1; |
44 |
+ p += strspn(p, WHITESPACE); |
45 |
+ |
46 |
+- /* Skip interface */ |
47 |
++ /* Parse interface */ |
48 |
++ if (af == AF_INET6) ((ipv6_address_t*)data)->if_idx = strtoul(p, 0, 10); |
49 |
+ p += strcspn(p, WHITESPACE); |
50 |
+ p += strspn(p, WHITESPACE); |
51 |
+ |
52 |
+diff -u src/avahi-test.c src/avahi-test.c |
53 |
+--- src/avahi-test.c 2007-02-09 00:42:23.000000000 +0800 |
54 |
++++ src/avahi-test.c 2013-01-04 09:59:06.174017729 +0800 |
55 |
+@@ -24,6 +24,7 @@ |
56 |
+ #include <stdio.h> |
57 |
+ |
58 |
+ #include "avahi.h" |
59 |
++#include "query.h" |
60 |
+ |
61 |
+ int main(int argc, char *argv[]) { |
62 |
+ uint8_t data[64]; |
63 |
+@@ -35,15 +36,20 @@ |
64 |
+ else |
65 |
+ printf("AF_INET: failed (%i).\n", r); |
66 |
+ |
67 |
+-/* if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0) */ |
68 |
+-/* printf("AF_INET6: %s\n", inet_ntop(AF_INET6, data, t, sizeof(t))); */ |
69 |
+-/* else */ |
70 |
+-/* printf("AF_INET6: failed (%i).\n", r); */ |
71 |
+- |
72 |
+ if ((r = avahi_resolve_address(AF_INET, data, t, sizeof(t))) == 0) |
73 |
+ printf("REVERSE: %s\n", t); |
74 |
+ else |
75 |
+ printf("REVERSE: failed (%i).\n", r); |
76 |
++ |
77 |
++ if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0) |
78 |
++ printf("AF_INET6: %s, %u\n", inet_ntop(AF_INET6, data, t, sizeof(t)), ((ipv6_address_t*)data)->if_idx); |
79 |
++ else |
80 |
++ printf("AF_INET6: failed (%i).\n", r); |
81 |
++ |
82 |
++ if ((r = avahi_resolve_address(AF_INET6, data, t, sizeof(t))) == 0) |
83 |
++ printf("REVERSE: %s\n", t); |
84 |
++ else |
85 |
++ printf("REVERSE: failed (%i).\n", r); |
86 |
+ |
87 |
+ return 0; |
88 |
+ } |
89 |
+diff -u src/bsdnss.c src/bsdnss.c |
90 |
+--- src/bsdnss.c 2007-02-09 00:42:23.000000000 +0800 |
91 |
++++ src/bsdnss.c 2013-01-04 09:49:45.566389491 +0800 |
92 |
+@@ -258,6 +258,8 @@ |
93 |
+ ai->ai_addrlen = sizeof(struct sockaddr_in6); |
94 |
+ memcpy(&((struct sockaddr_in6 *)psa)->sin6_addr, hap, |
95 |
+ ai->ai_addrlen); |
96 |
++ if (((struct sockaddr_in6 *)psa)->sin6_addr[0] == 0xfe && ((struct sockaddr_in6 *)psa)->sin6_addr[0] == 0x80) |
97 |
++ ((struct sockaddr_in6 *)psa)->sin6_scope_id = ((struct ipv6_address_t*) hap)->if_idx; |
98 |
+ break; |
99 |
+ default: |
100 |
+ ai->ai_addrlen = sizeof(struct sockaddr_storage); |
101 |
+diff -u src/map-file src/map-file |
102 |
+--- src/map-file 2007-01-02 02:36:21.000000000 +0800 |
103 |
++++ src/map-file 2013-01-07 08:56:56.406478774 +0800 |
104 |
+@@ -18,6 +18,12 @@ |
105 |
+ _nss_mdns_minimal_gethostbyname2_r; |
106 |
+ _nss_mdns4_minimal_gethostbyname2_r; |
107 |
+ _nss_mdns6_minimal_gethostbyname2_r; |
108 |
++_nss_mdns_gethostbyname4_r; |
109 |
++_nss_mdns4_gethostbyname4_r; |
110 |
++_nss_mdns6_gethostbyname4_r; |
111 |
++_nss_mdns_minimal_gethostbyname4_r; |
112 |
++_nss_mdns4_minimal_gethostbyname4_r; |
113 |
++_nss_mdns6_minimal_gethostbyname4_r; |
114 |
+ local: |
115 |
+ *; |
116 |
+ }; |
117 |
+diff -u src/nss.c src/nss.c |
118 |
+--- src/nss.c 2013-01-07 15:14:23.000000000 +0800 |
119 |
++++ src/nss.c 2013-01-07 16:52:38.399842517 +0800 |
120 |
+@@ -41,22 +41,27 @@ |
121 |
+ |
122 |
+ #if defined(NSS_IPV4_ONLY) && ! defined(MDNS_MINIMAL) |
123 |
+ #define _nss_mdns_gethostbyname2_r _nss_mdns4_gethostbyname2_r |
124 |
++#define _nss_mdns_gethostbyname4_r _nss_mdns4_gethostbyname4_r |
125 |
+ #define _nss_mdns_gethostbyname_r _nss_mdns4_gethostbyname_r |
126 |
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns4_gethostbyaddr_r |
127 |
+ #elif defined(NSS_IPV4_ONLY) && defined(MDNS_MINIMAL) |
128 |
+ #define _nss_mdns_gethostbyname2_r _nss_mdns4_minimal_gethostbyname2_r |
129 |
++#define _nss_mdns_gethostbyname4_r _nss_mdns4_minimal_gethostbyname4_r |
130 |
+ #define _nss_mdns_gethostbyname_r _nss_mdns4_minimal_gethostbyname_r |
131 |
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns4_minimal_gethostbyaddr_r |
132 |
+ #elif defined(NSS_IPV6_ONLY) && ! defined(MDNS_MINIMAL) |
133 |
+ #define _nss_mdns_gethostbyname2_r _nss_mdns6_gethostbyname2_r |
134 |
++#define _nss_mdns_gethostbyname4_r _nss_mdns6_gethostbyname4_r |
135 |
+ #define _nss_mdns_gethostbyname_r _nss_mdns6_gethostbyname_r |
136 |
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns6_gethostbyaddr_r |
137 |
+ #elif defined(NSS_IPV6_ONLY) && defined(MDNS_MINIMAL) |
138 |
+ #define _nss_mdns_gethostbyname2_r _nss_mdns6_minimal_gethostbyname2_r |
139 |
++#define _nss_mdns_gethostbyname4_r _nss_mdns6_minimal_gethostbyname4_r |
140 |
+ #define _nss_mdns_gethostbyname_r _nss_mdns6_minimal_gethostbyname_r |
141 |
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns6_minimal_gethostbyaddr_r |
142 |
+ #elif defined(MDNS_MINIMAL) |
143 |
+ #define _nss_mdns_gethostbyname2_r _nss_mdns_minimal_gethostbyname2_r |
144 |
++#define _nss_mdns_gethostbyname4_r _nss_mdns_minimal_gethostbyname4_r |
145 |
+ #define _nss_mdns_gethostbyname_r _nss_mdns_minimal_gethostbyname_r |
146 |
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns_minimal_gethostbyaddr_r |
147 |
+ #endif |
148 |
+@@ -81,6 +86,12 @@ |
149 |
+ char *name[MAX_ENTRIES]; |
150 |
+ } data; |
151 |
+ }; |
152 |
++struct user_gai_buf { |
153 |
++ struct gaih_addrtuple *list_base; |
154 |
++ int list_size; |
155 |
++ int list_idx; |
156 |
++ int wrote_name; |
157 |
++}; |
158 |
+ |
159 |
+ #ifndef NSS_IPV6_ONLY |
160 |
+ static void ipv4_callback(const ipv4_address_t *ipv4, void *userdata) { |
161 |
+@@ -93,6 +104,21 @@ |
162 |
+ u->data.ipv4[u->count++] = *ipv4; |
163 |
+ u->data_len += sizeof(ipv4_address_t); |
164 |
+ } |
165 |
++static void ipv4_gai_callback(const ipv4_address_t *ipv4, void *userdata) { |
166 |
++ struct user_gai_buf *u = userdata; |
167 |
++ assert(ipv4 && userdata); |
168 |
++ |
169 |
++ if (u->list_idx+1 >= u->list_size) |
170 |
++ return; |
171 |
++ |
172 |
++ u->list_base[u->list_idx].name = 0; |
173 |
++ u->list_base[u->list_idx].family = AF_INET; |
174 |
++ u->list_base[u->list_idx].addr[0] = ipv4->address; |
175 |
++ u->list_base[u->list_idx].scopeid = 0; |
176 |
++ if (u->list_idx > 0) u->list_base[u->list_idx-1].next = &u->list_base[u->list_idx]; |
177 |
++ u->list_base[u->list_idx].next = 0; |
178 |
++ u->list_idx += 1; |
179 |
++} |
180 |
+ #endif |
181 |
+ |
182 |
+ #ifndef NSS_IPV4_ONLY |
183 |
+@@ -106,6 +132,21 @@ |
184 |
+ u->data.ipv6[u->count++] = *ipv6; |
185 |
+ u->data_len += sizeof(ipv6_address_t); |
186 |
+ } |
187 |
++static void ipv6_gai_callback(const ipv6_address_t *ipv6, void *userdata) { |
188 |
++ struct user_gai_buf *u = userdata; |
189 |
++ assert(ipv6 && userdata); |
190 |
++ |
191 |
++ if (u->list_idx+1 >= u->list_size) |
192 |
++ return; |
193 |
++ |
194 |
++ u->list_base[u->list_idx].name = 0; |
195 |
++ u->list_base[u->list_idx].family = AF_INET6; |
196 |
++ memcpy(u->list_base[u->list_idx].addr, ipv6->address, sizeof(u->list_base[u->list_idx].addr)); |
197 |
++ u->list_base[u->list_idx].scopeid = ipv6->if_idx; |
198 |
++ if (u->list_idx > 0) u->list_base[u->list_idx-1].next = &u->list_base[u->list_idx]; |
199 |
++ u->list_base[u->list_idx].next = 0; |
200 |
++ u->list_idx += 1; |
201 |
++} |
202 |
+ #endif |
203 |
+ |
204 |
+ static void name_callback(const char*name, void *userdata) { |
205 |
+@@ -538,6 +579,265 @@ |
206 |
+ |
207 |
+ status = NSS_STATUS_SUCCESS; |
208 |
+ |
209 |
++finish: |
210 |
++#ifdef ENABLE_LEGACY |
211 |
++ if (fd >= 0) |
212 |
++ close(fd); |
213 |
++#endif |
214 |
++ |
215 |
++ return status; |
216 |
++} |
217 |
++ |
218 |
++enum nss_status _nss_mdns_gethostbyname4_r( |
219 |
++ const char *name, |
220 |
++ struct gaih_addrtuple **pat, |
221 |
++ char *buffer, |
222 |
++ size_t buflen, |
223 |
++ int *errnop, |
224 |
++ int *h_errnop, |
225 |
++ int32_t *ttlp) { |
226 |
++ |
227 |
++ struct user_gai_buf u; |
228 |
++ enum nss_status status = NSS_STATUS_UNAVAIL; |
229 |
++ int i; |
230 |
++ size_t l, idx; |
231 |
++ void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata); |
232 |
++ void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata); |
233 |
++ int name_allowed; |
234 |
++ int af = AF_UNSPEC; |
235 |
++ |
236 |
++#ifdef ENABLE_AVAHI |
237 |
++ int avahi_works = 1; |
238 |
++ void * data[32]; |
239 |
++#endif |
240 |
++ |
241 |
++#ifdef ENABLE_LEGACY |
242 |
++ int fd = -1; |
243 |
++#endif |
244 |
++ |
245 |
++ if (pat) { |
246 |
++ af = (*pat)->family; |
247 |
++ } |
248 |
++ |
249 |
++/* DEBUG_TRAP; */ |
250 |
++ |
251 |
++#ifdef NSS_IPV6_ONLY |
252 |
++ if (af == AF_UNSPEC) |
253 |
++ af = AF_INET6; |
254 |
++#endif |
255 |
++ |
256 |
++#ifdef NSS_IPV4_ONLY |
257 |
++ if (af == AF_UNSPEC) |
258 |
++ af = AF_INET; |
259 |
++#endif |
260 |
++ |
261 |
++#ifdef NSS_IPV4_ONLY |
262 |
++ if (af != AF_INET) |
263 |
++#elif NSS_IPV6_ONLY |
264 |
++ if (af != AF_INET6) |
265 |
++#else |
266 |
++ if (af != AF_INET && af != AF_INET6 && af != AF_UNSPEC) |
267 |
++#endif |
268 |
++ { |
269 |
++ *errnop = EINVAL; |
270 |
++ *h_errnop = NO_RECOVERY; |
271 |
++ |
272 |
++ goto finish; |
273 |
++ } |
274 |
++ |
275 |
++ if (buflen < |
276 |
++ sizeof(struct gaih_addrtuple)) { |
277 |
++ |
278 |
++ *errnop = ERANGE; |
279 |
++ *h_errnop = NO_RECOVERY; |
280 |
++ status = NSS_STATUS_TRYAGAIN; |
281 |
++ |
282 |
++ goto finish; |
283 |
++ } |
284 |
++ |
285 |
++ u.list_base = (struct user_gai_buf*) buffer; |
286 |
++ u.list_size = buflen / sizeof( struct user_gai_buf ); |
287 |
++ u.list_idx = 0; |
288 |
++ u.wrote_name = 0; |
289 |
++ |
290 |
++#ifdef NSS_IPV6_ONLY |
291 |
++ ipv4_func = NULL; |
292 |
++#else |
293 |
++ ipv4_func = (af == AF_INET || af == AF_UNSPEC) ? ipv4_gai_callback : NULL; |
294 |
++#endif |
295 |
++ |
296 |
++#ifdef NSS_IPV4_ONLY |
297 |
++ ipv6_func = NULL; |
298 |
++#else |
299 |
++ ipv6_func = (af == AF_INET6 || af == AF_UNSPEC) ? ipv6_gai_callback : NULL; |
300 |
++#endif |
301 |
++ |
302 |
++ name_allowed = verify_name_allowed(name); |
303 |
++ |
304 |
++#ifdef ENABLE_AVAHI |
305 |
++ |
306 |
++ if (avahi_works && name_allowed) { |
307 |
++ int r; |
308 |
++ |
309 |
++ if (af == AF_INET || af == AF_UNSPEC) { |
310 |
++ if ((r = avahi_resolve_name(AF_INET, name, data)) < 0) |
311 |
++ avahi_works = 0; |
312 |
++ else if (r == 0) { |
313 |
++ if (ipv4_func) { |
314 |
++ ipv4_func((ipv4_address_t*) data, &u); |
315 |
++ } |
316 |
++ } |
317 |
++ else |
318 |
++ status = NSS_STATUS_NOTFOUND; |
319 |
++ } |
320 |
++ if (af == AF_INET6 || af == AF_UNSPEC) { |
321 |
++ if ((r = avahi_resolve_name(AF_INET6, name, data)) < 0) |
322 |
++ avahi_works = 0; |
323 |
++ else if (r == 0) { |
324 |
++ if (ipv6_func) |
325 |
++ ipv6_func((ipv6_address_t*)data, &u); |
326 |
++ } |
327 |
++ else |
328 |
++ status = NSS_STATUS_NOTFOUND; |
329 |
++ } |
330 |
++ } |
331 |
++ |
332 |
++#ifdef HONOUR_SEARCH_DOMAINS |
333 |
++ if (u.list_idx == 0 && avahi_works && !ends_with(name, ".")) { |
334 |
++ char **domains; |
335 |
++ |
336 |
++ if ((domains = get_search_domains())) { |
337 |
++ char **p; |
338 |
++ |
339 |
++ /* Try to concatenate host names */ |
340 |
++ for (p = domains; *p; p++) { |
341 |
++ int fullnamesize; |
342 |
++ char *fullname; |
343 |
++ |
344 |
++ fullnamesize = strlen(name) + strlen(*p) + 2; |
345 |
++ |
346 |
++ if (!(fullname = malloc(fullnamesize))) |
347 |
++ break; |
348 |
++ |
349 |
++ snprintf(fullname, fullnamesize, "%s.%s", name, *p); |
350 |
++ |
351 |
++ if (verify_name_allowed(fullname)) { |
352 |
++ int r; |
353 |
++ |
354 |
++ if (af == AF_INET || af == AF_UNSPEC) { |
355 |
++ r = avahi_resolve_name(AF_INET, fullname, data); |
356 |
++ |
357 |
++ if (r < 0) { |
358 |
++ /* Lookup failed */ |
359 |
++ avahi_works = 0; |
360 |
++ free(fullname); |
361 |
++ break; |
362 |
++ } else if (r == 0) { |
363 |
++ /* Lookup succeeded */ |
364 |
++ if (ipv4_func) |
365 |
++ ipv4_func((ipv4_address_t*) data, &u); |
366 |
++ } |
367 |
++ } |
368 |
++ if (af == AF_INET6 || af == AF_UNSPEC) { |
369 |
++ r = avahi_resolve_name(AF_INET6, fullname, data); |
370 |
++ |
371 |
++ if (r < 0) { |
372 |
++ /* Lookup failed */ |
373 |
++ avahi_works = 0; |
374 |
++ free(fullname); |
375 |
++ break; |
376 |
++ } else if (r == 0) { |
377 |
++ /* Lookup succeeded */ |
378 |
++ if (ipv6_func) |
379 |
++ ipv6_func((ipv6_address_t*)data, &u); |
380 |
++ } |
381 |
++ } |
382 |
++ free(fullname); |
383 |
++ if (u.list_idx > 0) break; |
384 |
++ |
385 |
++ } else |
386 |
++ free(fullname); |
387 |
++ } |
388 |
++ |
389 |
++ free_domains(domains); |
390 |
++ } |
391 |
++ } |
392 |
++#endif /* HONOUR_SEARCH_DOMAINS */ |
393 |
++#endif /* ENABLE_AVAHI */ |
394 |
++ |
395 |
++#if defined(ENABLE_LEGACY) && defined(ENABLE_AVAHI) |
396 |
++ if (u.list_idx == 0 && !avahi_works) |
397 |
++#endif |
398 |
++ |
399 |
++#if defined(ENABLE_LEGACY) |
400 |
++ { |
401 |
++ if ((fd = mdns_open_socket()) < 0) { |
402 |
++ *errnop = errno; |
403 |
++ *h_errnop = NO_RECOVERY; |
404 |
++ goto finish; |
405 |
++ } |
406 |
++ |
407 |
++ if (name_allowed) { |
408 |
++ /* Ignore return value */ |
409 |
++ mdns_query_name(fd, name, ipv4_func, ipv6_func, &u); |
410 |
++ |
411 |
++ if (!u.list_idx) |
412 |
++ status = NSS_STATUS_NOTFOUND; |
413 |
++ } |
414 |
++ |
415 |
++#ifdef HONOUR_SEARCH_DOMAINS |
416 |
++ if (u.list_idx == 0 && !ends_with(name, ".")) { |
417 |
++ char **domains; |
418 |
++ |
419 |
++ /* Try the search domains if the user did not use a traling '.' */ |
420 |
++ |
421 |
++ if ((domains = get_search_domains())) { |
422 |
++ char **p; |
423 |
++ |
424 |
++ for (p = domains; *p; p++) { |
425 |
++ int fullnamesize = 0; |
426 |
++ char *fullname = NULL; |
427 |
++ |
428 |
++ fullnamesize = strlen(name) + strlen(*p) + 2; |
429 |
++ if (!(fullname = malloc(fullnamesize))) |
430 |
++ break; |
431 |
++ |
432 |
++ snprintf(fullname, fullnamesize, "%s.%s", name, *p); |
433 |
++ |
434 |
++ if (verify_name_allowed(fullname)) { |
435 |
++ |
436 |
++ /* Ignore return value */ |
437 |
++ mdns_query_name(fd, fullname, ipv4_func, ipv6_func, &u); |
438 |
++ |
439 |
++ if (u.list_idx > 0) { |
440 |
++ /* We found something, so let's quit */ |
441 |
++ free(fullname); |
442 |
++ break; |
443 |
++ } else |
444 |
++ status = NSS_STATUS_NOTFOUND; |
445 |
++ |
446 |
++ } |
447 |
++ |
448 |
++ free(fullname); |
449 |
++ } |
450 |
++ |
451 |
++ free_domains(domains); |
452 |
++ } |
453 |
++ } |
454 |
++#endif /* HONOUR_SEARCH_DOMAINS */ |
455 |
++ } |
456 |
++#endif /* ENABLE_LEGACY */ |
457 |
++ |
458 |
++ if (u.list_idx == 0) { |
459 |
++ *errnop = ETIMEDOUT; |
460 |
++ *h_errnop = HOST_NOT_FOUND; |
461 |
++ goto finish; |
462 |
++ } |
463 |
++ |
464 |
++ *pat = (struct gaih_addrtuple*) buffer; |
465 |
++ |
466 |
++ status = NSS_STATUS_SUCCESS; |
467 |
++ |
468 |
+ finish: |
469 |
+ #ifdef ENABLE_LEGACY |
470 |
+ if (fd >= 0) |
471 |
+diff -u src/query.c src/query.c |
472 |
+--- src/query.c 2007-02-09 00:42:23.000000000 +0800 |
473 |
++++ src/query.c 2013-01-04 09:57:03.778972196 +0800 |
474 |
+@@ -263,7 +263,7 @@ |
475 |
+ return n_sent; |
476 |
+ } |
477 |
+ |
478 |
+-static int recv_dns_packet(int fd, struct dns_packet **ret_packet, uint8_t *ret_ttl, struct timeval *end) { |
479 |
++static int recv_dns_packet(int fd, struct dns_packet **ret_packet, uint8_t *ret_ttl, uint32_t *if_idx, struct timeval *end) { |
480 |
+ struct dns_packet *p= NULL; |
481 |
+ struct msghdr msg; |
482 |
+ struct iovec io; |
483 |
+@@ -286,6 +286,10 @@ |
484 |
+ msg.msg_controllen = sizeof(aux); |
485 |
+ msg.msg_flags = 0; |
486 |
+ |
487 |
++#ifndef IP_PKTINFO |
488 |
++ *if_idx = 0; |
489 |
++#endif |
490 |
++ |
491 |
+ for (;;) { |
492 |
+ ssize_t l; |
493 |
+ int r; |
494 |
+@@ -304,6 +308,14 @@ |
495 |
+ *ret_ttl = (uint8_t) (*(uint32_t*) CMSG_DATA(cmsg)); |
496 |
+ break; |
497 |
+ } |
498 |
++#ifdef IP_PKTINFO |
499 |
++ if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) |
500 |
++ { |
501 |
++ *if_idx = ((struct in_pktinfo*) CMSG_DATA(cmsg))->ipi_ifindex; |
502 |
++ break; |
503 |
++ } |
504 |
++#endif |
505 |
++ |
506 |
+ } |
507 |
+ |
508 |
+ if (!cmsg) |
509 |
+@@ -427,9 +439,10 @@ |
510 |
+ |
511 |
+ while (!done) { |
512 |
+ uint8_t ttl; |
513 |
++ uint32_t if_idx; |
514 |
+ int r; |
515 |
+ |
516 |
+- if ((r = recv_dns_packet(fd, &p, &ttl, &end)) < 0) |
517 |
++ if ((r = recv_dns_packet(fd, &p, &ttl, &if_idx, &end)) < 0) |
518 |
+ return -1; |
519 |
+ else if (r > 0) /* timeout */ |
520 |
+ return 1; |
521 |
+@@ -488,6 +501,7 @@ |
522 |
+ rdlength == sizeof(ipv6_address_t)) { |
523 |
+ |
524 |
+ ipv6_address_t ipv6; |
525 |
++ ipv6.if_idx = if_idx; |
526 |
+ |
527 |
+ if (dns_packet_consume_bytes(p, &ipv6, sizeof(ipv6_address_t)) < 0) |
528 |
+ break; |
529 |
+@@ -584,9 +598,10 @@ |
530 |
+ |
531 |
+ while (!done) { |
532 |
+ uint8_t ttl; |
533 |
++ uint32_t if_idx; |
534 |
+ int r; |
535 |
+ |
536 |
+- if ((r = recv_dns_packet(fd, &p, &ttl, &end)) < 0) |
537 |
++ if ((r = recv_dns_packet(fd, &p, &ttl, &if_idx, &end)) < 0) |
538 |
+ return -1; |
539 |
+ else if (r > 0) /* timeout */ |
540 |
+ return 1; |
541 |
+diff -u src/query.h src/query.h |
542 |
+--- src/query.h 2005-06-21 22:43:23.000000000 +0800 |
543 |
++++ src/query.h 2013-01-03 14:09:22.138018327 +0800 |
544 |
+@@ -30,6 +30,7 @@ |
545 |
+ |
546 |
+ typedef struct { |
547 |
+ uint8_t address[16]; |
548 |
++ uint32_t if_idx; |
549 |
+ } ipv6_address_t; |
550 |
+ |
551 |
|
552 |
diff --git a/sys-auth/nss-mdns/nss-mdns-0.10-r2.ebuild b/sys-auth/nss-mdns/nss-mdns-0.10-r3.ebuild |
553 |
similarity index 92% |
554 |
rename from sys-auth/nss-mdns/nss-mdns-0.10-r2.ebuild |
555 |
rename to sys-auth/nss-mdns/nss-mdns-0.10-r3.ebuild |
556 |
index 5255cd1..3be4d71 100644 |
557 |
--- a/sys-auth/nss-mdns/nss-mdns-0.10-r2.ebuild |
558 |
+++ b/sys-auth/nss-mdns/nss-mdns-0.10-r3.ebuild |
559 |
@@ -1,4 +1,4 @@ |
560 |
-# Copyright 1999-2015 Gentoo Foundation |
561 |
+# Copyright 1999-2016 Gentoo Foundation |
562 |
# Distributed under the terms of the GNU General Public License v2 |
563 |
# $Id$ |
564 |
|
565 |
@@ -23,7 +23,8 @@ RDEPEND="${RDEPEND} |
566 |
)" |
567 |
|
568 |
src_prepare() { |
569 |
- epatch "${FILESDIR}"/${PN}-0.10-avahi-socket.patch |
570 |
+ epatch "${FILESDIR}"/${PN}-0.10-avahi-socket.patch \ |
571 |
+ "${FILESDIR}"/${PN}-0.10-ipv6.patch |
572 |
epatch_user |
573 |
eautoreconf |
574 |
} |