From: Lennart Poettering Date: Mon, 18 May 2015 15:10:07 +0000 (+0200) Subject: util: split all hostname related calls into hostname-util.c X-Git-Tag: v226.4~1^2~378 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=73318a83b2222cad43d67b01078e38a32ac1c1e2 util: split all hostname related calls into hostname-util.c --- diff --git a/src/login/pam_elogind.c b/src/login/pam_elogind.c index 1eecbf9d6..f42da90cd 100644 --- a/src/login/pam_elogind.c +++ b/src/login/pam_elogind.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/shared/condition.c b/src/shared/condition.c index db12df952..9f2574c2f 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 000000000..2998fdf2c --- /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 000000000..f2821c307 --- /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 8fbf6db5d..85bd477f2 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 d3dacfcfb..04831505a 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); @@ -1935,26 +1936,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; @@ -2586,79 +2567,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)) @@ -5356,23 +5264,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 = { @@ -5730,26 +5621,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 4a5de6f66..a6f536754 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -352,10 +352,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); @@ -398,9 +395,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); @@ -847,8 +841,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); @@ -865,8 +857,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 d6c4cc81b..6fa9a3d7a 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 };