summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Wegener <swegener@gentoo.org>2007-01-07 14:15:22 +0000
committerSven Wegener <swegener@gentoo.org>2007-01-07 14:15:22 +0000
commit1f635f8af97aaf1cf5e13ccf69402afaa250866d (patch)
tree2c54bdf06c5ccba08ebd302d2ac866b39ef9882d /net-dns/avahi/files
parentRemoved sounds USE flag as package is b0rked (diff)
downloadgentoo-2-1f635f8af97aaf1cf5e13ccf69402afaa250866d.tar.gz
gentoo-2-1f635f8af97aaf1cf5e13ccf69402afaa250866d.tar.bz2
gentoo-2-1f635f8af97aaf1cf5e13ccf69402afaa250866d.zip
Revision bump, pull in a couple of fixes until 0.6.17 is released.
(Portage version: 2.1.2_rc4-r6)
Diffstat (limited to 'net-dns/avahi/files')
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1353.patch13
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1361.patch56
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1363.patch26
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1365.patch258
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1366.patch96
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1370.patch106
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1371.patch15
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1372.patch22
-rw-r--r--net-dns/avahi/files/avahi-0.6.16-svn-1374.patch105
-rw-r--r--net-dns/avahi/files/digest-avahi-0.6.16-r13
10 files changed, 700 insertions, 0 deletions
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1353.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1353.patch
new file mode 100644
index 000000000000..4dc5563be417
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1353.patch
@@ -0,0 +1,13 @@
+Index: avahi-core/dns.c
+===================================================================
+--- avahi-core/dns.c (revision 1352)
++++ avahi-core/dns.c (revision 1353)
+@@ -400,6 +400,8 @@
+ } else
+ return -1;
+ }
++
++ return -1;
+ }
+
+ int avahi_dns_packet_consume_name(AvahiDnsPacket *p, char *ret_name, size_t l) {
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1361.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1361.patch
new file mode 100644
index 000000000000..5b56b3b714f0
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1361.patch
@@ -0,0 +1,56 @@
+Index: avahi-core/socket.c
+===================================================================
+--- avahi-core/socket.c (revision 1360)
++++ avahi-core/socket.c (revision 1361)
+@@ -635,6 +635,9 @@
+ goto fail;
+ }
+
++ if (ms <= 0)
++ goto fail;
++
+ p = avahi_dns_packet_new(ms + AVAHI_DNS_PACKET_EXTRA_SIZE);
+
+ io.iov_base = AVAHI_DNS_PACKET_DATA(p);
+@@ -650,7 +653,14 @@
+ msg.msg_flags = 0;
+
+ if ((l = recvmsg(fd, &msg, 0)) < 0) {
+- avahi_log_warn("recvmsg(): %s", strerror(errno));
++ /* Linux returns EAGAIN when an invalid IP packet has been
++ recieved. We suppress warnings in this case because this might
++ create quite a bit of log traffic on machines with unstable
++ links. (See #60) */
++
++ if (errno != EAGAIN)
++ avahi_log_warn("recvmsg(): %s", strerror(errno));
++
+ goto fail;
+ }
+
+@@ -768,6 +778,9 @@
+ avahi_log_warn("ioctl(): %s", strerror(errno));
+ goto fail;
+ }
++
++ if (ms <= 0)
++ goto fail;
+
+ p = avahi_dns_packet_new(ms + AVAHI_DNS_PACKET_EXTRA_SIZE);
+
+@@ -785,7 +798,14 @@
+ msg.msg_flags = 0;
+
+ if ((l = recvmsg(fd, &msg, 0)) < 0) {
+- avahi_log_warn("recvmsg(): %s", strerror(errno));
++ /* Linux returns EAGAIN when an invalid IP packet has been
++ recieved. We suppress warnings in this case because this might
++ create quite a bit of log traffic on machines with unstable
++ links. (See #60) */
++
++ if (errno != EAGAIN)
++ avahi_log_warn("recvmsg(): %s", strerror(errno));
++
+ goto fail;
+ }
+
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1363.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1363.patch
new file mode 100644
index 000000000000..bb97b40a86ff
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1363.patch
@@ -0,0 +1,26 @@
+Index: avahi-core/socket.c
+===================================================================
+--- avahi-core/socket.c (revision 1362)
++++ avahi-core/socket.c (revision 1363)
+@@ -475,10 +475,10 @@
+ struct iovec io;
+ #ifdef IP_PKTINFO
+ struct cmsghdr *cmsg;
+- uint8_t cmsg_data[CMSG_SPACE(sizeof(struct in_pktinfo))];
++ size_t cmsg_data[( CMSG_SPACE(sizeof(struct in_pktinfo)) / sizeof(size_t)) + 1];
+ #elif defined(IP_SENDSRCADDR)
+ struct cmsghdr *cmsg;
+- uint8_t cmsg_data[CMSG_SPACE(sizeof(struct in_addr))];
++ size_t cmsg_data[( CMSG_SPACE(sizeof(struct in_addr)) / sizeof(size_t)) + 1];
+ #endif
+
+ assert(fd >= 0);
+@@ -565,7 +565,7 @@
+ struct msghdr msg;
+ struct iovec io;
+ struct cmsghdr *cmsg;
+- uint8_t cmsg_data[CMSG_SPACE(sizeof(struct in6_pktinfo))];
++ size_t cmsg_data[(CMSG_SPACE(sizeof(struct in6_pktinfo))/sizeof(size_t)) + 1];
+
+ assert(fd >= 0);
+ assert(p);
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1365.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1365.patch
new file mode 100644
index 000000000000..c3aa8c47f3a2
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1365.patch
@@ -0,0 +1,258 @@
+Index: avahi-core/iface.c
+===================================================================
+--- avahi-core/iface.c (revision 1364)
++++ avahi-core/iface.c (revision 1365)
+@@ -50,9 +50,9 @@
+ assert(a);
+ m = a->monitor;
+
+- if (a->interface->announcing &&
+- m->list_complete &&
++ if (m->list_complete &&
+ avahi_interface_address_is_relevant(a) &&
++ avahi_interface_is_relevant(a->interface) &&
+ !remove_rrs &&
+ m->server->config.publish_addresses &&
+ (m->server->state == AVAHI_SERVER_RUNNING ||
+@@ -67,11 +67,15 @@
+
+ if (avahi_s_entry_group_is_empty(a->entry_group)) {
+ char t[AVAHI_ADDRESS_STR_MAX];
++ AvahiProtocol p;
++
++ p = (a->interface->protocol == AVAHI_PROTO_INET && m->server->config.publish_a_on_ipv6) ||
++ (a->interface->protocol == AVAHI_PROTO_INET6 && m->server->config.publish_aaaa_on_ipv4) ? AVAHI_PROTO_UNSPEC : a->interface->protocol;
++
+ avahi_address_snprint(t, sizeof(t), &a->address);
++ avahi_log_info("Registering new address record for %s on %s.%s.", t, a->interface->hardware->name, p == AVAHI_PROTO_UNSPEC ? "*" : avahi_proto_to_string(p));
+
+- avahi_log_info("Registering new address record for %s on %s.", t, a->interface->hardware->name);
+-
+- if (avahi_server_add_address(m->server, a->entry_group, a->interface->hardware->index, a->interface->protocol, 0, NULL, &a->address) < 0) {
++ if (avahi_server_add_address(m->server, a->entry_group, a->interface->hardware->index, p, 0, NULL, &a->address) < 0) {
+ avahi_log_warn(__FILE__": avahi_server_add_address() failed: %s", avahi_strerror(m->server->error));
+ avahi_s_entry_group_free(a->entry_group);
+ a->entry_group = NULL;
+@@ -171,6 +175,10 @@
+
+ if (!!join == !!i->mcast_joined)
+ return 0;
++
++ if ((i->protocol == AVAHI_PROTO_INET6 && i->monitor->server->fd_ipv6 < 0) ||
++ (i->protocol == AVAHI_PROTO_INET && i->monitor->server->fd_ipv4 < 0))
++ return -1;
+
+ if (join) {
+ AvahiInterfaceAddress *a;
+@@ -186,10 +194,8 @@
+ a = i->addresses;
+
+ /* Hmm, there is no address available. */
+- if (!a) {
+- avahi_log_warn(__FILE__": interface_mdns_mcast_join() called but no local address available.");
++ if (!a)
+ return -1;
+- }
+
+ i->local_mcast_address = a->address;
+ }
+@@ -387,9 +393,9 @@
+
+ avahi_hashmap_insert(m->hashmap, &hw->index, hw);
+
+- if (m->server->fd_ipv4 >= 0)
++ if (m->server->fd_ipv4 >= 0 || m->server->config.publish_a_on_ipv6)
+ avahi_interface_new(m, hw, AVAHI_PROTO_INET);
+- if (m->server->fd_ipv6 >= 0)
++ if (m->server->fd_ipv6 >= 0 || m->server->config.publish_aaaa_on_ipv4)
+ avahi_interface_new(m, hw, AVAHI_PROTO_INET6);
+
+ return hw;
+@@ -426,13 +432,16 @@
+ b = avahi_interface_is_relevant(i);
+
+ if (m->list_complete && b && !i->announcing) {
+- avahi_log_info("New relevant interface %s.%s for mDNS.", i->hardware->name, avahi_proto_to_string(i->protocol));
+-
+ interface_mdns_mcast_join(i, 1);
+
+- i->announcing = 1;
+- avahi_announce_interface(m->server, i);
+- avahi_multicast_lookup_engine_new_interface(m->server->multicast_lookup_engine, i);
++ if (i->mcast_joined) {
++ avahi_log_info("New relevant interface %s.%s for mDNS.", i->hardware->name, avahi_proto_to_string(i->protocol));
++
++ i->announcing = 1;
++ avahi_announce_interface(m->server, i);
++ avahi_multicast_lookup_engine_new_interface(m->server->multicast_lookup_engine, i);
++ }
++
+ } else if (!b && i->announcing) {
+ avahi_log_info("Interface %s.%s no longer relevant for mDNS.", i->hardware->name, avahi_proto_to_string(i->protocol));
+
+@@ -553,7 +562,7 @@
+ assert(i);
+ assert(p);
+
+- if (!avahi_interface_is_relevant(i))
++ if (!i->announcing)
+ return;
+
+ assert(!a || a->proto == i->protocol);
+@@ -575,10 +584,10 @@
+ assert(i);
+ assert(key);
+
+- if (avahi_interface_is_relevant(i))
+- return avahi_query_scheduler_post(i->query_scheduler, key, immediately, ret_id);
+-
+- return 0;
++ if (!i->announcing)
++ return 0;
++
++ return avahi_query_scheduler_post(i->query_scheduler, key, immediately, ret_id);
+ }
+
+ int avahi_interface_withraw_query(AvahiInterface *i, unsigned id) {
+@@ -590,20 +599,20 @@
+ assert(i);
+ assert(record);
+
+- if (avahi_interface_is_relevant(i))
+- return avahi_response_scheduler_post(i->response_scheduler, record, flush_cache, querier, immediately);
+-
+- return 0;
++ if (!i->announcing)
++ return 0;
++
++ return avahi_response_scheduler_post(i->response_scheduler, record, flush_cache, querier, immediately);
+ }
+
+ int avahi_interface_post_probe(AvahiInterface *i, AvahiRecord *record, int immediately) {
+ assert(i);
+ assert(record);
+
+- if (avahi_interface_is_relevant(i))
+- return avahi_probe_scheduler_post(i->probe_scheduler, record, immediately);
++ if (!i->announcing)
++ return 0;
+
+- return 0;
++ return avahi_probe_scheduler_post(i->probe_scheduler, record, immediately);
+ }
+
+ int avahi_dump_caches(AvahiInterfaceMonitor *m, AvahiDumpCallback callback, void* userdata) {
+@@ -625,21 +634,19 @@
+
+ int avahi_interface_is_relevant(AvahiInterface *i) {
+ AvahiInterfaceAddress *a;
+- int relevant_address;
+
+ assert(i);
+
+- relevant_address = 0;
++ if (!i->hardware->flags_ok)
++ return 0;
+
+ for (a = i->addresses; a; a = a->address_next)
+- if (avahi_interface_address_is_relevant(a)) {
+- relevant_address = 1;
+- break;
+- }
++ if (avahi_interface_address_is_relevant(a))
++ return 1;
+
+- return i->hardware->flags_ok && relevant_address;
++ return 0;
+ }
+-
++
+ int avahi_interface_address_is_relevant(AvahiInterfaceAddress *a) {
+ AvahiInterfaceAddress *b;
+ assert(a);
+Index: avahi-core/announce.c
+===================================================================
+--- avahi-core/announce.c (revision 1364)
++++ avahi-core/announce.c (revision 1365)
+@@ -498,7 +498,7 @@
+ assert(i);
+
+ if (send_goodbye)
+- if (avahi_interface_is_relevant(i)) {
++ if (i->announcing) {
+ AvahiEntry *e;
+
+ for (e = s->entries; e; e = e->entries_next)
+Index: avahi-core/core.h
+===================================================================
+--- avahi-core/core.h (revision 1364)
++++ avahi-core/core.h (revision 1365)
+@@ -63,6 +63,8 @@
+ AvahiStringList *browse_domains; /**< Additional browsing domains */
+ int disable_publishing; /**< Disable publishing of any record */
+ int allow_point_to_point; /**< Enable publishing on POINTOPOINT interfaces */
++ int publish_a_on_ipv6; /**< Publish an IPv4 A RR on IPv6 sockets */
++ int publish_aaaa_on_ipv4; /**< Publish an IPv4 A RR on IPv6 sockets */
+ } AvahiServerConfig;
+
+ /** Allocate a new mDNS responder object. */
+@@ -148,6 +150,9 @@
+ /** Set the wide area DNS servers */
+ int avahi_server_set_wide_area_servers(AvahiServer *s, const AvahiAddress *a, unsigned n);
+
++/** Return the current configuration of the server \since 0.6.17 */
++const AvahiServerConfig* avahi_server_get_config(AvahiServer *s);
++
+ AVAHI_C_DECL_END
+
+ #endif
+Index: avahi-core/server.c
+===================================================================
+--- avahi-core/server.c (revision 1364)
++++ avahi-core/server.c (revision 1365)
+@@ -803,7 +803,7 @@
+ avahi_dns_packet_set_field(p, AVAHI_DNS_FIELD_ID, slot->id);
+
+ for (j = s->monitor->interfaces; j; j = j->interface_next)
+- if (avahi_interface_is_relevant(j) &&
++ if (j->announcing &&
+ j != i &&
+ (s->config.reflect_ipv || j->protocol == i->protocol)) {
+
+@@ -884,7 +884,7 @@
+ assert(src_address->proto == dst_address->proto);
+
+ if (!(i = avahi_interface_monitor_get_interface(s->monitor, iface, src_address->proto)) ||
+- !avahi_interface_is_relevant(i)) {
++ !i->announcing) {
+ avahi_log_warn("Recieved packet from invalid interface.");
+ return;
+ }
+@@ -977,7 +977,7 @@
+ }
+
+ if (!(j = avahi_interface_monitor_get_interface(s->monitor, slot->interface, slot->address.proto)) ||
+- !avahi_interface_is_relevant(j))
++ !j->announcing)
+ return;
+
+ /* Patch the original ID into this response */
+@@ -1560,6 +1560,8 @@
+ c->browse_domains = NULL;
+ c->disable_publishing = 0;
+ c->allow_point_to_point = 0;
++ c->publish_aaaa_on_ipv4 = 1;
++ c->publish_a_on_ipv6 = 0;
+
+ return c;
+ }
+@@ -1721,3 +1723,9 @@
+ avahi_wide_area_set_servers(s->wide_area_lookup_engine, a, n);
+ return AVAHI_OK;
+ }
++
++const AvahiServerConfig* avahi_server_get_config(AvahiServer *s) {
++ assert(s);
++
++ return &s->config;
++}
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1366.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1366.patch
new file mode 100644
index 000000000000..8f13aaf50289
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1366.patch
@@ -0,0 +1,96 @@
+Index: avahi-daemon/static-hosts.c
+===================================================================
+--- avahi-daemon/static-hosts.c (revision 1365)
++++ avahi-daemon/static-hosts.c (revision 1366)
+@@ -110,7 +110,9 @@
+ static void add_static_host_to_server(StaticHost *h)
+ {
+ AvahiAddress a;
++ AvahiProtocol p;
+ int err;
++ const AvahiServerConfig *config;
+
+ if (!h->group)
+ if (!(h->group = avahi_s_entry_group_new (avahi_server, entry_group_callback, h))) {
+@@ -123,7 +125,12 @@
+ return;
+ }
+
+- if ((err = avahi_server_add_address(avahi_server, h->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, h->host, &a))) {
++ config = avahi_server_get_config(avahi_server);
++
++ p = (a.proto == AVAHI_PROTO_INET && config->publish_a_on_ipv6) ||
++ (a.proto == AVAHI_PROTO_INET6 && config->publish_aaaa_on_ipv4) ? AVAHI_PROTO_UNSPEC : a.proto;
++
++ if ((err = avahi_server_add_address(avahi_server, h->group, AVAHI_IF_UNSPEC, p, 0, h->host, &a))) {
+ avahi_log_error ("Static host name %s: avahi_server_add_address failure: %s", h->host, avahi_strerror(err));
+ return;
+ }
+Index: avahi-daemon/main.c
+===================================================================
+--- avahi-daemon/main.c (revision 1365)
++++ avahi-daemon/main.c (revision 1366)
+@@ -442,7 +442,7 @@
+ static int is_yes(const char *s) {
+ assert(s);
+
+- return *s == 'y' || *s == 'Y';
++ return *s == 'y' || *s == 'Y' || *s == '1' || *s == 't' || *s == 'T';
+ }
+
+ static int load_config_file(DaemonConfig *c) {
+@@ -541,8 +541,12 @@
+ c->server_config.add_service_cookie = is_yes(p->value);
+ else if (strcasecmp(p->key, "publish-dns-servers") == 0) {
+ avahi_strfreev(c->publish_dns_servers);
+- c->publish_dns_servers = avahi_split_csv(p->value);
+- } else {
++ c->publish_dns_servers = avahi_split_csv(p->value);
++ } else if (strcasecmp(p->key, "publish-a-on-ipv6") == 0)
++ c->server_config.publish_a_on_ipv6 = is_yes(p->value);
++ else if (strcasecmp(p->key, "publish-aaaa-on-ipv4") == 0)
++ c->server_config.publish_aaaa_on_ipv4 = is_yes(p->value);
++ else {
+ avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name);
+ goto finish;
+ }
+Index: avahi-daemon/avahi-daemon.conf
+===================================================================
+--- avahi-daemon/avahi-daemon.conf (revision 1365)
++++ avahi-daemon/avahi-daemon.conf (revision 1366)
+@@ -45,6 +45,8 @@
+ #publish-domain=yes
+ #publish-dns-servers=192.168.50.1, 192.168.50.2
+ #publish-resolv-conf-dns-servers=yes
++#publish-aaaa-on-ipv4=yes
++#publish-a-on-ipv6=no
+
+ [reflector]
+ #enable-reflector=no
+Index: man/avahi-daemon.conf.5.xml.in
+===================================================================
+--- man/avahi-daemon.conf.5.xml.in (revision 1365)
++++ man/avahi-daemon.conf.5.xml.in (revision 1366)
+@@ -223,6 +223,22 @@
+ SIGHUP to have it reload this file. Defaults to "no".</p>
+ </option>
+
++ <option>
++ <p><opt>publish-aaaa-on-ipv4=</opt> Takes a boolean value
++ ("yes" or "no"). If set to "yes" avahi-daemon will publish an
++ IPv6 AAAA record via IPv4, i.e. the local IPv6 addresses can be
++ resolved using an IPv4 transport. Only useful when IPv4 is
++ enabled with <opt>use-ipv4=true</opt>. Defaults to "yes".</p>
++ </option>
++
++ <option>
++ <p><opt>publish-a-on-ipv6=</opt> Takes a boolean value
++ ("yes" or "no"). If set to "yes" avahi-daemon will publish an
++ IPv4 A record via IPv6, i.e. the local IPv4 addresses can be
++ resolved using an IPv6 transport. Only useful when IPv6 is
++ enabled with <opt>use-ipv6=true</opt>. Defaults to "no".</p>
++ </option>
++
+ </section>
+
+ <section name="Section [reflector]">
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1370.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1370.patch
new file mode 100644
index 000000000000..13f6bcdbfc7e
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1370.patch
@@ -0,0 +1,106 @@
+Index: avahi-core/socket.c
+===================================================================
+--- avahi-core/socket.c (revision 1369)
++++ avahi-core/socket.c (revision 1370)
+@@ -560,7 +560,14 @@
+ return sendmsg_loop(fd, &msg, 0);
+ }
+
+-int avahi_send_dns_packet_ipv6(int fd, AvahiIfIndex interface, AvahiDnsPacket *p, const AvahiIPv6Address *src_address, const AvahiIPv6Address *dst_address, uint16_t dst_port) {
++int avahi_send_dns_packet_ipv6(
++ int fd,
++ AvahiIfIndex interface,
++ AvahiDnsPacket *p,
++ const AvahiIPv6Address *src_address,
++ const AvahiIPv6Address *dst_address,
++ uint16_t dst_port) {
++
+ struct sockaddr_in6 sa;
+ struct msghdr msg;
+ struct iovec io;
+@@ -617,7 +624,14 @@
+ return sendmsg_loop(fd, &msg, 0);
+ }
+
+-AvahiDnsPacket *avahi_recv_dns_packet_ipv4(int fd, AvahiIPv4Address *ret_src_address, uint16_t *ret_src_port, AvahiIPv4Address *ret_dst_address, AvahiIfIndex *ret_iface, uint8_t *ret_ttl) {
++AvahiDnsPacket *avahi_recv_dns_packet_ipv4(
++ int fd,
++ AvahiIPv4Address *ret_src_address,
++ uint16_t *ret_src_port,
++ AvahiIPv4Address *ret_dst_address,
++ AvahiIfIndex *ret_iface,
++ uint8_t *ret_ttl) {
++
+ AvahiDnsPacket *p= NULL;
+ struct msghdr msg;
+ struct iovec io;
+@@ -635,8 +649,10 @@
+ goto fail;
+ }
+
+- if (ms <= 0)
++ if (ms < 0) {
++ avahi_log_warn("FIONREAD returned negative value.");
+ goto fail;
++ }
+
+ p = avahi_dns_packet_new(ms + AVAHI_DNS_PACKET_EXTRA_SIZE);
+
+@@ -761,7 +777,14 @@
+ return NULL;
+ }
+
+-AvahiDnsPacket *avahi_recv_dns_packet_ipv6(int fd, AvahiIPv6Address *ret_src_address, uint16_t *ret_src_port, AvahiIPv6Address *ret_dst_address, AvahiIfIndex *ret_iface, uint8_t *ret_ttl) {
++AvahiDnsPacket *avahi_recv_dns_packet_ipv6(
++ int fd,
++ AvahiIPv6Address *ret_src_address,
++ uint16_t *ret_src_port,
++ AvahiIPv6Address *ret_dst_address,
++ AvahiIfIndex *ret_iface,
++ uint8_t *ret_ttl) {
++
+ AvahiDnsPacket *p = NULL;
+ struct msghdr msg;
+ struct iovec io;
+@@ -779,8 +802,10 @@
+ goto fail;
+ }
+
+- if (ms <= 0)
++ if (ms < 0) {
++ avahi_log_warn("FIONREAD returned negative value.");
+ goto fail;
++ }
+
+ p = avahi_dns_packet_new(ms + AVAHI_DNS_PACKET_EXTRA_SIZE);
+
+@@ -860,7 +885,7 @@
+
+ assert(found_iface);
+ assert(found_ttl);
+-
++
+ return p;
+
+ fail:
+@@ -912,13 +937,19 @@
+
+ int avahi_open_unicast_socket_ipv6(void) {
+ struct sockaddr_in6 local;
+- int fd = -1;
++ int fd = -1, yes;
+
+ if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
+ avahi_log_warn("socket() failed: %s", strerror(errno));
+ goto fail;
+ }
+
++ yes = 1;
++ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes)) < 0) {
++ avahi_log_warn("IPV6_V6ONLY failed: %s", strerror(errno));
++ goto fail;
++ }
++
+ memset(&local, 0, sizeof(local));
+ local.sin6_family = AF_INET6;
+
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1371.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1371.patch
new file mode 100644
index 000000000000..e17900fc0183
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1371.patch
@@ -0,0 +1,15 @@
+Index: avahi-core/wide-area.c
+===================================================================
+--- avahi-core/wide-area.c (revision 1370)
++++ avahi-core/wide-area.c (revision 1371)
+@@ -579,8 +579,8 @@
+ e->cleanup_dead = 0;
+
+ /* Create sockets */
+- e->fd_ipv4 = avahi_open_unicast_socket_ipv4();
+- e->fd_ipv6 = avahi_open_unicast_socket_ipv6();
++ e->fd_ipv4 = s->config.use_ipv4 ? avahi_open_unicast_socket_ipv4() : -1;
++ e->fd_ipv6 = s->config.use_ipv6 ? avahi_open_unicast_socket_ipv6() : -1;
+
+ if (e->fd_ipv4 < 0 && e->fd_ipv6 < 0) {
+ avahi_log_error(__FILE__": Failed to create wide area sockets: %s", strerror(errno));
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1372.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1372.patch
new file mode 100644
index 000000000000..ff4b7ad0d004
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1372.patch
@@ -0,0 +1,22 @@
+Index: avahi-daemon/static-hosts.c
+===================================================================
+--- avahi-daemon/static-hosts.c (revision 1371)
++++ avahi-daemon/static-hosts.c (revision 1372)
+@@ -116,7 +116,7 @@
+
+ if (!h->group)
+ if (!(h->group = avahi_s_entry_group_new (avahi_server, entry_group_callback, h))) {
+- avahi_log_error("avahi_s_entry_group_new() failed: %s", avahi_strerror(err));
++ avahi_log_error("avahi_s_entry_group_new() failed: %s", avahi_strerror(avahi_server_errno(avahi_server)));
+ return;
+ }
+
+@@ -130,7 +130,7 @@
+ p = (a.proto == AVAHI_PROTO_INET && config->publish_a_on_ipv6) ||
+ (a.proto == AVAHI_PROTO_INET6 && config->publish_aaaa_on_ipv4) ? AVAHI_PROTO_UNSPEC : a.proto;
+
+- if ((err = avahi_server_add_address(avahi_server, h->group, AVAHI_IF_UNSPEC, p, 0, h->host, &a))) {
++ if ((err = avahi_server_add_address(avahi_server, h->group, AVAHI_IF_UNSPEC, p, 0, h->host, &a)) < 0) {
+ avahi_log_error ("Static host name %s: avahi_server_add_address failure: %s", h->host, avahi_strerror(err));
+ return;
+ }
diff --git a/net-dns/avahi/files/avahi-0.6.16-svn-1374.patch b/net-dns/avahi/files/avahi-0.6.16-svn-1374.patch
new file mode 100644
index 000000000000..89397fe4279d
--- /dev/null
+++ b/net-dns/avahi/files/avahi-0.6.16-svn-1374.patch
@@ -0,0 +1,105 @@
+Index: avahi-compat-libdns_sd/compat.c
+===================================================================
+--- avahi-compat-libdns_sd/compat.c (revision 1373)
++++ avahi-compat-libdns_sd/compat.c (revision 1374)
+@@ -469,25 +469,26 @@
+ }
+
+ int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdref) {
++
++ AVAHI_WARN_LINKAGE;
++
+ if (!sdref || sdref->n_ref <= 0)
+ return -1;
+
+- AVAHI_WARN_LINKAGE;
+-
+ return sdref->main_fd;
+ }
+
+ DNSServiceErrorType DNSSD_API DNSServiceProcessResult(DNSServiceRef sdref) {
+ DNSServiceErrorType ret = kDNSServiceErr_Unknown;
+
+- assert(sdref);
+- assert(sdref->n_ref >= 1);
+-
+ AVAHI_WARN_LINKAGE;
+
++ if (!sdref || sdref->n_ref <= 0)
++ return kDNSServiceErr_BadParam;
++
++ sdref_ref(sdref);
++
+ ASSERT_SUCCESS(pthread_mutex_lock(&sdref->mutex));
+-
+- sdref_ref(sdref);
+
+ /* Cleanup notification socket */
+ if (read_command(sdref->main_fd) != COMMAND_POLL_DONE)
+@@ -512,10 +513,10 @@
+
+ finish:
+
++ ASSERT_SUCCESS(pthread_mutex_unlock(&sdref->mutex));
++
+ sdref_unref(sdref);
+
+- ASSERT_SUCCESS(pthread_mutex_unlock(&sdref->mutex));
+-
+ return ret;
+ }
+
+@@ -613,7 +614,6 @@
+
+ if (!ret_sdref)
+ return kDNSServiceErr_BadParam;
+-
+ *ret_sdref = NULL;
+
+ assert(regtype);
+@@ -739,7 +739,10 @@
+
+ AVAHI_WARN_LINKAGE;
+
+- assert(ret_sdref);
++ if (!ret_sdref)
++ return kDNSServiceErr_BadParam;
++ *ret_sdref = NULL;
++
+ assert(name);
+ assert(regtype);
+ assert(domain);
+@@ -853,7 +856,10 @@
+
+ AVAHI_WARN_LINKAGE;
+
+- assert(ret_sdref);
++ if (!ret_sdref)
++ return kDNSServiceErr_BadParam;
++ *ret_sdref = NULL;
++
+ assert(callback);
+
+ if (interface == kDNSServiceInterfaceIndexLocalOnly ||
+@@ -1096,7 +1102,6 @@
+
+ if (!ret_sdref)
+ return kDNSServiceErr_BadParam;
+-
+ *ret_sdref = NULL;
+
+ if (!regtype)
+@@ -1210,10 +1215,12 @@
+
+ int ret = kDNSServiceErr_Unknown;
+ AvahiStringList *txt = NULL;
+- assert(sdref);
+
+ AVAHI_WARN_LINKAGE;
+
++ if (!sdref || sdref->n_ref <= 0)
++ return kDNSServiceErr_BadParam;
++
+ if (flags || rref) {
+ AVAHI_WARN_UNSUPPORTED;
+ return kDNSServiceErr_Unsupported;
diff --git a/net-dns/avahi/files/digest-avahi-0.6.16-r1 b/net-dns/avahi/files/digest-avahi-0.6.16-r1
new file mode 100644
index 000000000000..5917dd6b84d0
--- /dev/null
+++ b/net-dns/avahi/files/digest-avahi-0.6.16-r1
@@ -0,0 +1,3 @@
+MD5 3cbc460bbd55bae35f7b57443c063640 avahi-0.6.16.tar.gz 891970
+RMD160 0106c3082867715052b416e3c761d8f052de00a0 avahi-0.6.16.tar.gz 891970
+SHA256 794d4d1c485d4dc24659a25feb92706eb8bff4552333a1df83e856db123c36ce avahi-0.6.16.tar.gz 891970