summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-auth')
-rw-r--r--sys-auth/nss-mdns/files/nss-mdns-0.10-ipv6.patch528
-rw-r--r--sys-auth/nss-mdns/nss-mdns-0.10-r3.ebuild (renamed from sys-auth/nss-mdns/nss-mdns-0.10-r2.ebuild)5
2 files changed, 531 insertions, 2 deletions
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
new file mode 100644
index 000000000000..6d6dbc9eab58
--- /dev/null
+++ b/sys-auth/nss-mdns/files/nss-mdns-0.10-ipv6.patch
@@ -0,0 +1,528 @@
+diff -u src/avahi.c src/avahi.c
+--- src/avahi.c 2006-04-29 05:14:09.000000000 +0800
++++ src/avahi.c 2013-01-04 10:00:05.025558790 +0800
+@@ -26,6 +26,7 @@
+ #include <sys/socket.h>
+ #include <string.h>
+ #include <stdio.h>
++#include <stdlib.h>
+ #include <sys/types.h>
+ #include <arpa/inet.h>
+ #include <sys/un.h>
+@@ -34,6 +35,7 @@
+
+ #include "avahi.h"
+ #include "util.h"
++#include "query.h"
+
+ #define WHITESPACE " \t"
+
+@@ -93,7 +95,8 @@
+ p = ln+1;
+ p += strspn(p, WHITESPACE);
+
+- /* Skip interface */
++ /* Parse interface */
++ if (af == AF_INET6) ((ipv6_address_t*)data)->if_idx = strtoul(p, 0, 10);
+ p += strcspn(p, WHITESPACE);
+ p += strspn(p, WHITESPACE);
+
+diff -u src/avahi-test.c src/avahi-test.c
+--- src/avahi-test.c 2007-02-09 00:42:23.000000000 +0800
++++ src/avahi-test.c 2013-01-04 09:59:06.174017729 +0800
+@@ -24,6 +24,7 @@
+ #include <stdio.h>
+
+ #include "avahi.h"
++#include "query.h"
+
+ int main(int argc, char *argv[]) {
+ uint8_t data[64];
+@@ -35,15 +36,20 @@
+ else
+ printf("AF_INET: failed (%i).\n", r);
+
+-/* if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0) */
+-/* printf("AF_INET6: %s\n", inet_ntop(AF_INET6, data, t, sizeof(t))); */
+-/* else */
+-/* printf("AF_INET6: failed (%i).\n", r); */
+-
+ if ((r = avahi_resolve_address(AF_INET, data, t, sizeof(t))) == 0)
+ printf("REVERSE: %s\n", t);
+ else
+ printf("REVERSE: failed (%i).\n", r);
++
++ if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0)
++ printf("AF_INET6: %s, %u\n", inet_ntop(AF_INET6, data, t, sizeof(t)), ((ipv6_address_t*)data)->if_idx);
++ else
++ printf("AF_INET6: failed (%i).\n", r);
++
++ if ((r = avahi_resolve_address(AF_INET6, data, t, sizeof(t))) == 0)
++ printf("REVERSE: %s\n", t);
++ else
++ printf("REVERSE: failed (%i).\n", r);
+
+ return 0;
+ }
+diff -u src/bsdnss.c src/bsdnss.c
+--- src/bsdnss.c 2007-02-09 00:42:23.000000000 +0800
++++ src/bsdnss.c 2013-01-04 09:49:45.566389491 +0800
+@@ -258,6 +258,8 @@
+ ai->ai_addrlen = sizeof(struct sockaddr_in6);
+ memcpy(&((struct sockaddr_in6 *)psa)->sin6_addr, hap,
+ ai->ai_addrlen);
++ if (((struct sockaddr_in6 *)psa)->sin6_addr[0] == 0xfe && ((struct sockaddr_in6 *)psa)->sin6_addr[0] == 0x80)
++ ((struct sockaddr_in6 *)psa)->sin6_scope_id = ((struct ipv6_address_t*) hap)->if_idx;
+ break;
+ default:
+ ai->ai_addrlen = sizeof(struct sockaddr_storage);
+diff -u src/map-file src/map-file
+--- src/map-file 2007-01-02 02:36:21.000000000 +0800
++++ src/map-file 2013-01-07 08:56:56.406478774 +0800
+@@ -18,6 +18,12 @@
+ _nss_mdns_minimal_gethostbyname2_r;
+ _nss_mdns4_minimal_gethostbyname2_r;
+ _nss_mdns6_minimal_gethostbyname2_r;
++_nss_mdns_gethostbyname4_r;
++_nss_mdns4_gethostbyname4_r;
++_nss_mdns6_gethostbyname4_r;
++_nss_mdns_minimal_gethostbyname4_r;
++_nss_mdns4_minimal_gethostbyname4_r;
++_nss_mdns6_minimal_gethostbyname4_r;
+ local:
+ *;
+ };
+diff -u src/nss.c src/nss.c
+--- src/nss.c 2013-01-07 15:14:23.000000000 +0800
++++ src/nss.c 2013-01-07 16:52:38.399842517 +0800
+@@ -41,22 +41,27 @@
+
+ #if defined(NSS_IPV4_ONLY) && ! defined(MDNS_MINIMAL)
+ #define _nss_mdns_gethostbyname2_r _nss_mdns4_gethostbyname2_r
++#define _nss_mdns_gethostbyname4_r _nss_mdns4_gethostbyname4_r
+ #define _nss_mdns_gethostbyname_r _nss_mdns4_gethostbyname_r
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns4_gethostbyaddr_r
+ #elif defined(NSS_IPV4_ONLY) && defined(MDNS_MINIMAL)
+ #define _nss_mdns_gethostbyname2_r _nss_mdns4_minimal_gethostbyname2_r
++#define _nss_mdns_gethostbyname4_r _nss_mdns4_minimal_gethostbyname4_r
+ #define _nss_mdns_gethostbyname_r _nss_mdns4_minimal_gethostbyname_r
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns4_minimal_gethostbyaddr_r
+ #elif defined(NSS_IPV6_ONLY) && ! defined(MDNS_MINIMAL)
+ #define _nss_mdns_gethostbyname2_r _nss_mdns6_gethostbyname2_r
++#define _nss_mdns_gethostbyname4_r _nss_mdns6_gethostbyname4_r
+ #define _nss_mdns_gethostbyname_r _nss_mdns6_gethostbyname_r
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns6_gethostbyaddr_r
+ #elif defined(NSS_IPV6_ONLY) && defined(MDNS_MINIMAL)
+ #define _nss_mdns_gethostbyname2_r _nss_mdns6_minimal_gethostbyname2_r
++#define _nss_mdns_gethostbyname4_r _nss_mdns6_minimal_gethostbyname4_r
+ #define _nss_mdns_gethostbyname_r _nss_mdns6_minimal_gethostbyname_r
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns6_minimal_gethostbyaddr_r
+ #elif defined(MDNS_MINIMAL)
+ #define _nss_mdns_gethostbyname2_r _nss_mdns_minimal_gethostbyname2_r
++#define _nss_mdns_gethostbyname4_r _nss_mdns_minimal_gethostbyname4_r
+ #define _nss_mdns_gethostbyname_r _nss_mdns_minimal_gethostbyname_r
+ #define _nss_mdns_gethostbyaddr_r _nss_mdns_minimal_gethostbyaddr_r
+ #endif
+@@ -81,6 +86,12 @@
+ char *name[MAX_ENTRIES];
+ } data;
+ };
++struct user_gai_buf {
++ struct gaih_addrtuple *list_base;
++ int list_size;
++ int list_idx;
++ int wrote_name;
++};
+
+ #ifndef NSS_IPV6_ONLY
+ static void ipv4_callback(const ipv4_address_t *ipv4, void *userdata) {
+@@ -93,6 +104,21 @@
+ u->data.ipv4[u->count++] = *ipv4;
+ u->data_len += sizeof(ipv4_address_t);
+ }
++static void ipv4_gai_callback(const ipv4_address_t *ipv4, void *userdata) {
++ struct user_gai_buf *u = userdata;
++ assert(ipv4 && userdata);
++
++ if (u->list_idx+1 >= u->list_size)
++ return;
++
++ u->list_base[u->list_idx].name = 0;
++ u->list_base[u->list_idx].family = AF_INET;
++ u->list_base[u->list_idx].addr[0] = ipv4->address;
++ u->list_base[u->list_idx].scopeid = 0;
++ if (u->list_idx > 0) u->list_base[u->list_idx-1].next = &u->list_base[u->list_idx];
++ u->list_base[u->list_idx].next = 0;
++ u->list_idx += 1;
++}
+ #endif
+
+ #ifndef NSS_IPV4_ONLY
+@@ -106,6 +132,21 @@
+ u->data.ipv6[u->count++] = *ipv6;
+ u->data_len += sizeof(ipv6_address_t);
+ }
++static void ipv6_gai_callback(const ipv6_address_t *ipv6, void *userdata) {
++ struct user_gai_buf *u = userdata;
++ assert(ipv6 && userdata);
++
++ if (u->list_idx+1 >= u->list_size)
++ return;
++
++ u->list_base[u->list_idx].name = 0;
++ u->list_base[u->list_idx].family = AF_INET6;
++ memcpy(u->list_base[u->list_idx].addr, ipv6->address, sizeof(u->list_base[u->list_idx].addr));
++ u->list_base[u->list_idx].scopeid = ipv6->if_idx;
++ if (u->list_idx > 0) u->list_base[u->list_idx-1].next = &u->list_base[u->list_idx];
++ u->list_base[u->list_idx].next = 0;
++ u->list_idx += 1;
++}
+ #endif
+
+ static void name_callback(const char*name, void *userdata) {
+@@ -538,6 +579,265 @@
+
+ status = NSS_STATUS_SUCCESS;
+
++finish:
++#ifdef ENABLE_LEGACY
++ if (fd >= 0)
++ close(fd);
++#endif
++
++ return status;
++}
++
++enum nss_status _nss_mdns_gethostbyname4_r(
++ const char *name,
++ struct gaih_addrtuple **pat,
++ char *buffer,
++ size_t buflen,
++ int *errnop,
++ int *h_errnop,
++ int32_t *ttlp) {
++
++ struct user_gai_buf u;
++ enum nss_status status = NSS_STATUS_UNAVAIL;
++ int i;
++ size_t l, idx;
++ void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata);
++ void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata);
++ int name_allowed;
++ int af = AF_UNSPEC;
++
++#ifdef ENABLE_AVAHI
++ int avahi_works = 1;
++ void * data[32];
++#endif
++
++#ifdef ENABLE_LEGACY
++ int fd = -1;
++#endif
++
++ if (pat) {
++ af = (*pat)->family;
++ }
++
++/* DEBUG_TRAP; */
++
++#ifdef NSS_IPV6_ONLY
++ if (af == AF_UNSPEC)
++ af = AF_INET6;
++#endif
++
++#ifdef NSS_IPV4_ONLY
++ if (af == AF_UNSPEC)
++ af = AF_INET;
++#endif
++
++#ifdef NSS_IPV4_ONLY
++ if (af != AF_INET)
++#elif NSS_IPV6_ONLY
++ if (af != AF_INET6)
++#else
++ if (af != AF_INET && af != AF_INET6 && af != AF_UNSPEC)
++#endif
++ {
++ *errnop = EINVAL;
++ *h_errnop = NO_RECOVERY;
++
++ goto finish;
++ }
++
++ if (buflen <
++ sizeof(struct gaih_addrtuple)) {
++
++ *errnop = ERANGE;
++ *h_errnop = NO_RECOVERY;
++ status = NSS_STATUS_TRYAGAIN;
++
++ goto finish;
++ }
++
++ u.list_base = (struct user_gai_buf*) buffer;
++ u.list_size = buflen / sizeof( struct user_gai_buf );
++ u.list_idx = 0;
++ u.wrote_name = 0;
++
++#ifdef NSS_IPV6_ONLY
++ ipv4_func = NULL;
++#else
++ ipv4_func = (af == AF_INET || af == AF_UNSPEC) ? ipv4_gai_callback : NULL;
++#endif
++
++#ifdef NSS_IPV4_ONLY
++ ipv6_func = NULL;
++#else
++ ipv6_func = (af == AF_INET6 || af == AF_UNSPEC) ? ipv6_gai_callback : NULL;
++#endif
++
++ name_allowed = verify_name_allowed(name);
++
++#ifdef ENABLE_AVAHI
++
++ if (avahi_works && name_allowed) {
++ int r;
++
++ if (af == AF_INET || af == AF_UNSPEC) {
++ if ((r = avahi_resolve_name(AF_INET, name, data)) < 0)
++ avahi_works = 0;
++ else if (r == 0) {
++ if (ipv4_func) {
++ ipv4_func((ipv4_address_t*) data, &u);
++ }
++ }
++ else
++ status = NSS_STATUS_NOTFOUND;
++ }
++ if (af == AF_INET6 || af == AF_UNSPEC) {
++ if ((r = avahi_resolve_name(AF_INET6, name, data)) < 0)
++ avahi_works = 0;
++ else if (r == 0) {
++ if (ipv6_func)
++ ipv6_func((ipv6_address_t*)data, &u);
++ }
++ else
++ status = NSS_STATUS_NOTFOUND;
++ }
++ }
++
++#ifdef HONOUR_SEARCH_DOMAINS
++ if (u.list_idx == 0 && avahi_works && !ends_with(name, ".")) {
++ char **domains;
++
++ if ((domains = get_search_domains())) {
++ char **p;
++
++ /* Try to concatenate host names */
++ for (p = domains; *p; p++) {
++ int fullnamesize;
++ char *fullname;
++
++ fullnamesize = strlen(name) + strlen(*p) + 2;
++
++ if (!(fullname = malloc(fullnamesize)))
++ break;
++
++ snprintf(fullname, fullnamesize, "%s.%s", name, *p);
++
++ if (verify_name_allowed(fullname)) {
++ int r;
++
++ if (af == AF_INET || af == AF_UNSPEC) {
++ r = avahi_resolve_name(AF_INET, fullname, data);
++
++ if (r < 0) {
++ /* Lookup failed */
++ avahi_works = 0;
++ free(fullname);
++ break;
++ } else if (r == 0) {
++ /* Lookup succeeded */
++ if (ipv4_func)
++ ipv4_func((ipv4_address_t*) data, &u);
++ }
++ }
++ if (af == AF_INET6 || af == AF_UNSPEC) {
++ r = avahi_resolve_name(AF_INET6, fullname, data);
++
++ if (r < 0) {
++ /* Lookup failed */
++ avahi_works = 0;
++ free(fullname);
++ break;
++ } else if (r == 0) {
++ /* Lookup succeeded */
++ if (ipv6_func)
++ ipv6_func((ipv6_address_t*)data, &u);
++ }
++ }
++ free(fullname);
++ if (u.list_idx > 0) break;
++
++ } else
++ free(fullname);
++ }
++
++ free_domains(domains);
++ }
++ }
++#endif /* HONOUR_SEARCH_DOMAINS */
++#endif /* ENABLE_AVAHI */
++
++#if defined(ENABLE_LEGACY) && defined(ENABLE_AVAHI)
++ if (u.list_idx == 0 && !avahi_works)
++#endif
++
++#if defined(ENABLE_LEGACY)
++ {
++ if ((fd = mdns_open_socket()) < 0) {
++ *errnop = errno;
++ *h_errnop = NO_RECOVERY;
++ goto finish;
++ }
++
++ if (name_allowed) {
++ /* Ignore return value */
++ mdns_query_name(fd, name, ipv4_func, ipv6_func, &u);
++
++ if (!u.list_idx)
++ status = NSS_STATUS_NOTFOUND;
++ }
++
++#ifdef HONOUR_SEARCH_DOMAINS
++ if (u.list_idx == 0 && !ends_with(name, ".")) {
++ char **domains;
++
++ /* Try the search domains if the user did not use a traling '.' */
++
++ if ((domains = get_search_domains())) {
++ char **p;
++
++ for (p = domains; *p; p++) {
++ int fullnamesize = 0;
++ char *fullname = NULL;
++
++ fullnamesize = strlen(name) + strlen(*p) + 2;
++ if (!(fullname = malloc(fullnamesize)))
++ break;
++
++ snprintf(fullname, fullnamesize, "%s.%s", name, *p);
++
++ if (verify_name_allowed(fullname)) {
++
++ /* Ignore return value */
++ mdns_query_name(fd, fullname, ipv4_func, ipv6_func, &u);
++
++ if (u.list_idx > 0) {
++ /* We found something, so let's quit */
++ free(fullname);
++ break;
++ } else
++ status = NSS_STATUS_NOTFOUND;
++
++ }
++
++ free(fullname);
++ }
++
++ free_domains(domains);
++ }
++ }
++#endif /* HONOUR_SEARCH_DOMAINS */
++ }
++#endif /* ENABLE_LEGACY */
++
++ if (u.list_idx == 0) {
++ *errnop = ETIMEDOUT;
++ *h_errnop = HOST_NOT_FOUND;
++ goto finish;
++ }
++
++ *pat = (struct gaih_addrtuple*) buffer;
++
++ status = NSS_STATUS_SUCCESS;
++
+ finish:
+ #ifdef ENABLE_LEGACY
+ if (fd >= 0)
+diff -u src/query.c src/query.c
+--- src/query.c 2007-02-09 00:42:23.000000000 +0800
++++ src/query.c 2013-01-04 09:57:03.778972196 +0800
+@@ -263,7 +263,7 @@
+ return n_sent;
+ }
+
+-static int recv_dns_packet(int fd, struct dns_packet **ret_packet, uint8_t *ret_ttl, struct timeval *end) {
++static int recv_dns_packet(int fd, struct dns_packet **ret_packet, uint8_t *ret_ttl, uint32_t *if_idx, struct timeval *end) {
+ struct dns_packet *p= NULL;
+ struct msghdr msg;
+ struct iovec io;
+@@ -286,6 +286,10 @@
+ msg.msg_controllen = sizeof(aux);
+ msg.msg_flags = 0;
+
++#ifndef IP_PKTINFO
++ *if_idx = 0;
++#endif
++
+ for (;;) {
+ ssize_t l;
+ int r;
+@@ -304,6 +308,14 @@
+ *ret_ttl = (uint8_t) (*(uint32_t*) CMSG_DATA(cmsg));
+ break;
+ }
++#ifdef IP_PKTINFO
++ if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO)
++ {
++ *if_idx = ((struct in_pktinfo*) CMSG_DATA(cmsg))->ipi_ifindex;
++ break;
++ }
++#endif
++
+ }
+
+ if (!cmsg)
+@@ -427,9 +439,10 @@
+
+ while (!done) {
+ uint8_t ttl;
++ uint32_t if_idx;
+ int r;
+
+- if ((r = recv_dns_packet(fd, &p, &ttl, &end)) < 0)
++ if ((r = recv_dns_packet(fd, &p, &ttl, &if_idx, &end)) < 0)
+ return -1;
+ else if (r > 0) /* timeout */
+ return 1;
+@@ -488,6 +501,7 @@
+ rdlength == sizeof(ipv6_address_t)) {
+
+ ipv6_address_t ipv6;
++ ipv6.if_idx = if_idx;
+
+ if (dns_packet_consume_bytes(p, &ipv6, sizeof(ipv6_address_t)) < 0)
+ break;
+@@ -584,9 +598,10 @@
+
+ while (!done) {
+ uint8_t ttl;
++ uint32_t if_idx;
+ int r;
+
+- if ((r = recv_dns_packet(fd, &p, &ttl, &end)) < 0)
++ if ((r = recv_dns_packet(fd, &p, &ttl, &if_idx, &end)) < 0)
+ return -1;
+ else if (r > 0) /* timeout */
+ return 1;
+diff -u src/query.h src/query.h
+--- src/query.h 2005-06-21 22:43:23.000000000 +0800
++++ src/query.h 2013-01-03 14:09:22.138018327 +0800
+@@ -30,6 +30,7 @@
+
+ typedef struct {
+ uint8_t address[16];
++ uint32_t if_idx;
+ } ipv6_address_t;
+
diff --git a/sys-auth/nss-mdns/nss-mdns-0.10-r2.ebuild b/sys-auth/nss-mdns/nss-mdns-0.10-r3.ebuild
index 5255cd10c8de..3be4d71072f3 100644
--- a/sys-auth/nss-mdns/nss-mdns-0.10-r2.ebuild
+++ b/sys-auth/nss-mdns/nss-mdns-0.10-r3.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2015 Gentoo Foundation
+# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
@@ -23,7 +23,8 @@ RDEPEND="${RDEPEND}
)"
src_prepare() {
- epatch "${FILESDIR}"/${PN}-0.10-avahi-socket.patch
+ epatch "${FILESDIR}"/${PN}-0.10-avahi-socket.patch \
+ "${FILESDIR}"/${PN}-0.10-ipv6.patch
epatch_user
eautoreconf
}