chiark / gitweb /
util: Introduce unquote_first_word_and_warn
[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 <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
44 #if SIZEOF_PID_T == 4
45 #  define PID_PRI PRIi32
46 #elif SIZEOF_PID_T == 2
47 #  define PID_PRI PRIi16
48 #else
49 #  error Unknown pid_t size
50 #endif
51 #define PID_FMT "%" PID_PRI
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 #if SIZEOF_TIME_T == 8
70 #  define PRI_TIME PRIi64
71 #elif SIZEOF_TIME_T == 4
72 #  define PRI_TIME PRIu32
73 #else
74 #  error Unknown time_t size
75 #endif
76
77 #if SIZEOF_RLIM_T == 8
78 #  define RLIM_FMT "%" PRIu64
79 #elif SIZEOF_RLIM_T == 4
80 #  define RLIM_FMT "%" PRIu32
81 #else
82 #  error Unknown rlim_t size
83 #endif
84
85 #include "macro.h"
86 #include "missing.h"
87 #include "time-util.h"
88
89 /* What is interpreted as whitespace? */
90 #define WHITESPACE " \t\n\r"
91 #define NEWLINE    "\n\r"
92 #define QUOTES     "\"\'"
93 #define COMMENTS   "#;"
94 #define GLOB_CHARS "*?["
95
96 /* What characters are special in the shell? */
97 /* must be escaped outside and inside double-quotes */
98 #define SHELL_NEED_ESCAPE "\"\\`$"
99 /* can be escaped or double-quoted */
100 #define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;"
101
102 #define FORMAT_BYTES_MAX 8
103
104 #define ANSI_HIGHLIGHT_ON "\x1B[1;39m"
105 #define ANSI_RED_ON "\x1B[31m"
106 #define ANSI_HIGHLIGHT_RED_ON "\x1B[1;31m"
107 #define ANSI_GREEN_ON "\x1B[32m"
108 #define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m"
109 #define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m"
110 #define ANSI_HIGHLIGHT_BLUE_ON "\x1B[1;34m"
111 #define ANSI_HIGHLIGHT_OFF "\x1B[0m"
112 #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K"
113
114 size_t page_size(void) _pure_;
115 #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
116
117 #define streq(a,b) (strcmp((a),(b)) == 0)
118 #define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
119 #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
120 #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
121
122 bool streq_ptr(const char *a, const char *b) _pure_;
123
124 #define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
125
126 #define new0(t, n) ((t*) calloc((n), sizeof(t)))
127
128 #define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
129
130 #define newa0(t, n) ((t*) alloca0(sizeof(t)*(n)))
131
132 #define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
133
134 #define malloc0(n) (calloc((n), 1))
135
136 static inline const char* yes_no(bool b) {
137         return b ? "yes" : "no";
138 }
139
140 static inline const char* true_false(bool b) {
141         return b ? "true" : "false";
142 }
143
144 static inline const char* one_zero(bool b) {
145         return b ? "1" : "0";
146 }
147
148 static inline const char* strempty(const char *s) {
149         return s ? s : "";
150 }
151
152 static inline const char* strnull(const char *s) {
153         return s ? s : "(null)";
154 }
155
156 static inline const char *strna(const char *s) {
157         return s ? s : "n/a";
158 }
159
160 static inline bool isempty(const char *p) {
161         return !p || !p[0];
162 }
163
164 static inline char *startswith(const char *s, const char *prefix) {
165         size_t l;
166
167         l = strlen(prefix);
168         if (strncmp(s, prefix, l) == 0)
169                 return (char*) s + l;
170
171         return NULL;
172 }
173
174 static inline char *startswith_no_case(const char *s, const char *prefix) {
175         size_t l;
176
177         l = strlen(prefix);
178         if (strncasecmp(s, prefix, l) == 0)
179                 return (char*) s + l;
180
181         return NULL;
182 }
183
184 char *endswith(const char *s, const char *postfix) _pure_;
185
186 char *first_word(const char *s, const char *word) _pure_;
187
188 int close_nointr(int fd);
189 int safe_close(int fd);
190 void safe_close_pair(int p[]);
191
192 void close_many(const int fds[], unsigned n_fd);
193
194 int parse_size(const char *t, off_t base, off_t *size);
195
196 int parse_boolean(const char *v) _pure_;
197 int parse_pid(const char *s, pid_t* ret_pid);
198 int parse_uid(const char *s, uid_t* ret_uid);
199 #define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
200
201 int safe_atou(const char *s, unsigned *ret_u);
202 int safe_atoi(const char *s, int *ret_i);
203
204 int safe_atollu(const char *s, unsigned long long *ret_u);
205 int safe_atolli(const char *s, long long int *ret_i);
206
207 int safe_atod(const char *s, double *ret_d);
208
209 int safe_atou8(const char *s, uint8_t *ret);
210
211 #if LONG_MAX == INT_MAX
212 static inline int safe_atolu(const char *s, unsigned long *ret_u) {
213         assert_cc(sizeof(unsigned long) == sizeof(unsigned));
214         return safe_atou(s, (unsigned*) ret_u);
215 }
216 static inline int safe_atoli(const char *s, long int *ret_u) {
217         assert_cc(sizeof(long int) == sizeof(int));
218         return safe_atoi(s, (int*) ret_u);
219 }
220 #else
221 static inline int safe_atolu(const char *s, unsigned long *ret_u) {
222         assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
223         return safe_atollu(s, (unsigned long long*) ret_u);
224 }
225 static inline int safe_atoli(const char *s, long int *ret_u) {
226         assert_cc(sizeof(long int) == sizeof(long long int));
227         return safe_atolli(s, (long long int*) ret_u);
228 }
229 #endif
230
231 static inline int safe_atou32(const char *s, uint32_t *ret_u) {
232         assert_cc(sizeof(uint32_t) == sizeof(unsigned));
233         return safe_atou(s, (unsigned*) ret_u);
234 }
235
236 static inline int safe_atoi32(const char *s, int32_t *ret_i) {
237         assert_cc(sizeof(int32_t) == sizeof(int));
238         return safe_atoi(s, (int*) ret_i);
239 }
240
241 static inline int safe_atou64(const char *s, uint64_t *ret_u) {
242         assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
243         return safe_atollu(s, (unsigned long long*) ret_u);
244 }
245
246 static inline int safe_atoi64(const char *s, int64_t *ret_i) {
247         assert_cc(sizeof(int64_t) == sizeof(long long int));
248         return safe_atolli(s, (long long int*) ret_i);
249 }
250
251 int safe_atou16(const char *s, uint16_t *ret);
252 int safe_atoi16(const char *s, int16_t *ret);
253
254 const char* split(const char **state, size_t *l, const char *separator, bool quoted);
255
256 #define FOREACH_WORD(word, length, s, state)                            \
257         _FOREACH_WORD(word, length, s, WHITESPACE, false, state)
258
259 #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state)       \
260         _FOREACH_WORD(word, length, s, separator, false, state)
261
262 #define FOREACH_WORD_QUOTED(word, length, s, state)                     \
263         _FOREACH_WORD(word, length, s, WHITESPACE, true, state)
264
265 #define _FOREACH_WORD(word, length, s, separator, quoted, state)        \
266         for ((state) = (s), (word) = split(&(state), &(length), (separator), (quoted)); (word); (word) = split(&(state), &(length), (separator), (quoted)))
267
268 pid_t get_parent_of_pid(pid_t pid, pid_t *ppid);
269
270 char *strappend(const char *s, const char *suffix);
271 char *strnappend(const char *s, const char *suffix, size_t length);
272
273 char *replace_env(const char *format, char **env);
274 char **replace_env_argv(char **argv, char **env);
275
276 int readlinkat_malloc(int fd, const char *p, char **ret);
277 int readlink_malloc(const char *p, char **r);
278 int readlink_value(const char *p, char **ret);
279 int readlink_and_make_absolute(const char *p, char **r);
280 int readlink_and_canonicalize(const char *p, char **r);
281
282 char *strstrip(char *s);
283 char *delete_chars(char *s, const char *bad);
284 char *truncate_nl(char *s);
285
286 char *file_in_same_dir(const char *path, const char *filename);
287
288 int rmdir_parents(const char *path, const char *stop);
289
290 int get_process_state(pid_t pid);
291 int get_process_comm(pid_t pid, char **name);
292 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
293 int get_process_exe(pid_t pid, char **name);
294 int get_process_uid(pid_t pid, uid_t *uid);
295 int get_process_gid(pid_t pid, gid_t *gid);
296 int get_process_capeff(pid_t pid, char **capeff);
297 int get_process_cwd(pid_t pid, char **cwd);
298 int get_process_root(pid_t pid, char **root);
299 int get_process_environ(pid_t pid, char **environ);
300
301 char hexchar(int x) _const_;
302 int unhexchar(char c) _const_;
303 char octchar(int x) _const_;
304 int unoctchar(char c) _const_;
305 char decchar(int x) _const_;
306 int undecchar(char c) _const_;
307
308 char *cescape(const char *s);
309 char *cunescape(const char *s);
310 char *cunescape_length(const char *s, size_t length);
311 char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix);
312
313 char *xescape(const char *s, const char *bad);
314
315 char *ascii_strlower(char *path);
316
317 bool dirent_is_file(const struct dirent *de) _pure_;
318 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
319
320 bool hidden_file(const char *filename) _pure_;
321
322 bool chars_intersect(const char *a, const char *b) _pure_;
323
324 int make_stdio(int fd);
325 int make_null_stdio(void);
326 int make_console_stdio(void);
327
328 int dev_urandom(void *p, size_t n);
329 void random_bytes(void *p, size_t n);
330 void initialize_srand(void);
331
332 static inline uint64_t random_u64(void) {
333         uint64_t u;
334         random_bytes(&u, sizeof(u));
335         return u;
336 }
337
338 static inline uint32_t random_u32(void) {
339         uint32_t u;
340         random_bytes(&u, sizeof(u));
341         return u;
342 }
343
344 /* For basic lookup tables with strictly enumerated entries */
345 #define _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope)          \
346         scope const char *name##_to_string(type i) {                    \
347                 if (i < 0 || i >= (type) ELEMENTSOF(name##_table))      \
348                         return NULL;                                    \
349                 return name##_table[i];                                 \
350         }
351
352 ssize_t string_table_lookup(const char * const *table, size_t len, const char *key);
353
354 #define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope)                                \
355         scope inline type name##_from_string(const char *s) {                                   \
356                 return (type)string_table_lookup(name##_table, ELEMENTSOF(name##_table), s);    \
357         }
358
359 #define _DEFINE_STRING_TABLE_LOOKUP(name,type,scope)                    \
360         _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope)          \
361         _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope)        \
362         struct __useless_struct_to_allow_trailing_semicolon__
363
364 #define DEFINE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,)
365 #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,static)
366 #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,static)
367 #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,static)
368
369 /* For string conversions where numbers are also acceptable */
370 #define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max)         \
371         int name##_to_string_alloc(type i, char **str) {                \
372                 char *s;                                                \
373                 int r;                                                  \
374                 if (i < 0 || i > max)                                   \
375                         return -ERANGE;                                 \
376                 if (i < (type) ELEMENTSOF(name##_table)) {              \
377                         s = strdup(name##_table[i]);                    \
378                         if (!s)                                         \
379                                 return log_oom();                       \
380                 } else {                                                \
381                         r = asprintf(&s, "%i", i);                      \
382                         if (r < 0)                                      \
383                                 return log_oom();                       \
384                 }                                                       \
385                 *str = s;                                               \
386                 return 0;                                               \
387         }                                                               \
388         type name##_from_string(const char *s) {                        \
389                 type i;                                                 \
390                 unsigned u = 0;                                         \
391                 assert(s);                                              \
392                 for (i = 0; i < (type)ELEMENTSOF(name##_table); i++)    \
393                         if (name##_table[i] &&                          \
394                             streq(name##_table[i], s))                  \
395                                 return i;                               \
396                 if (safe_atou(s, &u) >= 0 && u <= max)                  \
397                         return (type) u;                                \
398                 return (type) -1;                                       \
399         }                                                               \
400         struct __useless_struct_to_allow_trailing_semicolon__
401
402 int fd_nonblock(int fd, bool nonblock);
403 int fd_cloexec(int fd, bool cloexec);
404
405 int close_all_fds(const int except[], unsigned n_except);
406
407 bool fstype_is_network(const char *fstype);
408
409 int chvt(int vt);
410
411 int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
412 int ask_char(char *ret, const char *replies, const char *text, ...) _printf_(3, 4);
413 int ask_string(char **ret, const char *text, ...) _printf_(2, 3);
414
415 int reset_terminal_fd(int fd, bool switch_to_text);
416 int reset_terminal(const char *name);
417
418 int open_terminal(const char *name, int mode);
419 int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm, usec_t timeout);
420 int release_terminal(void);
421
422 int flush_fd(int fd);
423
424 int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
425
426 ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
427 int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll);
428 int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
429
430 bool is_device_path(const char *path);
431
432 int dir_is_empty(const char *path);
433 char* dirname_malloc(const char *path);
434
435 void rename_process(const char name[8]);
436
437 bool hostname_is_set(void);
438
439 char* lookup_uid(uid_t uid);
440 char* gethostname_malloc(void);
441 char* getlogname_malloc(void);
442 char* getusername_malloc(void);
443
444 int getttyname_malloc(int fd, char **r);
445 int getttyname_harder(int fd, char **r);
446
447 int get_ctty_devnr(pid_t pid, dev_t *d);
448 int get_ctty(pid_t, dev_t *_devnr, char **r);
449
450 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
451 int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
452
453 int is_fd_on_temporary_fs(int fd);
454
455 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
456 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
457 int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
458 int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
459
460 int pipe_eof(int fd);
461
462 cpu_set_t* cpu_set_malloc(unsigned *ncpus);
463
464 int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap) _printf_(4,0);
465 int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...) _printf_(4,5);
466
467 #define xsprintf(buf, fmt, ...) assert_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf))
468
469 int fd_columns(int fd);
470 unsigned columns(void);
471 int fd_lines(int fd);
472 unsigned lines(void);
473 void columns_lines_cache_reset(int _unused_ signum);
474
475 bool on_tty(void);
476
477 static inline const char *ansi_highlight(void) {
478         return on_tty() ? ANSI_HIGHLIGHT_ON : "";
479 }
480
481 static inline const char *ansi_highlight_red(void) {
482         return on_tty() ? ANSI_HIGHLIGHT_RED_ON : "";
483 }
484
485 static inline const char *ansi_highlight_green(void) {
486         return on_tty() ? ANSI_HIGHLIGHT_GREEN_ON : "";
487 }
488
489 static inline const char *ansi_highlight_yellow(void) {
490         return on_tty() ? ANSI_HIGHLIGHT_YELLOW_ON : "";
491 }
492
493 static inline const char *ansi_highlight_blue(void) {
494         return on_tty() ? ANSI_HIGHLIGHT_BLUE_ON : "";
495 }
496
497 static inline const char *ansi_highlight_off(void) {
498         return on_tty() ? ANSI_HIGHLIGHT_OFF : "";
499 }
500
501 int files_same(const char *filea, const char *fileb);
502
503 int running_in_chroot(void);
504
505 char *ellipsize(const char *s, size_t length, unsigned percent);
506                                    /* bytes                 columns */
507 char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
508
509 int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode);
510 int touch(const char *path);
511
512 char *unquote(const char *s, const char *quotes);
513 char *normalize_env_assignment(const char *s);
514
515 int wait_for_terminate(pid_t pid, siginfo_t *status);
516 int wait_for_terminate_and_warn(const char *name, pid_t pid, bool check_exit_code);
517
518 noreturn void freeze(void);
519
520 bool null_or_empty(struct stat *st) _pure_;
521 int null_or_empty_path(const char *fn);
522 int null_or_empty_fd(int fd);
523
524 DIR *xopendirat(int dirfd, const char *name, int flags);
525
526 char *fstab_node_to_udev_node(const char *p);
527
528 char *resolve_dev_console(char **active);
529 bool tty_is_vc(const char *tty);
530 bool tty_is_vc_resolve(const char *tty);
531 bool tty_is_console(const char *tty) _pure_;
532 int vtnr_from_tty(const char *tty);
533 const char *default_term_for_tty(const char *tty);
534
535 void execute_directories(const char* const* directories, usec_t timeout, char *argv[]);
536
537 int kill_and_sigcont(pid_t pid, int sig);
538
539 bool nulstr_contains(const char*nulstr, const char *needle);
540
541 bool plymouth_running(void);
542
543 bool hostname_is_valid(const char *s) _pure_;
544 char* hostname_cleanup(char *s, bool lowercase);
545
546 bool machine_name_is_valid(const char *s) _pure_;
547
548 char* strshorten(char *s, size_t l);
549
550 int terminal_vhangup_fd(int fd);
551 int terminal_vhangup(const char *name);
552
553 int vt_disallocate(const char *name);
554
555 int symlink_atomic(const char *from, const char *to);
556 int mknod_atomic(const char *path, mode_t mode, dev_t dev);
557 int mkfifo_atomic(const char *path, mode_t mode);
558
559 int fchmod_umask(int fd, mode_t mode);
560
561 bool display_is_local(const char *display) _pure_;
562 int socket_from_display(const char *display, char **path);
563
564 int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
565 int get_group_creds(const char **groupname, gid_t *gid);
566
567 int in_gid(gid_t gid);
568 int in_group(const char *name);
569
570 char* uid_to_name(uid_t uid);
571 char* gid_to_name(gid_t gid);
572
573 int glob_exists(const char *path);
574 int glob_extend(char ***strv, const char *path);
575
576 int dirent_ensure_type(DIR *d, struct dirent *de);
577
578 int get_files_in_directory(const char *path, char ***list);
579
580 char *strjoin(const char *x, ...) _sentinel_;
581
582 bool is_main_thread(void);
583
584 static inline bool _pure_ in_charset(const char *s, const char* charset) {
585         assert(s);
586         assert(charset);
587         return s[strspn(s, charset)] == '\0';
588 }
589
590 int block_get_whole_disk(dev_t d, dev_t *ret);
591
592 #define NULSTR_FOREACH(i, l)                                    \
593         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
594
595 #define NULSTR_FOREACH_PAIR(i, j, l)                             \
596         for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
597
598 int ioprio_class_to_string_alloc(int i, char **s);
599 int ioprio_class_from_string(const char *s);
600
601 const char *sigchld_code_to_string(int i) _const_;
602 int sigchld_code_from_string(const char *s) _pure_;
603
604 int log_facility_unshifted_to_string_alloc(int i, char **s);
605 int log_facility_unshifted_from_string(const char *s);
606
607 int log_level_to_string_alloc(int i, char **s);
608 int log_level_from_string(const char *s);
609
610 int sched_policy_to_string_alloc(int i, char **s);
611 int sched_policy_from_string(const char *s);
612
613 const char *rlimit_to_string(int i) _const_;
614 int rlimit_from_string(const char *s) _pure_;
615
616 int ip_tos_to_string_alloc(int i, char **s);
617 int ip_tos_from_string(const char *s);
618
619 extern int saved_argc;
620 extern char **saved_argv;
621
622 bool kexec_loaded(void);
623
624 int prot_from_flags(int flags) _const_;
625
626 char *format_bytes(char *buf, size_t l, off_t t);
627
628 int fd_wait_for_event(int fd, int event, usec_t timeout);
629
630 void* memdup(const void *p, size_t l) _alloc_(2);
631
632 int is_kernel_thread(pid_t pid);
633
634 int fd_inc_sndbuf(int fd, size_t n);
635 int fd_inc_rcvbuf(int fd, size_t n);
636
637 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
638
639 int setrlimit_closest(int resource, const struct rlimit *rlim);
640
641 int getenv_for_pid(pid_t pid, const char *field, char **_value);
642
643 bool http_url_is_valid(const char *url) _pure_;
644 bool documentation_url_is_valid(const char *url) _pure_;
645
646 bool http_etag_is_valid(const char *etag);
647
648 bool in_initrd(void);
649
650 void warn_melody(void);
651
652 int get_home_dir(char **ret);
653 int get_shell(char **_ret);
654
655 static inline void freep(void *p) {
656         free(*(void**) p);
657 }
658
659 static inline void closep(int *fd) {
660         safe_close(*fd);
661 }
662
663 static inline void umaskp(mode_t *u) {
664         umask(*u);
665 }
666
667 static inline void close_pairp(int (*p)[2]) {
668         safe_close_pair(*p);
669 }
670
671 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, fclose);
672 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, pclose);
673 DEFINE_TRIVIAL_CLEANUP_FUNC(DIR*, closedir);
674 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent);
675
676 #define _cleanup_free_ _cleanup_(freep)
677 #define _cleanup_close_ _cleanup_(closep)
678 #define _cleanup_umask_ _cleanup_(umaskp)
679 #define _cleanup_globfree_ _cleanup_(globfree)
680 #define _cleanup_fclose_ _cleanup_(fclosep)
681 #define _cleanup_pclose_ _cleanup_(pclosep)
682 #define _cleanup_closedir_ _cleanup_(closedirp)
683 #define _cleanup_endmntent_ _cleanup_(endmntentp)
684 #define _cleanup_close_pair_ _cleanup_(close_pairp)
685
686 _malloc_  _alloc_(1, 2) static inline void *malloc_multiply(size_t a, size_t b) {
687         if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
688                 return NULL;
689
690         return malloc(a * b);
691 }
692
693 _alloc_(2, 3) static inline void *realloc_multiply(void *p, size_t a, size_t b) {
694         if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
695                 return NULL;
696
697         return realloc(p, a * b);
698 }
699
700 _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
701         if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
702                 return NULL;
703
704         return memdup(p, a * b);
705 }
706
707 bool filename_is_valid(const char *p) _pure_;
708 bool path_is_safe(const char *p) _pure_;
709 bool string_is_safe(const char *p) _pure_;
710 bool string_has_cc(const char *p, const char *ok) _pure_;
711
712 /**
713  * Check if a string contains any glob patterns.
714  */
715 _pure_ static inline bool string_is_glob(const char *p) {
716         return !!strpbrk(p, GLOB_CHARS);
717 }
718
719 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
720                  int (*compar) (const void *, const void *, void *),
721                  void *arg);
722
723 #define _(String) gettext (String)
724 void init_gettext(void);
725 bool is_locale_utf8(void);
726
727 typedef enum DrawSpecialChar {
728         DRAW_TREE_VERTICAL,
729         DRAW_TREE_BRANCH,
730         DRAW_TREE_RIGHT,
731         DRAW_TREE_SPACE,
732         DRAW_TRIANGULAR_BULLET,
733         DRAW_BLACK_CIRCLE,
734         DRAW_ARROW,
735         DRAW_DASH,
736         _DRAW_SPECIAL_CHAR_MAX
737 } DrawSpecialChar;
738
739 const char *draw_special_char(DrawSpecialChar ch);
740
741 char *strreplace(const char *text, const char *old_string, const char *new_string);
742
743 char *strip_tab_ansi(char **p, size_t *l);
744
745 int on_ac_power(void);
746
747 int search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f);
748 int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f);
749
750 #define FOREACH_LINE(line, f, on_error)                         \
751         for (;;)                                                \
752                 if (!fgets(line, sizeof(line), f)) {            \
753                         if (ferror(f)) {                        \
754                                 on_error;                       \
755                         }                                       \
756                         break;                                  \
757                 } else
758
759 #define FOREACH_DIRENT(de, d, on_error)                                 \
760         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
761                 if (!de) {                                              \
762                         if (errno > 0) {                                \
763                                 on_error;                               \
764                         }                                               \
765                         break;                                          \
766                 } else if (hidden_file((de)->d_name))                   \
767                         continue;                                       \
768                 else
769
770 #define FOREACH_DIRENT_ALL(de, d, on_error)                             \
771         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
772                 if (!de) {                                              \
773                         if (errno > 0) {                                \
774                                 on_error;                               \
775                         }                                               \
776                         break;                                          \
777                 } else
778
779 static inline void *mempset(void *s, int c, size_t n) {
780         memset(s, c, n);
781         return (uint8_t*)s + n;
782 }
783
784 char *hexmem(const void *p, size_t l);
785 void *unhexmem(const char *p, size_t l);
786
787 char *strextend(char **x, ...) _sentinel_;
788 char *strrep(const char *s, unsigned n);
789
790 void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size);
791 void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size);
792 #define GREEDY_REALLOC(array, allocated, need)                          \
793         greedy_realloc((void**) &(array), &(allocated), (need), sizeof((array)[0]))
794
795 #define GREEDY_REALLOC0(array, allocated, need)                         \
796         greedy_realloc0((void**) &(array), &(allocated), (need), sizeof((array)[0]))
797
798 static inline void _reset_errno_(int *saved_errno) {
799         errno = *saved_errno;
800 }
801
802 #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
803
804 static inline int negative_errno(void) {
805         /* This helper should be used to shut up gcc if you know 'errno' is
806          * negative. Instead of "return -errno;", use "return negative_errno();"
807          * It will suppress bogus gcc warnings in case it assumes 'errno' might
808          * be 0 and thus the caller's error-handling might not be triggered. */
809         assert_return(errno > 0, -EINVAL);
810         return -errno;
811 }
812
813 struct _umask_struct_ {
814         mode_t mask;
815         bool quit;
816 };
817
818 static inline void _reset_umask_(struct _umask_struct_ *s) {
819         umask(s->mask);
820 };
821
822 #define RUN_WITH_UMASK(mask)                                            \
823         for (_cleanup_(_reset_umask_) struct _umask_struct_ _saved_umask_ = { umask(mask), false }; \
824              !_saved_umask_.quit ;                                      \
825              _saved_umask_.quit = true)
826
827 static inline unsigned u64log2(uint64_t n) {
828 #if __SIZEOF_LONG_LONG__ == 8
829         return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
830 #else
831 #error "Wut?"
832 #endif
833 }
834
835 static inline unsigned u32ctz(uint32_t n) {
836 #if __SIZEOF_INT__ == 4
837         return __builtin_ctz(n);
838 #else
839 #error "Wut?"
840 #endif
841 }
842
843 static inline unsigned log2i(int x) {
844         assert(x > 0);
845
846         return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
847 }
848
849 static inline unsigned log2u(unsigned x) {
850         assert(x > 0);
851
852         return sizeof(unsigned) * 8 - __builtin_clz(x) - 1;
853 }
854
855 static inline unsigned log2u_round_up(unsigned x) {
856         assert(x > 0);
857
858         if (x == 1)
859                 return 0;
860
861         return log2u(x - 1) + 1;
862 }
863
864 static inline bool logind_running(void) {
865         return access("/run/systemd/seats/", F_OK) >= 0;
866 }
867
868 #define DECIMAL_STR_WIDTH(x)                            \
869         ({                                              \
870                 typeof(x) _x_ = (x);                    \
871                 unsigned ans = 1;                       \
872                 while (_x_ /= 10)                       \
873                         ans++;                          \
874                 ans;                                    \
875         })
876
877 int unlink_noerrno(const char *path);
878
879 #define alloca0(n)                                      \
880         ({                                              \
881                 char *_new_;                            \
882                 size_t _len_ = n;                       \
883                 _new_ = alloca(_len_);                  \
884                 (void *) memset(_new_, 0, _len_);       \
885         })
886
887 /* It's not clear what alignment glibc/gcc alloca() guarantee, hence provide a guaranteed safe version */
888 #define alloca_align(size, align)                                       \
889         ({                                                              \
890                 void *_ptr_;                                            \
891                 size_t _mask_ = (align) - 1;                            \
892                 _ptr_ = alloca((size) + _mask_);                        \
893                 (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_);         \
894         })
895
896 #define alloca0_align(size, align)                                      \
897         ({                                                              \
898                 void *_new_;                                            \
899                 size_t _size_ = (size);                                 \
900                 _new_ = alloca_align(_size_, (align));                  \
901                 (void*)memset(_new_, 0, _size_);                        \
902         })
903
904 #define strjoina(a, ...)                                                \
905         ({                                                              \
906                 const char *_appendees_[] = { a, __VA_ARGS__ };         \
907                 char *_d_, *_p_;                                        \
908                 int _len_ = 0;                                          \
909                 unsigned _i_;                                           \
910                 for (_i_ = 0; _i_ < ELEMENTSOF(_appendees_) && _appendees_[_i_]; _i_++) \
911                         _len_ += strlen(_appendees_[_i_]);              \
912                 _p_ = _d_ = alloca(_len_ + 1);                          \
913                 for (_i_ = 0; _i_ < ELEMENTSOF(_appendees_) && _appendees_[_i_]; _i_++) \
914                         _p_ = stpcpy(_p_, _appendees_[_i_]);            \
915                 *_p_ = 0;                                               \
916                 _d_;                                                    \
917         })
918
919 #define procfs_file_alloca(pid, field)                                  \
920         ({                                                              \
921                 pid_t _pid_ = (pid);                                    \
922                 const char *_r_;                                        \
923                 if (_pid_ == 0) {                                       \
924                         _r_ = ("/proc/self/" field);                    \
925                 } else {                                                \
926                         _r_ = alloca(strlen("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
927                         sprintf((char*) _r_, "/proc/"PID_FMT"/" field, _pid_);                       \
928                 }                                                       \
929                 _r_;                                                    \
930         })
931
932 bool id128_is_valid(const char *s) _pure_;
933
934 int split_pair(const char *s, const char *sep, char **l, char **r);
935
936 int shall_restore_state(void);
937
938 /**
939  * Normal qsort requires base to be nonnull. Here were require
940  * that only if nmemb > 0.
941  */
942 static inline void qsort_safe(void *base, size_t nmemb, size_t size,
943                               int (*compar)(const void *, const void *)) {
944         if (nmemb) {
945                 assert(base);
946                 qsort(base, nmemb, size, compar);
947         }
948 }
949
950 int proc_cmdline(char **ret);
951 int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
952 int get_proc_cmdline_key(const char *parameter, char **value);
953
954 int container_get_leader(const char *machine, pid_t *pid);
955
956 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *root_fd);
957 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int root_fd);
958
959 bool pid_is_alive(pid_t pid);
960 bool pid_is_unwaited(pid_t pid);
961
962 int getpeercred(int fd, struct ucred *ucred);
963 int getpeersec(int fd, char **ret);
964
965 int writev_safe(int fd, const struct iovec *w, int j);
966
967 int mkostemp_safe(char *pattern, int flags);
968 int open_tmpfile(const char *path, int flags);
969
970 int fd_warn_permissions(const char *path, int fd);
971
972 unsigned long personality_from_string(const char *p);
973 const char *personality_to_string(unsigned long);
974
975 uint64_t physical_memory(void);
976
977 void hexdump(FILE *f, const void *p, size_t s);
978
979 union file_handle_union {
980         struct file_handle handle;
981         char padding[sizeof(struct file_handle) + MAX_HANDLE_SZ];
982 };
983 #define FILE_HANDLE_INIT { .handle.handle_bytes = MAX_HANDLE_SZ }
984
985 int update_reboot_param_file(const char *param);
986
987 int umount_recursive(const char *target, int flags);
988
989 int bind_remount_recursive(const char *prefix, bool ro);
990
991 int fflush_and_check(FILE *f);
992
993 int tempfn_xxxxxx(const char *p, char **ret);
994 int tempfn_random(const char *p, char **ret);
995 int tempfn_random_child(const char *p, char **ret);
996
997 bool is_localhost(const char *hostname);
998
999 int take_password_lock(const char *root);
1000
1001 int is_symlink(const char *path);
1002 int is_dir(const char *path, bool follow);
1003
1004 typedef enum UnquoteFlags{
1005         UNQUOTE_RELAX           = 1,
1006         UNQUOTE_CUNESCAPE       = 2,
1007         UNQUOTE_CUNESCAPE_RELAX = 4,
1008 } UnquoteFlags;
1009
1010 int unquote_first_word(const char **p, char **ret, UnquoteFlags flags);
1011 int unquote_first_word_and_warn(const char **p, char **ret, UnquoteFlags flags, const char *unit, const char *filename, unsigned line, const char *rvalue);
1012 int unquote_many_words(const char **p, UnquoteFlags flags, ...) _sentinel_;
1013
1014 int free_and_strdup(char **p, const char *s);
1015
1016 int sethostname_idempotent(const char *s);
1017
1018 #define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1)
1019
1020 #define FOREACH_INOTIFY_EVENT(e, buffer, sz) \
1021         for ((e) = &buffer.ev;                                \
1022              (uint8_t*) (e) < (uint8_t*) (buffer.raw) + (sz); \
1023              (e) = (struct inotify_event*) ((uint8_t*) (e) + sizeof(struct inotify_event) + (e)->len))
1024
1025 union inotify_event_buffer {
1026         struct inotify_event ev;
1027         uint8_t raw[INOTIFY_EVENT_MAX];
1028 };
1029
1030 #define laccess(path, mode) faccessat(AT_FDCWD, (path), (mode), AT_SYMLINK_NOFOLLOW)
1031
1032 int ptsname_malloc(int fd, char **ret);
1033
1034 int openpt_in_namespace(pid_t pid, int flags);
1035
1036 ssize_t fgetxattrat_fake(int dirfd, const char *filename, const char *attribute, void *value, size_t size, int flags);
1037
1038 int fd_setcrtime(int fd, usec_t usec);
1039 int fd_getcrtime(int fd, usec_t *usec);
1040 int path_getcrtime(const char *p, usec_t *usec);
1041 int fd_getcrtime_at(int dirfd, const char *name, usec_t *usec, int flags);
1042
1043 int chattr_fd(int fd, bool b, unsigned mask);
1044 int chattr_path(const char *p, bool b, unsigned mask);
1045 int change_attr_fd(int fd, unsigned value, unsigned mask);
1046
1047 int read_attr_fd(int fd, unsigned *ret);
1048 int read_attr_path(const char *p, unsigned *ret);
1049
1050 typedef struct LockFile {
1051         char *path;
1052         int fd;
1053         int operation;
1054 } LockFile;
1055
1056 int make_lock_file(const char *p, int operation, LockFile *ret);
1057 int make_lock_file_for(const char *p, int operation, LockFile *ret);
1058 void release_lock_file(LockFile *f);
1059
1060 #define _cleanup_release_lock_file_ _cleanup_(release_lock_file)
1061
1062 #define LOCK_FILE_INIT { .fd = -1, .path = NULL }
1063
1064 #define RLIMIT_MAKE_CONST(lim) ((struct rlimit) { lim, lim })
1065
1066 ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
1067
1068 void sigkill_wait(pid_t *pid);
1069 #define _cleanup_sigkill_wait_ _cleanup_(sigkill_wait)
1070
1071 int syslog_parse_priority(const char **p, int *priority, bool with_facility);
1072
1073 void cmsg_close_all(struct msghdr *mh);
1074
1075 int rename_noreplace(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);