diff options
Diffstat (limited to 'avahi-core/iface.c')
| -rw-r--r-- | avahi-core/iface.c | 38 | 
1 files changed, 24 insertions, 14 deletions
diff --git a/avahi-core/iface.c b/avahi-core/iface.c index 9b17e40..f60224b 100644 --- a/avahi-core/iface.c +++ b/avahi-core/iface.c @@ -47,7 +47,8 @@ static void update_address_rr(AvahiInterfaceMonitor *m, AvahiInterfaceAddress *a      assert(m);      assert(a); -    if (avahi_interface_address_relevant(a) && +    if (m->list == LIST_DONE && +        avahi_interface_address_relevant(a) &&          !remove_rrs &&          m->server->config.publish_addresses &&          (m->server->state == AVAHI_SERVER_RUNNING || @@ -112,7 +113,8 @@ static void update_hw_interface_rr(AvahiInterfaceMonitor *m, AvahiHwInterface *h      for (i = hw->interfaces; i; i = i->by_hardware_next)          update_interface_rr(m, i, remove_rrs); -    if (!remove_rrs && +    if (m->list == LIST_DONE && +        !remove_rrs &&          m->server->config.publish_workstation &&          (m->server->state == AVAHI_SERVER_RUNNING ||          m->server->state == AVAHI_SERVER_REGISTERING)) { @@ -302,7 +304,7 @@ static void check_interface_relevant(AvahiInterfaceMonitor *m, AvahiInterface *i      b = avahi_interface_relevant(i); -    if (b && !i->announcing) { +    if (m->list == LIST_DONE && b && !i->announcing) {          avahi_log_info("New relevant interface %s.%i.", i->hardware->name, i->protocol);          if (i->protocol == AVAHI_PROTO_INET) @@ -341,6 +343,14 @@ static void check_hw_interface_relevant(AvahiInterfaceMonitor *m, AvahiHwInterfa          check_interface_relevant(m, i);  } +static void check_all_interfaces_relevant(AvahiInterfaceMonitor *m) { +    AvahiInterface *i; +    assert(m); + +    for (i = m->interfaces; i; i = i->interface_next) +        check_interface_relevant(m, i); +} +  static void netlink_callback(AvahiNetlink *nl, struct nlmsghdr *n, void* userdata) {      AvahiInterfaceMonitor *m = userdata; @@ -427,7 +437,6 @@ static void netlink_callback(AvahiNetlink *nl, struct nlmsghdr *n, void* userdat          if (!(hw = avahi_interface_monitor_get_hw_interface(m, (AvahiIfIndex) ifinfomsg->ifi_index)))              return; -        update_hw_interface_rr(m, hw, 1);          free_hw_interface(m, hw, 0);      } else if (n->nlmsg_type == RTM_NEWADDR || n->nlmsg_type == RTM_DELADDR) { @@ -491,33 +500,35 @@ static void netlink_callback(AvahiNetlink *nl, struct nlmsghdr *n, void* userdat              addr->flags = ifaddrmsg->ifa_flags;              addr->scope = ifaddrmsg->ifa_scope;              addr->prefix_len = ifaddrmsg->ifa_prefixlen; - -            update_interface_rr(m, addr->interface, 0);          } else {              AvahiInterfaceAddress *addr;              if (!(addr = get_address(m, i, &raddr)))                  return; -            update_address_rr(m, addr, 1);              free_address(m, addr); - -            update_interface_rr(m, addr->interface, 0); /* if this address was removed another might becomes usable instead */          } +        update_interface_rr(m, i, 0);          check_interface_relevant(m, i);      } else if (n->nlmsg_type == NLMSG_DONE) {          if (m->list == LIST_IFACE) { -            m->list = LIST_DONE; -            if (netlink_list_items(m->netlink, RTM_GETADDR, &m->query_addr_seq) < 0) +            if (netlink_list_items(m->netlink, RTM_GETADDR, &m->query_addr_seq) < 0) {                  avahi_log_warn("NETLINK: Failed to list addrs: %s", strerror(errno)); -            else +                m->list = LIST_DONE; +            } else                  m->list = LIST_ADDR; -        } else { + +        } else +            /* We're through */              m->list = LIST_DONE; + +        if (m->list == LIST_DONE) { +            check_all_interfaces_relevant(m); +            avahi_update_host_rrs(m, 0);              avahi_log_info("Network interface enumeration completed.");          } @@ -741,7 +752,6 @@ int avahi_interface_address_relevant(AvahiInterfaceAddress *a) {      return 0;  } -  int avahi_interface_match(AvahiInterface *i, AvahiIfIndex idx, AvahiProtocol protocol) {      assert(i);  | 
