1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 This file is part of systemd.
7 Copyright 2010 Lennart Poettering
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
36 #include <sys/inotify.h>
37 #include <sys/socket.h>
39 #include <sys/statfs.h>
40 #include <sys/sysmacros.h>
41 #include <sys/types.h>
45 #include "format-util.h"
48 #include "time-util.h"
50 size_t page_size(void) _pure_;
51 #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
53 static inline const char* yes_no(bool b) {
54 return b ? "yes" : "no";
57 static inline const char* true_false(bool b) {
58 return b ? "true" : "false";
61 static inline const char* one_zero(bool b) {
65 static inline const char* enable_disable(bool b) {
66 return b ? "enable" : "disable";
69 #if 0 /// UNNEEDED by elogind
70 bool plymouth_running(void);
73 bool display_is_local(const char *display) _pure_;
74 int socket_from_display(const char *display, char **path);
76 #if 0 /// UNNEEDED by elogind
78 #define NULSTR_FOREACH(i, l) \
79 for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
81 #define NULSTR_FOREACH_PAIR(i, j, l) \
82 for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
84 extern int saved_argc;
85 extern char **saved_argv;
87 #if 0 /// UNNEEDED by elogind
88 bool kexec_loaded(void);
90 int prot_from_flags(int flags) _const_;
94 void in_initrd_force(bool value);
96 #if 0 /// UNNEEDED by elogind
97 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
98 int (*compar) (const void *, const void *, void *),
103 * Normal qsort requires base to be nonnull. Here were require
104 * that only if nmemb > 0.
106 static inline void qsort_safe(void *base, size_t nmemb, size_t size, comparison_fn_t compar) {
111 qsort(base, nmemb, size, compar);
115 * Normal memcpy requires src to be nonnull. We do nothing if n is 0.
117 static inline void memcpy_safe(void *dst, const void *src, size_t n) {
124 #if 0 /// UNNEEDED by elogind
125 int on_ac_power(void);
128 #define memzero(x,l) (memset((x), 0, (l)))
129 #define zero(x) (memzero(&(x), sizeof(x)))
131 static inline void *mempset(void *s, int c, size_t n) {
133 return (uint8_t*)s + n;
136 static inline void _reset_errno_(int *saved_errno) {
137 errno = *saved_errno;
140 #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
142 static inline int negative_errno(void) {
143 /* This helper should be used to shut up gcc if you know 'errno' is
144 * negative. Instead of "return -errno;", use "return negative_errno();"
145 * It will suppress bogus gcc warnings in case it assumes 'errno' might
146 * be 0 and thus the caller's error-handling might not be triggered. */
147 assert_return(errno > 0, -EINVAL);
151 static inline unsigned u64log2(uint64_t n) {
152 #if __SIZEOF_LONG_LONG__ == 8
153 return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
159 static inline unsigned u32ctz(uint32_t n) {
160 #if __SIZEOF_INT__ == 4
161 return __builtin_ctz(n);
167 static inline unsigned log2i(int x) {
170 return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
173 static inline unsigned log2u(unsigned x) {
176 return sizeof(unsigned) * 8 - __builtin_clz(x) - 1;
179 static inline unsigned log2u_round_up(unsigned x) {
185 return log2u(x - 1) + 1;
188 int container_get_leader(const char *machine, pid_t *pid);
190 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd);
191 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd);
193 uint64_t physical_memory(void);
194 uint64_t physical_memory_scale(uint64_t v, uint64_t max);
196 uint64_t system_tasks_max(void);
197 uint64_t system_tasks_max_scale(uint64_t v, uint64_t max);
199 #if 0 /// UNNEEDED by elogind
203 #if 0 /// UNNEEDED by elogind
205 int str_verscmp(const char *s1, const char *s2);
207 void disable_coredumps(void);