From 958b66ea16deddd794b3a52643bd44633e165ead Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 18 May 2015 17:10:07 +0200 Subject: util: split all hostname related calls into hostname-util.c --- src/core/hostname-setup.c | 3 +- src/firstboot/firstboot.c | 1 + src/hostname/hostnamectl.c | 4 +- src/hostname/hostnamed.c | 1 + src/import/pull-dkr.c | 1 + src/journal-remote/journal-gatewayd.c | 1 + src/journal/journalctl.c | 1 + src/journal/journald-server.c | 7 +- src/libsystemd-network/sd-dhcp-lease.c | 2 +- src/login/pam_systemd.c | 1 + src/network/networkd-dhcp4.c | 1 + src/network/networkd-network.c | 1 + src/nspawn/nspawn.c | 3 +- src/nss-myhostname/nss-myhostname.c | 1 + src/resolve/resolved-dns-scope.c | 3 +- src/resolve/resolved-manager.c | 1 + src/shared/condition.c | 3 +- src/shared/hostname-util.c | 160 +++++++++++++++++++++++++++++++++ src/shared/hostname-util.h | 37 ++++++++ src/shared/specifier.c | 1 + src/shared/util.c | 131 +-------------------------- src/shared/util.h | 10 --- src/shared/utmp-wtmp.c | 3 +- src/systemctl/systemctl.c | 1 + src/test/test-condition.c | 1 + src/test/test-unit-file.c | 1 + src/test/test-unit-name.c | 1 + src/test/test-util.c | 1 + 28 files changed, 231 insertions(+), 151 deletions(-) create mode 100644 src/shared/hostname-util.c create mode 100644 src/shared/hostname-util.h (limited to 'src') diff --git a/src/core/hostname-setup.c b/src/core/hostname-setup.c index 03b0ce3b4d..217f201d05 100644 --- a/src/core/hostname-setup.c +++ b/src/core/hostname-setup.c @@ -23,11 +23,12 @@ #include #include -#include "hostname-setup.h" #include "macro.h" #include "util.h" #include "log.h" #include "fileio.h" +#include "hostname-util.h" +#include "hostname-setup.h" static int read_and_strip_hostname(const char *path, char **hn) { char *s; diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index d156d57caf..cda96d484a 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -36,6 +36,7 @@ #include "locale-util.h" #include "ask-password-api.h" #include "terminal-util.h" +#include "hostname-util.h" static char *arg_root = NULL; static char *arg_locale = NULL; /* $LANG */ diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index 5218b41b41..69ecd61f60 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -26,13 +26,13 @@ #include #include "sd-bus.h" - +#include "sd-id128.h" +#include "hostname-util.h" #include "bus-util.h" #include "bus-error.h" #include "util.h" #include "spawn-polkit-agent.h" #include "build.h" -#include "sd-id128.h" #include "architecture.h" static bool arg_ask_password = true; diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index ddf7b8f1bd..ab9ddc706a 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -33,6 +33,7 @@ #include "bus-util.h" #include "event-util.h" #include "selinux-util.h" +#include "hostname-util.h" #define VALID_DEPLOYMENT_CHARS (DIGITS LETTERS "-.:") diff --git a/src/import/pull-dkr.c b/src/import/pull-dkr.c index 0eefec562e..f89eb88669 100644 --- a/src/import/pull-dkr.c +++ b/src/import/pull-dkr.c @@ -38,6 +38,7 @@ #include "import-common.h" #include "pull-dkr.h" #include "process-util.h" +#include "hostname-util.h" typedef enum DkrProgress { DKR_SEARCHING, diff --git a/src/journal-remote/journal-gatewayd.c b/src/journal-remote/journal-gatewayd.c index 07aebd8c4b..d9450ae8cd 100644 --- a/src/journal-remote/journal-gatewayd.c +++ b/src/journal-remote/journal-gatewayd.c @@ -42,6 +42,7 @@ #include "build.h" #include "fileio.h" #include "sigbus.h" +#include "hostname-util.h" static char *arg_key_pem = NULL; static char *arg_cert_pem = NULL; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 627e43ba35..09f4e0fe38 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -61,6 +61,7 @@ #include "bus-util.h" #include "bus-error.h" #include "terminal-util.h" +#include "hostname-util.h" #define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE) diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 5e07ce3c49..b3a4b53080 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -39,6 +39,10 @@ #include "missing.h" #include "conf-parser.h" #include "selinux-util.h" +#include "acl-util.h" +#include "formats-util.h" +#include "process-util.h" +#include "hostname-util.h" #include "journal-internal.h" #include "journal-vacuum.h" #include "journal-authenticate.h" @@ -49,9 +53,6 @@ #include "journald-native.h" #include "journald-audit.h" #include "journald-server.h" -#include "acl-util.h" -#include "formats-util.h" -#include "process-util.h" #ifdef HAVE_SELINUX #include diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index fa1fa112b1..4b8763aab0 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -27,7 +27,7 @@ #include "fileio.h" #include "unaligned.h" #include "in-addr-util.h" - +#include "hostname-util.h" #include "dhcp-protocol.h" #include "dhcp-lease-internal.h" #include "sd-dhcp-lease.h" diff --git a/src/login/pam_systemd.c b/src/login/pam_systemd.c index 1416701ee1..b5d419000c 100644 --- a/src/login/pam_systemd.c +++ b/src/login/pam_systemd.c @@ -42,6 +42,7 @@ #include "bus-error.h" #include "formats-util.h" #include "terminal-util.h" +#include "hostname-util.h" static int parse_argv( pam_handle_t *handle, diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index c99e92f56d..20aee53d6e 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -22,6 +22,7 @@ #include #include +#include "hostname-util.h" #include "networkd-link.h" #include "network-internal.h" #include "dhcp-lease-internal.h" diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 8aa4eb2ed1..5947084106 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -25,6 +25,7 @@ #include "conf-files.h" #include "conf-parser.h" #include "util.h" +#include "hostname-util.h" #include "networkd.h" #include "networkd-netdev.h" #include "networkd-link.h" diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 8aa7b451bb..4095c77fdf 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -52,11 +52,11 @@ #include #endif -#include "random-util.h" #include "sd-daemon.h" #include "sd-bus.h" #include "sd-id128.h" #include "sd-rtnl.h" +#include "random-util.h" #include "log.h" #include "util.h" #include "mkdir.h" @@ -95,6 +95,7 @@ #include "formats-util.h" #include "process-util.h" #include "terminal-util.h" +#include "hostname-util.h" #ifdef HAVE_SECCOMP #include "seccomp-util.h" diff --git a/src/nss-myhostname/nss-myhostname.c b/src/nss-myhostname/nss-myhostname.c index fed76c62e7..31db1aaf68 100644 --- a/src/nss-myhostname/nss-myhostname.c +++ b/src/nss-myhostname/nss-myhostname.c @@ -29,6 +29,7 @@ #include "local-addresses.h" #include "macro.h" #include "nss-util.h" +#include "hostname-util.h" #include "util.h" /* We use 127.0.0.2 as IPv4 address. This has the advantage over diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index b2bc09266c..7369cbf50f 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -25,9 +25,10 @@ #include "strv.h" #include "socket-util.h" #include "af-list.h" +#include "random-util.h" +#include "hostname-util.h" #include "resolved-dns-domain.h" #include "resolved-dns-scope.h" -#include "random-util.h" #define MULTICAST_RATELIMIT_INTERVAL_USEC (1*USEC_PER_SEC) #define MULTICAST_RATELIMIT_BURST 1000 diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index a10a3277be..dab737d3e4 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -32,6 +32,7 @@ #include "fileio-label.h" #include "ordered-set.h" #include "random-util.h" +#include "hostname-util.h" #include "resolved-dns-domain.h" #include "resolved-conf.h" diff --git a/src/shared/condition.c b/src/shared/condition.c index db12df952b..9f2574c2f6 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -35,8 +35,9 @@ #include "ima-util.h" #include "selinux-util.h" #include "audit.h" -#include "condition.h" #include "cap-list.h" +#include "hostname-util.h" +#include "condition.h" Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate) { Condition *c; diff --git a/src/shared/hostname-util.c b/src/shared/hostname-util.c new file mode 100644 index 0000000000..2998fdf2c7 --- /dev/null +++ b/src/shared/hostname-util.c @@ -0,0 +1,160 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2015 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include + +#include "util.h" +#include "hostname-util.h" + +bool hostname_is_set(void) { + struct utsname u; + + assert_se(uname(&u) >= 0); + + if (isempty(u.nodename)) + return false; + + /* This is the built-in kernel default host name */ + if (streq(u.nodename, "(none)")) + return false; + + return true; +} + +char* gethostname_malloc(void) { + struct utsname u; + + assert_se(uname(&u) >= 0); + + if (isempty(u.nodename) || streq(u.nodename, "(none)")) + return strdup(u.sysname); + + return strdup(u.nodename); +} + +static bool hostname_valid_char(char c) { + return + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + c == '-' || + c == '_' || + c == '.'; +} + +bool hostname_is_valid(const char *s) { + const char *p; + bool dot; + + if (isempty(s)) + return false; + + /* Doesn't accept empty hostnames, hostnames with trailing or + * leading dots, and hostnames with multiple dots in a + * sequence. Also ensures that the length stays below + * HOST_NAME_MAX. */ + + for (p = s, dot = true; *p; p++) { + if (*p == '.') { + if (dot) + return false; + + dot = true; + } else { + if (!hostname_valid_char(*p)) + return false; + + dot = false; + } + } + + if (dot) + return false; + + if (p-s > HOST_NAME_MAX) + return false; + + return true; +} + +char* hostname_cleanup(char *s, bool lowercase) { + char *p, *d; + bool dot; + + assert(s); + + for (p = s, d = s, dot = true; *p; p++) { + if (*p == '.') { + if (dot) + continue; + + *(d++) = '.'; + dot = true; + } else if (hostname_valid_char(*p)) { + *(d++) = lowercase ? tolower(*p) : *p; + dot = false; + } + + } + + if (dot && d > s) + d[-1] = 0; + else + *d = 0; + + strshorten(s, HOST_NAME_MAX); + + return s; +} + +bool is_localhost(const char *hostname) { + assert(hostname); + + /* This tries to identify local host and domain names + * described in RFC6761 plus the redhatism of .localdomain */ + + return streq(hostname, "localhost") || + streq(hostname, "localhost.") || + streq(hostname, "localdomain.") || + streq(hostname, "localdomain") || + endswith(hostname, ".localhost") || + endswith(hostname, ".localhost.") || + endswith(hostname, ".localdomain") || + endswith(hostname, ".localdomain."); +} + +int sethostname_idempotent(const char *s) { + char buf[HOST_NAME_MAX + 1] = {}; + + assert(s); + + if (gethostname(buf, sizeof(buf)) < 0) + return -errno; + + if (streq(buf, s)) + return 0; + + if (sethostname(s, strlen(s)) < 0) + return -errno; + + return 1; +} diff --git a/src/shared/hostname-util.h b/src/shared/hostname-util.h new file mode 100644 index 0000000000..f2821c3078 --- /dev/null +++ b/src/shared/hostname-util.h @@ -0,0 +1,37 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#pragma once + +/*** + This file is part of systemd. + + Copyright 2010-2015 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include + +#include "macro.h" + +bool hostname_is_set(void); + +char* gethostname_malloc(void); + +bool hostname_is_valid(const char *s) _pure_; +char* hostname_cleanup(char *s, bool lowercase); + +bool is_localhost(const char *hostname); + +int sethostname_idempotent(const char *s); diff --git a/src/shared/specifier.c b/src/shared/specifier.c index 8fbf6db5df..85bd477f2d 100644 --- a/src/shared/specifier.c +++ b/src/shared/specifier.c @@ -24,6 +24,7 @@ #include "macro.h" #include "util.h" +#include "hostname-util.h" #include "specifier.h" /* diff --git a/src/shared/util.c b/src/shared/util.c index 3060adc8a6..da6343f4c4 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -92,6 +92,7 @@ #include "process-util.h" #include "random-util.h" #include "terminal-util.h" +#include "hostname-util.h" /* Put this test here for a lack of better place */ assert_cc(EAGAIN == EWOULDBLOCK); @@ -1934,26 +1935,6 @@ int sigprocmask_many(int how, ...) { return 0; } - -char* gethostname_malloc(void) { - struct utsname u; - - assert_se(uname(&u) >= 0); - - if (!isempty(u.nodename) && !streq(u.nodename, "(none)")) - return strdup(u.nodename); - - return strdup(u.sysname); -} - -bool hostname_is_set(void) { - struct utsname u; - - assert_se(uname(&u) >= 0); - - return !isempty(u.nodename) && !streq(u.nodename, "(none)"); -} - char *lookup_uid(uid_t uid) { long bufsize; char *name; @@ -2585,79 +2566,6 @@ char* strshorten(char *s, size_t l) { return s; } -static bool hostname_valid_char(char c) { - return - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - c == '-' || - c == '_' || - c == '.'; -} - -bool hostname_is_valid(const char *s) { - const char *p; - bool dot; - - if (isempty(s)) - return false; - - /* Doesn't accept empty hostnames, hostnames with trailing or - * leading dots, and hostnames with multiple dots in a - * sequence. Also ensures that the length stays below - * HOST_NAME_MAX. */ - - for (p = s, dot = true; *p; p++) { - if (*p == '.') { - if (dot) - return false; - - dot = true; - } else { - if (!hostname_valid_char(*p)) - return false; - - dot = false; - } - } - - if (dot) - return false; - - if (p-s > HOST_NAME_MAX) - return false; - - return true; -} - -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) - continue; - - *(d++) = '.'; - dot = true; - } else if (hostname_valid_char(*p)) { - *(d++) = lowercase ? tolower(*p) : *p; - dot = false; - } - - } - - if (dot && d > s) - d[-1] = 0; - else - *d = 0; - - strshorten(s, HOST_NAME_MAX); - - return s; -} - bool machine_name_is_valid(const char *s) { if (!hostname_is_valid(s)) @@ -5355,23 +5263,6 @@ int tempfn_random_child(const char *p, char **ret) { return 0; } -/* make sure the hostname is not "localhost" */ -bool is_localhost(const char *hostname) { - assert(hostname); - - /* This tries to identify local host and domain names - * described in RFC6761 plus the redhatism of .localdomain */ - - return streq(hostname, "localhost") || - streq(hostname, "localhost.") || - streq(hostname, "localdomain.") || - streq(hostname, "localdomain") || - endswith(hostname, ".localhost") || - endswith(hostname, ".localhost.") || - endswith(hostname, ".localdomain") || - endswith(hostname, ".localdomain."); -} - int take_password_lock(const char *root) { struct flock flock = { @@ -5729,26 +5620,6 @@ int free_and_strdup(char **p, const char *s) { return 1; } -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(s, strlen(s)); - if (r < 0) - return -errno; - - return 1; -} - int ptsname_malloc(int fd, char **ret) { size_t l = 100; diff --git a/src/shared/util.h b/src/shared/util.h index 22f505c0cb..a2b1ec5030 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -351,10 +351,7 @@ char* dirname_malloc(const char *path); void sigset_add_many(sigset_t *ss, ...); int sigprocmask_many(int how, ...); -bool hostname_is_set(void); - char* lookup_uid(uid_t uid); -char* gethostname_malloc(void); char* getlogname_malloc(void); char* getusername_malloc(void); @@ -397,9 +394,6 @@ 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, bool lowercase); - bool machine_name_is_valid(const char *s) _pure_; char* strshorten(char *s, size_t l); @@ -846,8 +840,6 @@ int tempfn_xxxxxx(const char *p, char **ret); int tempfn_random(const char *p, char **ret); int tempfn_random_child(const char *p, char **ret); -bool is_localhost(const char *hostname); - int take_password_lock(const char *root); int is_symlink(const char *path); @@ -864,8 +856,6 @@ int unquote_many_words(const char **p, UnquoteFlags flags, ...) _sentinel_; int free_and_strdup(char **p, const char *s); -int sethostname_idempotent(const char *s); - #define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1) #define FOREACH_INOTIFY_EVENT(e, buffer, sz) \ diff --git a/src/shared/utmp-wtmp.c b/src/shared/utmp-wtmp.c index aaf249dd20..8f66df7718 100644 --- a/src/shared/utmp-wtmp.c +++ b/src/shared/utmp-wtmp.c @@ -29,8 +29,9 @@ #include "macro.h" #include "path-util.h" -#include "utmp-wtmp.h" #include "terminal-util.h" +#include "hostname-util.h" +#include "utmp-wtmp.h" int utmp_get_runlevel(int *runlevel, int *previous) { struct utmpx *found, lookup = { .ut_type = RUN_LVL }; diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index a5b3660be5..f8e10a4710 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -71,6 +71,7 @@ #include "formats-util.h" #include "process-util.h" #include "terminal-util.h" +#include "hostname-util.h" static char **arg_types = NULL; static char **arg_states = NULL; diff --git a/src/test/test-condition.c b/src/test/test-condition.c index 88147c8e0a..b788c9532d 100644 --- a/src/test/test-condition.c +++ b/src/test/test-condition.c @@ -28,6 +28,7 @@ #include "ima-util.h" #include "apparmor-util.h" #include "smack-util.h" +#include "hostname-util.h" static void test_condition_test_path(void) { Condition *condition; diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c index 03ca70a493..a9711ac9f5 100644 --- a/src/test/test-unit-file.c +++ b/src/test/test-unit-file.c @@ -36,6 +36,7 @@ #include "strv.h" #include "fileio.h" #include "test-helper.h" +#include "hostname-util.h" static int test_unit_file_get_set(void) { int r; diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c index 5053d69d1d..e5405fb7f3 100644 --- a/src/test/test-unit-name.c +++ b/src/test/test-unit-name.c @@ -35,6 +35,7 @@ #include "macro.h" #include "path-util.h" #include "test-helper.h" +#include "hostname-util.h" static void test_unit_name_is_valid(void) { assert_se(unit_name_is_valid("foo.service", UNIT_NAME_ANY)); diff --git a/src/test/test-util.c b/src/test/test-util.c index fdb772ddda..9af3e757e3 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -38,6 +38,7 @@ #include "conf-parser.h" #include "virt.h" #include "process-util.h" +#include "hostname-util.h" static void test_streq_ptr(void) { assert_se(streq_ptr(NULL, NULL)); -- cgit v1.2.3-54-g00ecf