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