chiark / gitweb /
hostname: split out hostname validation into util.c
authorLennart Poettering <lennart@poettering.net>
Fri, 15 Apr 2011 23:57:23 +0000 (01:57 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 16 Apr 2011 00:03:35 +0000 (02:03 +0200)
src/hostname-setup.c
src/util.c
src/util.h

index e9869bb4dff4d64f6d8d1500bd956815fc38cd26..ab497670453e82542110c3d0fc588b3b171297b7 100644 (file)
 #define FILENAME "/etc/conf.d/hostname"
 #endif
 
-static char* strip_bad_chars(char *s) {
-        char *p, *d;
-
-        for (p = s, d = s; *p; p++)
-                if ((*p >= 'a' && *p <= 'z') ||
-                    (*p >= 'A' && *p <= 'Z') ||
-                    (*p >= '0' && *p <= '9') ||
-                    *p == '-' ||
-                    *p == '_' ||
-                    *p == '.')
-                        *(d++) = *p;
-
-        *d = 0;
-
-        return s;
-}
-
 static int read_and_strip_hostname(const char *path, char **hn) {
-        char *s, *k;
+        char *s;
         int r;
 
         assert(path);
@@ -67,20 +50,14 @@ static int read_and_strip_hostname(const char *path, char **hn) {
         if ((r = read_one_line_file(path, &s)) < 0)
                 return r;
 
-        k = strdup(strstrip(s));
-        free(s);
-
-        if (!k)
-                return -ENOMEM;
-
-        strip_bad_chars(k);
+        hostname_cleanup(s);
 
-        if (k[0] == 0) {
-                free(k);
+        if (isempty(s)) {
+                free(s);
                 return -ENOENT;
         }
 
-        *hn = k;
+        *hn = s;
 
         return 0;
 }
@@ -118,9 +95,9 @@ static int read_distro_hostname(char **hn) {
                         goto finish;
                 }
 
-                strip_bad_chars(k);
+                hostname_cleanup(k);
 
-                if (k[0] == 0) {
+                if (isempty(k)) {
                         free(k);
                         r = -ENOENT;
                         goto finish;
index fb8df84e1934552dce76f582cedb965a4b46e46a..bec6e0c8e8b95d857e19d2c7f11cfff606462b90 100644 (file)
@@ -4248,6 +4248,59 @@ int have_effective_cap(int value) {
         return r;
 }
 
+char* strshorten(char *s, size_t l) {
+        assert(s);
+
+        if (l < strlen(s))
+                s[l] = 0;
+
+        return s;
+}
+
+static bool hostname_valid_char(char c) {
+        return
+                (c >= 'a' && c <= 'z') ||
+                (c >= 'A' && c <= 'Z') ||
+                (c >= '0' && c <= '9') ||
+                c == '-' ||
+                c == '_' ||
+                c == '.';
+}
+
+bool hostname_is_valid(const char *s) {
+        const char *p;
+
+        if (isempty(s))
+                return false;
+
+        for (p = s; *p; p++)
+                if (!hostname_valid_char(*p))
+                        return false;
+
+        if (p-s > HOST_NAME_MAX)
+                return false;
+
+        return true;
+}
+
+char* hostname_cleanup(char *s) {
+        char *p, *d;
+
+        for (p = s, d = s; *p; p++)
+                if ((*p >= 'a' && *p <= 'z') ||
+                    (*p >= 'A' && *p <= 'Z') ||
+                    (*p >= '0' && *p <= '9') ||
+                    *p == '-' ||
+                    *p == '_' ||
+                    *p == '.')
+                        *(d++) = *p;
+
+        *d = 0;
+
+        strshorten(s, HOST_NAME_MAX);
+        return s;
+}
+
 static const char *const ioprio_class_table[] = {
         [IOPRIO_CLASS_NONE] = "none",
         [IOPRIO_CLASS_RT] = "realtime",
index 72ddd36e556bc8954063c88767c73fb73a8f10e7..946179a90d3b27a505865ff901e2b3b4c807f6be 100644 (file)
@@ -117,6 +117,10 @@ static inline bool is_path_absolute(const char *p) {
         return *p == '/';
 }
 
+static inline bool isempty(const char *p) {
+        return !p || !p[0];
+}
+
 bool endswith(const char *s, const char *postfix);
 bool startswith(const char *s, const char *prefix);
 bool startswith_no_case(const char *s, const char *prefix);
@@ -398,6 +402,11 @@ void parse_syslog_priority(char **p, int *priority);
 
 int have_effective_cap(int value);
 
+bool hostname_is_valid(const char *s);
+char* hostname_cleanup(char *s);
+
+char* strshorten(char *s, size_t l);
+
 #define NULSTR_FOREACH(i, l)                                    \
         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)