chiark / gitweb /
util: unify SO_PEERCRED/SO_PEERSEC invocations
[elogind.git] / src / core / hostname-setup.c
index 03b5f472a55287ce31c4c547265d5e203f74f94c..8aa1cff1d30f23ad1a42826a487a7e8540a11beb 100644 (file)
 #include "macro.h"
 #include "util.h"
 #include "log.h"
-
-#if defined(TARGET_FEDORA) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MEEGO) || 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,97 +50,16 @@ 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_MEEGO) || 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) {
                 if (r == -ENOENT)
                         enoent = true;
@@ -160,22 +70,11 @@ int hostname_setup(void) {
         } else
                 hn = b;
 
-        if (!hn) {
-                /* Don't override the hostname if it is unset and not
-                 * explicitly configured */
-
-                char *old_hostname = NULL;
-
-                old_hostname = gethostname_malloc();
-                if (old_hostname) {
-                        bool already_set;
-
-                        already_set = old_hostname[0] != 0;
-                        free(old_hostname);
-
-                        if (already_set)
-                                goto finish;
-                }
+        if (isempty(hn)) {
+                /* Don't override the hostname if it is already set
+                 * and not explicitly configured */
+                if (hostname_is_set())
+                        return 0;
 
                 if (enoent)
                         log_info("No hostname configured.");
@@ -185,12 +84,9 @@ int hostname_setup(void) {
 
         if (sethostname(hn, strlen(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;
 }