+ if (ioctl(fd, SIOCGLIFMTU, &lifrcopy) < 0) {
+ avahi_log_error(__FILE__": ioctl(SIOCGLIFMTU) %s", strerror(errno));
+ return;
+ }
+ mtu = lifrcopy.lifr_metric;
+
+ if (ioctl(fd, SIOCGLIFADDR, &lifrcopy) < 0) {
+ avahi_log_error(__FILE__": ioctl(SIOCGLIFADDR) %s", strerror(errno));
+ return;
+ }
+ addr.proto = avahi_af_to_proto(lifreq->lifr_addr.ss_family);
+ if (ioctl(fd, SIOCGLIFNETMASK, &lifrcopy) < 0) {
+ avahi_log_error(__FILE__": ioctl(SIOCGLIFNETMASK) %s", strerror(errno));
+ return;
+ }
+ switch (lifreq->lifr_addr.ss_family) {
+ case AF_INET:
+ memcpy(addr.data.data, &((struct sockaddr_in *)&lifreq->lifr_addr)->sin_addr, sizeof(struct in_addr));
+ memcpy(&mask, &((struct sockaddr_in *)&lifrcopy.lifr_addr)->sin_addr, sizeof(struct in_addr));
+ prefixlen = bitcount((unsigned int) mask.sin_addr.s_addr);
+ break;
+ case AF_INET6:
+ memcpy(addr.data.data, &((struct sockaddr_in6 *)&lifreq->lifr_addr)->sin6_addr, sizeof(struct in6_addr));
+ memcpy(&mask6, &((struct sockaddr_in6 *)&lifrcopy.lifr_addr)->sin6_addr, sizeof(struct in6_addr));
+ prefixlen = lifrcopy.lifr_addrlen;
+ break;
+ default:
+ break;
+ }
+ index = if_nametoindex(lifreq->lifr_name);
+
+ if (!(hw = avahi_interface_monitor_get_hw_interface(m, (AvahiIfIndex) index))) {
+ if (!(hw = avahi_hw_interface_new(m, (AvahiIfIndex) index)))
+ return; /* OOM */
+
+ hw->flags_ok =
+ (flags & IFF_UP) &&
+ (!m->server->config.use_iff_running || (flags & IFF_RUNNING)) &&
+ !(flags & IFF_LOOPBACK) &&
+ (flags & IFF_MULTICAST) &&
+ (m->server->config.allow_point_to_point || !(flags & IFF_POINTOPOINT));
+ hw->name = avahi_strdup(lifreq->lifr_name);
+ hw->mtu = mtu;
+ /* TODO get mac address */
+ }
+
+ if (!(iface = avahi_interface_monitor_get_interface(m, (AvahiIfIndex)index, addr.proto)))
+ return;
+
+ if (!(addriface = avahi_interface_monitor_get_address(m, iface, &addr)))
+ if (!(addriface = avahi_interface_address_new(m, iface, &addr, prefixlen)))
+ return; /* OOM */
+
+ addriface->global_scope = 1;
+
+ avahi_hw_interface_check_relevant(hw);
+ avahi_hw_interface_update_rrs(hw, 0);