From: Lennart Poettering Date: Tue, 7 May 2013 18:55:11 +0000 (+0200) Subject: hostname: only suppress setting of pretty hostname if it is non-equal to the static... X-Git-Tag: v204~9 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=e724b0639c43c2821613fc4f7f755f87c49a22e8 hostname: only suppress setting of pretty hostname if it is non-equal to the static hostname and if the static hostname is set, too https://bugzilla.redhat.com/show_bug.cgi?id=957814 --- diff --git a/src/core/hostname-setup.c b/src/core/hostname-setup.c index ac508af12..8aa1cff1d 100644 --- a/src/core/hostname-setup.c +++ b/src/core/hostname-setup.c @@ -42,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); diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index 1c9043534..a1e1bd844 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -213,26 +213,6 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) { return 0; } -static char* hostname_simplify(char *s) { - char *p, *d; - - for (p = s, d = s; *p; p++) { - if ((*p >= 'a' && *p <= 'z') || - (*p >= '0' && *p <= '9') || - *p == '-' || *p == '_') - *(d++) = *p; - else if (*p >= 'A' && *p <= 'Z') - *(d++) = *p - 'A' + 'a'; - else if (*p == ' ') - *(d++) = '-'; - } - - *d = 0; - - strshorten(s, HOST_NAME_MAX); - return s; -} - static int set_hostname(DBusConnection *bus, char **args, unsigned n) { _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; dbus_bool_t interactive = true; @@ -254,16 +234,17 @@ static int set_hostname(DBusConnection *bus, char **args, unsigned n) { * just set the passed hostname as static/dynamic * hostname. */ - if (hostname_is_valid(hostname)) + h = strdup(hostname); + if (!h) + return log_oom(); + + hostname_cleanup(h, true); + + if (arg_set_static && streq(h, hostname)) p = ""; else { p = hostname; - - h = strdup(hostname); - if (!h) - return log_oom(); - - hostname = hostname_simplify(h); + hostname = h; } r = bus_method_call_with_reply( diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c index 51a938b79..745f45f93 100644 --- a/src/journal/journal-gatewayd.c +++ b/src/journal/journal-gatewayd.c @@ -839,7 +839,7 @@ static int request_handler_machine( "\"cutoff_to_realtime\" : \"%llu\" }\n", SD_ID128_FORMAT_VAL(mid), SD_ID128_FORMAT_VAL(bid), - hostname_cleanup(hostname), + hostname_cleanup(hostname, false), os_name ? os_name : "Linux", v ? v : "bare", (unsigned long long) usage, diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index d1b201beb..409f08227 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -835,7 +835,7 @@ static int setup_keys(void) { hn = gethostname_malloc(); if (hn) { - hostname_cleanup(hn); + hostname_cleanup(hn, false); fprintf(stderr, "\nThe keys have been generated for host %s/" SD_ID128_FORMAT_STR ".\n", hn, SD_ID128_FORMAT_VAL(machine)); } else fprintf(stderr, "\nThe keys have been generated for host " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(machine)); diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index a58cbec38..09153c87c 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -1267,7 +1267,7 @@ int main(int argc, char *argv[]) { goto finish; } - hostname_cleanup(arg_machine); + hostname_cleanup(arg_machine, false); if (isempty(arg_machine)) { log_error("Failed to determine machine name automatically, please use -M."); goto finish; diff --git a/src/shared/util.c b/src/shared/util.c index 00d3ace61..673e0da6b 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -3838,24 +3838,29 @@ bool hostname_is_valid(const char *s) { return true; } -char* hostname_cleanup(char *s) { +char* hostname_cleanup(char *s, bool lowercase) { char *p, *d; bool dot; for (p = s, d = s, dot = true; *p; p++) { if (*p == '.') { - if (dot || p[1] == 0) + if (dot) continue; + *(d++) = '.'; dot = true; - } else + } else if (hostname_valid_char(*p)) { + *(d++) = lowercase ? tolower(*p) : *p; dot = false; + } - if (hostname_valid_char(*p)) - *(d++) = *p; } - *d = 0; + if (dot && d > s) + d[-1] = 0; + else + *d = 0; + strshorten(s, HOST_NAME_MAX); return s; diff --git a/src/shared/util.h b/src/shared/util.h index 7ef46e8f1..64e63b8c0 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -411,7 +411,7 @@ bool nulstr_contains(const char*nulstr, const char *needle); bool plymouth_running(void); bool hostname_is_valid(const char *s) _pure_; -char* hostname_cleanup(char *s); +char* hostname_cleanup(char *s, bool lowercase); char* strshorten(char *s, size_t l);