chiark / gitweb /
make gcc shut up
[elogind.git] / hostname-setup.c
index 67891a52e62c9d82ef49faa86ad41a45774072d4..71a3f75bd98fed18872dbb552fd1f0992e0613ff 100644 (file)
 
 #define LINE_MAX 4096
 
-static int read_hostname(char **hn) {
-
 #if defined(TARGET_FEDORA)
-        int r;
-        FILE *f;
-
-        assert(hn);
-
-        if (!(f = fopen("/etc/sysconfig/network", "re")))
-                return -errno;
-
-        for (;;) {
-                char line[LINE_MAX];
-                char *s, *k;
-
-                if (!fgets(line, sizeof(line), f)) {
-                        if (feof(f))
-                                break;
-
-                        r = -errno;
-                        goto finish;
-                }
-
-                s = strstrip(line);
+#define FILENAME "/etc/sysconfig/network"
+#elif defined(TARGET_SUSE)
+#define FILENAME "/etc/HOSTNAME"
+#elif defined(TARGET_DEBIAN)
+#define FILENAME "/etc/hostname"
+#elif defined(TARGET_ARCH)
+#define FILENAME "/etc/rc.conf"
+#elif defined(TARGET_GENTOO)
+#define FILENAME "/etc/conf.d/hostname"
+#endif
 
-                if (!startswith(s, "HOSTNAME="))
-                        continue;
+static char* strip_bad_chars(char *s) {
+        char *p, *d;
 
-                if (!(k = strdup(s+9))) {
-                        r = -ENOMEM;
-                        goto finish;
-                }
+        for (p = s, d = s; *p; p++)
+                if ((*p >= 'a' && *p <= 'z') ||
+                    (*p >= 'A' && *p <= 'Z') ||
+                    (*p >= '0' && *p <= '9') ||
+                    *p == '-' ||
+                    *p == '_')
+                        *(d++) = *p;
 
-                *hn = k;
-                break;
-        }
+        *d = 0;
 
-        r = 0;
+        return s;
+}
 
-finish:
-        fclose(f);
-        return r;
+static int read_hostname(char **hn) {
 
-#elif defined(TARGET_ARCH)
+#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO)
         int r;
         FILE *f;
 
         assert(hn);
 
-        if (!(f = fopen("/etc/rc.conf", "re")))
+        if (!(f = fopen(FILENAME, "re")))
                 return -errno;
 
         for (;;) {
@@ -98,7 +85,7 @@ finish:
 
                 s = strstrip(line);
 
-                if (!startswith(s, "HOSTNAME="))
+                if (!startswith_no_case(s, "HOSTNAME="))
                         continue;
 
                 if (!(k = strdup(s+9))) {
@@ -106,6 +93,14 @@ finish:
                         goto finish;
                 }
 
+                strip_bad_chars(k);
+
+                if (k[0] == 0) {
+                        free(k);
+                        r = -ENOENT;
+                        goto finish;
+                }
+
                 *hn = k;
                 break;
         }
@@ -116,13 +111,13 @@ finish:
         fclose(f);
         return r;
 
-#elif defined(TARGET_SUSE)
+#elif defined(TARGET_SUSE) || defined(TARGET_DEBIAN)
         int r;
         char *s, *k;
 
         assert(hn);
 
-        if ((r = read_one_line_file("/etc/HOSTNAME", &s)) < 0)
+        if ((r = read_one_line_file(FILENAME, &s)) < 0)
                 return r;
 
         k = strdup(strstrip(s));
@@ -131,24 +126,15 @@ finish:
         if (!k)
                 return -ENOMEM;
 
-        *hn = k;
+        strip_bad_chars(k);
 
-#elif defined(TARGET_DEBIAN)
-        int r;
-        char *s, *k;
-
-        assert(hn);
-
-        if ((r = read_one_line_file("/etc/hostname", &s)) < 0)
-                return r;
-
-        k = strdup(strstrip(s));
-        free(s);
-
-        if (!k)
-                return -ENOMEM;
+        if (k[0] == 0) {
+                free(k);
+                return -ENOENT;
+        }
 
         *hn = k;
+
 #else
 #warning "Don't know how to read the hostname"