Line data Source code
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 <time.h>
28 : #include <stdarg.h>
29 : #include <stdbool.h>
30 : #include <stdlib.h>
31 : #include <stdio.h>
32 : #include <sched.h>
33 : #include <limits.h>
34 : #include <sys/types.h>
35 : #include <sys/socket.h>
36 : #include <sys/stat.h>
37 : #include <dirent.h>
38 : #include <stddef.h>
39 : #include <unistd.h>
40 : #include <locale.h>
41 : #include <mntent.h>
42 : #include <sys/inotify.h>
43 : #include <sys/statfs.h>
44 :
45 : #include "macro.h"
46 : #include "missing.h"
47 : #include "time-util.h"
48 : #include "formats-util.h"
49 :
50 : /* What is interpreted as whitespace? */
51 : #define WHITESPACE " \t\n\r"
52 : #define NEWLINE "\n\r"
53 : #define QUOTES "\"\'"
54 : #define COMMENTS "#;"
55 : #define GLOB_CHARS "*?["
56 :
57 : /* What characters are special in the shell? */
58 : /* must be escaped outside and inside double-quotes */
59 : #define SHELL_NEED_ESCAPE "\"\\`$"
60 : /* can be escaped or double-quoted */
61 : #define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;"
62 :
63 : #define FORMAT_BYTES_MAX 8
64 :
65 : size_t page_size(void) _pure_;
66 : #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
67 :
68 : #define streq(a,b) (strcmp((a),(b)) == 0)
69 : #define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
70 : #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
71 : #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
72 :
73 : bool streq_ptr(const char *a, const char *b) _pure_;
74 :
75 : #define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
76 :
77 : #define new0(t, n) ((t*) calloc((n), sizeof(t)))
78 :
79 : #define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
80 :
81 : #define newa0(t, n) ((t*) alloca0(sizeof(t)*(n)))
82 :
83 : #define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
84 :
85 : #define malloc0(n) (calloc((n), 1))
86 :
87 3897 : static inline const char* yes_no(bool b) {
88 3897 : return b ? "yes" : "no";
89 : }
90 :
91 5 : static inline const char* true_false(bool b) {
92 5 : return b ? "true" : "false";
93 : }
94 :
95 0 : static inline const char* one_zero(bool b) {
96 0 : return b ? "1" : "0";
97 : }
98 :
99 32149 : static inline const char* strempty(const char *s) {
100 32149 : return s ? s : "";
101 : }
102 :
103 : static inline const char* strnull(const char *s) {
104 : return s ? s : "(null)";
105 : }
106 :
107 3584 : static inline const char *strna(const char *s) {
108 3584 : return s ? s : "n/a";
109 : }
110 :
111 147074 : static inline bool isempty(const char *p) {
112 147074 : return !p || !p[0];
113 : }
114 :
115 47166 : static inline char *startswith(const char *s, const char *prefix) {
116 : size_t l;
117 :
118 47166 : l = strlen(prefix);
119 47166 : if (strncmp(s, prefix, l) == 0)
120 32913 : return (char*) s + l;
121 :
122 14253 : return NULL;
123 : }
124 :
125 2040 : static inline char *startswith_no_case(const char *s, const char *prefix) {
126 : size_t l;
127 :
128 2040 : l = strlen(prefix);
129 2040 : if (strncasecmp(s, prefix, l) == 0)
130 172 : return (char*) s + l;
131 :
132 1868 : return NULL;
133 : }
134 :
135 : char *endswith(const char *s, const char *postfix) _pure_;
136 : char *endswith_no_case(const char *s, const char *postfix) _pure_;
137 :
138 : char *first_word(const char *s, const char *word) _pure_;
139 :
140 : int close_nointr(int fd);
141 : int safe_close(int fd);
142 : void safe_close_pair(int p[]);
143 :
144 : void close_many(const int fds[], unsigned n_fd);
145 :
146 : int parse_size(const char *t, off_t base, off_t *size);
147 :
148 : int parse_boolean(const char *v) _pure_;
149 : int parse_pid(const char *s, pid_t* ret_pid);
150 : int parse_uid(const char *s, uid_t* ret_uid);
151 : #define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
152 :
153 : int safe_atou(const char *s, unsigned *ret_u);
154 : int safe_atoi(const char *s, int *ret_i);
155 :
156 : int safe_atollu(const char *s, unsigned long long *ret_u);
157 : int safe_atolli(const char *s, long long int *ret_i);
158 :
159 : int safe_atod(const char *s, double *ret_d);
160 :
161 : int safe_atou8(const char *s, uint8_t *ret);
162 :
163 : #if LONG_MAX == INT_MAX
164 : static inline int safe_atolu(const char *s, unsigned long *ret_u) {
165 : assert_cc(sizeof(unsigned long) == sizeof(unsigned));
166 : return safe_atou(s, (unsigned*) ret_u);
167 : }
168 : static inline int safe_atoli(const char *s, long int *ret_u) {
169 : assert_cc(sizeof(long int) == sizeof(int));
170 : return safe_atoi(s, (int*) ret_u);
171 : }
172 : #else
173 357 : static inline int safe_atolu(const char *s, unsigned long *ret_u) {
174 : assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
175 357 : return safe_atollu(s, (unsigned long long*) ret_u);
176 : }
177 0 : static inline int safe_atoli(const char *s, long int *ret_u) {
178 : assert_cc(sizeof(long int) == sizeof(long long int));
179 0 : return safe_atolli(s, (long long int*) ret_u);
180 : }
181 : #endif
182 :
183 0 : static inline int safe_atou32(const char *s, uint32_t *ret_u) {
184 : assert_cc(sizeof(uint32_t) == sizeof(unsigned));
185 0 : return safe_atou(s, (unsigned*) ret_u);
186 : }
187 :
188 0 : static inline int safe_atoi32(const char *s, int32_t *ret_i) {
189 : assert_cc(sizeof(int32_t) == sizeof(int));
190 0 : return safe_atoi(s, (int*) ret_i);
191 : }
192 :
193 15713 : static inline int safe_atou64(const char *s, uint64_t *ret_u) {
194 : assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
195 15713 : return safe_atollu(s, (unsigned long long*) ret_u);
196 : }
197 :
198 : static inline int safe_atoi64(const char *s, int64_t *ret_i) {
199 : assert_cc(sizeof(int64_t) == sizeof(long long int));
200 : return safe_atolli(s, (long long int*) ret_i);
201 : }
202 :
203 : int safe_atou16(const char *s, uint16_t *ret);
204 : int safe_atoi16(const char *s, int16_t *ret);
205 :
206 : const char* split(const char **state, size_t *l, const char *separator, bool quoted);
207 :
208 : #define FOREACH_WORD(word, length, s, state) \
209 : _FOREACH_WORD(word, length, s, WHITESPACE, false, state)
210 :
211 : #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state) \
212 : _FOREACH_WORD(word, length, s, separator, false, state)
213 :
214 : #define FOREACH_WORD_QUOTED(word, length, s, state) \
215 : _FOREACH_WORD(word, length, s, WHITESPACE, true, state)
216 :
217 : #define _FOREACH_WORD(word, length, s, separator, quoted, state) \
218 : for ((state) = (s), (word) = split(&(state), &(length), (separator), (quoted)); (word); (word) = split(&(state), &(length), (separator), (quoted)))
219 :
220 : char *strappend(const char *s, const char *suffix);
221 : char *strnappend(const char *s, const char *suffix, size_t length);
222 :
223 : int readlinkat_malloc(int fd, const char *p, char **ret);
224 : int readlink_malloc(const char *p, char **r);
225 : int readlink_value(const char *p, char **ret);
226 : int readlink_and_make_absolute(const char *p, char **r);
227 : int readlink_and_canonicalize(const char *p, char **r);
228 :
229 : char *strstrip(char *s);
230 : char *delete_chars(char *s, const char *bad);
231 : char *truncate_nl(char *s);
232 :
233 : char *file_in_same_dir(const char *path, const char *filename);
234 :
235 : int rmdir_parents(const char *path, const char *stop);
236 :
237 : char hexchar(int x) _const_;
238 : int unhexchar(char c) _const_;
239 : char octchar(int x) _const_;
240 : int unoctchar(char c) _const_;
241 : char decchar(int x) _const_;
242 : int undecchar(char c) _const_;
243 : char base32hexchar(int x) _const_;
244 : int unbase32hexchar(char c) _const_;
245 : char base64char(int x) _const_;
246 : int unbase64char(char c) _const_;
247 :
248 : char *cescape(const char *s);
249 : size_t cescape_char(char c, char *buf);
250 :
251 : typedef enum UnescapeFlags {
252 : UNESCAPE_RELAX = 1,
253 : } UnescapeFlags;
254 :
255 : int cunescape(const char *s, UnescapeFlags flags, char **ret);
256 : int cunescape_length(const char *s, size_t length, UnescapeFlags flags, char **ret);
257 : int cunescape_length_with_prefix(const char *s, size_t length, const char *prefix, UnescapeFlags flags, char **ret);
258 :
259 : char *xescape(const char *s, const char *bad);
260 :
261 : char *ascii_strlower(char *path);
262 :
263 : bool dirent_is_file(const struct dirent *de) _pure_;
264 : bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
265 :
266 : bool hidden_file(const char *filename) _pure_;
267 :
268 : bool chars_intersect(const char *a, const char *b) _pure_;
269 :
270 : /* For basic lookup tables with strictly enumerated entries */
271 : #define _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope) \
272 : scope const char *name##_to_string(type i) { \
273 : if (i < 0 || i >= (type) ELEMENTSOF(name##_table)) \
274 : return NULL; \
275 : return name##_table[i]; \
276 : }
277 :
278 : ssize_t string_table_lookup(const char * const *table, size_t len, const char *key);
279 :
280 : #define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope) \
281 : scope inline type name##_from_string(const char *s) { \
282 : return (type)string_table_lookup(name##_table, ELEMENTSOF(name##_table), s); \
283 : }
284 :
285 : #define _DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \
286 : _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope) \
287 : _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope) \
288 : struct __useless_struct_to_allow_trailing_semicolon__
289 :
290 : #define DEFINE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,)
291 : #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,static)
292 : #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,static)
293 : #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,static)
294 :
295 : /* For string conversions where numbers are also acceptable */
296 : #define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max) \
297 : int name##_to_string_alloc(type i, char **str) { \
298 : char *s; \
299 : int r; \
300 : if (i < 0 || i > max) \
301 : return -ERANGE; \
302 : if (i < (type) ELEMENTSOF(name##_table)) { \
303 : s = strdup(name##_table[i]); \
304 : if (!s) \
305 : return log_oom(); \
306 : } else { \
307 : r = asprintf(&s, "%i", i); \
308 : if (r < 0) \
309 : return log_oom(); \
310 : } \
311 : *str = s; \
312 : return 0; \
313 : } \
314 : type name##_from_string(const char *s) { \
315 : type i; \
316 : unsigned u = 0; \
317 : assert(s); \
318 : for (i = 0; i < (type)ELEMENTSOF(name##_table); i++) \
319 : if (name##_table[i] && \
320 : streq(name##_table[i], s)) \
321 : return i; \
322 : if (safe_atou(s, &u) >= 0 && u <= max) \
323 : return (type) u; \
324 : return (type) -1; \
325 : } \
326 : struct __useless_struct_to_allow_trailing_semicolon__
327 :
328 : int fd_nonblock(int fd, bool nonblock);
329 : int fd_cloexec(int fd, bool cloexec);
330 :
331 : int close_all_fds(const int except[], unsigned n_except);
332 :
333 : bool fstype_is_network(const char *fstype);
334 :
335 : int flush_fd(int fd);
336 :
337 : int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
338 :
339 : ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
340 : int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll);
341 : int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
342 :
343 : bool is_device_path(const char *path);
344 :
345 : int dir_is_empty(const char *path);
346 : char* dirname_malloc(const char *path);
347 :
348 : char* lookup_uid(uid_t uid);
349 : char* getlogname_malloc(void);
350 : char* getusername_malloc(void);
351 :
352 : int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
353 : int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
354 :
355 : bool is_temporary_fs(const struct statfs *s) _pure_;
356 : int fd_is_temporary_fs(int fd);
357 :
358 : int pipe_eof(int fd);
359 :
360 : cpu_set_t* cpu_set_malloc(unsigned *ncpus);
361 :
362 : #define xsprintf(buf, fmt, ...) assert_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf))
363 :
364 : int files_same(const char *filea, const char *fileb);
365 :
366 : int running_in_chroot(void);
367 :
368 : char *ellipsize(const char *s, size_t length, unsigned percent);
369 : /* bytes columns */
370 : char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
371 :
372 : int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode);
373 : int touch(const char *path);
374 :
375 : noreturn void freeze(void);
376 :
377 : bool null_or_empty(struct stat *st) _pure_;
378 : int null_or_empty_path(const char *fn);
379 : int null_or_empty_fd(int fd);
380 :
381 : DIR *xopendirat(int dirfd, const char *name, int flags);
382 :
383 : char *fstab_node_to_udev_node(const char *p);
384 :
385 : void execute_directories(const char* const* directories, usec_t timeout, char *argv[]);
386 :
387 : bool nulstr_contains(const char*nulstr, const char *needle);
388 :
389 : bool plymouth_running(void);
390 :
391 : bool machine_name_is_valid(const char *s) _pure_;
392 :
393 : char* strshorten(char *s, size_t l);
394 :
395 : int symlink_idempotent(const char *from, const char *to);
396 :
397 : int symlink_atomic(const char *from, const char *to);
398 : int mknod_atomic(const char *path, mode_t mode, dev_t dev);
399 : int mkfifo_atomic(const char *path, mode_t mode);
400 :
401 : int fchmod_umask(int fd, mode_t mode);
402 :
403 : bool display_is_local(const char *display) _pure_;
404 : int socket_from_display(const char *display, char **path);
405 :
406 : int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
407 : int get_group_creds(const char **groupname, gid_t *gid);
408 :
409 : int in_gid(gid_t gid);
410 : int in_group(const char *name);
411 :
412 : char* uid_to_name(uid_t uid);
413 : char* gid_to_name(gid_t gid);
414 :
415 : int glob_exists(const char *path);
416 : int glob_extend(char ***strv, const char *path);
417 :
418 : int dirent_ensure_type(DIR *d, struct dirent *de);
419 :
420 : int get_files_in_directory(const char *path, char ***list);
421 :
422 : char *strjoin(const char *x, ...) _sentinel_;
423 :
424 : bool is_main_thread(void);
425 :
426 274 : static inline bool _pure_ in_charset(const char *s, const char* charset) {
427 274 : assert(s);
428 274 : assert(charset);
429 274 : return s[strspn(s, charset)] == '\0';
430 : }
431 :
432 : int block_get_whole_disk(dev_t d, dev_t *ret);
433 :
434 : #define NULSTR_FOREACH(i, l) \
435 : for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
436 :
437 : #define NULSTR_FOREACH_PAIR(i, j, l) \
438 : for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
439 :
440 : int ioprio_class_to_string_alloc(int i, char **s);
441 : int ioprio_class_from_string(const char *s);
442 :
443 : const char *sigchld_code_to_string(int i) _const_;
444 : int sigchld_code_from_string(const char *s) _pure_;
445 :
446 : int log_facility_unshifted_to_string_alloc(int i, char **s);
447 : int log_facility_unshifted_from_string(const char *s);
448 :
449 : int log_level_to_string_alloc(int i, char **s);
450 : int log_level_from_string(const char *s);
451 :
452 : int sched_policy_to_string_alloc(int i, char **s);
453 : int sched_policy_from_string(const char *s);
454 :
455 : const char *rlimit_to_string(int i) _const_;
456 : int rlimit_from_string(const char *s) _pure_;
457 :
458 : int ip_tos_to_string_alloc(int i, char **s);
459 : int ip_tos_from_string(const char *s);
460 :
461 : extern int saved_argc;
462 : extern char **saved_argv;
463 :
464 : bool kexec_loaded(void);
465 :
466 : int prot_from_flags(int flags) _const_;
467 :
468 : char *format_bytes(char *buf, size_t l, off_t t);
469 :
470 : int fd_wait_for_event(int fd, int event, usec_t timeout);
471 :
472 : void* memdup(const void *p, size_t l) _alloc_(2);
473 :
474 : int fd_inc_sndbuf(int fd, size_t n);
475 : int fd_inc_rcvbuf(int fd, size_t n);
476 :
477 : int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
478 :
479 : int setrlimit_closest(int resource, const struct rlimit *rlim);
480 :
481 : bool http_url_is_valid(const char *url) _pure_;
482 : bool documentation_url_is_valid(const char *url) _pure_;
483 :
484 : bool http_etag_is_valid(const char *etag);
485 :
486 : bool in_initrd(void);
487 :
488 : int get_home_dir(char **ret);
489 : int get_shell(char **_ret);
490 :
491 186965 : static inline void freep(void *p) {
492 186965 : free(*(void**) p);
493 186965 : }
494 :
495 2451 : static inline void closep(int *fd) {
496 2451 : safe_close(*fd);
497 2451 : }
498 :
499 57 : static inline void umaskp(mode_t *u) {
500 57 : umask(*u);
501 57 : }
502 :
503 4 : static inline void close_pairp(int (*p)[2]) {
504 4 : safe_close_pair(*p);
505 4 : }
506 :
507 3768 : DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, fclose);
508 : DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, pclose);
509 2867 : DEFINE_TRIVIAL_CLEANUP_FUNC(DIR*, closedir);
510 : DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent);
511 :
512 : #define _cleanup_free_ _cleanup_(freep)
513 : #define _cleanup_close_ _cleanup_(closep)
514 : #define _cleanup_umask_ _cleanup_(umaskp)
515 : #define _cleanup_globfree_ _cleanup_(globfree)
516 : #define _cleanup_fclose_ _cleanup_(fclosep)
517 : #define _cleanup_pclose_ _cleanup_(pclosep)
518 : #define _cleanup_closedir_ _cleanup_(closedirp)
519 : #define _cleanup_endmntent_ _cleanup_(endmntentp)
520 : #define _cleanup_close_pair_ _cleanup_(close_pairp)
521 :
522 39051 : _malloc_ _alloc_(1, 2) static inline void *malloc_multiply(size_t a, size_t b) {
523 39051 : if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
524 0 : return NULL;
525 :
526 39051 : return malloc(a * b);
527 : }
528 :
529 699 : _alloc_(2, 3) static inline void *realloc_multiply(void *p, size_t a, size_t b) {
530 699 : if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
531 0 : return NULL;
532 :
533 699 : return realloc(p, a * b);
534 : }
535 :
536 3 : _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
537 3 : if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
538 0 : return NULL;
539 :
540 3 : return memdup(p, a * b);
541 : }
542 :
543 : bool filename_is_valid(const char *p) _pure_;
544 : bool path_is_safe(const char *p) _pure_;
545 : bool string_is_safe(const char *p) _pure_;
546 : bool string_has_cc(const char *p, const char *ok) _pure_;
547 :
548 : /**
549 : * Check if a string contains any glob patterns.
550 : */
551 : _pure_ static inline bool string_is_glob(const char *p) {
552 : return !!strpbrk(p, GLOB_CHARS);
553 : }
554 :
555 : void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
556 : int (*compar) (const void *, const void *, void *),
557 : void *arg);
558 :
559 : #define _(String) gettext (String)
560 : void init_gettext(void);
561 : bool is_locale_utf8(void);
562 :
563 : typedef enum DrawSpecialChar {
564 : DRAW_TREE_VERTICAL,
565 : DRAW_TREE_BRANCH,
566 : DRAW_TREE_RIGHT,
567 : DRAW_TREE_SPACE,
568 : DRAW_TRIANGULAR_BULLET,
569 : DRAW_BLACK_CIRCLE,
570 : DRAW_ARROW,
571 : DRAW_DASH,
572 : _DRAW_SPECIAL_CHAR_MAX
573 : } DrawSpecialChar;
574 :
575 : const char *draw_special_char(DrawSpecialChar ch);
576 :
577 : char *strreplace(const char *text, const char *old_string, const char *new_string);
578 :
579 : char *strip_tab_ansi(char **p, size_t *l);
580 :
581 : int on_ac_power(void);
582 :
583 : int search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f);
584 : int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f);
585 :
586 : #define FOREACH_LINE(line, f, on_error) \
587 : for (;;) \
588 : if (!fgets(line, sizeof(line), f)) { \
589 : if (ferror(f)) { \
590 : on_error; \
591 : } \
592 : break; \
593 : } else
594 :
595 : #define FOREACH_DIRENT(de, d, on_error) \
596 : for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d)) \
597 : if (!de) { \
598 : if (errno > 0) { \
599 : on_error; \
600 : } \
601 : break; \
602 : } else if (hidden_file((de)->d_name)) \
603 : continue; \
604 : else
605 :
606 : #define FOREACH_DIRENT_ALL(de, d, on_error) \
607 : for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d)) \
608 : if (!de) { \
609 : if (errno > 0) { \
610 : on_error; \
611 : } \
612 : break; \
613 : } else
614 :
615 15384 : static inline void *mempset(void *s, int c, size_t n) {
616 15384 : memset(s, c, n);
617 15384 : return (uint8_t*)s + n;
618 : }
619 :
620 : char *hexmem(const void *p, size_t l);
621 : int unhexmem(const char *p, size_t l, void **mem, size_t *len);
622 :
623 : char *base32hexmem(const void *p, size_t l, bool padding);
624 : int unbase32hexmem(const char *p, size_t l, bool padding, void **mem, size_t *len);
625 :
626 : char *base64mem(const void *p, size_t l);
627 : int unbase64mem(const char *p, size_t l, void **mem, size_t *len);
628 :
629 : char *strextend(char **x, ...) _sentinel_;
630 : char *strrep(const char *s, unsigned n);
631 :
632 : void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size);
633 : void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size);
634 : #define GREEDY_REALLOC(array, allocated, need) \
635 : greedy_realloc((void**) &(array), &(allocated), (need), sizeof((array)[0]))
636 :
637 : #define GREEDY_REALLOC0(array, allocated, need) \
638 : greedy_realloc0((void**) &(array), &(allocated), (need), sizeof((array)[0]))
639 :
640 24612 : static inline void _reset_errno_(int *saved_errno) {
641 24612 : errno = *saved_errno;
642 24612 : }
643 :
644 : #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
645 :
646 : static inline int negative_errno(void) {
647 : /* This helper should be used to shut up gcc if you know 'errno' is
648 : * negative. Instead of "return -errno;", use "return negative_errno();"
649 : * It will suppress bogus gcc warnings in case it assumes 'errno' might
650 : * be 0 and thus the caller's error-handling might not be triggered. */
651 : assert_return(errno > 0, -EINVAL);
652 : return -errno;
653 : }
654 :
655 : struct _umask_struct_ {
656 : mode_t mask;
657 : bool quit;
658 : };
659 :
660 9 : static inline void _reset_umask_(struct _umask_struct_ *s) {
661 9 : umask(s->mask);
662 9 : };
663 :
664 : #define RUN_WITH_UMASK(mask) \
665 : for (_cleanup_(_reset_umask_) struct _umask_struct_ _saved_umask_ = { umask(mask), false }; \
666 : !_saved_umask_.quit ; \
667 : _saved_umask_.quit = true)
668 :
669 584 : static inline unsigned u64log2(uint64_t n) {
670 : #if __SIZEOF_LONG_LONG__ == 8
671 584 : return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
672 : #else
673 : #error "Wut?"
674 : #endif
675 : }
676 :
677 0 : static inline unsigned u32ctz(uint32_t n) {
678 : #if __SIZEOF_INT__ == 4
679 0 : return __builtin_ctz(n);
680 : #else
681 : #error "Wut?"
682 : #endif
683 : }
684 :
685 8 : static inline unsigned log2i(int x) {
686 8 : assert(x > 0);
687 :
688 8 : return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
689 : }
690 :
691 1984 : static inline unsigned log2u(unsigned x) {
692 1984 : assert(x > 0);
693 :
694 1984 : return sizeof(unsigned) * 8 - __builtin_clz(x) - 1;
695 : }
696 :
697 1984 : static inline unsigned log2u_round_up(unsigned x) {
698 1984 : assert(x > 0);
699 :
700 1984 : if (x == 1)
701 0 : return 0;
702 :
703 1984 : return log2u(x - 1) + 1;
704 : }
705 :
706 : static inline bool logind_running(void) {
707 : return access("/run/systemd/seats/", F_OK) >= 0;
708 : }
709 :
710 : #define DECIMAL_STR_WIDTH(x) \
711 : ({ \
712 : typeof(x) _x_ = (x); \
713 : unsigned ans = 1; \
714 : while (_x_ /= 10) \
715 : ans++; \
716 : ans; \
717 : })
718 :
719 : int unlink_noerrno(const char *path);
720 :
721 : #define alloca0(n) \
722 : ({ \
723 : char *_new_; \
724 : size_t _len_ = n; \
725 : _new_ = alloca(_len_); \
726 : (void *) memset(_new_, 0, _len_); \
727 : })
728 :
729 : /* It's not clear what alignment glibc/gcc alloca() guarantee, hence provide a guaranteed safe version */
730 : #define alloca_align(size, align) \
731 : ({ \
732 : void *_ptr_; \
733 : size_t _mask_ = (align) - 1; \
734 : _ptr_ = alloca((size) + _mask_); \
735 : (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); \
736 : })
737 :
738 : #define alloca0_align(size, align) \
739 : ({ \
740 : void *_new_; \
741 : size_t _size_ = (size); \
742 : _new_ = alloca_align(_size_, (align)); \
743 : (void*)memset(_new_, 0, _size_); \
744 : })
745 :
746 : #define strjoina(a, ...) \
747 : ({ \
748 : const char *_appendees_[] = { a, __VA_ARGS__ }; \
749 : char *_d_, *_p_; \
750 : int _len_ = 0; \
751 : unsigned _i_; \
752 : for (_i_ = 0; _i_ < ELEMENTSOF(_appendees_) && _appendees_[_i_]; _i_++) \
753 : _len_ += strlen(_appendees_[_i_]); \
754 : _p_ = _d_ = alloca(_len_ + 1); \
755 : for (_i_ = 0; _i_ < ELEMENTSOF(_appendees_) && _appendees_[_i_]; _i_++) \
756 : _p_ = stpcpy(_p_, _appendees_[_i_]); \
757 : *_p_ = 0; \
758 : _d_; \
759 : })
760 :
761 : bool id128_is_valid(const char *s) _pure_;
762 :
763 : int split_pair(const char *s, const char *sep, char **l, char **r);
764 :
765 : int shall_restore_state(void);
766 :
767 : /**
768 : * Normal qsort requires base to be nonnull. Here were require
769 : * that only if nmemb > 0.
770 : */
771 6353 : static inline void qsort_safe(void *base, size_t nmemb, size_t size, comparison_fn_t compar) {
772 6353 : if (nmemb <= 1)
773 6073 : return;
774 :
775 280 : assert(base);
776 280 : qsort(base, nmemb, size, compar);
777 : }
778 :
779 : /* Normal memmem() requires haystack to be nonnull, which is annoying for zero-length buffers */
780 27 : static inline void *memmem_safe(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) {
781 :
782 27 : if (needlelen <= 0)
783 0 : return (void*) haystack;
784 :
785 27 : if (haystacklen < needlelen)
786 18 : return NULL;
787 :
788 9 : assert(haystack);
789 9 : assert(needle);
790 :
791 9 : return memmem(haystack, haystacklen, needle, needlelen);
792 : }
793 :
794 : int proc_cmdline(char **ret);
795 : int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
796 : int get_proc_cmdline_key(const char *parameter, char **value);
797 :
798 : int container_get_leader(const char *machine, pid_t *pid);
799 :
800 : int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *root_fd);
801 : int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int root_fd);
802 :
803 : int getpeercred(int fd, struct ucred *ucred);
804 : int getpeersec(int fd, char **ret);
805 :
806 : int writev_safe(int fd, const struct iovec *w, int j);
807 :
808 : int mkostemp_safe(char *pattern, int flags);
809 : int open_tmpfile(const char *path, int flags);
810 :
811 : int fd_warn_permissions(const char *path, int fd);
812 :
813 : #ifndef PERSONALITY_INVALID
814 : /* personality(7) documents that 0xffffffffUL is used for querying the
815 : * current personality, hence let's use that here as error
816 : * indicator. */
817 : #define PERSONALITY_INVALID 0xffffffffLU
818 : #endif
819 :
820 : unsigned long personality_from_string(const char *p);
821 : const char *personality_to_string(unsigned long);
822 :
823 : uint64_t physical_memory(void);
824 :
825 : void hexdump(FILE *f, const void *p, size_t s);
826 :
827 : union file_handle_union {
828 : struct file_handle handle;
829 : char padding[sizeof(struct file_handle) + MAX_HANDLE_SZ];
830 : };
831 : #define FILE_HANDLE_INIT { .handle.handle_bytes = MAX_HANDLE_SZ }
832 :
833 : int update_reboot_param_file(const char *param);
834 :
835 : int umount_recursive(const char *target, int flags);
836 :
837 : int bind_remount_recursive(const char *prefix, bool ro);
838 :
839 : int fflush_and_check(FILE *f);
840 :
841 : int tempfn_xxxxxx(const char *p, const char *extra, char **ret);
842 : int tempfn_random(const char *p, const char *extra, char **ret);
843 : int tempfn_random_child(const char *p, const char *extra, char **ret);
844 :
845 : int take_password_lock(const char *root);
846 :
847 : int is_symlink(const char *path);
848 : int is_dir(const char *path, bool follow);
849 : int is_device_node(const char *path);
850 :
851 : typedef enum UnquoteFlags {
852 : UNQUOTE_RELAX = 1,
853 : UNQUOTE_CUNESCAPE = 2,
854 : UNQUOTE_CUNESCAPE_RELAX = 4,
855 : } UnquoteFlags;
856 :
857 : int unquote_first_word(const char **p, char **ret, UnquoteFlags flags);
858 : int unquote_first_word_and_warn(const char **p, char **ret, UnquoteFlags flags, const char *unit, const char *filename, unsigned line, const char *rvalue);
859 : int unquote_many_words(const char **p, UnquoteFlags flags, ...) _sentinel_;
860 :
861 : int free_and_strdup(char **p, const char *s);
862 :
863 : #define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1)
864 :
865 : #define FOREACH_INOTIFY_EVENT(e, buffer, sz) \
866 : for ((e) = &buffer.ev; \
867 : (uint8_t*) (e) < (uint8_t*) (buffer.raw) + (sz); \
868 : (e) = (struct inotify_event*) ((uint8_t*) (e) + sizeof(struct inotify_event) + (e)->len))
869 :
870 : union inotify_event_buffer {
871 : struct inotify_event ev;
872 : uint8_t raw[INOTIFY_EVENT_MAX];
873 : };
874 :
875 : #define laccess(path, mode) faccessat(AT_FDCWD, (path), (mode), AT_SYMLINK_NOFOLLOW)
876 :
877 : int ptsname_malloc(int fd, char **ret);
878 :
879 : int openpt_in_namespace(pid_t pid, int flags);
880 :
881 : ssize_t fgetxattrat_fake(int dirfd, const char *filename, const char *attribute, void *value, size_t size, int flags);
882 :
883 : int fd_setcrtime(int fd, usec_t usec);
884 : int fd_getcrtime(int fd, usec_t *usec);
885 : int path_getcrtime(const char *p, usec_t *usec);
886 : int fd_getcrtime_at(int dirfd, const char *name, usec_t *usec, int flags);
887 :
888 : int same_fd(int a, int b);
889 :
890 : int chattr_fd(int fd, unsigned value, unsigned mask);
891 : int chattr_path(const char *p, unsigned value, unsigned mask);
892 :
893 : int read_attr_fd(int fd, unsigned *ret);
894 : int read_attr_path(const char *p, unsigned *ret);
895 :
896 : #define RLIMIT_MAKE_CONST(lim) ((struct rlimit) { lim, lim })
897 :
898 : ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
899 :
900 : void sigkill_wait(pid_t *pid);
901 : #define _cleanup_sigkill_wait_ _cleanup_(sigkill_wait)
902 :
903 : int syslog_parse_priority(const char **p, int *priority, bool with_facility);
904 :
905 : void cmsg_close_all(struct msghdr *mh);
906 :
907 : int rename_noreplace(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
908 :
909 : char *shell_maybe_quote(const char *s);
910 :
911 : int parse_mode(const char *s, mode_t *ret);
912 :
913 : int mount_move_root(const char *path);
914 :
915 : int reset_uid_gid(void);
|