]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/util.h
sd-id128: split UUID file read/write code into new id128-util.[ch]
[thirdparty/systemd.git] / src / basic / util.h
CommitLineData
c2f1db8f 1#pragma once
60918275 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
31885cd5 22#include <alloca.h>
11c3a366 23#include <errno.h>
370c860f 24#include <fcntl.h>
60918275 25#include <inttypes.h>
f6c2284a
LP
26#include <limits.h>
27#include <locale.h>
ec2002f8 28#include <stdarg.h>
60918275 29#include <stdbool.h>
f6c2284a 30#include <stddef.h>
11c3a366 31#include <stdint.h>
80876c20 32#include <stdio.h>
f6c2284a 33#include <stdlib.h>
11c3a366 34#include <string.h>
f6c2284a 35#include <sys/inotify.h>
2c35d880 36#include <sys/socket.h>
00dc5d76 37#include <sys/stat.h>
c6878637 38#include <sys/statfs.h>
27d13af7 39#include <sys/sysmacros.h>
f6c2284a
LP
40#include <sys/types.h>
41#include <time.h>
42#include <unistd.h>
60918275 43
f6c2284a 44#include "formats-util.h"
a838e6a1 45#include "macro.h"
dced1557 46#include "missing.h"
9a98c7a1 47#include "time-util.h"
871d7de4 48
2e857429 49size_t page_size(void) _pure_;
37f85e66 50#define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
51
60918275
LP
52static inline const char* yes_no(bool b) {
53 return b ? "yes" : "no";
54}
55
5232c42e
LS
56static inline const char* true_false(bool b) {
57 return b ? "true" : "false";
58}
59
769d324c
LP
60static inline const char* one_zero(bool b) {
61 return b ? "1" : "0";
62}
63
e801700e 64void execute_directories(const char* const* directories, usec_t timeout, char *argv[]);
83cc030f 65
a88c8750
TG
66bool plymouth_running(void);
67
44a6b1b6 68bool display_is_local(const char *display) _pure_;
4d6d6518
LP
69int socket_from_display(const char *display, char **path);
70
94959f0f
LP
71int block_get_whole_disk(dev_t d, dev_t *ret);
72
e23a0ce8 73#define NULSTR_FOREACH(i, l) \
c4e2ceae
LP
74 for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
75
5c0532d1
LP
76#define NULSTR_FOREACH_PAIR(i, j, l) \
77 for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
78
9a0e6896
LP
79extern int saved_argc;
80extern char **saved_argv;
81
65457142
FC
82bool kexec_loaded(void);
83
44a6b1b6 84int prot_from_flags(int flags) _const_;
87d2c1ff 85
9bdc770c 86int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
6bb92a16 87
9be346c9 88bool in_initrd(void);
dcd61450 89void in_initrd_force(bool value);
069cfc85 90
a9e12476
KS
91void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
92 int (*compar) (const void *, const void *, void *),
93 void *arg);
09017585 94
b5efdb8a
LP
95/**
96 * Normal qsort requires base to be nonnull. Here were require
97 * that only if nmemb > 0.
98 */
99static inline void qsort_safe(void *base, size_t nmemb, size_t size, comparison_fn_t compar) {
100 if (nmemb <= 1)
101 return;
f74e605f 102
b5efdb8a
LP
103 assert(base);
104 qsort(base, nmemb, size, compar);
6282c859 105}
66e35261 106
75f32f04
ZJS
107/**
108 * Normal memcpy requires src to be nonnull. We do nothing if n is 0.
109 */
110static inline void memcpy_safe(void *dst, const void *src, size_t n) {
111 if (n == 0)
112 return;
113 assert(src);
114 memcpy(dst, src, n);
115}
116
b5efdb8a
LP
117int on_ac_power(void);
118
7d50b32a
LP
119#define memzero(x,l) (memset((x), 0, (l)))
120#define zero(x) (memzero(&(x), sizeof(x)))
121
b5efdb8a
LP
122static inline void *mempset(void *s, int c, size_t n) {
123 memset(s, c, n);
124 return (uint8_t*)s + n;
125}
a1937e67 126
5c0d398d 127static inline void _reset_errno_(int *saved_errno) {
5c0aa72a
LP
128 errno = *saved_errno;
129}
130
2a371001 131#define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
5c0d398d 132
44dd2c6e
DH
133static inline int negative_errno(void) {
134 /* This helper should be used to shut up gcc if you know 'errno' is
135 * negative. Instead of "return -errno;", use "return negative_errno();"
136 * It will suppress bogus gcc warnings in case it assumes 'errno' might
137 * be 0 and thus the caller's error-handling might not be triggered. */
138 assert_return(errno > 0, -EINVAL);
139 return -errno;
140}
141
144e51ec 142static inline unsigned u64log2(uint64_t n) {
ec417ccc 143#if __SIZEOF_LONG_LONG__ == 8
693eb9a2 144 return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
ec417ccc
LP
145#else
146#error "Wut?"
147#endif
148}
149
150static inline unsigned u32ctz(uint32_t n) {
151#if __SIZEOF_INT__ == 4
152 return __builtin_ctz(n);
153#else
154#error "Wut?"
155#endif
144e51ec 156}
79d860fe 157
7d328b54 158static inline unsigned log2i(int x) {
8fe90522
ZJS
159 assert(x > 0);
160
161 return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
162}
163
b5de6d98
MS
164static inline unsigned log2u(unsigned x) {
165 assert(x > 0);
166
167 return sizeof(unsigned) * 8 - __builtin_clz(x) - 1;
168}
169
170static inline unsigned log2u_round_up(unsigned x) {
171 assert(x > 0);
172
173 if (x == 1)
174 return 0;
175
176 return log2u(x - 1) + 1;
177}
178
bc9fd78c
LP
179int container_get_leader(const char *machine, pid_t *pid);
180
671c3419
RM
181int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd);
182int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd);
bf108e55 183
1c231f56 184uint64_t physical_memory(void);
d8cf2ac7 185uint64_t physical_memory_scale(uint64_t v, uint64_t max);
6db615c1 186
27c06cb5 187int update_reboot_parameter_and_warn(const char *param);
6d313367 188
3f6fd1ba 189int version(void);