From d0a9e76f8f858b7dd98c9950a376dc347b230af9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 3 Oct 2005 22:56:14 +0000 Subject: Add avahi_service_name_snprint() git-svn-id: file:///home/lennart/svn/public/avahi/trunk@683 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-common/domain.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'avahi-common/domain.c') diff --git a/avahi-common/domain.c b/avahi-common/domain.c index 1a4f8a6..bffe563 100644 --- a/avahi-common/domain.c +++ b/avahi-common/domain.c @@ -35,6 +35,7 @@ #include "domain.h" #include "malloc.h" +#include "error.h" char *avahi_get_host_name(void) { #ifdef HOST_NAME_MAX @@ -355,3 +356,69 @@ int avahi_domain_ends_with(const char *domain, const char *suffix) { return 0; } } + +static void escape_service_name(char *d, size_t size, const char *s) { + assert(d); + assert(size); + assert(s); + + while (*s && size >= 2) { + if (*s == '.' || *s == '\\') { + if (size < 3) + break; + + *(d++) = '\\'; + size--; + } + + *(d++) = *(s++); + size--; + } + + assert(size > 0); + *(d++) = 0; +} + + +int avahi_service_name_snprint(char *p, size_t size, const char *name, const char *type, const char *domain) { + char *t = NULL, *d = NULL; + char ename[64]; + int ret; + + assert(p); + + if ((name && !avahi_is_valid_service_name(name))) { + ret = AVAHI_ERR_INVALID_SERVICE_NAME; + goto fail; + } + + if (!avahi_is_valid_service_type(type)) { + ret = AVAHI_ERR_INVALID_SERVICE_TYPE; + goto fail; + } + + if (!avahi_is_valid_domain_name(domain)) { + ret = AVAHI_ERR_INVALID_DOMAIN_NAME; + goto fail; + } + + if (name) + escape_service_name(ename, sizeof(ename), name); + + if (!(d = avahi_normalize_name(domain)) || + !(t = avahi_normalize_name(type))) { + ret = AVAHI_ERR_NO_MEMORY; + goto fail; + } + + snprintf(p, size, "%s%s%s.%s", name ? ename : "", name ? "." : "", t, d); + + ret = AVAHI_OK; + +fail: + + avahi_free(t); + avahi_free(d); + + return ret; +} -- cgit