]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared: add new API to validate a string as hostname or IP address
authorLennart Poettering <lennart@poettering.net>
Fri, 18 Nov 2016 15:55:01 +0000 (16:55 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 21 Nov 2016 21:58:26 +0000 (22:58 +0100)
src/shared/dns-domain.c
src/shared/dns-domain.h
src/test/test-dns-domain.c

index f9a6fd5f03283da95d0ce59fb7917b654657655d..33debadb153ae9f867b60eb8f70c9b4faf2dee2a 100644 (file)
@@ -1324,3 +1324,15 @@ int dns_name_apply_idna(const char *name, char **ret) {
 
         return (int) n;
 }
+
+int dns_name_is_valid_or_address(const char *name) {
+        /* Returns > 0 if the specified name is either a valid IP address formatted as string or a valid DNS name */
+
+        if (isempty(name))
+                return 0;
+
+        if (in_addr_from_string_auto(name, NULL, NULL) >= 0)
+                return 1;
+
+        return dns_name_is_valid(name);
+}
index af780f0b8b96cc0887447dee4a0629dccc431200..03f160369cbb692064bf20bc966756fe6e8c83fb 100644 (file)
@@ -107,3 +107,5 @@ int dns_name_equal_skip(const char *a, unsigned n_labels, const char *b);
 int dns_name_common_suffix(const char *a, const char *b, const char **ret);
 
 int dns_name_apply_idna(const char *name, char **ret);
+
+int dns_name_is_valid_or_address(const char *name);
index e2f097c95e2ab1ce6fd664c035cb3626afefdea0..b4db4a670296d7e6f3cb73479e865ac8da32cc22 100644 (file)
@@ -627,6 +627,18 @@ static void test_dns_name_apply_idna(void) {
         test_dns_name_apply_idna_one("föö.bär.", "xn--f-1gaa.xn--br-via");
 }
 
+static void test_dns_name_is_valid_or_address(void) {
+        assert_se(dns_name_is_valid_or_address(NULL) == 0);
+        assert_se(dns_name_is_valid_or_address("") == 0);
+        assert_se(dns_name_is_valid_or_address("foobar") > 0);
+        assert_se(dns_name_is_valid_or_address("foobar.com") > 0);
+        assert_se(dns_name_is_valid_or_address("foobar..com") == 0);
+        assert_se(dns_name_is_valid_or_address("foobar.com.") > 0);
+        assert_se(dns_name_is_valid_or_address("127.0.0.1") > 0);
+        assert_se(dns_name_is_valid_or_address("::") > 0);
+        assert_se(dns_name_is_valid_or_address("::1") > 0);
+}
+
 int main(int argc, char *argv[]) {
 
         test_dns_label_unescape();
@@ -654,6 +666,7 @@ int main(int argc, char *argv[]) {
         test_dns_name_compare_func();
         test_dns_name_common_suffix();
         test_dns_name_apply_idna();
+        test_dns_name_is_valid_or_address();
 
         return 0;
 }