X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fiface.c;h=7afd2513f472d9a10e9a9fc691c336ca287c71a3;hb=9aa4773acbfadbcf95aaf0063510f8be8ddcbd86;hp=2b11e5ffee2619d3aa03c19e7fe2376264b2057b;hpb=e59d53a034f0cfdede9c439d1fd7e5f25aea5802;p=catta diff --git a/avahi-core/iface.c b/avahi-core/iface.c index 2b11e5f..7afd251 100644 --- a/avahi-core/iface.c +++ b/avahi-core/iface.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -63,7 +64,7 @@ void avahi_interface_address_update_rrs(AvahiInterfaceAddress *a, int remove_rrs return; if (avahi_s_entry_group_is_empty(a->entry_group)) { - char t[64]; + char t[AVAHI_ADDRESS_STR_MAX]; avahi_address_snprint(t, sizeof(t), &a->address); avahi_log_info("Registering new address %s on %s.", t, a->interface->hardware->name); @@ -82,7 +83,7 @@ void avahi_interface_address_update_rrs(AvahiInterfaceAddress *a, int remove_rrs /* Clear the entry group */ if (a->entry_group && !avahi_s_entry_group_is_empty(a->entry_group)) { - char t[64]; + char t[AVAHI_ADDRESS_STR_MAX]; avahi_address_snprint(t, sizeof(t), &a->address); if (avahi_s_entry_group_get_state(a->entry_group) == AVAHI_ENTRY_GROUP_REGISTERING && @@ -330,6 +331,30 @@ AvahiInterfaceAddress *avahi_interface_address_new(AvahiInterfaceMonitor *m, Ava return a; } +static int interface_mdns_mcast_join(AvahiInterface *i, int join) { + + if (i->protocol == AVAHI_PROTO_INET6) + return avahi_mdns_mcast_join_ipv6(i->monitor->server->fd_ipv6, i->hardware->index, join); + else if (i->protocol == AVAHI_PROTO_INET) { + +#ifdef HAVE_STRUCT_IP_MREQN + return avahi_mdns_mcast_join_ipv4(i->monitor->server->fd_ipv4, i->hardware->index, join); + +#else + AvahiInterfaceAddress *ia; + int r = 0; + + for (ia = i->addresses; ia; ia = ia->address_next) + r |= avahi_mdns_mcast_join_ipv4(i->monitor->server->fd_ipv4, &ia->address, join); + + return r; +#endif + } + + abort(); +} + + void avahi_interface_check_relevant(AvahiInterface *i) { int b; AvahiInterfaceMonitor *m; @@ -342,10 +367,7 @@ void avahi_interface_check_relevant(AvahiInterface *i) { if (m->list_complete && b && !i->announcing) { avahi_log_info("New relevant interface %s.%s.", i->hardware->name, avahi_proto_to_string(i->protocol)); - if (i->protocol == AVAHI_PROTO_INET) - avahi_mdns_mcast_join_ipv4(m->server->fd_ipv4, i->hardware->index); - if (i->protocol == AVAHI_PROTO_INET6) - avahi_mdns_mcast_join_ipv6(m->server->fd_ipv6, i->hardware->index); + interface_mdns_mcast_join(i, 1); i->announcing = 1; avahi_announce_interface(m->server, i); @@ -353,10 +375,7 @@ void avahi_interface_check_relevant(AvahiInterface *i) { } else if (!b && i->announcing) { avahi_log_info("Interface %s.%s no longer relevant.", i->hardware->name, avahi_proto_to_string(i->protocol)); - if (i->protocol == AVAHI_PROTO_INET) - avahi_mdns_mcast_leave_ipv4(m->server->fd_ipv4, i->hardware->index); - if (i->protocol == AVAHI_PROTO_INET6) - avahi_mdns_mcast_leave_ipv6(m->server->fd_ipv6, i->hardware->index); + interface_mdns_mcast_join(i, 0); avahi_goodbye_interface(m->server, i, 0, 1); avahi_querier_free_all(i); @@ -471,7 +490,7 @@ AvahiInterfaceAddress* avahi_interface_monitor_get_address(AvahiInterfaceMonitor void avahi_interface_send_packet_unicast(AvahiInterface *i, AvahiDnsPacket *p, const AvahiAddress *a, uint16_t port) { assert(i); assert(p); -/* char t[64]; */ +/* char t[AVAHI_ADDRESS_STR_MAX]; */ if (!avahi_interface_is_relevant(i)) return;