summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/hostnamectl.xml8
-rw-r--r--src/hostname/hostnamed.c35
2 files changed, 33 insertions, 10 deletions
diff --git a/man/hostnamectl.xml b/man/hostnamectl.xml
index 6746a7042f..a11f2215d9 100644
--- a/man/hostnamectl.xml
+++ b/man/hostnamectl.xml
@@ -69,11 +69,9 @@
(e.g. "Lennart's Laptop"), the static hostname which
is used to initialize the kernel hostname at boot
(e.g. "lennarts-laptop"), and the transient hostname
- which might be assigned temporarily due to network
- configuration and might revert back to the static
- hostname if network connectivity is lost and is only
- temporarily written to the kernel hostname
- (e.g. "dhcp-47-11").</para>
+ which is a default received from network configuration.
+ If a static hostname is set, and is valid (something other
+ than localhost) then the transient hostname is not used.</para>
<para>Note that the pretty hostname has little
restrictions on the characters used, while the static
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index 5c767cde97..a3504904a0 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -250,16 +250,35 @@ static char* context_fallback_icon_name(Context *c) {
return strdup("computer");
}
-static int context_write_data_hostname(Context *c) {
+static bool hostname_is_useful(const char *hn) {
+ return !isempty(hn) && !streq(hn, "localhost");
+}
+
+static int context_update_kernel_hostname(Context *c) {
+ const char *static_hn;
const char *hn;
assert(c);
- if (isempty(c->data[PROP_HOSTNAME]))
- hn = "localhost";
- else
+ static_hn = c->data[PROP_STATIC_HOSTNAME];
+
+ /* /etc/hostname with something other than "localhost"
+ * has the highest preference ... */
+ if (hostname_is_useful(static_hn))
+ hn = static_hn;
+
+ /* ... the transient host name, (ie: DHCP) comes next ...*/
+ else if (!isempty(c->data[PROP_HOSTNAME]))
hn = c->data[PROP_HOSTNAME];
+ /* ... fallback to static "localhost.*" ignored above ... */
+ else if (!isempty(static_hn))
+ hn = static_hn;
+
+ /* ... and the ultimate fallback */
+ else
+ hn = "localhost";
+
if (sethostname(hn, strlen(hn)) < 0)
return -errno;
@@ -411,7 +430,7 @@ static int method_set_hostname(sd_bus *bus, sd_bus_message *m, void *userdata, s
free(c->data[PROP_HOSTNAME]);
c->data[PROP_HOSTNAME] = h;
- r = context_write_data_hostname(c);
+ r = context_update_kernel_hostname(c);
if (r < 0) {
log_error("Failed to set host name: %s", strerror(-r));
return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %s", strerror(-r));
@@ -463,6 +482,12 @@ static int method_set_static_hostname(sd_bus *bus, sd_bus_message *m, void *user
c->data[PROP_STATIC_HOSTNAME] = h;
}
+ r = context_update_kernel_hostname(c);
+ if (r < 0) {
+ log_error("Failed to set host name: %s", strerror(-r));
+ return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %s", strerror(-r));
+ }
+
r = context_write_data_static_hostname(c);
if (r < 0) {
log_error("Failed to write static host name: %s", strerror(-r));