+
+void avahi_update_host_rrs(AvahiInterfaceMonitor *m, int remove_rrs) {
+ AvahiHwInterface *hw;
+
+ assert(m);
+
+ for (hw = m->hw_interfaces; hw; hw = hw->hardware_next)
+ update_hw_interface_rr(m, hw, remove_rrs);
+}
+
+int avahi_address_is_local(AvahiInterfaceMonitor *m, const AvahiAddress *a) {
+ AvahiInterface *i;
+ AvahiInterfaceAddress *ia;
+ assert(m);
+ assert(a);
+
+ for (i = m->interfaces; i; i = i->interface_next)
+ for (ia = i->addresses; ia; ia = ia->address_next)
+ if (avahi_address_cmp(a, &ia->address) == 0)
+ return 1;
+
+ return 0;
+}
+
+int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a) {
+ AvahiInterfaceAddress *ia;
+
+ assert(i);
+ assert(a);
+
+ if (a->proto != i->protocol)
+ return 0;
+
+ for (ia = i->addresses; ia; ia = ia->address_next) {
+
+ if (a->proto == AVAHI_PROTO_INET) {
+ uint32_t m;
+
+ m = ~(((uint32_t) -1) >> ia->prefix_len);
+
+ if ((ntohl(a->data.ipv4.address) & m) == (ntohl(ia->address.data.ipv4.address) & m))
+ return 1;
+ } else {
+ unsigned j;
+ unsigned char pl;
+ assert(a->proto == AVAHI_PROTO_INET6);
+
+ pl = ia->prefix_len;
+
+ for (j = 0; j < 16; j++) {
+ uint8_t m;
+
+ if (pl == 0)
+ return 1;
+
+ if (pl >= 8) {
+ m = 0xFF;
+ pl -= 8;
+ } else {
+ m = ~(0xFF >> pl);
+ pl = 0;
+ }
+
+ if ((a->data.ipv6.address[j] & m) != (ia->address.data.ipv6.address[j] & m))
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int avahi_interface_has_address(AvahiInterfaceMonitor *m, AvahiIfIndex iface, const AvahiAddress *a) {
+ AvahiInterface *i;
+ AvahiInterfaceAddress *j;
+
+ assert(m);
+ assert(iface != AVAHI_IF_UNSPEC);
+ assert(a);
+
+ if (!(i = avahi_interface_monitor_get_interface(m, iface, a->proto)))
+ return 0;
+
+ for (j = i->addresses; j; j = j->address_next)
+ if (avahi_address_cmp(a, &j->address) == 0)
+ return 1;
+
+ return 0;
+}