chiark / gitweb /
udev: support ENV{}=="" global property matches
[elogind.git] / src / core / hostname-setup.c
index 25ea09c733d3070e2e5479d43ad499be8a9f24ad..57baa7927504197d881a024ede7304cfad18ad3a 100644 (file)
 #include "macro.h"
 #include "util.h"
 #include "log.h"
-
-#if defined(TARGET_FEDORA) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
-#define FILENAME "/etc/sysconfig/network"
-#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
-#define FILENAME "/etc/HOSTNAME"
-#elif defined(TARGET_ARCH)
-#define FILENAME "/etc/rc.conf"
-#elif defined(TARGET_GENTOO)
-#define FILENAME "/etc/conf.d/hostname"
-#endif
+#include "fileio.h"
 
 static int read_and_strip_hostname(const char *path, char **hn) {
         char *s;
@@ -51,7 +42,7 @@ static int read_and_strip_hostname(const char *path, char **hn) {
         if (r < 0)
                 return r;
 
-        hostname_cleanup(s);
+        hostname_cleanup(s, false);
 
         if (isempty(s)) {
                 free(s);
@@ -59,104 +50,23 @@ static int read_and_strip_hostname(const char *path, char **hn) {
         }
 
         *hn = s;
-
-        return 0;
-}
-
-static int read_distro_hostname(char **hn) {
-
-#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
-        int r;
-        FILE *f;
-
-        assert(hn);
-
-        f = fopen(FILENAME, "re");
-        if (!f)
-                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);
-
-                if (!startswith_no_case(s, "HOSTNAME="))
-                        continue;
-
-                k = strdup(s+9);
-                if (!k) {
-                        r = -ENOMEM;
-                        goto finish;
-                }
-
-                hostname_cleanup(k);
-
-                if (isempty(k)) {
-                        free(k);
-                        r = -ENOENT;
-                        goto finish;
-                }
-
-                *hn = k;
-                r = 0;
-                goto finish;
-        }
-
-        r = -ENOENT;
-
-finish:
-        fclose(f);
-        return r;
-
-#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
-        return read_and_strip_hostname(FILENAME, hn);
-#else
-        return -ENOENT;
-#endif
-}
-
-static int read_hostname(char **hn) {
-        int r;
-
-        assert(hn);
-
-        /* First, try to load the generic hostname configuration file,
-         * that we support on all distributions */
-
-        r = read_and_strip_hostname("/etc/hostname", hn);
-        if (r < 0) {
-                if (r == -ENOENT)
-                        return read_distro_hostname(hn);
-
-                return r;
-        }
-
         return 0;
 }
 
 int hostname_setup(void) {
         int r;
-        char *b = NULL;
-        const char *hn = NULL;
+        _cleanup_free_ char *b = NULL;
+        const char *hn;
         bool enoent = false;
 
-        r = read_hostname(&b);
+        r = read_and_strip_hostname("/etc/hostname", &b);
         if (r < 0) {
-                hn = NULL;
-
                 if (r == -ENOENT)
                         enoent = true;
                 else
                         log_warning("Failed to read configured hostname: %s", strerror(-r));
+
+                hn = NULL;
         } else
                 hn = b;
 
@@ -164,7 +74,7 @@ int hostname_setup(void) {
                 /* Don't override the hostname if it is already set
                  * and not explicitly configured */
                 if (hostname_is_set())
-                        goto finish;
+                        return 0;
 
                 if (enoent)
                         log_info("No hostname configured.");
@@ -172,14 +82,11 @@ int hostname_setup(void) {
                 hn = "localhost";
         }
 
-        if (sethostname(hn, strlen(hn)) < 0) {
+        if (sethostname_idempotent(hn) < 0) {
                 log_warning("Failed to set hostname to <%s>: %m", hn);
-                r = -errno;
-        } else
-                log_info("Set hostname to <%s>.", hn);
-
-finish:
-        free(b);
+                return -errno;
+        }
 
-        return r;
+        log_info("Set hostname to <%s>.", hn);
+        return 0;
 }