64 lines
1.8 KiB
C
64 lines
1.8 KiB
C
/* SPDX-License-Identifier: LGPL-2.1+ */
|
|
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "alloc-util.h"
|
|
#include "fileio.h"
|
|
#include "hostname-setup.h"
|
|
#include "hostname-util.h"
|
|
#include "log.h"
|
|
#include "macro.h"
|
|
#include "proc-cmdline.h"
|
|
#include "string-util.h"
|
|
#include "util.h"
|
|
|
|
int hostname_setup(void) {
|
|
_cleanup_free_ char *b = NULL;
|
|
const char *hn = NULL;
|
|
bool enoent = false;
|
|
int r;
|
|
|
|
r = proc_cmdline_get_key("systemd.hostname", 0, &b);
|
|
if (r < 0)
|
|
log_warning_errno(r, "Failed to retrieve system hostname from kernel command line, ignoring: %m");
|
|
else if (r > 0) {
|
|
if (hostname_is_valid(b, true))
|
|
hn = b;
|
|
else {
|
|
log_warning("Hostname specified on kernel command line is invalid, ignoring: %s", b);
|
|
b = mfree(b);
|
|
}
|
|
}
|
|
|
|
if (!hn) {
|
|
r = read_etc_hostname(NULL, &b);
|
|
if (r < 0) {
|
|
if (r == -ENOENT)
|
|
enoent = true;
|
|
else
|
|
log_warning_errno(r, "Failed to read configured hostname: %m");
|
|
} else
|
|
hn = b;
|
|
}
|
|
|
|
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.");
|
|
|
|
hn = FALLBACK_HOSTNAME;
|
|
}
|
|
|
|
r = sethostname_idempotent(hn);
|
|
if (r < 0)
|
|
return log_warning_errno(r, "Failed to set hostname to <%s>: %m", hn);
|
|
|
|
log_info("Set hostname to <%s>.", hn);
|
|
return 0;
|
|
}
|