- assert(a->proto == AVAHI_PROTO_INET6);
-
- if (!(r = avahi_record_new_full(name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_AAAA, AVAHI_DEFAULT_TTL_HOST_NAME))) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
- goto fail;
- }
-
- r->data.aaaa.address = a->data.ipv6;
- ret = avahi_server_add(s, g, interface, protocol, (flags & ~ AVAHI_PUBLISH_NO_REVERSE) | AVAHI_PUBLISH_UNIQUE | AVAHI_PUBLISH_ALLOW_MULTIPLE, r);
- avahi_record_unref(r);
-
- if (ret < 0)
- goto fail;
-
- if (!(flags & AVAHI_PUBLISH_NO_REVERSE)) {
- char *reverse;
-
- if (!(reverse = avahi_reverse_lookup_name_ipv6_arpa(&a->data.ipv6))) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
- goto fail;
- }
-
- ret = avahi_server_add_ptr(s, g, interface, protocol, flags | AVAHI_PUBLISH_UNIQUE, AVAHI_DEFAULT_TTL_HOST_NAME, reverse, name);
- avahi_free(reverse);
-
- if (ret < 0)
- goto fail;
-
- if (!(reverse = avahi_reverse_lookup_name_ipv6_int(&a->data.ipv6))) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
- goto fail;
- }
-
- ret = avahi_server_add_ptr(s, g, interface, protocol, flags | AVAHI_PUBLISH_UNIQUE, AVAHI_DEFAULT_TTL_HOST_NAME, reverse, name);
- avahi_free(reverse);
- }
- }
-
-fail:
-
- avahi_free(n);
-
- return ret;
-}
-
-static int server_add_txt_strlst_nocopy(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- uint32_t ttl,
- const char *name,
- AvahiStringList *strlst) {
-
- AvahiRecord *r;
- int ret;
-
- assert(s);
-
- if (!(r = avahi_record_new_full(name ? name : s->host_name_fqdn, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT, ttl)))
- return avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
-
- r->data.txt.string_list = strlst;
- ret = avahi_server_add(s, g, interface, protocol, flags, r);
- avahi_record_unref(r);
-
- return ret;
-}
-
-int avahi_server_add_txt_strlst(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- uint32_t ttl,
- const char *name,
- AvahiStringList *strlst) {
-
- assert(s);
-
- return server_add_txt_strlst_nocopy(s, g, interface, protocol, flags, ttl, name, avahi_string_list_copy(strlst));
-}
-
-int avahi_server_add_txt_va(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- uint32_t ttl,
- const char *name,
- va_list va) {
-
- assert(s);
-
- return server_add_txt_strlst_nocopy(s, g, interface, protocol, flags, ttl, name, avahi_string_list_new_va(va));
-}
-
-int avahi_server_add_txt(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- uint32_t ttl,
- const char *name,
- ...) {
-
- va_list va;
- int ret;
-
- assert(s);
-
- va_start(va, name);
- ret = avahi_server_add_txt_va(s, g, interface, protocol, flags, ttl, name, va);
- va_end(va);
-
- return ret;
-}
-
-static AvahiStringList *add_magic_cookie(
- AvahiServer *s,
- AvahiStringList *strlst) {
-
- assert(s);
-
- if (!s->config.add_service_cookie)
- return strlst;
-
- if (avahi_string_list_find(strlst, AVAHI_SERVICE_COOKIE))
- /* This string list already contains a magic cookie */
- return strlst;
-
- return avahi_string_list_add_printf(strlst, AVAHI_SERVICE_COOKIE"=%u", s->local_service_cookie);
-}
-
-static int server_add_service_strlst_nocopy(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- const char *name,
- const char *type,
- const char *domain,
- const char *host,
- uint16_t port,
- AvahiStringList *strlst) {
-
- char ptr_name[256], svc_name[256], enum_ptr[256];
- char *t = NULL, *d = NULL, *h = NULL;
- AvahiRecord *r = NULL;
- int ret = AVAHI_OK;
-
- assert(s);
- assert(type);
- assert(name);
-
- if (!AVAHI_IF_VALID(interface)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_INTERFACE);
- goto fail;
- }
-
- if (!AVAHI_PROTO_VALID(protocol)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_PROTOCOL);
- goto fail;
- }
-
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_PUBLISH_NO_COOKIE|AVAHI_PUBLISH_IS_PROXY)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_FLAGS);
- goto fail;
- }
-
- if (!avahi_is_valid_service_name(name)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_NAME);
- goto fail;
- }
-
- if (!avahi_is_valid_service_type(type)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_TYPE);
- goto fail;
- }
-
- if (domain && !avahi_is_valid_domain_name(domain)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME);
- goto fail;
- }
-
- if (host && !avahi_is_valid_domain_name(host)) {
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_HOST_NAME);
- goto fail;
- }
-
- if (!domain)
- domain = s->domain_name;
-
- if (!host)
- host = s->host_name_fqdn;
-
- if (!(d = avahi_normalize_name(domain)) ||
- !(t = avahi_normalize_name(type)) ||
- !(h = avahi_normalize_name(host))) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
- goto fail;
- }
-
- if ((ret = avahi_service_name_snprint(svc_name, sizeof(svc_name), name, t, d)) < 0 ||
- (ret = avahi_service_name_snprint(ptr_name, sizeof(ptr_name), NULL, t, d)) < 0) {
- avahi_server_set_errno(s, ret);
- goto fail;
- }
-
- if ((ret = avahi_server_add_ptr(s, g, interface, protocol, flags & AVAHI_PUBLISH_IS_PROXY, AVAHI_DEFAULT_TTL, ptr_name, svc_name)) < 0)
- goto fail;
-
- if (!(r = avahi_record_new_full(svc_name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV, AVAHI_DEFAULT_TTL_HOST_NAME))) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
- goto fail;
- }
-
- r->data.srv.priority = 0;
- r->data.srv.weight = 0;
- r->data.srv.port = port;
- r->data.srv.name = h;
- h = NULL;
- ret = avahi_server_add(s, g, interface, protocol, (flags & AVAHI_PUBLISH_IS_PROXY) | AVAHI_PUBLISH_UNIQUE, r);
- avahi_record_unref(r);
-
- if (ret < 0)
- goto fail;
-
- if (!(flags & AVAHI_PUBLISH_NO_COOKIE))
- strlst = add_magic_cookie(s, strlst);
-
- ret = server_add_txt_strlst_nocopy(s, g, interface, protocol, (flags & AVAHI_PUBLISH_IS_PROXY) | AVAHI_PUBLISH_UNIQUE, AVAHI_DEFAULT_TTL, svc_name, strlst);
- strlst = NULL;
-
- if (ret < 0)
- goto fail;
-
- snprintf(enum_ptr, sizeof(enum_ptr), "_services._dns-sd._udp.%s", d);
- ret = avahi_server_add_ptr(s, g, interface, protocol, (flags & AVAHI_PUBLISH_IS_PROXY), AVAHI_DEFAULT_TTL, enum_ptr, ptr_name);
-
-fail:
-
- avahi_free(d);
- avahi_free(t);
- avahi_free(h);
-
- avahi_string_list_free(strlst);
-
- return ret;
-}
-
-int avahi_server_add_service_strlst(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- const char *name,
- const char *type,
- const char *domain,
- const char *host,
- uint16_t port,
- AvahiStringList *strlst) {
-
- assert(s);
- assert(type);
- assert(name);
-
- return server_add_service_strlst_nocopy(s, g, interface, protocol, flags, name, type, domain, host, port, avahi_string_list_copy(strlst));
-}
-
-int avahi_server_add_service_va(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- const char *name,
- const char *type,
- const char *domain,
- const char *host,
- uint16_t port,
- va_list va){
-
- assert(s);
- assert(type);
- assert(name);
-
- return server_add_service_strlst_nocopy(s, g, interface, protocol, flags, name, type, domain, host, port, avahi_string_list_new_va(va));
-}
-
-int avahi_server_add_service(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiPublishFlags flags,
- const char *name,
- const char *type,
- const char *domain,
- const char *host,
- uint16_t port,
- ... ){
-
- va_list va;
- int ret;
-
- assert(s);
- assert(type);
- assert(name);
-
- va_start(va, port);
- ret = avahi_server_add_service_va(s, g, interface, protocol, flags, name, type, domain, host, port, va);
- va_end(va);
- return ret;
-}
-
-static void hexstring(char *s, size_t sl, const void *p, size_t pl) {
- static const char hex[] = "0123456789abcdef";
- int b = 0;
- const uint8_t *k = p;
-
- while (sl > 1 && pl > 0) {
- *(s++) = hex[(b ? *k : *k >> 4) & 0xF];
-
- if (b) {
- k++;
- pl--;
- }
-
- b = !b;
-
- sl--;
- }
-
- if (sl > 0)
- *s = 0;