From 66ecc207e203db5434610395cd04c40ae8727b58 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Thu, 27 Apr 2017 11:30:28 +0200 Subject: Prep v229: Add missing fixes from upstream [1/6] src/basic --- src/basic/audit-util.h | 2 +- src/basic/bus-label.h | 1 + src/basic/capability-util.c | 73 ++++++++++++++++++++++++++++++++++++++------- src/basic/capability-util.h | 15 ++++++++-- src/basic/cgroup-util.c | 13 ++++---- src/basic/cgroup-util.h | 10 +++++-- src/basic/copy.c | 17 ++++++++--- src/basic/copy.h | 1 + src/basic/errno-list.c | 9 ++---- src/basic/escape.c | 17 ++++++----- src/basic/escape.h | 10 +++++-- src/basic/extract-word.c | 16 +++++++--- src/basic/fd-util.c | 13 ++++++-- src/basic/fd-util.h | 6 +++- src/basic/fileio-label.c | 6 ++-- src/basic/fileio.c | 44 +++++++++++++++++++++++++-- src/basic/fileio.h | 4 +++ src/basic/fs-util.c | 16 ++++++++-- src/basic/hashmap.h | 45 ++-------------------------- src/basic/hostname-util.c | 11 ++++--- src/basic/io-util.c | 7 +++-- src/basic/label.c | 8 +++-- src/basic/locale-util.c | 13 ++++++-- src/basic/login-util.c | 5 ++-- src/basic/memfd-util.c | 7 +++-- src/basic/memfd-util.h | 4 ++- src/basic/mempool.c | 5 ++-- src/basic/missing.h | 37 +++++++++++++++++++++++ src/basic/mount-util.c | 8 +++-- src/basic/parse-util.c | 12 ++++++-- src/basic/path-util.h | 2 ++ src/basic/prioq.h | 3 ++ src/basic/proc-cmdline.c | 6 ++-- src/basic/process-util.c | 41 ++++++++++++++++++++++++- src/basic/process-util.h | 9 ++++-- src/basic/random-util.c | 9 +++--- src/basic/random-util.h | 1 + src/basic/rm-rf.c | 16 +++++++--- src/basic/selinux-util.c | 22 +++++++++----- src/basic/selinux-util.h | 9 ++++-- src/basic/signal-util.c | 13 ++++---- src/basic/signal-util.h | 12 ++++++++ src/basic/smack-util.c | 9 ++++-- src/basic/socket-util.c | 13 ++------ src/basic/socket-util.h | 18 +++++++---- src/basic/stat-util.c | 6 ++-- src/basic/stat-util.h | 5 ++-- src/basic/string-table.c | 3 +- src/basic/string-table.h | 1 + src/basic/string-util.c | 9 ++++-- src/basic/string-util.h | 2 ++ src/basic/strv.c | 22 ++++++++++++-- src/basic/strv.h | 2 ++ src/basic/syslog-util.c | 5 ++-- src/basic/terminal-util.c | 33 +++++++++++++++----- src/basic/terminal-util.h | 20 +++++++------ src/basic/time-util.c | 66 ++++++++++++++++++++-------------------- src/basic/time-util.h | 28 +++++++++++++++-- src/basic/unit-name.c | 2 +- src/basic/user-util.c | 14 +++++++-- src/basic/user-util.h | 2 +- src/basic/util.c | 60 ++++--------------------------------- src/basic/verbs.c | 16 ++++++++-- src/basic/virt.c | 6 ++-- src/basic/xattr-util.c | 11 +++++-- 65 files changed, 626 insertions(+), 305 deletions(-) (limited to 'src') diff --git a/src/basic/audit-util.h b/src/basic/audit-util.h index 85776b6bf..b16ca585b 100644 --- a/src/basic/audit-util.h +++ b/src/basic/audit-util.h @@ -19,8 +19,8 @@ along with systemd; If not, see . ***/ -#include #include +#include #include #define AUDIT_SESSION_INVALID ((uint32_t) -1) diff --git a/src/basic/bus-label.h b/src/basic/bus-label.h index 930e7b6f6..62fb2c450 100644 --- a/src/basic/bus-label.h +++ b/src/basic/bus-label.h @@ -19,6 +19,7 @@ along with systemd; If not, see . ***/ +#include #include #include diff --git a/src/basic/capability-util.c b/src/basic/capability-util.c index 3e1306470..a9c21fef2 100644 --- a/src/basic/capability-util.c +++ b/src/basic/capability-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -99,7 +97,62 @@ unsigned long cap_last_cap(void) { } #if 0 /// UNNEEDED by elogind -int capability_bounding_set_drop(uint64_t drop, bool right_now) { +int capability_update_inherited_set(cap_t caps, uint64_t set) { + unsigned long i; + + /* Add capabilities in the set to the inherited caps. Do not apply + * them yet. */ + + for (i = 0; i < cap_last_cap(); i++) { + + if (set & (UINT64_C(1) << i)) { + cap_value_t v; + + v = (cap_value_t) i; + + /* Make the capability inheritable. */ + if (cap_set_flag(caps, CAP_INHERITABLE, 1, &v, CAP_SET) < 0) + return -errno; + } + } + + return 0; +} + +int capability_ambient_set_apply(uint64_t set, bool also_inherit) { + unsigned long i; + _cleanup_cap_free_ cap_t caps = NULL; + + /* Add the capabilities to the ambient set. */ + + if (also_inherit) { + int r; + caps = cap_get_proc(); + if (!caps) + return -errno; + + r = capability_update_inherited_set(caps, set); + if (r < 0) + return -errno; + + if (cap_set_proc(caps) < 0) + return -errno; + } + + for (i = 0; i < cap_last_cap(); i++) { + + if (set & (UINT64_C(1) << i)) { + + /* Add the capability to the ambient set. */ + if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, i, 0, 0) < 0) + return -errno; + } + } + + return 0; +} + +int capability_bounding_set_drop(uint64_t keep, bool right_now) { _cleanup_cap_free_ cap_t after_cap = NULL; cap_flag_value_t fv; unsigned long i; @@ -140,7 +193,7 @@ int capability_bounding_set_drop(uint64_t drop, bool right_now) { for (i = 0; i <= cap_last_cap(); i++) { - if (drop & ((uint64_t) 1ULL << (uint64_t) i)) { + if (!(keep & (UINT64_C(1) << i))) { cap_value_t v; /* Drop it from the bounding set */ @@ -179,7 +232,7 @@ finish: return r; } -static int drop_from_file(const char *fn, uint64_t drop) { +static int drop_from_file(const char *fn, uint64_t keep) { int r, k; uint32_t hi, lo; uint64_t current, after; @@ -199,7 +252,7 @@ static int drop_from_file(const char *fn, uint64_t drop) { return -EIO; current = (uint64_t) lo | ((uint64_t) hi << 32ULL); - after = current & ~drop; + after = current & keep; if (current == after) return 0; @@ -216,14 +269,14 @@ static int drop_from_file(const char *fn, uint64_t drop) { return r; } -int capability_bounding_set_drop_usermode(uint64_t drop) { +int capability_bounding_set_drop_usermode(uint64_t keep) { int r; - r = drop_from_file("/proc/sys/kernel/usermodehelper/inheritable", drop); + r = drop_from_file("/proc/sys/kernel/usermodehelper/inheritable", keep); if (r < 0) return r; - r = drop_from_file("/proc/sys/kernel/usermodehelper/bset", drop); + r = drop_from_file("/proc/sys/kernel/usermodehelper/bset", keep); if (r < 0) return r; @@ -260,7 +313,7 @@ int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilities) { return log_error_errno(errno, "Failed to disable keep capabilities flag: %m"); /* Drop all caps from the bounding set, except the ones we want */ - r = capability_bounding_set_drop(~keep_capabilities, true); + r = capability_bounding_set_drop(keep_capabilities, true); if (r < 0) return log_error_errno(r, "Failed to drop capabilities: %m"); diff --git a/src/basic/capability-util.h b/src/basic/capability-util.h index d14106b48..913048e4c 100644 --- a/src/basic/capability-util.h +++ b/src/basic/capability-util.h @@ -27,11 +27,16 @@ #include "macro.h" #include "util.h" +#define CAP_ALL (uint64_t) -1 + unsigned long cap_last_cap(void); #if 0 /// UNNEEDED by elogind int have_effective_cap(int value); -int capability_bounding_set_drop(uint64_t drop, bool right_now); -int capability_bounding_set_drop_usermode(uint64_t drop); +int capability_bounding_set_drop(uint64_t keep, bool right_now); +int capability_bounding_set_drop_usermode(uint64_t keep); + +int capability_ambient_set_apply(uint64_t set, bool also_inherit); +int capability_update_inherited_set(cap_t caps, uint64_t ambient_set); int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilities); @@ -46,3 +51,9 @@ static inline void cap_free_charpp(char **p) { } #define _cleanup_cap_free_charp_ _cleanup_(cap_free_charpp) #endif // 0 + +static inline bool cap_test_all(uint64_t caps) { + uint64_t m; + m = (UINT64_C(1) << (cap_last_cap() + 1)) - 1; + return (caps & m) == m; +} diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 4d89043ab..3506ca8bf 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -22,23 +20,29 @@ #include #include #include +//#include #include +//#include #include #include #include +//#include #include #include #include "alloc-util.h" #include "cgroup-util.h" +//#include "def.h" #include "dirent-util.h" #include "extract-word.h" #include "fd-util.h" #include "fileio.h" #include "formats-util.h" #include "fs-util.h" +//#include "log.h" #include "login-util.h" #include "macro.h" +//#include "missing.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" @@ -47,11 +51,11 @@ #include "set.h" //#include "special.h" #include "stat-util.h" +#include "stdio-util.h" #include "string-table.h" #include "string-util.h" #include "unit-name.h" #include "user-util.h" -#include "util.h" int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) { _cleanup_free_ char *fs = NULL; @@ -557,7 +561,6 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch r = join_path_unified(path, suffix, fs); else r = join_path_legacy(controller, path, suffix, fs); - if (r < 0) return r; @@ -716,7 +719,7 @@ int cg_attach(const char *controller, const char *path, pid_t pid) { if (pid == 0) pid = getpid(); - snprintf(c, sizeof(c), PID_FMT"\n", pid); + xsprintf(c, PID_FMT "\n", pid); return write_string_file(fs, c, 0); } diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index e8fce8353..f1a52b2bd 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -19,12 +19,16 @@ along with systemd; If not, see . ***/ -#include -#include #include +#include +#include +#include +#include -#include "set.h" #include "def.h" +//#include "hashmap.h" +//#include "macro.h" +#include "set.h" /* An enum of well known cgroup controllers */ typedef enum CGroupController { diff --git a/src/basic/copy.c b/src/basic/copy.c index d807520a9..6be7cc37a 100644 --- a/src/basic/copy.c +++ b/src/basic/copy.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,8 +17,18 @@ along with systemd; If not, see . ***/ +//#include +//#include +//#include +//#include +//#include +//#include +//#include #include +//#include #include +//#include +//#include //#include "alloc-util.h" //#include "btrfs-util.h" @@ -31,10 +39,11 @@ //#include "fileio.h" //#include "fs-util.h" #include "io-util.h" +//#include "macro.h" //#include "string-util.h" #include "strv.h" +#include "time-util.h" //#include "umask-util.h" -#include "util.h" //#include "xattr-util.h" #define COPY_BUFFER_SIZE (16*1024) @@ -64,7 +73,7 @@ int copy_bytes(int fdf, int fdt, uint64_t max_bytes, bool try_reflink) { if (max_bytes != (uint64_t) -1) { if (max_bytes <= 0) - return -EFBIG; + return 1; /* return > 0 if we hit the max_bytes limit */ if ((uint64_t) m > max_bytes) m = (size_t) max_bytes; diff --git a/src/basic/copy.h b/src/basic/copy.h index da8586fed..c389724aa 100644 --- a/src/basic/copy.h +++ b/src/basic/copy.h @@ -21,6 +21,7 @@ #include #include +#include #include #if 0 /// UNNEEDED by elogind diff --git a/src/basic/errno-list.c b/src/basic/errno-list.c index c41a8b884..c568629f7 100644 --- a/src/basic/errno-list.c +++ b/src/basic/errno-list.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -21,14 +19,12 @@ #include -#include "config.h" #include "errno-list.h" -#include "util.h" +#include "macro.h" static const struct errno_name* lookup_errno(register const char *str, register GPERF_LEN_TYPE len); - #include "errno-from-name.h" #include "errno-to-name.h" @@ -50,8 +46,9 @@ int errno_from_name(const char *name) { sc = lookup_errno(name, strlen(name)); if (!sc) - return 0; + return -EINVAL; + assert(sc->id > 0); return sc->id; } diff --git a/src/basic/escape.c b/src/basic/escape.c index 9dbfa6d6e..2e483880c 100644 --- a/src/basic/escape.c +++ b/src/basic/escape.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,12 +17,15 @@ along with systemd; If not, see . ***/ +#include +#include +#include + #include "alloc-util.h" #include "escape.h" #include "hexdecoct.h" -#include "string-util.h" +#include "macro.h" #include "utf8.h" -#include "util.h" size_t cescape_char(char c, char *buf) { char * buf_old = buf; @@ -116,7 +117,7 @@ char *cescape(const char *s) { return cescape_length(s, strlen(s)); } -int cunescape_one(const char *p, size_t length, uint32_t *ret, bool *eight_bit) { +int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit) { int r = 1; assert(p); @@ -227,7 +228,7 @@ int cunescape_one(const char *p, size_t length, uint32_t *ret, bool *eight_bit) int a[8]; unsigned i; - uint32_t c; + char32_t c; if (length != (size_t) -1 && length < 9) return -EINVAL; @@ -264,7 +265,7 @@ int cunescape_one(const char *p, size_t length, uint32_t *ret, bool *eight_bit) case '7': { /* octal encoding */ int a, b, c; - uint32_t m; + char32_t m; if (length != (size_t) -1 && length < 3) return -EINVAL; @@ -324,8 +325,8 @@ int cunescape_length_with_prefix(const char *s, size_t length, const char *prefi for (f = s, t = r + pl; f < s + length; f++) { size_t remaining; - uint32_t u; bool eight_bit = false; + char32_t u; int k; remaining = s + length - f; diff --git a/src/basic/escape.h b/src/basic/escape.h index 3a1a62762..1b28bd10a 100644 --- a/src/basic/escape.h +++ b/src/basic/escape.h @@ -19,8 +19,14 @@ along with systemd; If not, see . ***/ -#include #include +#include +#include +#include +#include + +#include "string-util.h" +#include "missing.h" /* What characters are special in the shell? */ /* must be escaped outside and inside double-quotes */ @@ -39,7 +45,7 @@ size_t cescape_char(char c, char *buf); int cunescape(const char *s, UnescapeFlags flags, char **ret); int cunescape_length(const char *s, size_t length, UnescapeFlags flags, char **ret); int cunescape_length_with_prefix(const char *s, size_t length, const char *prefix, UnescapeFlags flags, char **ret); -int cunescape_one(const char *p, size_t length, uint32_t *ret, bool *eight_bit); +int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit); char *xescape(const char *s, const char *bad); diff --git a/src/basic/extract-word.c b/src/basic/extract-word.c index de5616890..97a02220c 100644 --- a/src/basic/extract-word.c +++ b/src/basic/extract-word.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,12 +17,22 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include +#include +#include +#include + #include "alloc-util.h" #include "escape.h" #include "extract-word.h" +#include "log.h" +#include "macro.h" #include "string-util.h" #include "utf8.h" -#include "util.h" int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags) { _cleanup_free_ char *s = NULL; @@ -97,8 +105,8 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra } if (flags & EXTRACT_CUNESCAPE) { - uint32_t u; bool eight_bit = false; + char32_t u; r = cunescape_one(*p, (size_t) -1, &u, &eight_bit); if (r < 0) { diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index 17cafa4bb..6c3063298 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,9 +17,18 @@ along with systemd; If not, see . ***/ -#include "dirent-util.h" +#include +#include +#include +#include +#include +#include + #include "fd-util.h" +#include "macro.h" +#include "missing.h" #include "parse-util.h" +#include "path-util.h" #include "socket-util.h" #include "util.h" diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index 2575bcc35..e2f5bbdaf 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -19,9 +19,9 @@ along with systemd; If not, see . ***/ -#include #include #include +#include #include #include "macro.h" @@ -75,3 +75,7 @@ void cmsg_close_all(struct msghdr *mh); bool fdname_is_valid(const char *s); #endif // 0 + +/* Hint: ENETUNREACH happens if we try to connect to "non-existing" special IP addresses, such as ::5 */ +#define ERRNO_IS_DISCONNECT(r) \ + IN_SET(r, ENOTCONN, ECONNRESET, ECONNREFUSED, ECONNABORTED, EPIPE, ENETUNREACH) diff --git a/src/basic/fileio-label.c b/src/basic/fileio-label.c index 5fd949e10..728267006 100644 --- a/src/basic/fileio-label.c +++ b/src/basic/fileio-label.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -20,9 +18,11 @@ along with systemd; If not, see . ***/ +#include + #include "fileio-label.h" +//#include "fileio.h" #include "selinux-util.h" -#include "util.h" int write_string_file_atomic_label(const char *fn, const char *line) { int r; diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 6c0be71df..f2a8f29e6 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,6 +17,15 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include "alloc-util.h" @@ -28,15 +35,17 @@ #include "fileio.h" #include "fs-util.h" #include "hexdecoct.h" +//#include "log.h" +//#include "macro.h" #include "parse-util.h" #include "path-util.h" #include "random-util.h" #include "stdio-util.h" #include "string-util.h" #include "strv.h" +//#include "time-util.h" #include "umask-util.h" #include "utf8.h" -#include "util.h" int write_string_stream(FILE *f, const char *line, bool enforce_newline) { @@ -1249,4 +1258,33 @@ int read_timestamp_file(const char *fn, usec_t *ret) { *ret = (usec_t) t; return 0; } + +int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space) { + int r; + + assert(s); + + /* Outputs the specified string with fputs(), but optionally prefixes it with a separator. The *space parameter + * when specified shall initially point to a boolean variable initialized to false. It is set to true after the + * first invocation. This call is supposed to be use in loops, where a separator shall be inserted between each + * element, but not before the first one. */ + + if (!f) + f = stdout; + + if (space) { + if (!separator) + separator = " "; + + if (*space) { + r = fputs(separator, f); + if (r < 0) + return r; + } + + *space = true; + } + + return fputs(s, f); +} #endif // 0 diff --git a/src/basic/fileio.h b/src/basic/fileio.h index e05bdcad2..0d4de515e 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -49,9 +49,11 @@ int load_env_file(FILE *f, const char *fname, const char *separator, char ***l); int load_env_file_pairs(FILE *f, const char *fname, const char *separator, char ***l); int write_env_file(const char *fname, char **l); + #if 0 /// UNNEEDED by elogind int executable_is_script(const char *path, char **interpreter); #endif // 0 + int get_proc_field(const char *filename, const char *pattern, const char *terminator, char **field); DIR *xopendirat(int dirfd, const char *name, int flags); @@ -84,4 +86,6 @@ int tempfn_random_child(const char *p, const char *extra, char **ret); int write_timestamp_file_atomic(const char *fn, usec_t n); int read_timestamp_file(const char *fn, usec_t *ret); + +int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space); #endif // 0 diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index e895cac4f..b37fef8f5 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,16 +17,30 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "alloc-util.h" #include "dirent-util.h" #include "fd-util.h" #include "fileio.h" #include "fs-util.h" +//#include "log.h" +//#include "macro.h" +//#include "missing.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" #include "string-util.h" #include "strv.h" +//#include "time-util.h" #include "user-util.h" #include "util.h" diff --git a/src/basic/hashmap.h b/src/basic/hashmap.h index d72f57654..a51027204 100644 --- a/src/basic/hashmap.h +++ b/src/basic/hashmap.h @@ -20,10 +20,12 @@ along with systemd; If not, see . ***/ +#include #include +#include +#include "hash-funcs.h" #include "macro.h" -#include "siphash24.h" #include "util.h" /* @@ -66,47 +68,6 @@ typedef struct { #define _IDX_ITERATOR_FIRST (UINT_MAX - 1) #define ITERATOR_FIRST ((Iterator) { .idx = _IDX_ITERATOR_FIRST, .next_key = NULL }) -typedef void (*hash_func_t)(const void *p, struct siphash *state); -typedef int (*compare_func_t)(const void *a, const void *b); - -struct hash_ops { - hash_func_t hash; - compare_func_t compare; -}; - -void string_hash_func(const void *p, struct siphash *state); -int string_compare_func(const void *a, const void *b) _pure_; -extern const struct hash_ops string_hash_ops; - -/* This will compare the passed pointers directly, and will not - * dereference them. This is hence not useful for strings or - * suchlike. */ -void trivial_hash_func(const void *p, struct siphash *state); -int trivial_compare_func(const void *a, const void *b) _const_; -extern const struct hash_ops trivial_hash_ops; - -/* 32bit values we can always just embedd in the pointer itself, but - * in order to support 32bit archs we need store 64bit values - * indirectly, since they don't fit in a pointer. */ -void uint64_hash_func(const void *p, struct siphash *state); -int uint64_compare_func(const void *a, const void *b) _pure_; -extern const struct hash_ops uint64_hash_ops; - -/* On some archs dev_t is 32bit, and on others 64bit. And sometimes - * it's 64bit on 32bit archs, and sometimes 32bit on 64bit archs. Yuck! */ -#if SIZEOF_DEV_T != 8 -void devt_hash_func(const void *p, struct siphash *state) _pure_; -int devt_compare_func(const void *a, const void *b) _pure_; -extern const struct hash_ops devt_hash_ops = { - .hash = devt_hash_func, - .compare = devt_compare_func -}; -#else -#define devt_hash_func uint64_hash_func -#define devt_compare_func uint64_compare_func -#define devt_hash_ops uint64_hash_ops -#endif - /* Macros for type checking */ #define PTR_COMPATIBLE_WITH_HASHMAP_BASE(h) \ (__builtin_types_compatible_p(typeof(h), HashmapBase*) || \ diff --git a/src/basic/hostname-util.c b/src/basic/hostname-util.c index 23366e57b..b3d79c5a8 100644 --- a/src/basic/hostname-util.c +++ b/src/basic/hostname-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,14 +17,19 @@ along with systemd; If not, see . ***/ -#include +#include +#include +#include +#include +#include #include +#include //#include "fd-util.h" #include "fileio.h" #include "hostname-util.h" +//#include "macro.h" #include "string-util.h" -#include "util.h" #if 0 /// UNNEEDED by elogind bool hostname_is_set(void) { diff --git a/src/basic/io-util.c b/src/basic/io-util.c index ac8f93ff5..3ec8d6123 100644 --- a/src/basic/io-util.c +++ b/src/basic/io-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,10 +17,15 @@ along with systemd; If not, see . ***/ +#include +#include #include +#include +#include #include #include "io-util.h" +#include "time-util.h" int flush_fd(int fd) { struct pollfd pollfd = { diff --git a/src/basic/label.c b/src/basic/label.c index ed7be67b0..3556377d2 100644 --- a/src/basic/label.c +++ b/src/basic/label.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,10 +17,14 @@ along with systemd; If not, see . ***/ +#include +#include +#include + #include "label.h" +#include "macro.h" #include "selinux-util.h" #include "smack-util.h" -#include "util.h" int label_fix(const char *path, bool ignore_enoent, bool ignore_erofs) { int r, q; diff --git a/src/basic/locale-util.c b/src/basic/locale-util.c index b87fd7670..cda6b2895 100644 --- a/src/basic/locale-util.c +++ b/src/basic/locale-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,12 +17,22 @@ along with systemd; If not, see . ***/ +#include +#include +#include #include +#include #include +#include +#include +#include +#include #include +#include #include "dirent-util.h" #include "fd-util.h" +#include "hashmap.h" #include "locale-util.h" #include "path-util.h" #include "set.h" @@ -32,7 +40,6 @@ #include "string-util.h" #include "strv.h" #include "utf8.h" -#include "util.h" static int add_locales_from_archive(Set *locales) { /* Stolen from glibc... */ diff --git a/src/basic/login-util.c b/src/basic/login-util.c index 41cef14e7..339e94f12 100644 --- a/src/basic/login-util.c +++ b/src/basic/login-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,7 +17,8 @@ along with systemd; If not, see . ***/ -#include "def.h" +#include + #include "login-util.h" #include "string-util.h" diff --git a/src/basic/memfd-util.c b/src/basic/memfd-util.c index 1f92b681f..66b5e5c7b 100644 --- a/src/basic/memfd-util.c +++ b/src/basic/memfd-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,7 +17,10 @@ along with systemd; If not, see . ***/ +#include #include +#include +#include #ifdef HAVE_LINUX_MEMFD_H # include #endif @@ -29,11 +30,11 @@ #include "alloc-util.h" #include "fd-util.h" +#include "macro.h" #include "memfd-util.h" #include "missing.h" #include "string-util.h" #include "utf8.h" -#include "util.h" int memfd_new(const char *name) { _cleanup_free_ char *g = NULL; diff --git a/src/basic/memfd-util.h b/src/basic/memfd-util.h index ddf408e0f..419d89979 100644 --- a/src/basic/memfd-util.h +++ b/src/basic/memfd-util.h @@ -19,8 +19,10 @@ along with systemd; If not, see . ***/ -#include #include +#include +#include +#include int memfd_new(const char *name); #if 0 /// UNNEEDED by elogind diff --git a/src/basic/mempool.c b/src/basic/mempool.c index 9ee6e6a76..f95e2beb0 100644 --- a/src/basic/mempool.c +++ b/src/basic/mempool.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -20,6 +18,9 @@ along with systemd; If not, see . ***/ +#include +#include + #include "macro.h" #include "mempool.h" #include "util.h" diff --git a/src/basic/missing.h b/src/basic/missing.h index 981b79325..f2bc828dd 100644 --- a/src/basic/missing.h +++ b/src/basic/missing.h @@ -34,6 +34,7 @@ #include #include #include +#include #include #include "musl_missing.h" @@ -1140,3 +1141,39 @@ static inline key_serial_t request_key(const char *type, const char *description #define KEY_SPEC_USER_KEYRING -4 #endif #endif // 0 + +#ifndef PR_CAP_AMBIENT +#define PR_CAP_AMBIENT 47 +#endif + +#ifndef PR_CAP_AMBIENT_IS_SET +#define PR_CAP_AMBIENT_IS_SET 1 +#endif + +#ifndef PR_CAP_AMBIENT_RAISE +#define PR_CAP_AMBIENT_RAISE 2 +#endif + +#ifndef PR_CAP_AMBIENT_CLEAR_ALL +#define PR_CAP_AMBIENT_CLEAR_ALL 4 +#endif + +/* The following two defines are actually available in the kernel headers for longer, but we define them here anyway, + * since that makes it easier to use them in conjunction with the glibc net/if.h header which conflicts with + * linux/if.h. */ +#ifndef IF_OPER_UNKNOWN +#define IF_OPER_UNKNOWN 0 +#endif + +#ifndef IF_OPER_UP +#define IF_OPER_UP 6 + +#ifndef HAVE_DECL_CHAR32_T +#define char32_t uint32_t +#endif + +#ifndef HAVE_DECL_CHAR16_T +#define char16_t uint16_t +#endif + +#endif diff --git a/src/basic/mount-util.c b/src/basic/mount-util.c index 8ae1e3108..da34ef6e7 100644 --- a/src/basic/mount-util.c +++ b/src/basic/mount-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,21 +17,25 @@ along with systemd; If not, see . ***/ +#include +#include #include #include +#include #include +#include #include "alloc-util.h" #include "escape.h" #include "fd-util.h" #include "fileio.h" +#include "hashmap.h" #include "mount-util.h" #include "parse-util.h" #include "path-util.h" #include "set.h" #include "stdio-util.h" #include "string-util.h" -#include "util.h" static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *mnt_id) { char path[strlen("/proc/self/fdinfo/") + DECIMAL_STR_MAX(int)]; diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index a58041671..25785136c 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,11 +17,19 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include +#include +#include + #include "alloc-util.h" //#include "extract-word.h" +#include "macro.h" #include "parse-util.h" #include "string-util.h" -#include "util.h" int parse_boolean(const char *v) { assert(v); diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 96336fe81..99035aae9 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -19,7 +19,9 @@ along with systemd; If not, see . ***/ +#include #include +#include #include "macro.h" #include "time-util.h" diff --git a/src/basic/prioq.h b/src/basic/prioq.h index 739152a94..113c73d04 100644 --- a/src/basic/prioq.h +++ b/src/basic/prioq.h @@ -19,7 +19,10 @@ along with systemd; If not, see . ***/ +#include + #include "hashmap.h" +#include "macro.h" typedef struct Prioq Prioq; diff --git a/src/basic/proc-cmdline.c b/src/basic/proc-cmdline.c index 5f8fb4aa1..62c801fe4 100644 --- a/src/basic/proc-cmdline.c +++ b/src/basic/proc-cmdline.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,6 +17,10 @@ along with systemd; If not, see . ***/ +#include +#include +#include + #include "alloc-util.h" #include "extract-word.h" #include "fileio.h" diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 0c6a494e0..550419d5e 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -17,19 +17,25 @@ along with systemd; If not, see . ***/ -#include #include #include +#include +#include #include #include #include #include +#include #include #include #include #include #include +#include #include +#ifdef HAVE_VALGRIND_VALGRIND_H +#include +#endif #include "alloc-util.h" #include "escape.h" @@ -38,8 +44,11 @@ #include "fs-util.h" //#include "ioprio.h" #include "log.h" +#include "macro.h" +#include "missing.h" #include "process-util.h" #include "signal-util.h" +//#include "stat-util.h" #include "string-table.h" #include "string-util.h" #include "user-util.h" @@ -637,6 +646,19 @@ bool pid_is_alive(pid_t pid) { return true; } +#if 0 /// UNNEEDED by elogind +int pid_from_same_root_fs(pid_t pid) { + const char *root; + + if (pid < 0) + return 0; + + root = procfs_file_alloca(pid, "root"); + + return files_same(root, "/proc/1/root"); +} +#endif // 0 + bool is_main_thread(void) { static thread_local int cached = 0; @@ -734,6 +756,23 @@ const char* personality_to_string(unsigned long p) { return NULL; } +void valgrind_summary_hack(void) { +#ifdef HAVE_VALGRIND_VALGRIND_H + if (getpid() == 1 && RUNNING_ON_VALGRIND) { + pid_t pid; + pid = raw_clone(SIGCHLD, NULL); + if (pid < 0) + log_emergency_errno(errno, "Failed to fork off valgrind helper: %m"); + else if (pid == 0) + exit(EXIT_SUCCESS); + else { + log_info("Spawned valgrind helper as PID "PID_FMT".", pid); + (void) wait_for_terminate(pid, NULL); + } + } +#endif +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", diff --git a/src/basic/process-util.h b/src/basic/process-util.h index dc6d776f8..d9c62aa9c 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -19,12 +19,13 @@ along with systemd; If not, see . ***/ -#include -#include #include +#include +#include +#include #include #include -#include +#include #include "formats-util.h" #include "macro.h" @@ -75,7 +76,9 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value); bool pid_is_alive(pid_t pid); bool pid_is_unwaited(pid_t pid); +#if 0 /// UNNEEDED by elogind int pid_from_same_root_fs(pid_t pid); +#endif // 0 bool is_main_thread(void); diff --git a/src/basic/random-util.c b/src/basic/random-util.c index 34cc7cbce..2f468db77 100644 --- a/src/basic/random-util.c +++ b/src/basic/random-util.c @@ -17,23 +17,24 @@ along with systemd; If not, see . ***/ +#include #include #include +#include +#include +#include #include #include + #ifdef HAVE_SYS_AUXV_H #include #endif -#include -#include -#include #include "fd-util.h" #include "io-util.h" #include "missing.h" #include "random-util.h" #include "time-util.h" -#include "util.h" int dev_urandom(void *p, size_t n) { static int have_syscall = -1; diff --git a/src/basic/random-util.h b/src/basic/random-util.h index f7862c8c8..3cee4c501 100644 --- a/src/basic/random-util.h +++ b/src/basic/random-util.h @@ -19,6 +19,7 @@ along with systemd; If not, see . ***/ +#include #include int dev_urandom(void *p, size_t n); diff --git a/src/basic/rm-rf.c b/src/basic/rm-rf.c index b9f71b4ee..6912b23f5 100644 --- a/src/basic/rm-rf.c +++ b/src/basic/rm-rf.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,14 +17,24 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include +#include +#include +#include + //#include "btrfs-util.h" #include "fd-util.h" +#include "log.h" +#include "macro.h" #include "mount-util.h" #include "path-util.h" #include "rm-rf.h" #include "stat-util.h" #include "string-util.h" -#include "util.h" int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) { _cleanup_closedir_ DIR *d = NULL; @@ -125,7 +133,7 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) { /* This could be a subvolume, try to remove it */ - r = btrfs_subvol_remove_fd(fd, de->d_name, BTRFS_REMOVE_RECURSIVE|BTRFS_REMOVE_QUOTA);; + r = btrfs_subvol_remove_fd(fd, de->d_name, BTRFS_REMOVE_RECURSIVE|BTRFS_REMOVE_QUOTA); if (r < 0) { if (r != -ENOTTY && r != -EINVAL) { if (ret == 0) diff --git a/src/basic/selinux-util.c b/src/basic/selinux-util.c index 03787ab75..700b2e829 100644 --- a/src/basic/selinux-util.c +++ b/src/basic/selinux-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -55,7 +53,7 @@ static struct selabel_handle *label_hnd = NULL; #define log_enforcing(...) log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG, __VA_ARGS__) #endif -bool mac_selinux_use(void) { +bool mac_selinux_have(void) { #ifdef HAVE_SELINUX if (cached_use < 0) cached_use = is_selinux_enabled() > 0; @@ -66,6 +64,16 @@ bool mac_selinux_use(void) { #endif } +bool mac_selinux_use(void) { + if (!mac_selinux_have()) + return false; + + /* Never try to configure SELinux features if we aren't + * root */ + + return getuid() == 0; +} + #if 0 /// UNNEEDED by elogind void mac_selinux_retest(void) { #ifdef HAVE_SELINUX @@ -210,7 +218,7 @@ int mac_selinux_get_create_label_from_exe(const char *exe, char **label) { assert(exe); assert(label); - if (!mac_selinux_use()) + if (!mac_selinux_have()) return -EOPNOTSUPP; r = getcon_raw(&mycon); @@ -236,7 +244,7 @@ int mac_selinux_get_our_label(char **label) { assert(label); #ifdef HAVE_SELINUX - if (!mac_selinux_use()) + if (!mac_selinux_have()) return -EOPNOTSUPP; r = getcon_raw(label); @@ -260,7 +268,7 @@ int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char * assert(exe); assert(label); - if (!mac_selinux_use()) + if (!mac_selinux_have()) return -EOPNOTSUPP; r = getcon_raw(&mycon); @@ -315,7 +323,7 @@ char* mac_selinux_free(char *label) { if (!label) return NULL; - if (!mac_selinux_use()) + if (!mac_selinux_have()) return NULL; diff --git a/src/basic/selinux-util.h b/src/basic/selinux-util.h index 220e27bb7..e2d21a486 100644 --- a/src/basic/selinux-util.h +++ b/src/basic/selinux-util.h @@ -19,12 +19,14 @@ along with systemd; If not, see . ***/ -#include #include +#include +#include #include "macro.h" bool mac_selinux_use(void); +bool mac_selinux_have(void); #if 0 /// UNNEEDED by elogind void mac_selinux_retest(void); #endif // 0 @@ -41,14 +43,17 @@ int mac_selinux_apply(const char *path, const char *label); int mac_selinux_get_create_label_from_exe(const char *exe, char **label); int mac_selinux_get_our_label(char **label); int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label); -void mac_selinux_free(char *label); #endif // 0 +char* mac_selinux_free(char *label); int mac_selinux_create_file_prepare(const char *path, mode_t mode); void mac_selinux_create_file_clear(void); #if 0 /// UNNEEDED by elogind + int mac_selinux_create_socket_prepare(const char *label); void mac_selinux_create_socket_clear(void); int mac_selinux_bind(int fd, const struct sockaddr *addr, socklen_t addrlen); #endif // 0 + +DEFINE_TRIVIAL_CLEANUP_FUNC(char*, mac_selinux_free); diff --git a/src/basic/signal-util.c b/src/basic/signal-util.c index ee4c7efdf..2e452f866 100644 --- a/src/basic/signal-util.c +++ b/src/basic/signal-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,11 +17,16 @@ along with systemd; If not, see . ***/ +#include +#include +#include + +#include "macro.h" #include "parse-util.h" #include "signal-util.h" +#include "stdio-util.h" #include "string-table.h" #include "string-util.h" -#include "util.h" int reset_all_signal_handlers(void) { static const struct sigaction sa = { @@ -234,9 +237,9 @@ const char *signal_to_string(int signo) { return name; if (signo >= SIGRTMIN && signo <= SIGRTMAX) - snprintf(buf, sizeof(buf), "RTMIN+%d", signo - SIGRTMIN); + xsprintf(buf, "RTMIN+%d", signo - SIGRTMIN); else - snprintf(buf, sizeof(buf), "%d", signo); + xsprintf(buf, "%d", signo); return buf; } diff --git a/src/basic/signal-util.h b/src/basic/signal-util.h index 3f22fd46e..7013c51a3 100644 --- a/src/basic/signal-util.h +++ b/src/basic/signal-util.h @@ -40,5 +40,17 @@ int signal_from_string(const char *s) _pure_; int signal_from_string_try_harder(const char *s); #if 0 /// UNNEEDED by elogind + void nop_signal_handler(int sig); #endif // 0 + +static inline void block_signals_reset(sigset_t *ss) { + assert_se(sigprocmask(SIG_SETMASK, ss, NULL) >= 0); +} + +#define BLOCK_SIGNALS(...) \ + _cleanup_(block_signals_reset) sigset_t _saved_sigset = ({ \ + sigset_t t; \ + assert_se(sigprocmask_many(SIG_BLOCK, &t, __VA_ARGS__, -1) >= 0); \ + t; \ + }) diff --git a/src/basic/smack-util.c b/src/basic/smack-util.c index 3845ab907..9bcc4a3a2 100644 --- a/src/basic/smack-util.c +++ b/src/basic/smack-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -21,15 +19,20 @@ along with systemd; If not, see . ***/ +#include +#include +#include #include +#include #include "alloc-util.h" #include "fileio.h" +#include "log.h" +#include "macro.h" #include "path-util.h" #include "process-util.h" #include "smack-util.h" #include "string-table.h" -#include "util.h" #include "xattr-util.h" #ifdef HAVE_SMACK diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 404a1ba81..73e19310e 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -442,17 +440,10 @@ const char* socket_address_get_path(const SocketAddress *a) { #endif // 0 bool socket_ipv6_is_supported(void) { - _cleanup_free_ char *l = NULL; - - if (access("/sys/module/ipv6", F_OK) != 0) + if (access("/proc/net/sockstat6", F_OK) != 0) return false; - /* If we can't check "disable" parameter, assume enabled */ - if (read_one_line_file("/sys/module/ipv6/parameters/disable", &l) < 0) - return true; - - /* If module was loaded with disable=1 no IPv6 available */ - return l[0] == '0'; + return true; } #if 0 /// UNNEEDED by elogind diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 88d591516..449273d9a 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -19,9 +19,12 @@ along with systemd; If not, see . ***/ -#include -#include #include +#include +#include +#include +#include +#include #include #include #include @@ -102,8 +105,8 @@ bool socket_ipv6_is_supported(void); #if 0 /// UNNEEDED by elogind int sockaddr_port(const struct sockaddr *_sa) _pure_; -Sint sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret); -int getpeername_pretty(int fd, char **ret); +int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret); +int getpeername_pretty(int fd, bool include_port, char **ret); int getsockname_pretty(int fd, char **ret); int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret); @@ -121,6 +124,7 @@ bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b int fd_inc_sndbuf(int fd, size_t n); int fd_inc_rcvbuf(int fd, size_t n); #if 0 /// UNNEEDED by elogind + int ip_tos_to_string_alloc(int i, char **s); int ip_tos_from_string(const char *s); #endif // 0 @@ -128,7 +132,11 @@ int ip_tos_from_string(const char *s); int getpeercred(int fd, struct ucred *ucred); int getpeersec(int fd, char **ret); -int send_one_fd(int transport_fd, int fd, int flags); +int send_one_fd_sa(int transport_fd, + int fd, + const struct sockaddr *sa, socklen_t len, + int flags); +#define send_one_fd(transport_fd, fd, flags) send_one_fd_sa(transport_fd, fd, NULL, 0, flags) #if 0 /// UNNEEDED by elogind int receive_one_fd(int transport_fd, int flags); #endif // 0 diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 5bc11e4a3..81c13ec59 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,7 +17,11 @@ along with systemd; If not, see . ***/ +#include +#include #include +#include +#include #include #include #include diff --git a/src/basic/stat-util.h b/src/basic/stat-util.h index 48f8e5d8a..077bfdd50 100644 --- a/src/basic/stat-util.h +++ b/src/basic/stat-util.h @@ -60,9 +60,8 @@ int path_is_os_tree(const char *path); int files_same(const char *filea, const char *fileb); /* The .f_type field of struct statfs is really weird defined on - * different archs. Let's use our own type we know is sufficiently - * larger to store the possible values. */ -typedef long statfs_f_type_t; + * different archs. Let's give its type a name. */ +typedef typeof(((struct statfs*)NULL)->f_type) statfs_f_type_t; bool is_fs_type(const struct statfs *s, statfs_f_type_t magic_value) _pure_; #if 0 /// UNNEEDED by elogind diff --git a/src/basic/string-table.c b/src/basic/string-table.c index a860324fc..a1499ab12 100644 --- a/src/basic/string-table.c +++ b/src/basic/string-table.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -20,6 +18,7 @@ ***/ #include "string-table.h" +#include "string-util.h" ssize_t string_table_lookup(const char * const *table, size_t len, const char *key) { size_t i; diff --git a/src/basic/string-table.h b/src/basic/string-table.h index e013db4b3..b180488fe 100644 --- a/src/basic/string-table.h +++ b/src/basic/string-table.h @@ -20,6 +20,7 @@ along with systemd; If not, see . ***/ +#include #include #include #include diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 6f4593e6b..0bde55f9d 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,8 +17,15 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include + #include "alloc-util.h" #include "gunicode.h" +#include "macro.h" #include "string-util.h" #include "utf8.h" #include "util.h" diff --git a/src/basic/string-util.h b/src/basic/string-util.h index 4a44c581b..ad0c81376 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -19,7 +19,9 @@ along with systemd; If not, see . ***/ +#include #include +#include #include #include "macro.h" diff --git a/src/basic/strv.c b/src/basic/strv.c index 966cab75d..5c8261d92 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -29,6 +27,7 @@ #include "alloc-util.h" #include "escape.h" #include "extract-word.h" +//#include "fileio.h" #include "string-util.h" #include "strv.h" #include "util.h" @@ -884,4 +883,23 @@ rollback: nl[k] = NULL; return -ENOMEM; } + +int fputstrv(FILE *f, char **l, const char *separator, bool *space) { + bool b = false; + char **s; + int r; + + /* Like fputs(), but for strv, and with a less stupid argument order */ + + if (!space) + space = &b; + + STRV_FOREACH(s, l) { + r = fputs_with_space(f, *s, separator, space); + if (r < 0) + return r; + } + + return 0; +} #endif // 0 diff --git a/src/basic/strv.h b/src/basic/strv.h index 3a21982e0..8e83ffde7 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -182,4 +182,6 @@ char ***strv_free_free(char ***l); char **strv_skip(char **l, size_t n); int strv_extend_n(char ***l, const char *value, size_t n); + +int fputstrv(FILE *f, char **l, const char *separator, bool *space); #endif // 0 diff --git a/src/basic/syslog-util.c b/src/basic/syslog-util.c index 441b2259f..05d51b4be 100644 --- a/src/basic/syslog-util.c +++ b/src/basic/syslog-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,10 +17,11 @@ along with systemd; If not, see . ***/ +#include #include -#include "assert.h" #include "hexdecoct.h" +#include "macro.h" #include "string-table.h" #include "syslog-util.h" diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 9fd4d3806..75a0d6fd8 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -17,18 +17,25 @@ along with systemd; If not, see . ***/ -#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include #include #include -#include #include #include -#include #include #include "alloc-util.h" @@ -36,8 +43,9 @@ #include "fileio.h" #include "fs-util.h" #include "io-util.h" +#include "log.h" +#include "macro.h" #include "parse-util.h" -#include "path-util.h" #include "process-util.h" #include "socket-util.h" #include "stat-util.h" @@ -725,9 +733,7 @@ bool tty_is_vc_resolve(const char *tty) { } const char *default_term_for_tty(const char *tty) { - assert(tty); - - return tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt220"; + return tty && tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt220"; } #endif // 0 @@ -1141,3 +1147,16 @@ int open_terminal_in_namespace(pid_t pid, const char *name, int mode) { return receive_one_fd(pair[0], 0); } #endif // 0 + +bool colors_enabled(void) { + const char *colors; + + colors = getenv("SYSTEMD_COLORS"); + if (!colors) { + if (streq_ptr(getenv("TERM"), "dumb")) + return false; + return on_tty(); + } + + return parse_boolean(colors) != 0; +} diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index 136618144..2296632d1 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -19,9 +19,10 @@ along with systemd; If not, see . ***/ -#include #include +#include #include +#include #include "macro.h" #include "time-util.h" @@ -92,37 +93,38 @@ void columns_lines_cache_reset(int _unused_ signum); #endif // 0 bool on_tty(void); +bool colors_enabled(void); static inline const char *ansi_underline(void) { - return on_tty() ? ANSI_UNDERLINE : ""; + return colors_enabled() ? ANSI_UNDERLINE : ""; } static inline const char *ansi_highlight(void) { - return on_tty() ? ANSI_HIGHLIGHT : ""; + return colors_enabled() ? ANSI_HIGHLIGHT : ""; } static inline const char *ansi_highlight_underline(void) { - return on_tty() ? ANSI_HIGHLIGHT_UNDERLINE : ""; + return colors_enabled() ? ANSI_HIGHLIGHT_UNDERLINE : ""; } static inline const char *ansi_highlight_red(void) { - return on_tty() ? ANSI_HIGHLIGHT_RED : ""; + return colors_enabled() ? ANSI_HIGHLIGHT_RED : ""; } static inline const char *ansi_highlight_green(void) { - return on_tty() ? ANSI_HIGHLIGHT_GREEN : ""; + return colors_enabled() ? ANSI_HIGHLIGHT_GREEN : ""; } static inline const char *ansi_highlight_yellow(void) { - return on_tty() ? ANSI_HIGHLIGHT_YELLOW : ""; + return colors_enabled() ? ANSI_HIGHLIGHT_YELLOW : ""; } static inline const char *ansi_highlight_blue(void) { - return on_tty() ? ANSI_HIGHLIGHT_BLUE : ""; + return colors_enabled() ? ANSI_HIGHLIGHT_BLUE : ""; } static inline const char *ansi_normal(void) { - return on_tty() ? ANSI_NORMAL : ""; + return colors_enabled() ? ANSI_NORMAL : ""; } int get_ctty_devnr(pid_t pid, dev_t *d); diff --git a/src/basic/time-util.c b/src/basic/time-util.c index 047d2a66d..98ec92918 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,20 +17,32 @@ along with systemd; If not, see . ***/ +#include +#include +#include #include +#include +#include #include #include +#include +#include #include "alloc-util.h" #include "fd-util.h" #include "fileio.h" #include "fs-util.h" +#include "log.h" +#include "macro.h" #include "parse-util.h" #include "path-util.h" #include "string-util.h" #include "strv.h" #include "time-util.h" -#include "util.h" + +#if 0 /// UNNEEDED by elogind +static nsec_t timespec_load_nsec(const struct timespec *ts); +#endif // 0 usec_t now(clockid_t clock_id) { struct timespec ts; @@ -127,7 +137,8 @@ usec_t timespec_load(const struct timespec *ts) { (usec_t) ts->tv_nsec / NSEC_PER_USEC; } -nsec_t timespec_load_nsec(const struct timespec *ts) { +#if 0 /// UNNEEDED by elogind +static nsec_t timespec_load_nsec(const struct timespec *ts) { assert(ts); if (ts->tv_sec == (time_t) -1 && @@ -138,6 +149,7 @@ nsec_t timespec_load_nsec(const struct timespec *ts) { (nsec_t) ts->tv_sec * NSEC_PER_SEC + (nsec_t) ts->tv_nsec; } +#endif // 0 struct timespec *timespec_store(struct timespec *ts, usec_t u) { assert(ts); @@ -183,9 +195,11 @@ struct timeval *timeval_store(struct timeval *tv, usec_t u) { return tv; } -static char *format_timestamp_internal(char *buf, size_t l, usec_t t, bool utc) { +static char *format_timestamp_internal(char *buf, size_t l, usec_t t, + bool utc, bool us) { struct tm tm; time_t sec; + int k; assert(buf); assert(l > 0); @@ -196,51 +210,39 @@ static char *format_timestamp_internal(char *buf, size_t l, usec_t t, bool utc) sec = (time_t) (t / USEC_PER_SEC); localtime_or_gmtime_r(&sec, &tm, utc); - if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S %Z", &tm) <= 0) + if (us) + k = strftime(buf, l, "%a %Y-%m-%d %H:%M:%S", &tm); + else + k = strftime(buf, l, "%a %Y-%m-%d %H:%M:%S %Z", &tm); + + if (k <= 0) return NULL; + if (us) { + snprintf(buf + strlen(buf), l - strlen(buf), ".%06llu", (unsigned long long) (t % USEC_PER_SEC)); + if (strftime(buf + strlen(buf), l - strlen(buf), " %Z", &tm) <= 0) + return NULL; + } return buf; } char *format_timestamp(char *buf, size_t l, usec_t t) { - return format_timestamp_internal(buf, l, t, false); + return format_timestamp_internal(buf, l, t, false, false); } #if 0 /// UNNEEDED by elogind char *format_timestamp_utc(char *buf, size_t l, usec_t t) { - return format_timestamp_internal(buf, l, t, true); + return format_timestamp_internal(buf, l, t, true, false); } #endif // 0 -static char *format_timestamp_internal_us(char *buf, size_t l, usec_t t, bool utc) { - struct tm tm; - time_t sec; - - assert(buf); - assert(l > 0); - - if (t <= 0 || t == USEC_INFINITY) - return NULL; - - sec = (time_t) (t / USEC_PER_SEC); - localtime_or_gmtime_r(&sec, &tm, utc); - - if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S", &tm) <= 0) - return NULL; - snprintf(buf + strlen(buf), l - strlen(buf), ".%06llu", (unsigned long long) (t % USEC_PER_SEC)); - if (strftime(buf + strlen(buf), l - strlen(buf), " %Z", &tm) <= 0) - return NULL; - - return buf; -} - char *format_timestamp_us(char *buf, size_t l, usec_t t) { - return format_timestamp_internal_us(buf, l, t, false); + return format_timestamp_internal(buf, l, t, false, true); } #if 0 /// UNNEEDED by elogind char *format_timestamp_us_utc(char *buf, size_t l, usec_t t) { - return format_timestamp_internal_us(buf, l, t, true); + return format_timestamp_internal(buf, l, t, true, true); } #endif // 0 diff --git a/src/basic/time-util.h b/src/basic/time-util.h index 7d2d5fa10..3c3fcca57 100644 --- a/src/basic/time-util.h +++ b/src/basic/time-util.h @@ -94,8 +94,6 @@ struct timespec *timespec_store(struct timespec *ts, usec_t u); usec_t timeval_load(const struct timeval *tv) _pure_; struct timeval *timeval_store(struct timeval *tv, usec_t u); -nsec_t timespec_load_nsec(const struct timespec *ts) _pure_; - char *format_timestamp(char *buf, size_t l, usec_t t); #if 0 /// UNNEEDED by elogind char *format_timestamp_utc(char *buf, size_t l, usec_t t); @@ -141,3 +139,29 @@ struct tm *localtime_or_gmtime_r(const time_t *t, struct tm *tm, bool utc); #if 0 /// UNNEEDED by elogind unsigned long usec_to_jiffies(usec_t usec); #endif // 0 + +static inline usec_t usec_add(usec_t a, usec_t b) { + usec_t c; + + /* Adds two time values, and makes sure USEC_INFINITY as input results as USEC_INFINITY in output, and doesn't + * overflow. */ + + c = a + b; + if (c < a || c < b) /* overflow check */ + return USEC_INFINITY; + + return c; +} + +static inline usec_t usec_sub(usec_t timestamp, int64_t delta) { + if (delta < 0) + return usec_add(timestamp, (usec_t) (-delta)); + + if (timestamp == USEC_INFINITY) /* Make sure infinity doesn't degrade */ + return USEC_INFINITY; + + if (timestamp < (usec_t) delta) + return 0; + + return timestamp - delta; +} diff --git a/src/basic/unit-name.c b/src/basic/unit-name.c index 15e97bb77..216fed95a 100644 --- a/src/basic/unit-name.c +++ b/src/basic/unit-name.c @@ -27,7 +27,7 @@ #include "alloc-util.h" #include "bus-label.h" -#include "glob-util.h" +//#include "glob-util.h" #include "hexdecoct.h" #include "macro.h" #include "path-util.h" diff --git a/src/basic/user-util.c b/src/basic/user-util.c index e6f3803a3..006a73e59 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,17 +17,27 @@ along with systemd; If not, see . ***/ +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include #include "alloc-util.h" #include "fd-util.h" +#include "formats-util.h" #include "macro.h" #include "parse-util.h" #include "path-util.h" #include "string-util.h" #include "user-util.h" -#include "util.h" bool uid_is_valid(uid_t uid) { diff --git a/src/basic/user-util.h b/src/basic/user-util.h index 5f733b3eb..8e652584d 100644 --- a/src/basic/user-util.h +++ b/src/basic/user-util.h @@ -19,8 +19,8 @@ along with systemd; If not, see . ***/ -#include #include +#include bool uid_is_valid(uid_t uid); diff --git a/src/basic/util.c b/src/basic/util.c index 998fa7f1e..8f2317f28 100644 --- a/src/basic/util.c +++ b/src/basic/util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,92 +17,46 @@ along with systemd; If not, see . ***/ -//#include +#include //#include //#include //#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include #include //#include //#include //#include -//#include +#include //#include -//#include -//#include //#include -//#include -//#include #include -//#include -//#include -//#include +#include +#include //#include -//#include -//#include -//#include -//#include //#include -/* When we include libgen.h because we need dirname() we immediately - * undefine basename() since libgen.h defines it as a macro to the - * POSIX version which is really broken. We prefer GNU basename(). */ -//#include -//#undef basename - -#ifdef HAVE_SYS_AUXV_H -#include -#endif - -/* We include linux/fs.h as last of the system headers, as it - * otherwise conflicts with sys/mount.h. Yay, Linux is great! */ -//#include - #include "alloc-util.h" #include "build.h" //#include "def.h" -//#include "device-nodes.h" #include "dirent-util.h" -//#include "env-util.h" -//#include "escape.h" -//#include "exit-status.h" #include "fd-util.h" #include "fileio.h" //#include "formats-util.h" -//#include "gunicode.h" #include "hashmap.h" -//#include "hexdecoct.h" #include "hostname-util.h" -//#include "ioprio.h" //#include "log.h" #include "macro.h" //#include "missing.h" -//#include "mkdir.h" #include "parse-util.h" //#include "path-util.h" #include "process-util.h" -//#include "random-util.h" -#include "signal-util.h" #include "set.h" -//#include "sparse-endian.h" +#include "signal-util.h" #include "stat-util.h" -//#include "string-table.h" #include "string-util.h" #include "strv.h" -//#include "terminal-util.h" +#include "time-util.h" #include "user-util.h" -//#include "utf8.h" #include "util.h" -//#include "virt.h" /* Put this test here for a lack of better place */ assert_cc(EAGAIN == EWOULDBLOCK); diff --git a/src/basic/verbs.c b/src/basic/verbs.c index d63062d39..d9cdb38d6 100644 --- a/src/basic/verbs.c +++ b/src/basic/verbs.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,9 +17,16 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include + +#include "log.h" +#include "macro.h" #include "string-util.h" -#include "util.h" #include "verbs.h" +#include "virt.h" int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) { const Verb *verb; @@ -78,6 +83,11 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) { return -EINVAL; } + if ((verb->flags & VERB_NOCHROOT) && running_in_chroot() > 0) { + log_info("Running in chroot, ignoring request."); + return 0; + } + if (name) return verb->dispatch(left, argv + optind, userdata); else { diff --git a/src/basic/virt.c b/src/basic/virt.c index bccde00f7..6eb1d0c46 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -20,6 +18,8 @@ ***/ #include +#include +#include #include #include @@ -27,11 +27,11 @@ #include "dirent-util.h" #include "fd-util.h" #include "fileio.h" +#include "macro.h" #include "process-util.h" #include "stat-util.h" #include "string-table.h" #include "string-util.h" -#include "util.h" #include "virt.h" #if 0 /// UNNEEDED by elogind diff --git a/src/basic/xattr-util.c b/src/basic/xattr-util.c index e00f1819d..85f3d2060 100644 --- a/src/basic/xattr-util.c +++ b/src/basic/xattr-util.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,13 +17,20 @@ along with systemd; If not, see . ***/ +#include +#include +#include +#include +#include +#include #include #include "alloc-util.h" #include "fd-util.h" +#include "macro.h" #include "sparse-endian.h" #include "stdio-util.h" -#include "util.h" +#include "time-util.h" #include "xattr-util.h" int getxattr_malloc(const char *path, const char *name, char **value, bool allow_symlink) { -- cgit v1.2.3