Function queries system hostname and applies changes only when necessary. Also,
migrate all client of sethostname to sethostname_idempotent while at it.
hn = "localhost";
}
- if (sethostname(hn, strlen(hn)) < 0) {
+ if (sethostname_idempotent(hn) < 0) {
log_warning("Failed to set hostname to <%s>: %m", hn);
return -errno;
}
else
hn = "localhost";
- if (sethostname(hn, strlen(hn)) < 0)
+ if (sethostname_idempotent(hn) < 0)
return -errno;
return 0;
if (arg_share_system)
return 0;
- if (sethostname(arg_machine, strlen(arg_machine)) < 0)
+ if (sethostname_idempotent(arg_machine) < 0)
return -errno;
return 0;
return 0;
}
+
+int sethostname_idempotent(const char *s) {
+ int r;
+ char buf[HOST_NAME_MAX + 1] = {};
+
+ assert(s);
+
+ r = gethostname(buf, sizeof(buf));
+ if (r < 0)
+ return -errno;
+
+ if (streq(buf, s))
+ return 0;
+
+ r = sethostname(buf, strlen(buf));
+ if (r < 0)
+ return -errno;
+
+ return 1;
+}
int unquote_many_words(const char **p, ...) _sentinel_;
int free_and_strdup(char **p, const char *s);
+
+int sethostname_idempotent(const char *s);