X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fhostname-setup.c;h=57baa7927504197d881a024ede7304cfad18ad3a;hp=25ea09c733d3070e2e5479d43ad499be8a9f24ad;hb=adeba5008eac3105ae59256dedd087ebe006a9e6;hpb=8401e9f91d65c3d8d49cf0d2e35d03146354e957 diff --git a/src/core/hostname-setup.c b/src/core/hostname-setup.c index 25ea09c73..57baa7927 100644 --- a/src/core/hostname-setup.c +++ b/src/core/hostname-setup.c @@ -29,16 +29,7 @@ #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; }