chiark / gitweb /
555e1d86658b71b5ea18f3c86310999ed96cfa7f
[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 <inttypes.h>
25 #include <time.h>
26 #include <sys/time.h>
27 #include <stdarg.h>
28 #include <stdbool.h>
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <signal.h>
32 #include <sched.h>
33 #include <limits.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <dirent.h>
37 #include <sys/resource.h>
38 #include <stddef.h>
39
40 #include "macro.h"
41 #include "time-util.h"
42
43 union dirent_storage {
44         struct dirent de;
45         uint8_t storage[offsetof(struct dirent, d_name) +
46                         ((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))];
47 };
48
49 /* What is interpreted as whitespace? */
50 #define WHITESPACE " \t\n\r"
51 #define NEWLINE "\n\r"
52 #define QUOTES "\"\'"
53 #define COMMENTS "#;\n"
54
55 #define FORMAT_BYTES_MAX 8
56
57 #define ANSI_HIGHLIGHT_ON "\x1B[1;39m"
58 #define ANSI_HIGHLIGHT_RED_ON "\x1B[1;31m"
59 #define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m"
60 #define ANSI_HIGHLIGHT_YELLOW_ON "\x1B[1;33m"
61 #define ANSI_HIGHLIGHT_OFF "\x1B[0m"
62 #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K"
63
64 size_t page_size(void);
65 #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
66
67 #define streq(a,b) (strcmp((a),(b)) == 0)
68 #define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
69 #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
70 #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
71
72 bool streq_ptr(const char *a, const char *b);
73
74 #define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
75
76 #define new0(t, n) ((t*) calloc((n), sizeof(t)))
77
78 #define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
79
80 #define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
81
82 #define malloc0(n) (calloc((n), 1))
83
84 static inline const char* yes_no(bool b) {
85         return b ? "yes" : "no";
86 }
87
88 static inline const char* strempty(const char *s) {
89         return s ? s : "";
90 }
91
92 static inline const char* strnull(const char *s) {
93         return s ? s : "(null)";
94 }
95
96 static inline const char *strna(const char *s) {
97         return s ? s : "n/a";
98 }
99
100 static inline bool isempty(const char *p) {
101         return !p || !p[0];
102 }
103
104 char *endswith(const char *s, const char *postfix);
105 char *startswith(const char *s, const char *prefix);
106 char *startswith_no_case(const char *s, const char *prefix);
107
108 bool first_word(const char *s, const char *word);
109
110 int close_nointr(int fd);
111 void close_nointr_nofail(int fd);
112 void close_many(const int fds[], unsigned n_fd);
113
114 int parse_boolean(const char *v);
115 int parse_bytes(const char *t, off_t *bytes);
116 int parse_pid(const char *s, pid_t* ret_pid);
117 int parse_uid(const char *s, uid_t* ret_uid);
118 #define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
119
120 int safe_atou(const char *s, unsigned *ret_u);
121 int safe_atoi(const char *s, int *ret_i);
122
123 int safe_atollu(const char *s, unsigned long long *ret_u);
124 int safe_atolli(const char *s, long long int *ret_i);
125
126 int safe_atod(const char *s, double *ret_d);
127
128 #if __WORDSIZE == 32
129 static inline int safe_atolu(const char *s, unsigned long *ret_u) {
130         assert_cc(sizeof(unsigned long) == sizeof(unsigned));
131         return safe_atou(s, (unsigned*) ret_u);
132 }
133 static inline int safe_atoli(const char *s, long int *ret_u) {
134         assert_cc(sizeof(long int) == sizeof(int));
135         return safe_atoi(s, (int*) ret_u);
136 }
137 #else
138 static inline int safe_atolu(const char *s, unsigned long *ret_u) {
139         assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
140         return safe_atollu(s, (unsigned long long*) ret_u);
141 }
142 static inline int safe_atoli(const char *s, long int *ret_u) {
143         assert_cc(sizeof(long int) == sizeof(long long int));
144         return safe_atolli(s, (long long int*) ret_u);
145 }
146 #endif
147
148 static inline int safe_atou32(const char *s, uint32_t *ret_u) {
149         assert_cc(sizeof(uint32_t) == sizeof(unsigned));
150         return safe_atou(s, (unsigned*) ret_u);
151 }
152
153 static inline int safe_atoi32(const char *s, int32_t *ret_i) {
154         assert_cc(sizeof(int32_t) == sizeof(int));
155         return safe_atoi(s, (int*) ret_i);
156 }
157
158 static inline int safe_atou64(const char *s, uint64_t *ret_u) {
159         assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
160         return safe_atollu(s, (unsigned long long*) ret_u);
161 }
162
163 static inline int safe_atoi64(const char *s, int64_t *ret_i) {
164         assert_cc(sizeof(int64_t) == sizeof(long long int));
165         return safe_atolli(s, (long long int*) ret_i);
166 }
167
168 char *split(const char *c, size_t *l, const char *separator, char **state);
169 char *split_quoted(const char *c, size_t *l, char **state);
170
171 #define FOREACH_WORD(word, length, s, state)                            \
172         for ((state) = NULL, (word) = split((s), &(length), WHITESPACE, &(state)); (word); (word) = split((s), &(length), WHITESPACE, &(state)))
173
174 #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state)       \
175         for ((state) = NULL, (word) = split((s), &(length), (separator), &(state)); (word); (word) = split((s), &(length), (separator), &(state)))
176
177 #define FOREACH_WORD_QUOTED(word, length, s, state)                     \
178         for ((state) = NULL, (word) = split_quoted((s), &(length), &(state)); (word); (word) = split_quoted((s), &(length), &(state)))
179
180 pid_t get_parent_of_pid(pid_t pid, pid_t *ppid);
181 int get_starttime_of_pid(pid_t pid, unsigned long long *st);
182
183 char *strappend(const char *s, const char *suffix);
184 char *strnappend(const char *s, const char *suffix, size_t length);
185
186 char *replace_env(const char *format, char **env);
187 char **replace_env_argv(char **argv, char **env);
188
189 int readlink_malloc(const char *p, char **r);
190 int readlink_and_make_absolute(const char *p, char **r);
191 int readlink_and_canonicalize(const char *p, char **r);
192
193 int reset_all_signal_handlers(void);
194
195 char *strstrip(char *s);
196 char *delete_chars(char *s, const char *bad);
197 char *truncate_nl(char *s);
198
199 char *file_in_same_dir(const char *path, const char *filename);
200
201 int rmdir_parents(const char *path, const char *stop);
202
203 int get_process_comm(pid_t pid, char **name);
204 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
205 int get_process_exe(pid_t pid, char **name);
206 int get_process_uid(pid_t pid, uid_t *uid);
207 int get_process_gid(pid_t pid, gid_t *gid);
208
209 char hexchar(int x);
210 int unhexchar(char c);
211 char octchar(int x);
212 int unoctchar(char c);
213 char decchar(int x);
214 int undecchar(char c);
215
216 char *cescape(const char *s);
217 char *cunescape(const char *s);
218 char *cunescape_length(const char *s, size_t length);
219 char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix);
220
221 char *xescape(const char *s, const char *bad);
222
223 char *bus_path_escape(const char *s);
224 char *bus_path_unescape(const char *s);
225
226 char *ascii_strlower(char *path);
227
228 bool dirent_is_file(const struct dirent *de);
229 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix);
230
231 bool ignore_file(const char *filename);
232
233 bool chars_intersect(const char *a, const char *b);
234
235 int make_stdio(int fd);
236 int make_null_stdio(void);
237 int make_console_stdio(void);
238
239 unsigned long long random_ull(void);
240
241 /* For basic lookup tables with strictly enumerated entries */
242 #define __DEFINE_STRING_TABLE_LOOKUP(name,type,scope)                   \
243         scope const char *name##_to_string(type i) {                    \
244                 if (i < 0 || i >= (type) ELEMENTSOF(name##_table))      \
245                         return NULL;                                    \
246                 return name##_table[i];                                 \
247         }                                                               \
248         scope type name##_from_string(const char *s) {                  \
249                 type i;                                                 \
250                 assert(s);                                              \
251                 for (i = 0; i < (type)ELEMENTSOF(name##_table); i++)    \
252                         if (name##_table[i] &&                          \
253                             streq(name##_table[i], s))                  \
254                                 return i;                               \
255                 return (type) -1;                                       \
256         }                                                               \
257         struct __useless_struct_to_allow_trailing_semicolon__
258
259 #define DEFINE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,)
260 #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,static)
261
262 /* For string conversions where numbers are also acceptable */
263 #define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max)         \
264         int name##_to_string_alloc(type i, char **str) {                \
265                 char *s;                                                \
266                 int r;                                                  \
267                 if (i < 0 || i > max)                                   \
268                         return -ERANGE;                                 \
269                 if (i < (type) ELEMENTSOF(name##_table)) {              \
270                         s = strdup(name##_table[i]);                    \
271                         if (!s)                                         \
272                                 return log_oom();                       \
273                 } else {                                                \
274                         r = asprintf(&s, "%u", i);                      \
275                         if (r < 0)                                      \
276                                 return log_oom();                       \
277                 }                                                       \
278                 *str = s;                                               \
279                 return 0;                                               \
280         }                                                               \
281         type name##_from_string(const char *s) {                        \
282                 type i;                                                 \
283                 unsigned u = 0;                                         \
284                 assert(s);                                              \
285                 for (i = 0; i < (type)ELEMENTSOF(name##_table); i++)    \
286                         if (name##_table[i] &&                          \
287                             streq(name##_table[i], s))                  \
288                                 return i;                               \
289                 if (safe_atou(s, &u) >= 0 && u <= max)                  \
290                         return (type) u;                                \
291                 return (type) -1;                                       \
292         }                                                               \
293         struct __useless_struct_to_allow_trailing_semicolon__
294
295 int fd_nonblock(int fd, bool nonblock);
296 int fd_cloexec(int fd, bool cloexec);
297
298 int close_all_fds(const int except[], unsigned n_except);
299
300 bool fstype_is_network(const char *fstype);
301
302 int chvt(int vt);
303
304 int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
305 int ask(char *ret, const char *replies, const char *text, ...);
306
307 int reset_terminal_fd(int fd, bool switch_to_text);
308 int reset_terminal(const char *name);
309
310 int open_terminal(const char *name, int mode);
311 int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocstty_eperm, usec_t timeout);
312 int release_terminal(void);
313
314 int flush_fd(int fd);
315
316 int ignore_signals(int sig, ...);
317 int default_signals(int sig, ...);
318 int sigaction_many(const struct sigaction *sa, ...);
319
320 int close_pipe(int p[]);
321 int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
322
323 ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
324 ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
325
326 bool is_device_path(const char *path);
327
328 int dir_is_empty(const char *path);
329
330 void rename_process(const char name[8]);
331
332 void sigset_add_many(sigset_t *ss, ...);
333
334 bool hostname_is_set(void);
335
336 char* gethostname_malloc(void);
337 char* getlogname_malloc(void);
338 char* getusername_malloc(void);
339
340 int getttyname_malloc(int fd, char **r);
341 int getttyname_harder(int fd, char **r);
342
343 int get_ctty_devnr(pid_t pid, dev_t *d);
344 int get_ctty(pid_t, dev_t *_devnr, char **r);
345
346 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
347 int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
348
349 int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
350 int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev);
351 int rm_rf(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
352 int rm_rf_dangerous(const char *path, bool only_dirs, bool delete_root, bool honour_sticky);
353
354 int pipe_eof(int fd);
355
356 cpu_set_t* cpu_set_malloc(unsigned *ncpus);
357
358 int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char *format, va_list ap);
359 int status_printf(const char *status, bool ellipse, bool ephemeral, const char *format, ...);
360 int status_welcome(void);
361
362 int fd_columns(int fd);
363 unsigned columns(void);
364 int fd_lines(int fd);
365 unsigned lines(void);
366 void columns_lines_cache_reset(int _unused_ signum);
367
368 bool on_tty(void);
369
370 int running_in_chroot(void);
371
372 char *ellipsize(const char *s, size_t length, unsigned percent);
373 char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
374
375 int touch(const char *path);
376
377 char *unquote(const char *s, const char *quotes);
378 char *normalize_env_assignment(const char *s);
379
380 int wait_for_terminate(pid_t pid, siginfo_t *status);
381 int wait_for_terminate_and_warn(const char *name, pid_t pid);
382
383 _noreturn_ void freeze(void);
384
385 bool null_or_empty(struct stat *st);
386 int null_or_empty_path(const char *fn);
387
388 DIR *xopendirat(int dirfd, const char *name, int flags);
389
390 char *fstab_node_to_udev_node(const char *p);
391
392 char *resolve_dev_console(char **active);
393 bool tty_is_vc(const char *tty);
394 bool tty_is_vc_resolve(const char *tty);
395 bool tty_is_console(const char *tty);
396 int vtnr_from_tty(const char *tty);
397 const char *default_term_for_tty(const char *tty);
398
399 void execute_directory(const char *directory, DIR *_d, char *argv[]);
400
401 int kill_and_sigcont(pid_t pid, int sig);
402
403 bool nulstr_contains(const char*nulstr, const char *needle);
404
405 bool plymouth_running(void);
406
407 bool hostname_is_valid(const char *s);
408 char* hostname_cleanup(char *s);
409
410 char* strshorten(char *s, size_t l);
411
412 int terminal_vhangup_fd(int fd);
413 int terminal_vhangup(const char *name);
414
415 int vt_disallocate(const char *name);
416
417 int copy_file(const char *from, const char *to);
418
419 int symlink_atomic(const char *from, const char *to);
420
421 int fchmod_umask(int fd, mode_t mode);
422
423 bool display_is_local(const char *display);
424 int socket_from_display(const char *display, char **path);
425
426 int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
427 int get_group_creds(const char **groupname, gid_t *gid);
428
429 int in_group(const char *name);
430
431 char* uid_to_name(uid_t uid);
432
433 int glob_exists(const char *path);
434
435 int dirent_ensure_type(DIR *d, struct dirent *de);
436
437 int in_search_path(const char *path, char **search);
438 int get_files_in_directory(const char *path, char ***list);
439
440 char *strjoin(const char *x, ...) _sentinel_;
441
442 bool is_main_thread(void);
443
444 bool in_charset(const char *s, const char* charset);
445
446 int block_get_whole_disk(dev_t d, dev_t *ret);
447
448 int file_is_priv_sticky(const char *p);
449
450 int strdup_or_null(const char *a, char **b);
451
452 #define NULSTR_FOREACH(i, l)                                    \
453         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
454
455 #define NULSTR_FOREACH_PAIR(i, j, l)                             \
456         for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
457
458 int ioprio_class_to_string_alloc(int i, char **s);
459 int ioprio_class_from_string(const char *s);
460
461 const char *sigchld_code_to_string(int i);
462 int sigchld_code_from_string(const char *s);
463
464 int log_facility_unshifted_to_string_alloc(int i, char **s);
465 int log_facility_unshifted_from_string(const char *s);
466
467 int log_level_to_string_alloc(int i, char **s);
468 int log_level_from_string(const char *s);
469
470 int sched_policy_to_string_alloc(int i, char **s);
471 int sched_policy_from_string(const char *s);
472
473 const char *rlimit_to_string(int i);
474 int rlimit_from_string(const char *s);
475
476 int ip_tos_to_string_alloc(int i, char **s);
477 int ip_tos_from_string(const char *s);
478
479 const char *signal_to_string(int i);
480 int signal_from_string(const char *s);
481
482 int signal_from_string_try_harder(const char *s);
483
484 extern int saved_argc;
485 extern char **saved_argv;
486
487 bool kexec_loaded(void);
488
489 int prot_from_flags(int flags);
490
491 char *format_bytes(char *buf, size_t l, off_t t);
492
493 int fd_wait_for_event(int fd, int event, usec_t timeout);
494
495 void* memdup(const void *p, size_t l) _malloc_;
496
497 int is_kernel_thread(pid_t pid);
498
499 int fd_inc_sndbuf(int fd, size_t n);
500 int fd_inc_rcvbuf(int fd, size_t n);
501
502 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
503
504 int setrlimit_closest(int resource, const struct rlimit *rlim);
505
506 int getenv_for_pid(pid_t pid, const char *field, char **_value);
507
508 int can_sleep(const char *type);
509 int can_sleep_disk(const char *type);
510
511 bool is_valid_documentation_url(const char *url);
512
513 bool in_initrd(void);
514
515 void warn_melody(void);
516
517 int get_shell(char **ret);
518 int get_home_dir(char **ret);
519
520 void freep(void *p);
521 void fclosep(FILE **f);
522 void pclosep(FILE **f);
523 void closep(int *fd);
524 void closedirp(DIR **d);
525 void umaskp(mode_t *u);
526
527 _malloc_  static inline void *malloc_multiply(size_t a, size_t b) {
528         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
529                 return NULL;
530
531         return malloc(a * b);
532 }
533
534 _malloc_ static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
535         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
536                 return NULL;
537
538         return memdup(p, a * b);
539 }
540
541 bool filename_is_safe(const char *p);
542 bool path_is_safe(const char *p);
543 bool string_is_safe(const char *p);
544 bool string_has_cc(const char *p);
545
546 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
547                  int (*compar) (const void *, const void *, void *),
548                  void *arg);
549
550 bool is_locale_utf8(void);
551
552 typedef enum DrawSpecialChar {
553         DRAW_TREE_VERT,
554         DRAW_TREE_BRANCH,
555         DRAW_TREE_RIGHT,
556         DRAW_TREE_SPACE,
557         DRAW_TRIANGULAR_BULLET,
558         _DRAW_SPECIAL_CHAR_MAX
559 } DrawSpecialChar;
560 const char *draw_special_char(DrawSpecialChar ch);
561
562 char *strreplace(const char *text, const char *old_string, const char *new_string);
563
564 char *strip_tab_ansi(char **p, size_t *l);
565
566 int on_ac_power(void);
567
568 int search_and_fopen(const char *path, const char *mode, const char **search, FILE **_f);
569 int search_and_fopen_nulstr(const char *path, const char *mode, const char *search, FILE **_f);
570
571 #define FOREACH_LINE(line, f, on_error)                         \
572         for (;;)                                                \
573                 if (!fgets(line, sizeof(line), f)) {            \
574                         if (ferror(f)) {                        \
575                                 on_error;                       \
576                         }                                       \
577                         break;                                  \
578                 } else
579
580 #define FOREACH_DIRENT(de, d, on_error)                                 \
581         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
582                 if (!de) {                                              \
583                         if (errno != 0) {                               \
584                                 on_error;                               \
585                         }                                               \
586                         break;                                          \
587                 } else if (ignore_file((de)->d_name))                   \
588                         continue;                                       \
589                 else