summaryrefslogtreecommitdiffstats
path: root/avahi-core
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-10-10 22:34:06 +0000
committerLennart Poettering <lennart@poettering.net>2005-10-10 22:34:06 +0000
commitd1dd07145bb3db5c6fd77c55aea762eb79ab3b5c (patch)
treef50a23c8d0faad85af129a2bac6fb3c08724cdab /avahi-core
parent1c22aa6ce3490c7f5447179b4ec2e6113881660e (diff)
* rename avahi_service_name_snprint() to avahi_service_name_join()
* add avahi_service_name_split() and make everything use it * change avahi_normalize_name() to work on a supplied buffer instead of malloc'ed memory. * add avahi_normalize_name_strdup() that retains the old behaviour avahi_normalize_name() * same thing for avahi_get_host_name()/avahi_get_host_name_strdup() * Rewrite domain name escaping and validity checking code * Remove superfluous memory allocationsfrom various browsers and do some other major cleanups * add new global macro AVAHI_CHECK_VALIDITY_RETURN_NULL() and modify many things to make use of it * add AVAHI_LABEL_MAX * patch everything to make use of AVAHI_LABEL_MAX and AVAHI_DOMAIN_NAME_MAX * add pretty printing for NS records * add partial pretty printing for SOA records * add many more validity checks to various user API functions git-svn-id: file:///home/lennart/svn/public/avahi/trunk@708 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core')
-rw-r--r--avahi-core/browse-dns-server.c55
-rw-r--r--avahi-core/browse-domain.c94
-rw-r--r--avahi-core/browse-service-type.c93
-rw-r--r--avahi-core/browse-service.c100
-rw-r--r--avahi-core/browse.c19
-rw-r--r--avahi-core/dns.c9
-rw-r--r--avahi-core/publish.h3
-rw-r--r--avahi-core/resolve-host-name.c2
-rw-r--r--avahi-core/resolve-service.c50
-rw-r--r--avahi-core/rr.c15
-rw-r--r--avahi-core/server.c47
-rw-r--r--avahi-core/server.h7
12 files changed, 226 insertions, 268 deletions
diff --git a/avahi-core/browse-dns-server.c b/avahi-core/browse-dns-server.c
index 31da536..52dafc2 100644
--- a/avahi-core/browse-dns-server.c
+++ b/avahi-core/browse-dns-server.c
@@ -50,7 +50,6 @@ struct AvahiDNSServerInfo {
struct AvahiSDNSServerBrowser {
AvahiServer *server;
- char *domain_name;
AvahiSRecordBrowser *record_browser;
AvahiSDNSServerBrowserCallback callback;
@@ -245,35 +244,41 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(
AvahiLookupFlags flags,
AvahiSDNSServerBrowserCallback callback,
void* userdata) {
+
+ static const char * const type_table[AVAHI_DNS_SERVER_MAX] = {
+ "_domain._udp",
+ "_dns-update._udp"
+ };
AvahiSDNSServerBrowser *b;
- AvahiKey *k;
- char *n = NULL;
+ AvahiKey *k = NULL;
+ char n[AVAHI_DOMAIN_NAME_MAX];
+ int r;
assert(server);
assert(callback);
- assert(type == AVAHI_DNS_SERVER_RESOLVE || type == AVAHI_DNS_SERVER_UPDATE);
- if (domain && !avahi_is_valid_domain_name(domain)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
- return NULL;
- }
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(aprotocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, type < AVAHI_DNS_SERVER_MAX, AVAHI_ERR_INVALID_FLAGS);
if (!domain)
domain = server->domain_name;
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
+ if ((r = avahi_service_name_join(n, sizeof(n), NULL, type_table[type], domain)) < 0) {
+ avahi_server_set_errno(server, r);
return NULL;
}
-
+
if (!(b = avahi_new(AvahiSDNSServerBrowser, 1))) {
avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
return NULL;
}
b->server = server;
- b->domain_name = avahi_normalize_name(domain);
b->callback = callback;
b->userdata = userdata;
b->aprotocol = aprotocol;
@@ -283,19 +288,25 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(
AVAHI_LLIST_HEAD_INIT(AvahiDNSServerInfo, b->info);
AVAHI_LLIST_PREPEND(AvahiSDNSServerBrowser, browser, server->dns_server_browsers, b);
- n = avahi_strdup_printf("%s.%s",type == AVAHI_DNS_SERVER_RESOLVE ? "_domain._udp" : "_dns-update._udp", b->domain_name);
- k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV);
- avahi_free(n);
+ if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV))) {
+ avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
- b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b);
+ if (!(b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b)))
+ goto fail;
+
avahi_key_unref(k);
- if (!b->record_browser) {
- avahi_s_dns_server_browser_free(b);
- return NULL;
- }
-
return b;
+
+fail:
+
+ if (k)
+ avahi_key_unref(k);
+
+ avahi_s_dns_server_browser_free(b);
+ return NULL;
}
void avahi_s_dns_server_browser_free(AvahiSDNSServerBrowser *b) {
@@ -308,7 +319,7 @@ void avahi_s_dns_server_browser_free(AvahiSDNSServerBrowser *b) {
if (b->record_browser)
avahi_s_record_browser_free(b->record_browser);
- avahi_free(b->domain_name);
+
avahi_free(b);
}
diff --git a/avahi-core/browse-domain.c b/avahi-core/browse-domain.c
index 2cb2f75..e2eab44 100644
--- a/avahi-core/browse-domain.c
+++ b/avahi-core/browse-domain.c
@@ -31,10 +31,8 @@
struct AvahiSDomainBrowser {
AvahiServer *server;
- char *domain_name;
AvahiSRecordBrowser *record_browser;
- AvahiLookupResultFlags flags;
AvahiSDomainBrowserCallback callback;
void* userdata;
@@ -59,13 +57,13 @@ static void record_browser_callback(
if (record) {
assert(record->key->type == AVAHI_DNS_TYPE_PTR);
- n = avahi_normalize_name(record->data.ptr.name);
+ n = record->data.ptr.name;
}
b->callback(b, interface, protocol, event, n, flags, b->userdata);
- avahi_free(n);
}
+
AvahiSDomainBrowser *avahi_s_domain_browser_new(
AvahiServer *server,
AvahiIfIndex interface,
@@ -75,34 +73,34 @@ AvahiSDomainBrowser *avahi_s_domain_browser_new(
AvahiLookupFlags flags,
AvahiSDomainBrowserCallback callback,
void* userdata) {
+
+ static const char * const type_table[AVAHI_DOMAIN_BROWSER_MAX] = {
+ "r",
+ "dr",
+ "b",
+ "db",
+ "lb"
+ };
AvahiSDomainBrowser *b;
- AvahiKey *k;
- char *n = NULL;
+ AvahiKey *k = NULL;
+ char n[AVAHI_DOMAIN_NAME_MAX];
+ int r;
assert(server);
assert(callback);
- if (type >= AVAHI_DOMAIN_BROWSER_MAX) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
- return NULL;
- }
-
- if (!AVAHI_IF_VALID(interface)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_INTERFACE);
- return NULL;
- }
-
- if (domain && !avahi_is_valid_domain_name(domain)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
- return NULL;
- }
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, type < AVAHI_DOMAIN_BROWSER_MAX, AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
if (!domain)
domain = server->domain_name;
-
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
+
+ if ((r = avahi_service_name_join(n, sizeof(n), type_table[type], "_dns-sd._udp", domain)) < 0) {
+ avahi_server_set_errno(server, r);
return NULL;
}
@@ -112,48 +110,31 @@ AvahiSDomainBrowser *avahi_s_domain_browser_new(
}
b->server = server;
- b->domain_name = avahi_normalize_name(domain);
b->callback = callback;
b->userdata = userdata;
+ b->record_browser = NULL;
AVAHI_LLIST_PREPEND(AvahiSDomainBrowser, browser, server->domain_browsers, b);
- switch (type) {
- case AVAHI_DOMAIN_BROWSER_BROWSE:
- n = avahi_strdup_printf("b._dns-sd._udp.%s", b->domain_name);
- break;
- case AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT:
- n = avahi_strdup_printf("db._dns-sd._udp.%s", b->domain_name);
- break;
- case AVAHI_DOMAIN_BROWSER_REGISTER:
- n = avahi_strdup_printf("r._dns-sd._udp.%s", b->domain_name);
- break;
- case AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT:
- n = avahi_strdup_printf("dr._dns-sd._udp.%s", b->domain_name);
- break;
- case AVAHI_DOMAIN_BROWSER_BROWSE_LEGACY:
- n = avahi_strdup_printf("lb._dns-sd._udp.%s", b->domain_name);
- break;
-
- case AVAHI_DOMAIN_BROWSER_MAX:
- assert(0);
- break;
+ if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) {
+ avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+ goto fail;
}
-
- assert(n);
-
- k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR);
- avahi_free(n);
- b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b);
- avahi_key_unref(k);
-
- if (!b->record_browser) {
- avahi_s_domain_browser_free(b);
- return NULL;
- }
+ if (!(b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b)))
+ goto fail;
+ avahi_key_unref(k);
return b;
+
+fail:
+
+ if (k)
+ avahi_key_unref(k);
+
+ avahi_s_domain_browser_free(b);
+
+ return NULL;
}
void avahi_s_domain_browser_free(AvahiSDomainBrowser *b) {
@@ -164,6 +145,5 @@ void avahi_s_domain_browser_free(AvahiSDomainBrowser *b) {
if (b->record_browser)
avahi_s_record_browser_free(b->record_browser);
- avahi_free(b->domain_name);
avahi_free(b);
}
diff --git a/avahi-core/browse-service-type.c b/avahi-core/browse-service-type.c
index 25673fa..39bf471 100644
--- a/avahi-core/browse-service-type.c
+++ b/avahi-core/browse-service-type.c
@@ -35,7 +35,7 @@
struct AvahiSServiceTypeBrowser {
AvahiServer *server;
char *domain_name;
-
+
AvahiSRecordBrowser *record_browser;
AvahiSServiceTypeBrowserCallback callback;
@@ -54,46 +54,23 @@ static void record_browser_callback(
void* userdata) {
AvahiSServiceTypeBrowser *b = userdata;
- char *n = NULL, *c = NULL;
assert(rr);
assert(b);
if (record) {
- char *e;
+ char type[AVAHI_DOMAIN_NAME_MAX], domain[AVAHI_DOMAIN_NAME_MAX];
assert(record->key->type == AVAHI_DNS_TYPE_PTR);
-
- n = avahi_normalize_name(record->data.ptr.name);
-
- if (*n != '_')
- goto fail;
-
- for (c = e = n; *c == '_';) {
- c += strcspn(c, ".");
-
- if (*c == 0)
- goto fail;
-
- assert(*c == '.');
- e = c;
- c++;
+
+ if (avahi_service_name_split(record->data.ptr.name, NULL, 0, type, sizeof(type), domain, sizeof(domain)) < 0) {
+ avahi_log_warn("Invalid service type '%s'", record->key->name);
+ return;
}
-
- *e = 0;
-
- if (!avahi_domain_equal(c, b->domain_name))
- goto fail;
- }
-
- b->callback(b, interface, protocol, event, n, c, flags, b->userdata);
- avahi_free(n);
-
- return;
-fail:
- avahi_log_warn("Invalid service type '%s'", n);
- avahi_free(n);
+ b->callback(b, interface, protocol, event, type, domain, flags, b->userdata);
+ } else
+ b->callback(b, interface, protocol, event, NULL, b->domain_name, flags, b->userdata);
}
AvahiSServiceTypeBrowser *avahi_s_service_type_browser_new(
@@ -106,48 +83,62 @@ AvahiSServiceTypeBrowser *avahi_s_service_type_browser_new(
void* userdata) {
AvahiSServiceTypeBrowser *b;
- AvahiKey *k;
- char *n = NULL;
+ AvahiKey *k = NULL;
+ char n[AVAHI_DOMAIN_NAME_MAX];
+ int r;
assert(server);
assert(callback);
- if (domain && !avahi_is_valid_domain_name(domain)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
- return NULL;
- }
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
if (!domain)
domain = server->domain_name;
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
+ if ((r = avahi_service_name_join(n, sizeof(n), NULL, "_services._dns-sd._udp", domain)) < 0) {
+ avahi_server_set_errno(server, r);
return NULL;
}
-
+
if (!(b = avahi_new(AvahiSServiceTypeBrowser, 1))) {
avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
return NULL;
}
b->server = server;
- b->domain_name = avahi_normalize_name(domain);
b->callback = callback;
b->userdata = userdata;
-
+ b->record_browser = NULL;
+
AVAHI_LLIST_PREPEND(AvahiSServiceTypeBrowser, browser, server->service_type_browsers, b);
- n = avahi_strdup_printf("_services._dns-sd._udp.%s", b->domain_name);
- k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR);
- avahi_free(n);
+ if (!(b->domain_name = avahi_normalize_name_strdup(domain))) {
+ avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
- b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b);
+ if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) {
+ avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
+
+ if (!(b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b)))
+ goto fail;
+
avahi_key_unref(k);
- if (!b->record_browser)
- return NULL;
-
return b;
+
+fail:
+ if (k)
+ avahi_key_unref(k);
+
+ avahi_s_service_type_browser_free(b);
+
+ return NULL;
}
void avahi_s_service_type_browser_free(AvahiSServiceTypeBrowser *b) {
@@ -157,7 +148,7 @@ void avahi_s_service_type_browser_free(AvahiSServiceTypeBrowser *b) {
if (b->record_browser)
avahi_s_record_browser_free(b->record_browser);
-
+
avahi_free(b->domain_name);
avahi_free(b);
}
diff --git a/avahi-core/browse-service.c b/avahi-core/browse-service.c
index dfa6050..d89ad7a 100644
--- a/avahi-core/browse-service.c
+++ b/avahi-core/browse-service.c
@@ -55,46 +55,25 @@ static void record_browser_callback(
void* userdata) {
AvahiSServiceBrowser *b = userdata;
- char *n = NULL, *c = NULL, *s = NULL;
- char service[128];
assert(rr);
assert(b);
if (record) {
- char *e;
+ char service[AVAHI_LABEL_MAX], type[AVAHI_DOMAIN_NAME_MAX], domain[AVAHI_DOMAIN_NAME_MAX];
+
assert(record->key->type == AVAHI_DNS_TYPE_PTR);
-
- c = n = avahi_normalize_name(record->data.ptr.name);
-
- if (!(avahi_unescape_label((const char**) &c, service, sizeof(service))))
- goto fail;
-
- for (s = e = c; *c == '_';) {
- c += strcspn(c, ".");
-
- if (*c == 0)
- goto fail;
-
- assert(*c == '.');
- e = c;
- c++;
- }
-
- *e = 0;
- if (!avahi_domain_equal(c, b->domain_name))
- goto fail;
- }
-
- b->callback(b, interface, protocol, event, record ? service : NULL, s, c, flags, b->userdata);
- avahi_free(n);
+ if (avahi_service_name_split(record->data.ptr.name, service, sizeof(service), type, sizeof(type), domain, sizeof(domain)) < 0) {
+ avahi_log_warn("Failed to split '%s'", record->key->name);
+ return;
+ }
- return;
+ b->callback(b, interface, protocol, event, service, type, domain, flags, b->userdata);
+
+ } else
+ b->callback(b, interface, protocol, event, NULL, b->service_type, b->domain_name, flags, b->userdata);
-fail:
- avahi_log_warn("Invalid service '%s'", n);
- avahi_free(n);
}
AvahiSServiceBrowser *avahi_s_service_browser_new(
@@ -108,28 +87,25 @@ AvahiSServiceBrowser *avahi_s_service_browser_new(
void* userdata) {
AvahiSServiceBrowser *b;
- AvahiKey *k;
- char *n = NULL;
+ AvahiKey *k = NULL;
+ char n[AVAHI_DOMAIN_NAME_MAX];
+ int r;
assert(server);
assert(callback);
assert(service_type);
- if (!avahi_is_valid_service_type(service_type)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_SERVICE_TYPE);
- return NULL;
- }
-
- if (domain && !avahi_is_valid_domain_name(domain)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
- return NULL;
- }
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, avahi_is_valid_service_type(service_type), AVAHI_ERR_INVALID_SERVICE_TYPE);
if (!domain)
domain = server->domain_name;
-
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
+
+ if ((r = avahi_service_name_join(n, sizeof(n), NULL, service_type, domain)) < 0) {
+ avahi_server_set_errno(server, r);
return NULL;
}
@@ -139,26 +115,38 @@ AvahiSServiceBrowser *avahi_s_service_browser_new(
}
b->server = server;
- b->domain_name = avahi_normalize_name(domain);
- b->service_type = avahi_normalize_name(service_type);
+ b->domain_name = b->service_type = NULL;
b->callback = callback;
b->userdata = userdata;
+ b->record_browser = NULL;
+
AVAHI_LLIST_PREPEND(AvahiSServiceBrowser, browser, server->service_browsers, b);
- n = avahi_strdup_printf("%s.%s", b->service_type, b->domain_name);
- k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR);
- avahi_free(n);
+ if (!(b->domain_name = avahi_normalize_name_strdup(domain)) ||
+ !(b->service_type = avahi_normalize_name_strdup(service_type))) {
+ avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
+
+ if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) {
+ avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+ goto fail;
+ }
- b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b);
+ if (!(b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b)))
+ goto fail;
avahi_key_unref(k);
- if (!b->record_browser) {
- avahi_s_service_browser_free(b);
- return NULL;
- }
-
return b;
+
+fail:
+
+ if (k)
+ avahi_key_unref(k);
+
+ avahi_s_service_browser_free(b);
+ return NULL;
}
void avahi_s_service_browser_free(AvahiSServiceBrowser *b) {
diff --git a/avahi-core/browse.c b/avahi-core/browse.c
index f47418a..5617395 100644
--- a/avahi-core/browse.c
+++ b/avahi-core/browse.c
@@ -502,13 +502,6 @@ void avahi_s_record_browser_restart(AvahiSRecordBrowser *b) {
}
}
-#define CHECK_VALIDITY_RETURN_NULL(server, expression, error) { \
- if (!(expression)) { \
- avahi_server_set_errno((server), (error)); \
- return NULL; \
- } \
-}
-
AvahiSRecordBrowser *avahi_s_record_browser_new(
AvahiServer *server,
AvahiIfIndex interface,
@@ -524,11 +517,12 @@ AvahiSRecordBrowser *avahi_s_record_browser_new(
assert(key);
assert(callback);
- CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
- CHECK_VALIDITY_RETURN_NULL(server, !avahi_key_is_pattern(key), AVAHI_ERR_IS_PATTERN);
- CHECK_VALIDITY_RETURN_NULL(server, avahi_key_is_valid(key), AVAHI_ERR_INVALID_KEY);
- CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
- CHECK_VALIDITY_RETURN_NULL(server, !(flags & AVAHI_LOOKUP_USE_WIDE_AREA) || !(flags & AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !avahi_key_is_pattern(key), AVAHI_ERR_IS_PATTERN);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, avahi_key_is_valid(key), AVAHI_ERR_INVALID_KEY);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !(flags & AVAHI_LOOKUP_USE_WIDE_AREA) || !(flags & AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
if (!(b = avahi_new(AvahiSRecordBrowser, 1))) {
avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
@@ -543,7 +537,6 @@ AvahiSRecordBrowser *avahi_s_record_browser_new(
b->flags = flags;
b->callback = callback;
b->userdata = userdata;
-
b->n_lookups = 0;
AVAHI_LLIST_HEAD_INIT(AvahiSRBLookup, b->lookups);
b->root_lookup = NULL;
diff --git a/avahi-core/dns.c b/avahi-core/dns.c
index 9412470..71ec0ce 100644
--- a/avahi-core/dns.c
+++ b/avahi-core/dns.c
@@ -165,7 +165,6 @@ uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) {
const char *pname;
char label[64], *u;
-
/* Check whether we can compress this name. */
if (p->name_table && (prev = avahi_hashmap_lookup(p->name_table, name))) {
@@ -366,7 +365,7 @@ static int consume_labels(AvahiDnsPacket *p, unsigned idx, char *ret_name, size_
} else
first_label = 0;
- if (!(avahi_escape_label(AVAHI_DNS_PACKET_DATA(p) + idx, n, &ret_name, &l)))
+ if (!(avahi_escape_label((char*) AVAHI_DNS_PACKET_DATA(p) + idx, n, &ret_name, &l)))
return -1;
idx += n;
@@ -519,6 +518,7 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f
switch (type) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
/* avahi_log_debug("ptr"); */
@@ -678,8 +678,9 @@ uint8_t* avahi_dns_packet_append_record(AvahiDnsPacket *p, AvahiRecord *r, int c
switch (r->key->type) {
case AVAHI_DNS_TYPE_PTR:
- case AVAHI_DNS_TYPE_CNAME :
-
+ case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
+
if (!(avahi_dns_packet_append_name(p, r->data.ptr.name)))
goto fail;
diff --git a/avahi-core/publish.h b/avahi-core/publish.h
index c75c067..4143bb3 100644
--- a/avahi-core/publish.h
+++ b/avahi-core/publish.h
@@ -211,7 +211,8 @@ int avahi_server_add_service_strlst(
/** The type of DNS server */
typedef enum {
AVAHI_DNS_SERVER_RESOLVE, /**< Unicast DNS servers for normal resolves (_domain._udp)*/
- AVAHI_DNS_SERVER_UPDATE /**< Unicast DNS servers for updates (_dns-update._udp)*/
+ AVAHI_DNS_SERVER_UPDATE, /**< Unicast DNS servers for updates (_dns-update._udp)*/
+ AVAHI_DNS_SERVER_MAX
} AvahiDNSServerType;
/** Publish the specified unicast DNS server address via mDNS. You may
diff --git a/avahi-core/resolve-host-name.c b/avahi-core/resolve-host-name.c
index 940febf..6315dbb 100644
--- a/avahi-core/resolve-host-name.c
+++ b/avahi-core/resolve-host-name.c
@@ -245,7 +245,7 @@ AvahiSHostNameResolver *avahi_s_host_name_resolver_new(
}
r->server = server;
- r->host_name = avahi_normalize_name(host_name);
+ r->host_name = avahi_normalize_name_strdup(host_name);
r->callback = callback;
r->userdata = userdata;
r->address_record = NULL;
diff --git a/avahi-core/resolve-service.c b/avahi-core/resolve-service.c
index de347e2..43b61d2 100644
--- a/avahi-core/resolve-service.c
+++ b/avahi-core/resolve-service.c
@@ -397,40 +397,26 @@ AvahiSServiceResolver *avahi_s_service_resolver_new(
AvahiSServiceResolver *r;
AvahiKey *k;
- char t[256];
+ char n[AVAHI_DOMAIN_NAME_MAX];
int ret;
assert(server);
assert(type);
assert(callback);
- assert(aprotocol == AVAHI_PROTO_UNSPEC || aprotocol == AVAHI_PROTO_INET || aprotocol == AVAHI_PROTO_INET6);
-
- if (!AVAHI_IF_VALID(interface)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_INTERFACE);
- return NULL;
- }
-
- if (name && !avahi_is_valid_service_name(name)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_SERVICE_NAME);
- return NULL;
- }
-
- if (!avahi_is_valid_service_type(type)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_SERVICE_TYPE);
- return NULL;
- }
-
- if (domain && !avahi_is_valid_domain_name(domain)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
- return NULL;
- }
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(aprotocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !name || avahi_is_valid_service_name(name), AVAHI_ERR_INVALID_SERVICE_NAME);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, avahi_is_valid_service_type(type), AVAHI_ERR_INVALID_SERVICE_TYPE);
+ AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST|AVAHI_LOOKUP_NO_TXT|AVAHI_LOOKUP_NO_ADDRESS), AVAHI_ERR_INVALID_FLAGS);
if (!domain)
domain = server->domain_name;
-
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST|AVAHI_LOOKUP_NO_TXT|AVAHI_LOOKUP_NO_ADDRESS)) {
- avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
+
+ if ((ret = avahi_service_name_join(n, sizeof(n), name, type, domain)) < 0) {
+ avahi_server_set_errno(server, ret);
return NULL;
}
@@ -441,8 +427,8 @@ AvahiSServiceResolver *avahi_s_service_resolver_new(
r->server = server;
r->service_name = avahi_strdup(name);
- r->service_type = avahi_normalize_name(type);
- r->domain_name = avahi_normalize_name(domain);
+ r->service_type = avahi_normalize_name_strdup(type);
+ r->domain_name = avahi_normalize_name_strdup(domain);
r->callback = callback;
r->userdata = userdata;
r->address_protocol = aprotocol;
@@ -455,13 +441,7 @@ AvahiSServiceResolver *avahi_s_service_resolver_new(
r->time_event = NULL;
AVAHI_LLIST_PREPEND(AvahiSServiceResolver, resolver, server->service_resolvers, r);
- if ((ret = avahi_service_name_snprint(t, sizeof(t), name, r->service_type, r->domain_name)) < 0) {
- avahi_server_set_errno(server, ret);
- avahi_s_service_resolver_free(r);
- return NULL;
- }
-
- k = avahi_key_new(t, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV);
+ k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV);
r->record_browser_srv = avahi_s_record_browser_new(server, interface, protocol, k, flags & ~(AVAHI_LOOKUP_NO_TXT|AVAHI_LOOKUP_NO_ADDRESS), record_browser_callback, r);
avahi_key_unref(k);
@@ -471,7 +451,7 @@ AvahiSServiceResolver *avahi_s_service_resolver_new(
}
if (!(flags & AVAHI_LOOKUP_NO_TXT)) {
- k = avahi_key_new(t, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT);
+ k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT);
r->record_browser_txt = avahi_s_record_browser_new(server, interface, protocol, k, flags & ~(AVAHI_LOOKUP_NO_TXT|AVAHI_LOOKUP_NO_ADDRESS), record_browser_callback, r);
avahi_key_unref(k);
diff --git a/avahi-core/rr.c b/avahi-core/rr.c
index 90c6236..c1faa50 100644
--- a/avahi-core/rr.c
+++ b/avahi-core/rr.c
@@ -47,7 +47,7 @@ AvahiKey *avahi_key_new(const char *name, uint16_t class, uint16_t type) {
return NULL;
}
- if (!(k->name = avahi_normalize_name(name))) {
+ if (!(k->name = avahi_normalize_name_strdup(name))) {
avahi_log_error("avahi_normalize_name() failed.");
avahi_free(k);
return NULL;
@@ -155,6 +155,7 @@ void avahi_record_unref(AvahiRecord *r) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
avahi_free(r->data.ptr.name);
break;
@@ -212,6 +213,10 @@ const char *avahi_dns_type_to_string(uint16_t type) {
return "SRV";
case AVAHI_DNS_TYPE_ANY:
return "ANY";
+ case AVAHI_DNS_TYPE_SOA:
+ return "SOA";
+ case AVAHI_DNS_TYPE_NS:
+ return "NS";
default:
return NULL;
}
@@ -244,7 +249,8 @@ char *avahi_record_to_string(const AvahiRecord *r) {
break;
case AVAHI_DNS_TYPE_PTR:
- case AVAHI_DNS_TYPE_CNAME :
+ case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
t = r->data.ptr.name;
break;
@@ -348,6 +354,7 @@ static int rdata_equal(const AvahiRecord *a, const AvahiRecord *b) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
return avahi_domain_equal(a->data.ptr.name, b->data.ptr.name);
case AVAHI_DNS_TYPE_HINFO:
@@ -399,6 +406,7 @@ AvahiRecord *avahi_record_copy(AvahiRecord *r) {
switch (r->key->type) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
if (!(copy->data.ptr.name = avahi_strdup(r->data.ptr.name)))
goto fail;
break;
@@ -468,6 +476,7 @@ size_t avahi_record_get_estimate_size(AvahiRecord *r) {
switch (r->key->type) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
n += strlen(r->data.ptr.name) + 1;
break;
@@ -543,6 +552,7 @@ int avahi_record_lexicographical_compare(AvahiRecord *a, AvahiRecord *b) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
return avahi_binary_domain_cmp(a->data.ptr.name, b->data.ptr.name);
case AVAHI_DNS_TYPE_SRV: {
@@ -640,6 +650,7 @@ int avahi_record_is_valid(AvahiRecord *r) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
return avahi_is_valid_domain_name(r->data.ptr.name);
case AVAHI_DNS_TYPE_SRV:
diff --git a/avahi-core/server.c b/avahi-core/server.c
index 18bead9..8082ea3 100644
--- a/avahi-core/server.c
+++ b/avahi-core/server.c
@@ -1285,7 +1285,7 @@ int avahi_server_set_host_name(AvahiServer *s, const char *host_name) {
withdraw_host_rrs(s);
avahi_free(s->host_name);
- s->host_name = host_name ? avahi_normalize_name(host_name) : avahi_get_host_name();
+ s->host_name = host_name ? avahi_normalize_name_strdup(host_name) : avahi_get_host_name_strdup();
s->host_name[strcspn(s->host_name, ".")] = 0;
update_fqdn(s);
@@ -1303,7 +1303,7 @@ int avahi_server_set_domain_name(AvahiServer *s, const char *domain_name) {
withdraw_host_rrs(s);
avahi_free(s->domain_name);
- s->domain_name = domain_name ? avahi_normalize_name(domain_name) : avahi_strdup("local");
+ s->domain_name = domain_name ? avahi_normalize_name_strdup(domain_name) : avahi_strdup("local");
update_fqdn(s);
register_stuff(s);
@@ -1431,9 +1431,9 @@ AvahiServer *avahi_server_new(const AvahiPoll *poll_api, const AvahiServerConfig
} while (s->local_service_cookie == AVAHI_SERVICE_COOKIE_INVALID);
/* Get host name */
- s->host_name = s->config.host_name ? avahi_normalize_name(s->config.host_name) : avahi_get_host_name();
+ s->host_name = s->config.host_name ? avahi_normalize_name_strdup(s->config.host_name) : avahi_get_host_name_strdup();
s->host_name[strcspn(s->host_name, ".")] = 0;
- s->domain_name = s->config.domain_name ? avahi_normalize_name(s->config.domain_name) : avahi_strdup("local");
+ s->domain_name = s->config.domain_name ? avahi_normalize_name_strdup(s->config.domain_name) : avahi_strdup("local");
s->host_name_fqdn = NULL;
update_fqdn(s);
@@ -1702,7 +1702,7 @@ int avahi_server_add_ptr(
if (!(r = avahi_record_new_full(name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR, ttl)))
return avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
- r->data.ptr.name = avahi_normalize_name(dest);
+ r->data.ptr.name = avahi_normalize_name_strdup(dest);
ret = avahi_server_add(s, g, interface, protocol, flags, r);
avahi_record_unref(r);
return ret;
@@ -1738,7 +1738,7 @@ int avahi_server_add_address(
if (!name)
name = s->host_name_fqdn;
else {
- if (!(n = avahi_normalize_name(name)))
+ if (!(n = avahi_normalize_name_strdup(name)))
return avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
name = n;
@@ -1834,8 +1834,10 @@ static int server_add_txt_strlst_nocopy(
assert(s);
- if (!(r = avahi_record_new_full(name ? name : s->host_name_fqdn, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT, ttl)))
+ if (!(r = avahi_record_new_full(name ? name : s->host_name_fqdn, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT, ttl))) {
+ avahi_string_list_free(strlst);
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);
@@ -1925,8 +1927,7 @@ static int server_add_service_strlst_nocopy(
uint16_t port,
AvahiStringList *strlst) {
- char ptr_name[256], svc_name[256], enum_ptr[256];
- char *t = NULL, *d = NULL, *h = NULL;
+ char ptr_name[AVAHI_DOMAIN_NAME_MAX], svc_name[AVAHI_DOMAIN_NAME_MAX], enum_ptr[AVAHI_DOMAIN_NAME_MAX], *h = NULL;
AvahiRecord *r = NULL;
int ret = AVAHI_OK;
@@ -1965,7 +1966,7 @@ static int server_add_service_strlst_nocopy(
}
if (host && !avahi_is_valid_domain_name(host)) {
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_HOST_NAME);
+ ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_HOST_NAME);
goto fail;
}
@@ -1975,18 +1976,15 @@ static int server_add_service_strlst_nocopy(
if (!host)
host = s->host_name_fqdn;
- if (!(d = avahi_normalize_name(domain)) ||
- !(t = avahi_normalize_name(type)) ||
- !(h = avahi_normalize_name(host))) {
+ if (!(h = avahi_normalize_name_strdup(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);
+ if ((ret = avahi_service_name_join(svc_name, sizeof(svc_name), name, type, domain)) < 0 ||
+ (ret = avahi_service_name_join(ptr_name, sizeof(ptr_name), NULL, type, domain)) < 0 ||
+ (ret = avahi_service_name_join(enum_ptr, sizeof(enum_ptr), NULL, "_services._dns-sd._udp", domain)) < 0)
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;
@@ -2016,16 +2014,12 @@ static int server_add_service_strlst_nocopy(
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);
+ avahi_free(h);
return ret;
}
@@ -2061,7 +2055,7 @@ int avahi_server_add_service_va(
const char *domain,
const char *host,
uint16_t port,
- va_list va){
+ va_list va) {
assert(s);
assert(type);
@@ -2093,6 +2087,7 @@ int avahi_server_add_service(
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;
}
@@ -2217,8 +2212,8 @@ int avahi_server_add_dns_server_name(
if (!domain)
domain = s->domain_name;
- if (!(n = avahi_normalize_name(name)) ||
- !(d = avahi_normalize_name(domain))) {
+ if (!(n = avahi_normalize_name_strdup(name)) ||
+ !(d = avahi_normalize_name_strdup(domain))) {
avahi_free(n);
avahi_free(d);
return avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
@@ -2593,7 +2588,7 @@ int avahi_server_is_service_local(AvahiServer *s, AvahiIfIndex interface, AvahiP
if (domain && !avahi_is_valid_domain_name(domain))
return avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME);
- if ((ret = avahi_service_name_snprint(n, sizeof(n), name, type, domain) < 0))
+ if ((ret = avahi_service_name_join(n, sizeof(n), name, type, domain) < 0))
return avahi_server_set_errno(s, ret);
if (!(key = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV)))
diff --git a/avahi-core/server.h b/avahi-core/server.h
index 1723250..300ae8b 100644
--- a/avahi-core/server.h
+++ b/avahi-core/server.h
@@ -175,4 +175,11 @@ void avahi_server_increase_host_rr_pending(AvahiServer *s);
int avahi_server_set_errno(AvahiServer *s, int error);
+#define AVAHI_CHECK_VALIDITY_RETURN_NULL(server, expression, error) { \
+ if (!(expression)) { \
+ avahi_server_set_errno((server), (error)); \
+ return NULL; \
+ } \
+}
+
#endif