- a = RTA_NEXT(a, l);
- }
-
- check_hw_interface_relevant(m, hw);
- update_hw_interface_rr(m, hw, 0);
-
- } else if (n->nlmsg_type == RTM_DELLINK) {
- struct ifinfomsg *ifinfomsg = NLMSG_DATA(n);
- AvahiHwInterface *hw;
-
- if (ifinfomsg->ifi_family != AF_UNSPEC)
- return;
-
- if (!(hw = avahi_interface_monitor_get_hw_interface(m, (AvahiIfIndex) ifinfomsg->ifi_index)))
- return;
-
- free_hw_interface(m, hw, 0);
-
- } else if (n->nlmsg_type == RTM_NEWADDR || n->nlmsg_type == RTM_DELADDR) {
-
- struct ifaddrmsg *ifaddrmsg = NLMSG_DATA(n);
- AvahiInterface *i;
- struct rtattr *a = NULL;
- size_t l;
- AvahiAddress raddr;
- int raddr_valid = 0;
-
- if (ifaddrmsg->ifa_family != AVAHI_PROTO_INET && ifaddrmsg->ifa_family != AVAHI_PROTO_INET6)
- return;
-
- if (!(i = (AvahiInterface*) avahi_interface_monitor_get_interface(m, (AvahiIfIndex) ifaddrmsg->ifa_index, (AvahiProtocol) ifaddrmsg->ifa_family)))
- return;
-
- raddr.family = (AvahiProtocol) ifaddrmsg->ifa_family;
-
- l = NLMSG_PAYLOAD(n, sizeof(struct ifaddrmsg));
- a = IFA_RTA(ifaddrmsg);
-
- while (RTA_OK(a, l)) {
-
- switch(a->rta_type) {
- case IFA_ADDRESS:
- if ((raddr.family == AVAHI_PROTO_INET6 && RTA_PAYLOAD(a) != 16) ||
- (raddr.family == AVAHI_PROTO_INET && RTA_PAYLOAD(a) != 4))
- return;
-
- memcpy(raddr.data.data, RTA_DATA(a), RTA_PAYLOAD(a));
- raddr_valid = 1;
-
- break;
-
- default:
- ;
- }
-
- a = RTA_NEXT(a, l);
- }
-
- if (!raddr_valid)
- return;
-
- if (n->nlmsg_type == RTM_NEWADDR) {
- AvahiInterfaceAddress *addr;
-
- if (!(addr = get_address(m, i, &raddr))) {
- if (!(addr = avahi_new(AvahiInterfaceAddress, 1)))
- return; /* OOM */
-
- addr->monitor = m;
- addr->address = raddr;
- addr->interface = i;
- addr->entry_group = NULL;
-
- AVAHI_LLIST_PREPEND(AvahiInterfaceAddress, address, i->addresses, addr);
- }
-
- addr->flags = ifaddrmsg->ifa_flags;
- addr->scope = ifaddrmsg->ifa_scope;
- addr->prefix_len = ifaddrmsg->ifa_prefixlen;
- } else {
- AvahiInterfaceAddress *addr;
-
- if (!(addr = get_address(m, i, &raddr)))
- return;
-
- free_address(m, addr);
- }
-
- check_interface_relevant(m, i);
- update_interface_rr(m, i, 0);
-
- } else if (n->nlmsg_type == NLMSG_DONE) {
-
- if (m->list == LIST_IFACE) {
-
- if (netlink_list_items(m->netlink, RTM_GETADDR, &m->query_addr_seq) < 0) {
- avahi_log_warn("NETLINK: Failed to list addrs: %s", strerror(errno));
- m->list = LIST_DONE;
- } else
- m->list = LIST_ADDR;
-
- } 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.");
- }
-
- } else if (n->nlmsg_type == NLMSG_ERROR && (n->nlmsg_seq == m->query_link_seq || n->nlmsg_seq == m->query_addr_seq)) {
- struct nlmsgerr *e = NLMSG_DATA (n);
-
- if (e->error)
- avahi_log_warn("NETLINK: Failed to browse: %s", strerror(-e->error));
- }