chiark / gitweb /
90464c940be37b0eeb64e3300729b050cb68da4e
[elogind.git] / src / shared / 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 <inttypes.h>
26 #include <time.h>
27 #include <sys/time.h>
28 #include <stdarg.h>
29 #include <stdbool.h>
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <signal.h>
33 #include <sched.h>
34 #include <limits.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include <dirent.h>
38 #include <sys/resource.h>
39 #include <stddef.h>
40 #include <unistd.h>
41 #include <locale.h>
42 #include <mntent.h>
43 #include <sys/socket.h>
44
45 #if SIZEOF_PID_T == 4
46 #  define PID_FMT "%" PRIu32
47 #elif SIZEOF_PID_T == 2
48 #  define PID_FMT "%" PRIu16
49 #else
50 #  error Unknown pid_t size
51 #endif
52
53 #if SIZEOF_UID_T == 4
54 #  define UID_FMT "%" PRIu32
55 #elif SIZEOF_UID_T == 2
56 #  define UID_FMT "%" PRIu16
57 #else
58 #  error Unknown uid_t size
59 #endif
60
61 #if SIZEOF_GID_T == 4
62 #  define GID_FMT "%" PRIu32
63 #elif SIZEOF_GID_T == 2
64 #  define GID_FMT "%" PRIu16
65 #else
66 #  error Unknown gid_t size
67 #endif
68
69 #include "macro.h"
70 #include "time-util.h"
71
72 /* What is interpreted as whitespace? */
73 #define WHITESPACE " \t\n\r"
74 #define NEWLINE    "\n\r"
75 #define QUOTES     "\"\'"
76 #define COMMENTS   "#;"
77 #define GLOB_CHARS "*?["
78
79 #define FORMAT_BYTES_MAX 8
80
81 #define ANSI_HIGHLIGHT_ON "\x1B[1;39m"
82 #define ANSI_RED_ON "\x1B[31m"
83 #define ANSI_HIGHLIGHT_RED_ON "\x1B[1;31m"
84 #define ANSI_GREEN_ON "\x1B[32m"
85 #define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m"
86 #define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m"
87 #define ANSI_HIGHLIGHT_BLUE_ON "\x1B[1;34m"
88 #define ANSI_HIGHLIGHT_OFF "\x1B[0m"
89 #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K"
90
91 size_t page_size(void);
92 #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
93
94 #define streq(a,b) (strcmp((a),(b)) == 0)
95 #define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
96 #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
97 #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
98
99 bool streq_ptr(const char *a, const char *b) _pure_;
100
101 #define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
102
103 #define new0(t, n) ((t*) calloc((n), sizeof(t)))
104
105 #define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
106
107 #define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
108
109 #define malloc0(n) (calloc((n), 1))
110
111 static inline const char* yes_no(bool b) {
112         return b ? "yes" : "no";
113 }
114
115 static inline const char* true_false(bool b) {
116         return b ? "true" : "false";
117 }
118
119 static inline const char* strempty(const char *s) {
120         return s ? s : "";
121 }
122
123 static inline const char* strnull(const char *s) {
124         return s ? s : "(null)";
125 }
126
127 static inline const char *strna(const char *s) {
128         return s ? s : "n/a";
129 }
130
131 static inline bool isempty(const char *p) {
132         return !p || !p[0];
133 }
134
135 static inline const char *startswith(const char *s, const char *prefix) {
136         if (strncmp(s, prefix, strlen(prefix)) == 0)
137                 return s + strlen(prefix);
138         return NULL;
139 }
140
141 static inline const char *startswith_no_case(const char *s, const char *prefix) {
142         if (strncasecmp(s, prefix, strlen(prefix)) == 0)
143                 return s + strlen(prefix);
144         return NULL;
145 }
146
147 char *endswith(const char *s, const char *postfix) _pure_;
148
149 bool first_word(const char *s, const char *word) _pure_;
150
151 int close_nointr(int fd);
152 int safe_close(int fd);
153 void safe_close_pair(int p[]);
154
155 void close_many(const int fds[], unsigned n_fd);
156
157 int parse_size(const char *t, off_t base, off_t *size);
158
159 int parse_boolean(const char *v) _pure_;
160 int parse_pid(const char *s, pid_t* ret_pid);
161 int parse_uid(const char *s, uid_t* ret_uid);
162 #define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
163
164 int safe_atou(const char *s, unsigned *ret_u);
165 int safe_atoi(const char *s, int *ret_i);
166
167 int safe_atollu(const char *s, unsigned long long *ret_u);
168 int safe_atolli(const char *s, long long int *ret_i);
169
170 int safe_atod(const char *s, double *ret_d);
171
172 #if __WORDSIZE == 32
173 static inline int safe_atolu(const char *s, unsigned long *ret_u) {
174         assert_cc(sizeof(unsigned long) == sizeof(unsigned));
175         return safe_atou(s, (unsigned*) ret_u);
176 }
177 static inline int safe_atoli(const char *s, long int *ret_u) {
178         assert_cc(sizeof(long int) == sizeof(int));
179         return safe_atoi(s, (int*) ret_u);
180 }
181 #else
182 static inline int safe_atolu(const char *s, unsigned long *ret_u) {
183         assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
184         return safe_atollu(s, (unsigned long long*) ret_u);
185 }
186 static inline int safe_atoli(const char *s, long int *ret_u) {
187         assert_cc(sizeof(long int) == sizeof(long long int));
188         return safe_atolli(s, (long long int*) ret_u);
189 }
190 #endif
191
192 static inline int safe_atou32(const char *s, uint32_t *ret_u) {
193         assert_cc(sizeof(uint32_t) == sizeof(unsigned));
194         return safe_atou(s, (unsigned*) ret_u);
195 }
196
197 static inline int safe_atoi32(const char *s, int32_t *ret_i) {
198         assert_cc(sizeof(int32_t) == sizeof(int));
199         return safe_atoi(s, (int*) ret_i);
200 }
201
202 static inline int safe_atou64(const char *s, uint64_t *ret_u) {
203         assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
204         return safe_atollu(s, (unsigned long long*) ret_u);
205 }
206
207 static inline int safe_atoi64(const char *s, int64_t *ret_i) {
208         assert_cc(sizeof(int64_t) == sizeof(long long int));
209         return safe_atolli(s, (long long int*) ret_i);
210 }
211
212 char *split(const char *c, size_t *l, const char *separator, bool quoted, char **state);
213
214 #define FOREACH_WORD(word, length, s, state)                            \
215         _FOREACH_WORD(word, length, s, WHITESPACE, false, state)
216
217 #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state)       \
218         _FOREACH_WORD(word, length, s, separator, false, state)
219
220 #define FOREACH_WORD_QUOTED(word, length, s, state)                     \
221         _FOREACH_WORD(word, length, s, WHITESPACE, true, state)
222
223 #define FOREACH_WORD_SEPARATOR_QUOTED(word, length, s, separator, state)       \
224         _FOREACH_WORD(word, length, s, separator, true, state)
225
226 #define _FOREACH_WORD(word, length, s, separator, quoted, state)        \
227         for ((state) = NULL, (word) = split((s), &(length), (separator), (quoted), &(state)); (word); (word) = split((s), &(length), (separator), (quoted), &(state)))
228
229 pid_t get_parent_of_pid(pid_t pid, pid_t *ppid);
230 int get_starttime_of_pid(pid_t pid, unsigned long long *st);
231
232 char *strappend(const char *s, const char *suffix);
233 char *strnappend(const char *s, const char *suffix, size_t length);
234
235 char *replace_env(const char *format, char **env);
236 char **replace_env_argv(char **argv, char **env);
237
238 int readlink_malloc(const char *p, char **r);
239 int readlink_and_make_absolute(const char *p, char **r);
240 int readlink_and_canonicalize(const char *p, char **r);
241
242 int reset_all_signal_handlers(void);
243
244 char *strstrip(char *s);
245 char *delete_chars(char *s, const char *bad);
246 char *truncate_nl(char *s);
247
248 char *file_in_same_dir(const char *path, const char *filename);
249
250 int rmdir_parents(const char *path, const char *stop);
251
252 int get_process_state(pid_t pid);
253 int get_process_comm(pid_t pid, char **name);
254 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
255 int get_process_exe(pid_t pid, char **name);
256 int get_process_uid(pid_t pid, uid_t *uid);
257 int get_process_gid(pid_t pid, gid_t *gid);
258 int get_process_capeff(pid_t pid, char **capeff);
259
260 char hexchar(int x) _const_;
261 int unhexchar(char c) _const_;
262 char octchar(int x) _const_;
263 int unoctchar(char c) _const_;
264 char decchar(int x) _const_;
265 int undecchar(char c) _const_;
266
267 char *cescape(const char *s);
268 char *cunescape(const char *s);
269 char *cunescape_length(const char *s, size_t length);
270 char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix);
271
272 char *xescape(const char *s, const char *bad);
273
274 char *ascii_strlower(char *path);
275
276 bool dirent_is_file(const struct dirent *de) _pure_;
277 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
278
279 bool ignore_file(const char *filename) _pure_;
280
281 bool chars_intersect(const char *a, const char *b) _pure_;
282
283 int make_stdio(int fd);
284 int make_null_stdio(void);
285 int make_console_stdio(void);
286
287 int dev_urandom(void *p, size_t n);
288 void random_bytes(void *p, size_t n);
289
290 static inline uint64_t random_u64(void) {
291         uint64_t u;
292         random_bytes(&u, sizeof(u));
293         return u;
294 }
295
296 static inline uint32_t random_u32(void) {
297         uint32_t u;
298         random_bytes(&u, sizeof(u));
299         return u;
300 }
301
302 /* For basic lookup tables with strictly enumerated entries */
303 #define __DEFINE_STRING_TABLE_LOOKUP(name,type,scope)                   \
304         scope const char *name##_to_string(type i) {                    \
305                 if (i < 0 || i >= (type) ELEMENTSOF(name##_table))      \
306                         return NULL;                                    \
307                 return name##_table[i];                                 \
308         }                                                               \
309         scope type name##_from_string(const char *s) {                  \
310                 type i;                                                 \
311                 if (!s)                                                 \
312                         return (type) -1;                               \
313                 for (i = 0; i < (type)ELEMENTSOF(name##_table); i++)    \
314                         if (name##_table[i] &&                          \
315                             streq(name##_table[i], s))                  \
316                                 return i;                               \
317                 return (type) -1;                                       \
318         }                                                               \
319         struct __useless_struct_to_allow_trailing_semicolon__
320
321 #define DEFINE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,)
322 #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,static)
323
324 /* For string conversions where numbers are also acceptable */
325 #define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max)         \
326         int name##_to_string_alloc(type i, char **str) {                \
327                 char *s;                                                \
328                 int r;                                                  \
329                 if (i < 0 || i > max)                                   \
330                         return -ERANGE;                                 \
331                 if (i < (type) ELEMENTSOF(name##_table)) {              \
332                         s = strdup(name##_table[i]);                    \
333                         if (!s)                                         \
334                                 return log_oom();                       \
335                 } else {                                                \
336                         r = asprintf(&s, "%u", i);                      \
337                         if (r < 0)                                      \
338                                 return log_oom();                       \
339                 }                                                       \
340                 *str = s;                                               \
341                 return 0;                                               \
342         }                                                               \
343         type name##_from_string(const char *s) {                        \
344                 type i;                                                 \
345                 unsigned u = 0;                                         \
346                 assert(s);                                              \
347                 for (i = 0; i < (type)ELEMENTSOF(name##_table); i++)    \
348                         if (name##_table[i] &&                          \
349                             streq(name##_table[i], s))                  \
350                                 return i;                               \
351                 if (safe_atou(s, &u) >= 0 && u <= max)                  \
352                         return (type) u;                                \
353                 return (type) -1;                                       \
354         }                                                               \
355         struct __useless_struct_to_allow_trailing_semicolon__
356
357 int fd_nonblock(int fd, bool nonblock);
358 int fd_cloexec(int fd, bool cloexec);
359
360 int close_all_fds(const int except[], unsigned n_except);
361
362 bool fstype_is_network(const char *fstype);
363
364 int chvt(int vt);
365
366 int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
367 int ask(char *ret, const char *replies, const char *text, ...) _printf_(3, 4);
368
369 int reset_terminal_fd(int fd, bool switch_to_text);
370 int reset_terminal(const char *name);
371
372 int open_terminal(const char *name, int mode);
373 int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm, usec_t timeout);
374 int release_terminal(void);
375
376 int flush_fd(int fd);
377
378 int ignore_signals(int sig, ...);
379 int default_signals(int sig, ...);
380 int sigaction_many(const struct sigaction *sa, ...);
381
382 int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
383
384 ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
385 ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
386
387 bool is_device_path(const char *path);
388
389 int dir_is_empty(const char *path);
390 char* dirname_malloc(const char *path);
391
392 void rename_process(const char name[8]);
393
394 void sigset_add_many(sigset_t *ss, ...);
395
396 bool hostname_is_set(void);
397
398 char* gethostname_malloc(void);
399 char* getlogname_malloc(void);
400 char* getusername_malloc(void);
401
402 int getttyname_malloc(int fd, char **r);
403 int getttyname_harder(int fd, char **r);
404
405 int get_ctty_devnr(pid_t pid, dev_t *d);
406 int get_ctty(pid_t, dev_t *_devnr, char **r);
407
408 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
409 int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
410
411 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
412 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
413 int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
414 int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
415
416 int pipe_eof(int fd);
417
418 cpu_set_t* cpu_set_malloc(unsigned *ncpus);
419
420 int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) _printf_(4,0);
421 int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) _printf_(4,5);
422
423 int fd_columns(int fd);
424 unsigned columns(void);
425 int fd_lines(int fd);
426 unsigned lines(void);
427 void columns_lines_cache_reset(int _unused_ signum);
428
429 bool on_tty(void);
430
431 static inline const char *ansi_highlight(void) {
432         return on_tty() ? ANSI_HIGHLIGHT_ON : "";
433 }
434
435 static inline const char *ansi_highlight_red(void) {
436         return on_tty() ? ANSI_HIGHLIGHT_RED_ON : "";
437 }
438
439 static inline const char *ansi_highlight_green(void) {
440         return on_tty() ? ANSI_HIGHLIGHT_GREEN_ON : "";
441 }
442
443 static inline const char *ansi_highlight_yellow(void) {
444         return on_tty() ? ANSI_HIGHLIGHT_YELLOW_ON : "";
445 }
446
447 static inline const char *ansi_highlight_blue(void) {
448         return on_tty() ? ANSI_HIGHLIGHT_BLUE_ON : "";
449 }
450
451 static inline const char *ansi_highlight_off(void) {
452         return on_tty() ? ANSI_HIGHLIGHT_OFF : "";
453 }
454
455 int files_same(const char *filea, const char *fileb);
456
457 int running_in_chroot(void);
458
459 char *ellipsize(const char *s, size_t length, unsigned percent);
460                                    /* bytes                 columns */
461 char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
462
463 int touch(const char *path);
464
465 char *unquote(const char *s, const char *quotes);
466 char *normalize_env_assignment(const char *s);
467
468 int wait_for_terminate(pid_t pid, siginfo_t *status);
469 int wait_for_terminate_and_warn(const char *name, pid_t pid);
470
471 noreturn void freeze(void);
472
473 bool null_or_empty(struct stat *st) _pure_;
474 int null_or_empty_path(const char *fn);
475
476 DIR *xopendirat(int dirfd, const char *name, int flags);
477
478 char *fstab_node_to_udev_node(const char *p);
479
480 char *resolve_dev_console(char **active);
481 bool tty_is_vc(const char *tty);
482 bool tty_is_vc_resolve(const char *tty);
483 bool tty_is_console(const char *tty) _pure_;
484 int vtnr_from_tty(const char *tty);
485 const char *default_term_for_tty(const char *tty);
486
487 void execute_directory(const char *directory, DIR *_d, usec_t timeout, char *argv[]);
488
489 int kill_and_sigcont(pid_t pid, int sig);
490
491 bool nulstr_contains(const char*nulstr, const char *needle);
492
493 bool plymouth_running(void);
494
495 bool hostname_is_valid(const char *s) _pure_;
496 char* hostname_cleanup(char *s, bool lowercase);
497
498 char* strshorten(char *s, size_t l);
499
500 int terminal_vhangup_fd(int fd);
501 int terminal_vhangup(const char *name);
502
503 int vt_disallocate(const char *name);
504
505 int copy_file(const char *from, const char *to, int flags);
506
507 int symlink_atomic(const char *from, const char *to);
508
509 int fchmod_umask(int fd, mode_t mode);
510
511 bool display_is_local(const char *display) _pure_;
512 int socket_from_display(const char *display, char **path);
513
514 int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
515 int get_group_creds(const char **groupname, gid_t *gid);
516
517 int in_gid(gid_t gid);
518 int in_group(const char *name);
519
520 char* uid_to_name(uid_t uid);
521 char* gid_to_name(gid_t gid);
522
523 int glob_exists(const char *path);
524 int glob_extend(char ***strv, const char *path);
525
526 int dirent_ensure_type(DIR *d, struct dirent *de);
527
528 int in_search_path(const char *path, char **search);
529 int get_files_in_directory(const char *path, char ***list);
530
531 char *strjoin(const char *x, ...) _sentinel_;
532
533 bool is_main_thread(void);
534
535 static inline bool _pure_ in_charset(const char *s, const char* charset) {
536         assert(s);
537         assert(charset);
538         return s[strspn(s, charset)] == '\0';
539 }
540
541 int block_get_whole_disk(dev_t d, dev_t *ret);
542
543 int file_is_priv_sticky(const char *p);
544
545 int strdup_or_null(const char *a, char **b);
546
547 #define NULSTR_FOREACH(i, l)                                    \
548         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
549
550 #define NULSTR_FOREACH_PAIR(i, j, l)                             \
551         for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
552
553 int ioprio_class_to_string_alloc(int i, char **s);
554 int ioprio_class_from_string(const char *s);
555
556 const char *sigchld_code_to_string(int i) _const_;
557 int sigchld_code_from_string(const char *s) _pure_;
558
559 int log_facility_unshifted_to_string_alloc(int i, char **s);
560 int log_facility_unshifted_from_string(const char *s);
561
562 int log_level_to_string_alloc(int i, char **s);
563 int log_level_from_string(const char *s);
564
565 int sched_policy_to_string_alloc(int i, char **s);
566 int sched_policy_from_string(const char *s);
567
568 const char *rlimit_to_string(int i) _const_;
569 int rlimit_from_string(const char *s) _pure_;
570
571 int ip_tos_to_string_alloc(int i, char **s);
572 int ip_tos_from_string(const char *s);
573
574 const char *signal_to_string(int i) _const_;
575 int signal_from_string(const char *s) _pure_;
576
577 int signal_from_string_try_harder(const char *s);
578
579 extern int saved_argc;
580 extern char **saved_argv;
581
582 bool kexec_loaded(void);
583
584 int prot_from_flags(int flags) _const_;
585
586 char *format_bytes(char *buf, size_t l, off_t t);
587
588 int fd_wait_for_event(int fd, int event, usec_t timeout);
589
590 void* memdup(const void *p, size_t l) _alloc_(2);
591
592 int is_kernel_thread(pid_t pid);
593
594 int fd_inc_sndbuf(int fd, size_t n);
595 int fd_inc_rcvbuf(int fd, size_t n);
596
597 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
598
599 int setrlimit_closest(int resource, const struct rlimit *rlim);
600
601 int getenv_for_pid(pid_t pid, const char *field, char **_value);
602
603 bool is_valid_documentation_url(const char *url) _pure_;
604
605 bool in_initrd(void);
606
607 void warn_melody(void);
608
609 int get_home_dir(char **ret);
610 int get_shell(char **_ret);
611
612 static inline void freep(void *p) {
613         free(*(void**) p);
614 }
615
616 #define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func)                 \
617         static inline void func##p(type *p) {                   \
618                 if (*p)                                         \
619                         func(*p);                               \
620         }                                                       \
621         struct __useless_struct_to_allow_trailing_semicolon__
622
623 static inline void closep(int *fd) {
624         safe_close(*fd);
625 }
626
627 static inline void umaskp(mode_t *u) {
628         umask(*u);
629 }
630
631 static inline void close_pairp(int (*p)[2]) {
632         safe_close_pair(*p);
633 }
634
635 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, fclose);
636 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, pclose);
637 DEFINE_TRIVIAL_CLEANUP_FUNC(DIR*, closedir);
638 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent);
639
640 #define _cleanup_free_ _cleanup_(freep)
641 #define _cleanup_close_ _cleanup_(closep)
642 #define _cleanup_umask_ _cleanup_(umaskp)
643 #define _cleanup_globfree_ _cleanup_(globfree)
644 #define _cleanup_fclose_ _cleanup_(fclosep)
645 #define _cleanup_pclose_ _cleanup_(pclosep)
646 #define _cleanup_closedir_ _cleanup_(closedirp)
647 #define _cleanup_endmntent_ _cleanup_(endmntentp)
648 #define _cleanup_close_pair_ _cleanup_(close_pairp)
649
650 _malloc_  _alloc_(1, 2) static inline void *malloc_multiply(size_t a, size_t b) {
651         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
652                 return NULL;
653
654         return malloc(a * b);
655 }
656
657 _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
658         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
659                 return NULL;
660
661         return memdup(p, a * b);
662 }
663
664 bool filename_is_safe(const char *p) _pure_;
665 bool path_is_safe(const char *p) _pure_;
666 bool string_is_safe(const char *p) _pure_;
667 bool string_has_cc(const char *p) _pure_;
668
669 /**
670  * Check if a string contains any glob patterns.
671  */
672 _pure_ static inline bool string_is_glob(const char *p) {
673         return !!strpbrk(p, GLOB_CHARS);
674 }
675
676 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
677                  int (*compar) (const void *, const void *, void *),
678                  void *arg);
679
680 bool is_locale_utf8(void);
681
682 typedef enum DrawSpecialChar {
683         DRAW_TREE_VERT,
684         DRAW_TREE_BRANCH,
685         DRAW_TREE_RIGHT,
686         DRAW_TREE_SPACE,
687         DRAW_TRIANGULAR_BULLET,
688         DRAW_BLACK_CIRCLE,
689         _DRAW_SPECIAL_CHAR_MAX
690 } DrawSpecialChar;
691 const char *draw_special_char(DrawSpecialChar ch);
692
693 char *strreplace(const char *text, const char *old_string, const char *new_string);
694
695 char *strip_tab_ansi(char **p, size_t *l);
696
697 int on_ac_power(void);
698
699 int search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f);
700 int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f);
701
702 #define FOREACH_LINE(line, f, on_error)                         \
703         for (;;)                                                \
704                 if (!fgets(line, sizeof(line), f)) {            \
705                         if (ferror(f)) {                        \
706                                 on_error;                       \
707                         }                                       \
708                         break;                                  \
709                 } else
710
711 #define FOREACH_DIRENT(de, d, on_error)                                 \
712         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
713                 if (!de) {                                              \
714                         if (errno > 0) {                                \
715                                 on_error;                               \
716                         }                                               \
717                         break;                                          \
718                 } else if (ignore_file((de)->d_name))                   \
719                         continue;                                       \
720                 else
721
722 static inline void *mempset(void *s, int c, size_t n) {
723         memset(s, c, n);
724         return (uint8_t*)s + n;
725 }
726
727 char *hexmem(const void *p, size_t l);
728 void *unhexmem(const char *p, size_t l);
729
730 char *strextend(char **x, ...) _sentinel_;
731 char *strrep(const char *s, unsigned n);
732
733 void* greedy_realloc(void **p, size_t *allocated, size_t need);
734 void* greedy_realloc0(void **p, size_t *allocated, size_t need);
735 #define GREEDY_REALLOC(array, allocated, need) \
736         greedy_realloc((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
737 #define GREEDY_REALLOC0(array, allocated, need) \
738         greedy_realloc0((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
739
740 #define GREEDY_REALLOC0_T(array, count, need)                           \
741         ({                                                              \
742                 size_t _size = (count) * sizeof((array)[0]);            \
743                 void *_ptr = GREEDY_REALLOC0((array), _size, (need));   \
744                 if (_ptr)                                               \
745                         (count) = _size / sizeof((array)[0]);           \
746                 _ptr;                                                   \
747         })
748
749 static inline void _reset_errno_(int *saved_errno) {
750         errno = *saved_errno;
751 }
752
753 #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
754
755 struct _umask_struct_ {
756         mode_t mask;
757         bool quit;
758 };
759
760 static inline void _reset_umask_(struct _umask_struct_ *s) {
761         umask(s->mask);
762 };
763
764 #define RUN_WITH_UMASK(mask)                                            \
765         for (_cleanup_(_reset_umask_) struct _umask_struct_ _saved_umask_ = { umask(mask), false }; \
766              !_saved_umask_.quit ;                                      \
767              _saved_umask_.quit = true)
768
769 static inline unsigned u64log2(uint64_t n) {
770 #if __SIZEOF_LONG_LONG__ == 8
771         return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
772 #else
773 #error "Wut?"
774 #endif
775 }
776
777 static inline unsigned u32ctz(uint32_t n) {
778 #if __SIZEOF_INT__ == 4
779         return __builtin_ctz(n);
780 #else
781 #error "Wut?"
782 #endif
783 }
784
785 static inline int log2i(int x) {
786         assert(x > 0);
787
788         return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
789 }
790
791 static inline bool logind_running(void) {
792         return access("/run/systemd/seats/", F_OK) >= 0;
793 }
794
795 #define DECIMAL_STR_WIDTH(x)                            \
796         ({                                              \
797                 typeof(x) _x_ = (x);                    \
798                 unsigned ans = 1;                       \
799                 while (_x_ /= 10)                       \
800                         ans++;                          \
801                 ans;                                    \
802         })
803
804 int unlink_noerrno(const char *path);
805
806 #define alloca0(n)                                      \
807         ({                                              \
808                 char *_new_;                            \
809                 size_t _len_ = n;                       \
810                 _new_ = alloca(_len_);                  \
811                 (void *) memset(_new_, 0, _len_);       \
812         })
813
814 #define strappenda(a, b)                                \
815         ({                                              \
816                 const char *_a_ = (a), *_b_ = (b);      \
817                 char *_c_;                              \
818                 size_t _x_, _y_;                        \
819                 _x_ = strlen(_a_);                      \
820                 _y_ = strlen(_b_);                      \
821                 _c_ = alloca(_x_ + _y_ + 1);            \
822                 strcpy(stpcpy(_c_, _a_), _b_);          \
823                 _c_;                                    \
824         })
825
826 #define strappenda3(a, b, c)                                    \
827         ({                                                      \
828                 const char *_a_ = (a), *_b_ = (b), *_c_ = (c);  \
829                 char *_d_;                                      \
830                 size_t _x_, _y_, _z_;                           \
831                 _x_ = strlen(_a_);                              \
832                 _y_ = strlen(_b_);                              \
833                 _z_ = strlen(_c_);                              \
834                 _d_ = alloca(_x_ + _y_ + _z_ + 1);              \
835                 strcpy(stpcpy(stpcpy(_d_, _a_), _b_), _c_);     \
836                 _d_;                                            \
837         })
838
839 #define procfs_file_alloca(pid, field)                                  \
840         ({                                                              \
841                 pid_t _pid_ = (pid);                                    \
842                 const char *_r_;                                        \
843                 if (_pid_ == 0) {                                       \
844                         _r_ = ("/proc/self/" field);                    \
845                 } else {                                                \
846                         _r_ = alloca(strlen("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
847                         sprintf((char*) _r_, "/proc/"PID_FMT"/" field, _pid_);                       \
848                 }                                                       \
849                 _r_;                                                    \
850         })
851
852 struct _locale_struct_ {
853         locale_t saved_locale;
854         locale_t new_locale;
855         bool quit;
856 };
857
858 static inline void _reset_locale_(struct _locale_struct_ *s) {
859         PROTECT_ERRNO;
860         if (s->saved_locale != (locale_t) 0)
861                 uselocale(s->saved_locale);
862         if (s->new_locale != (locale_t) 0)
863                 freelocale(s->new_locale);
864 }
865
866 #define RUN_WITH_LOCALE(mask, loc) \
867         for (_cleanup_(_reset_locale_) struct _locale_struct_ _saved_locale_ = { (locale_t) 0, (locale_t) 0, false }; \
868              ({                                                         \
869                      if (!_saved_locale_.quit) {                        \
870                              PROTECT_ERRNO;                             \
871                              _saved_locale_.new_locale = newlocale((mask), (loc), (locale_t) 0); \
872                              if (_saved_locale_.new_locale != (locale_t) 0)     \
873                                      _saved_locale_.saved_locale = uselocale(_saved_locale_.new_locale); \
874                      }                                                  \
875                      !_saved_locale_.quit; }) ;                         \
876              _saved_locale_.quit = true)
877
878 bool id128_is_valid(const char *s) _pure_;
879
880 int split_pair(const char *s, const char *sep, char **l, char **r);
881
882 int shall_restore_state(void);
883
884 /**
885  * Normal qsort requires base to be nonnull. Here were require
886  * that only if nmemb > 0.
887  */
888 static inline void qsort_safe(void *base, size_t nmemb, size_t size,
889                               int (*compar)(const void *, const void *)) {
890         if (nmemb) {
891                 assert(base);
892                 qsort(base, nmemb, size, compar);
893         }
894 }
895
896 int proc_cmdline(char **ret);
897 int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
898
899 int container_get_leader(const char *machine, pid_t *pid);
900
901 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *root_fd);
902 int namespace_enter(int pidns_fd, int mntns_fd, int root_fd);
903
904 bool pid_is_alive(pid_t pid);
905 bool pid_is_unwaited(pid_t pid);
906
907 int getpeercred(int fd, struct ucred *ucred);
908 int getpeersec(int fd, char **ret);
909
910 int writev_safe(int fd, const struct iovec *w, int j);
911
912 int mkostemp_safe(char *pattern, int flags);
913 int open_tmpfile(const char *path, int flags);
914
915 int fd_warn_permissions(const char *path, int fd);
916
917 unsigned long personality_from_string(const char *p);
918 const char *personality_to_string(unsigned long);
919
920 uint64_t physical_memory(void);
921
922 char* mount_test_option(const char *haystack, const char *needle);
923
924 void hexdump(FILE *f, const void *p, size_t s);