+ if (fd == s->fd_ipv4) {
+ dest.proto = AVAHI_PROTO_INET;
+ if ((p = avahi_recv_dns_packet_ipv4(s->fd_ipv4, &sa, &dest.data.ipv4, &iface, &ttl))) {
+ dispatch_packet(s, p, (struct sockaddr*) &sa, &dest, iface, ttl);
+ avahi_dns_packet_free(p);
+ }
+ } else if (fd == s->fd_ipv6) {
+ dest.proto = AVAHI_PROTO_INET6;
+
+ if ((p = avahi_recv_dns_packet_ipv6(s->fd_ipv6, &sa6, &dest.data.ipv6, &iface, &ttl))) {
+ dispatch_packet(s, p, (struct sockaddr*) &sa6, &dest, iface, ttl);
+ avahi_dns_packet_free(p);
+ }
+ } else if (fd == s->fd_legacy_unicast_ipv4) {
+ dest.proto = AVAHI_PROTO_INET;
+
+ if ((p = avahi_recv_dns_packet_ipv4(s->fd_legacy_unicast_ipv4, &sa, &dest.data.ipv4, &iface, &ttl))) {
+ dispatch_legacy_unicast_packet(s, p, (struct sockaddr*) &sa, iface);
+ avahi_dns_packet_free(p);
+ }
+ } else if (fd == s->fd_legacy_unicast_ipv6) {
+ dest.proto = AVAHI_PROTO_INET6;
+
+ if ((p = avahi_recv_dns_packet_ipv6(s->fd_legacy_unicast_ipv6, &sa6, &dest.data.ipv6, &iface, &ttl))) {
+ dispatch_legacy_unicast_packet(s, p, (struct sockaddr*) &sa6, iface);
+ avahi_dns_packet_free(p);
+ }
+ }
+
+ cleanup_dead(s);
+ } else
+ abort();
+}
+
+static void server_set_state(AvahiServer *s, AvahiServerState state) {
+ assert(s);
+
+ if (s->state == state)
+ return;
+
+ s->state = state;
+
+ if (s->callback)
+ s->callback(s, state, s->userdata);
+}
+
+static void withdraw_host_rrs(AvahiServer *s) {
+ assert(s);
+
+ if (s->hinfo_entry_group)
+ avahi_s_entry_group_reset(s->hinfo_entry_group);
+
+ if (s->browse_domain_entry_group)
+ avahi_s_entry_group_reset(s->browse_domain_entry_group);
+
+ avahi_interface_monitor_update_rrs(s->monitor, 1);
+ s->n_host_rr_pending = 0;