chiark / gitweb /
d88337126f27e130367eddc4766efc28063e05ab
[elogind.git] / src / basic / util.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2010 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include <alloca.h>
25 #include <fcntl.h>
26 #include <inttypes.h>
27 #include <limits.h>
28 #include <locale.h>
29 #include <stdarg.h>
30 #include <stdbool.h>
31 #include <stddef.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <sys/inotify.h>
35 #include <sys/socket.h>
36 #include <sys/stat.h>
37 #include <sys/statfs.h>
38 #include <sys/types.h>
39 #include <time.h>
40 #include <unistd.h>
41
42 #include "formats-util.h"
43 #include "macro.h"
44 #include "missing.h"
45 #include "time-util.h"
46
47 size_t page_size(void) _pure_;
48 #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
49
50 static inline const char* yes_no(bool b) {
51         return b ? "yes" : "no";
52 }
53
54 static inline const char* true_false(bool b) {
55         return b ? "true" : "false";
56 }
57
58 static inline const char* one_zero(bool b) {
59         return b ? "1" : "0";
60 }
61
62 void execute_directories(const char* const* directories, usec_t timeout, char *argv[]);
63
64 #if 0 /// UNNEEDED by elogind
65 bool plymouth_running(void);
66 #endif // 0
67
68 bool display_is_local(const char *display) _pure_;
69 int socket_from_display(const char *display, char **path);
70
71 #if 0 /// UNNEEDED by elogind
72 int block_get_whole_disk(dev_t d, dev_t *ret);
73 #endif // 0
74
75 #define NULSTR_FOREACH(i, l)                                    \
76         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
77
78 #define NULSTR_FOREACH_PAIR(i, j, l)                             \
79         for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
80
81 extern int saved_argc;
82 extern char **saved_argv;
83
84 #if 0 /// UNNEEDED by elogind
85 bool kexec_loaded(void);
86
87 int prot_from_flags(int flags) _const_;
88 #endif // 0
89
90 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
91
92 bool in_initrd(void);
93
94 #if 0 /// UNNEEDED by elogind
95 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
96                  int (*compar) (const void *, const void *, void *),
97                  void *arg);
98 #endif // 0
99
100 /**
101  * Normal qsort requires base to be nonnull. Here were require
102  * that only if nmemb > 0.
103  */
104 static inline void qsort_safe(void *base, size_t nmemb, size_t size, comparison_fn_t compar) {
105         if (nmemb <= 1)
106                 return;
107
108         assert(base);
109         qsort(base, nmemb, size, compar);
110 }
111
112 #if 0 /// UNNEEDED by elogind
113 int on_ac_power(void);
114 #endif // 0
115
116 #define memzero(x,l) (memset((x), 0, (l)))
117 #define zero(x) (memzero(&(x), sizeof(x)))
118
119 static inline void *mempset(void *s, int c, size_t n) {
120         memset(s, c, n);
121         return (uint8_t*)s + n;
122 }
123
124 static inline void _reset_errno_(int *saved_errno) {
125         errno = *saved_errno;
126 }
127
128 #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
129
130 #if 0 /// UNNEEDED by elogind
131 static inline int negative_errno(void) {
132         /* This helper should be used to shut up gcc if you know 'errno' is
133          * negative. Instead of "return -errno;", use "return negative_errno();"
134          * It will suppress bogus gcc warnings in case it assumes 'errno' might
135          * be 0 and thus the caller's error-handling might not be triggered. */
136         assert_return(errno > 0, -EINVAL);
137         return -errno;
138 }
139 #endif // 0
140
141 static inline unsigned u64log2(uint64_t n) {
142 #if __SIZEOF_LONG_LONG__ == 8
143         return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
144 #else
145 #error "Wut?"
146 #endif
147 }
148
149 static inline unsigned u32ctz(uint32_t n) {
150 #if __SIZEOF_INT__ == 4
151         return __builtin_ctz(n);
152 #else
153 #error "Wut?"
154 #endif
155 }
156
157 static inline unsigned log2i(int x) {
158         assert(x > 0);
159
160         return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
161 }
162
163 static inline unsigned log2u(unsigned x) {
164         assert(x > 0);
165
166         return sizeof(unsigned) * 8 - __builtin_clz(x) - 1;
167 }
168
169 static inline unsigned log2u_round_up(unsigned x) {
170         assert(x > 0);
171
172         if (x == 1)
173                 return 0;
174
175         return log2u(x - 1) + 1;
176 }
177
178 #if 0 /// UNNEEDED by elogind
179 bool id128_is_valid(const char *s) _pure_;
180 #endif // 0
181
182 int container_get_leader(const char *machine, pid_t *pid);
183
184 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd);
185 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd);
186
187 uint64_t physical_memory(void);
188
189 #if 0 /// UNNEEDED by elogind
190 int update_reboot_param_file(const char *param);
191 #endif // 0
192
193 int version(void);