+static void register_stuff(AvahiServer *s) {
+ g_assert(s);
+
+ server_set_state(s, AVAHI_SERVER_REGISTERING);
+ register_hinfo(s);
+ register_browse_domain(s);
+ avahi_update_host_rrs(s->monitor, FALSE);
+
+ if (s->n_host_rr_pending == 0)
+ server_set_state(s, AVAHI_SERVER_RUNNING);
+}
+
+static void update_fqdn(AvahiServer *s) {
+ g_assert(s);
+
+ g_assert(s->host_name);
+ g_assert(s->domain_name);
+
+ g_free(s->host_name_fqdn);
+ s->host_name_fqdn = g_strdup_printf("%s.%s", s->host_name, s->domain_name);
+}
+
+static void register_time_event_callback(AvahiTimeEvent *e, gpointer userdata) {
+ AvahiServer *s = userdata;
+
+ g_assert(e);
+ g_assert(s);
+
+ g_assert(e == s->register_time_event);
+ avahi_time_event_queue_remove(s->time_event_queue, s->register_time_event);
+ s->register_time_event = NULL;
+
+ if (s->state == AVAHI_SERVER_SLEEPING)
+ register_stuff(s);
+}
+
+static void delayed_register_stuff(AvahiServer *s) {
+ GTimeVal tv;
+
+ g_assert(s);
+
+ avahi_elapse_time(&tv, AVAHI_HOST_RR_HOLDOFF_MSEC, 0);
+
+ if (s->register_time_event)
+ avahi_time_event_queue_update(s->time_event_queue, s->register_time_event, &tv);
+ else
+ s->register_time_event = avahi_time_event_queue_add(s->time_event_queue, &tv, register_time_event_callback, s);
+}
+
+void avahi_server_set_host_name(AvahiServer *s, const gchar *host_name) {
+ g_assert(s);
+ g_assert(host_name);
+
+ server_set_state(s, AVAHI_SERVER_SLEEPING);
+ withdraw_host_rrs(s);
+
+ g_free(s->host_name);
+ s->host_name = host_name ? avahi_normalize_name(host_name) : avahi_get_host_name();
+ s->host_name[strcspn(s->host_name, ".")] = 0;
+ update_fqdn(s);
+
+ delayed_register_stuff(s);
+}
+
+void avahi_server_set_domain_name(AvahiServer *s, const gchar *domain_name) {
+ g_assert(s);
+ g_assert(domain_name);
+
+ server_set_state(s, AVAHI_SERVER_SLEEPING);
+ withdraw_host_rrs(s);
+
+ g_free(s->domain_name);
+ s->domain_name = domain_name ? avahi_normalize_name(domain_name) : g_strdup("local.");
+ update_fqdn(s);
+
+ delayed_register_stuff(s);
+}
+
+AvahiServer *avahi_server_new(GMainContext *c, const AvahiServerConfig *sc, AvahiServerCallback callback, gpointer userdata) {