From: Lennart Poettering Date: Thu, 2 Mar 2006 01:28:03 +0000 (+0000) Subject: add new API function avahi_is_valid_fqdn() X-Git-Url: https://git.meshlink.io/?a=commitdiff_plain;h=4d4577c5a953e9b462cffe9a5d3ead122b7bbe42;p=catta add new API function avahi_is_valid_fqdn() git-svn-id: file:///home/lennart/svn/public/avahi/trunk@1168 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- diff --git a/avahi-common/Makefile.am b/avahi-common/Makefile.am index 96ef099..c786954 100644 --- a/avahi-common/Makefile.am +++ b/avahi-common/Makefile.am @@ -81,12 +81,14 @@ alternative_test_SOURCES = \ alternative.c alternative.h \ malloc.c malloc.h \ domain.c domain.h \ + address.c address.h \ alternative-test.c alternative_test_CFLAGS = $(AM_CFLAGS) domain_test_SOURCES = \ domain.c domain.h \ malloc.c malloc.h \ + address.c address.h \ domain-test.c domain_test_CFLAGS = $(AM_CFLAGS) diff --git a/avahi-common/domain-test.c b/avahi-common/domain-test.c index c9ff32e..0f7d851 100644 --- a/avahi-common/domain-test.c +++ b/avahi-common/domain-test.c @@ -111,6 +111,15 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) { assert(avahi_normalize_name(".", t, sizeof(t))); assert(avahi_normalize_name("", t, sizeof(t))); + assert(!avahi_is_valid_fqdn(".")); + assert(!avahi_is_valid_fqdn("")); + assert(!avahi_is_valid_fqdn("foo")); + assert(avahi_is_valid_fqdn("foo.bar")); + assert(avahi_is_valid_fqdn("foo.bar.")); + assert(avahi_is_valid_fqdn("gnurz.foo.bar.")); + assert(!avahi_is_valid_fqdn("192.168.50.1")); + assert(!avahi_is_valid_fqdn("::1")); + assert(!avahi_is_valid_fqdn(".192.168.50.1.")); return 0; } diff --git a/avahi-common/domain.c b/avahi-common/domain.c index 4927086..1ac8577 100644 --- a/avahi-common/domain.c +++ b/avahi-common/domain.c @@ -36,6 +36,7 @@ #include "domain.h" #include "malloc.h" #include "error.h" +#include "address.h" /* Read the first label from string *name, unescape "\" and write it to dest */ char *avahi_unescape_label(const char **name, char *dest, size_t size) { @@ -569,3 +570,38 @@ int avahi_service_name_split(const char *p, char *name, size_t name_size, char * return 0; } +int avahi_is_valid_fqdn(const char *t) { + char label[AVAHI_LABEL_MAX]; + char normalized[AVAHI_DOMAIN_NAME_MAX]; + const char *k = t; + AvahiAddress a; + assert(t); + + if (strlen(t) >= AVAHI_DOMAIN_NAME_MAX) + return 0; + + if (!avahi_is_valid_domain_name(t)) + return 0; + + /* Check if there are at least two labels*/ + if (!(avahi_unescape_label(&k, label, sizeof(label)))) + return 0; + + if (label[0] == 0 || !k) + return 0; + + if (!(avahi_unescape_label(&k, label, sizeof(label)))) + return 0; + + if (label[0] == 0 || !k) + return 0; + + /* Make sure that the name is not an IP address */ + if (!(avahi_normalize_name(t, normalized, sizeof(normalized)))) + return 0; + + if (avahi_address_parse(normalized, AVAHI_PROTO_UNSPEC, &a)) + return 0; + + return 1; +} diff --git a/avahi-common/domain.h b/avahi-common/domain.h index 53897e7..7073e1c 100644 --- a/avahi-common/domain.h +++ b/avahi-common/domain.h @@ -89,6 +89,9 @@ int avahi_is_valid_service_name(const char *t); /** Return 1 when the specified string contains a valid non-FQDN host name (i.e. without dots), 0 otherwise */ int avahi_is_valid_host_name(const char *t); +/** Return 1 when the specified string contains a valid FQDN host name (i.e. with more than one label and non-numerical), 0 otherwise. \since 0.6.9 */ +int avahi_is_valid_fqdn(const char *t); + /** Return some kind of hash value for the domain, useful for using domains as hash table keys. */ unsigned avahi_domain_hash(const char *name);