-static gint server_add_service_strlst_nocopy(
- AvahiServer *s,
- AvahiEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- const gchar *name,
- const gchar *type,
- const gchar *domain,
- const gchar *host,
- guint16 port,
- AvahiStringList *strlst) {
-
- gchar ptr_name[256], svc_name[256], ename[64], enum_ptr[256];
- gchar *t, *d;
- AvahiRecord *r = NULL;
- gint ret = 0;
-
- g_assert(s);
- g_assert(type);
- g_assert(name);
-
- if (!avahi_valid_service_name(name))
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_NAME);
-
- if (!avahi_valid_service_type(type))
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_TYPE);
-
- if (domain && !avahi_valid_domain_name(domain))
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME);
-
- if (host && !avahi_valid_domain_name(host))
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_HOST_NAME);
-
- if (port == 0)
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_PORT);
-
- escape_service_name(ename, sizeof(ename), name);
-
- if (!domain)
- domain = s->domain_name;
-
- if (!host)
- host = s->host_name_fqdn;
-
- d = avahi_normalize_name(domain);
- t = avahi_normalize_name(type);
-
- g_snprintf(ptr_name, sizeof(ptr_name), "%s.%s", t, d);
- g_snprintf(svc_name, sizeof(svc_name), "%s.%s.%s", ename, t, d);
-
- if ((ret = avahi_server_add_ptr(s, g, interface, protocol, AVAHI_ENTRY_NULL, AVAHI_DEFAULT_TTL, ptr_name, svc_name)) < 0)
- goto fail;
-
- r = avahi_record_new_full(svc_name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV, AVAHI_DEFAULT_TTL_HOST_NAME);
- r->data.srv.priority = 0;
- r->data.srv.weight = 0;
- r->data.srv.port = port;
- r->data.srv.name = avahi_normalize_name(host);
- ret = avahi_server_add(s, g, interface, protocol, AVAHI_ENTRY_UNIQUE, r);
- avahi_record_unref(r);
-
- if (ret < 0)
- goto fail;
-
- ret = server_add_txt_strlst_nocopy(s, g, interface, protocol, AVAHI_ENTRY_UNIQUE, AVAHI_DEFAULT_TTL, svc_name, strlst);
- strlst = NULL;
-
- if (ret < 0)
- goto fail;
-
- g_snprintf(enum_ptr, sizeof(enum_ptr), "_services._dns-sd._udp.%s", d);
- ret = avahi_server_add_ptr(s, g, interface, protocol, AVAHI_ENTRY_NULL, AVAHI_DEFAULT_TTL, enum_ptr, ptr_name);
-
-fail:
-
- g_free(d);
- g_free(t);
-
- avahi_string_list_free(strlst);
-
- return ret;
-}