+
+void avahi_s_entry_group_set_data(AvahiSEntryGroup *g, void* userdata) {
+ assert(g);
+
+ g->userdata = userdata;
+}
+
+void* avahi_s_entry_group_get_data(AvahiSEntryGroup *g) {
+ assert(g);
+
+ return g->userdata;
+}
+
+int avahi_s_entry_group_is_empty(AvahiSEntryGroup *g) {
+ AvahiEntry *e;
+ assert(g);
+
+ /* Look for an entry that is not dead */
+ for (e = g->entries; e; e = e->by_group_next)
+ if (!e->dead)
+ return 0;
+
+ return 1;
+}
+
+const char* avahi_server_get_domain_name(AvahiServer *s) {
+ assert(s);
+
+ return s->domain_name;
+}
+
+const char* avahi_server_get_host_name(AvahiServer *s) {
+ assert(s);
+
+ return s->host_name;
+}
+
+const char* avahi_server_get_host_name_fqdn(AvahiServer *s) {
+ assert(s);
+
+ return s->host_name_fqdn;
+}
+
+void* avahi_server_get_data(AvahiServer *s) {
+ assert(s);
+
+ return s->userdata;
+}
+
+void avahi_server_set_data(AvahiServer *s, void* userdata) {
+ assert(s);
+
+ s->userdata = userdata;
+}
+
+AvahiServerState avahi_server_get_state(AvahiServer *s) {
+ assert(s);
+
+ return s->state;
+}
+
+AvahiServerConfig* avahi_server_config_init(AvahiServerConfig *c) {
+ assert(c);
+
+ memset(c, 0, sizeof(AvahiServerConfig));
+ c->use_ipv6 = 1;
+ c->use_ipv4 = 1;
+ c->host_name = NULL;
+ c->domain_name = NULL;
+ c->check_response_ttl = 0;
+ c->publish_hinfo = 1;
+ c->publish_addresses = 1;
+ c->publish_workstation = 1;
+ c->publish_domain = 1;
+ c->use_iff_running = 0;
+ c->enable_reflector = 0;
+ c->reflect_ipv = 0;
+ c->add_service_cookie = 1;
+ c->enable_wide_area = 0;
+ c->n_wide_area_servers = 0;
+
+ return c;
+}
+
+void avahi_server_config_free(AvahiServerConfig *c) {
+ assert(c);
+
+ avahi_free(c->host_name);
+ avahi_free(c->domain_name);
+}
+
+AvahiServerConfig* avahi_server_config_copy(AvahiServerConfig *ret, const AvahiServerConfig *c) {
+ char *d = NULL, *h = NULL;
+ assert(ret);
+ assert(c);
+
+ if (c->host_name)
+ if (!(h = avahi_strdup(c->host_name)))
+ return NULL;
+
+ if (c->domain_name)
+ if (!(d = avahi_strdup(c->domain_name))) {
+ avahi_free(h);
+ return NULL;
+ }
+
+ *ret = *c;
+ ret->host_name = h;
+ ret->domain_name = d;
+
+ return ret;
+}
+
+int avahi_server_errno(AvahiServer *s) {
+ assert(s);
+
+ return s->error;
+}
+
+/* Just for internal use */
+int avahi_server_set_errno(AvahiServer *s, int error) {
+ assert(s);
+
+ return s->error = error;
+}
+
+uint32_t avahi_server_get_local_service_cookie(AvahiServer *s) {
+ assert(s);
+
+ return s->local_service_cookie;
+}
+
+int avahi_server_is_service_local(AvahiServer *s, AvahiIfIndex interface, AvahiProtocol protocol, const char *name, const char *type, const char*domain) {
+ AvahiKey *key = NULL;
+ char *d, *t;
+ char ename[64], n[256];
+ int ret;
+ AvahiEntry *e;
+
+ assert(s);
+ assert(name);
+ assert(type);
+ assert(domain);
+
+ if (!avahi_is_valid_service_name(name))
+ return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_NAME);
+
+ if (!avahi_is_valid_service_type(type))
+ return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_TYPE);
+
+ if (domain && !avahi_is_valid_domain_name(domain))
+ return avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME);
+
+ escape_service_name(ename, sizeof(ename), name);
+
+ if (!(d = avahi_normalize_name(domain)) ||
+ !(t = avahi_normalize_name(type))) {
+ ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
+ snprintf(n, sizeof(n), "%s.%s.%s", ename, t, d);
+
+ if (!(key = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV))) {
+ ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
+
+ ret = 0;
+
+ for (e = avahi_hashmap_lookup(s->entries_by_key, key); e; e = e->by_key_next) {
+
+ if ((e->interface == interface || e->interface <= 0 || interface <= 0) &&
+ (e->protocol == protocol || e->protocol == AVAHI_PROTO_UNSPEC || protocol == AVAHI_PROTO_UNSPEC)) {
+ ret = 1;
+ break;
+ }
+ }
+
+ avahi_key_unref(key);
+
+ avahi_free(d);
+ avahi_free(t);
+
+ return ret;
+
+fail:
+ if (d)
+ avahi_free(d);
+
+ if (t)
+ avahi_free(t);
+
+ if (key)
+ avahi_key_unref(key);
+
+ return ret;
+}
+
+/** Set the wide area DNS servers */
+int avahi_server_set_wide_area_servers(AvahiServer *s, const AvahiAddress *a, unsigned n) {
+ assert(s);
+
+ if (!s->wide_area_lookup_engine)
+ return avahi_server_set_errno(s, AVAHI_ERR_INVALID_CONFIG);
+
+ avahi_wide_area_set_servers(s->wide_area_lookup_engine, a, n);
+ return AVAHI_OK;
+}