X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fiface.c;h=7afd2513f472d9a10e9a9fc691c336ca287c71a3;hb=9aa4773acbfadbcf95aaf0063510f8be8ddcbd86;hp=04d0bc986d8713dccf781643646ec4421624262f;hpb=a3f8ceb929420a0be2b2c8341382fdfe0a50b859;p=catta diff --git a/avahi-core/iface.c b/avahi-core/iface.c index 04d0bc9..7afd251 100644 --- a/avahi-core/iface.c +++ b/avahi-core/iface.c @@ -25,9 +25,9 @@ #include #include -#include #include #include +#include #include #include @@ -64,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); @@ -83,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 && @@ -187,9 +187,9 @@ void avahi_interface_free(AvahiInterface *i, int send_goodbye) { assert(i); /* Handle goodbyes and remove announcers */ - avahi_goodbye_interface(i->monitor->server, i, send_goodbye); + avahi_goodbye_interface(i->monitor->server, i, send_goodbye, 1); avahi_response_scheduler_force(i->response_scheduler); - assert(!i->announcements); + assert(!i->announcers); /* Remove queriers */ avahi_querier_free_all(i); @@ -246,7 +246,7 @@ AvahiInterface* avahi_interface_new(AvahiInterfaceMonitor *m, AvahiHwInterface * i->announcing = 0; AVAHI_LLIST_HEAD_INIT(AvahiInterfaceAddress, i->addresses); - AVAHI_LLIST_HEAD_INIT(AvahiAnnouncement, i->announcements); + AVAHI_LLIST_HEAD_INIT(AvahiAnnouncer, i->announcers); AVAHI_LLIST_HEAD_INIT(AvahiQuerier, i->queriers); i->queriers_by_key = avahi_hashmap_new((AvahiHashFunc) avahi_key_hash, (AvahiEqualFunc) avahi_key_equal, NULL, NULL); @@ -331,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; @@ -343,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); @@ -354,12 +375,9 @@ 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); + avahi_goodbye_interface(m->server, i, 0, 1); avahi_querier_free_all(i); avahi_response_scheduler_clear(i->response_scheduler); @@ -472,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;