chiark / gitweb /
util, core: add support for ephemeral status lines
[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 bool tty_is_vc(const char *tty);
393 bool tty_is_vc_resolve(const char *tty);
394 bool tty_is_console(const char *tty);
395 int vtnr_from_tty(const char *tty);
396 const char *default_term_for_tty(const char *tty);
397
398 void execute_directory(const char *directory, DIR *_d, char *argv[]);
399
400 int kill_and_sigcont(pid_t pid, int sig);
401
402 bool nulstr_contains(const char*nulstr, const char *needle);
403
404 bool plymouth_running(void);
405
406 bool hostname_is_valid(const char *s);
407 char* hostname_cleanup(char *s);
408
409 char* strshorten(char *s, size_t l);
410
411 int terminal_vhangup_fd(int fd);
412 int terminal_vhangup(const char *name);
413
414 int vt_disallocate(const char *name);
415
416 int copy_file(const char *from, const char *to);
417
418 int symlink_atomic(const char *from, const char *to);
419
420 int fchmod_umask(int fd, mode_t mode);
421
422 bool display_is_local(const char *display);
423 int socket_from_display(const char *display, char **path);
424
425 int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
426 int get_group_creds(const char **groupname, gid_t *gid);
427
428 int in_group(const char *name);
429
430 char* uid_to_name(uid_t uid);
431
432 int glob_exists(const char *path);
433
434 int dirent_ensure_type(DIR *d, struct dirent *de);
435
436 int in_search_path(const char *path, char **search);
437 int get_files_in_directory(const char *path, char ***list);
438
439 char *strjoin(const char *x, ...) _sentinel_;
440
441 bool is_main_thread(void);
442
443 bool in_charset(const char *s, const char* charset);
444
445 int block_get_whole_disk(dev_t d, dev_t *ret);
446
447 int file_is_priv_sticky(const char *p);
448
449 int strdup_or_null(const char *a, char **b);
450
451 #define NULSTR_FOREACH(i, l)                                    \
452         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
453
454 #define NULSTR_FOREACH_PAIR(i, j, l)                             \
455         for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
456
457 int ioprio_class_to_string_alloc(int i, char **s);
458 int ioprio_class_from_string(const char *s);
459
460 const char *sigchld_code_to_string(int i);
461 int sigchld_code_from_string(const char *s);
462
463 int log_facility_unshifted_to_string_alloc(int i, char **s);
464 int log_facility_unshifted_from_string(const char *s);
465
466 int log_level_to_string_alloc(int i, char **s);
467 int log_level_from_string(const char *s);
468
469 int sched_policy_to_string_alloc(int i, char **s);
470 int sched_policy_from_string(const char *s);
471
472 const char *rlimit_to_string(int i);
473 int rlimit_from_string(const char *s);
474
475 int ip_tos_to_string_alloc(int i, char **s);
476 int ip_tos_from_string(const char *s);
477
478 const char *signal_to_string(int i);
479 int signal_from_string(const char *s);
480
481 int signal_from_string_try_harder(const char *s);
482
483 extern int saved_argc;
484 extern char **saved_argv;
485
486 bool kexec_loaded(void);
487
488 int prot_from_flags(int flags);
489
490 char *format_bytes(char *buf, size_t l, off_t t);
491
492 int fd_wait_for_event(int fd, int event, usec_t timeout);
493
494 void* memdup(const void *p, size_t l) _malloc_;
495
496 int is_kernel_thread(pid_t pid);
497
498 int fd_inc_sndbuf(int fd, size_t n);
499 int fd_inc_rcvbuf(int fd, size_t n);
500
501 int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
502
503 int setrlimit_closest(int resource, const struct rlimit *rlim);
504
505 int getenv_for_pid(pid_t pid, const char *field, char **_value);
506
507 int can_sleep(const char *type);
508 int can_sleep_disk(const char *type);
509
510 bool is_valid_documentation_url(const char *url);
511
512 bool in_initrd(void);
513
514 void warn_melody(void);
515
516 int get_shell(char **ret);
517 int get_home_dir(char **ret);
518
519 void freep(void *p);
520 void fclosep(FILE **f);
521 void pclosep(FILE **f);
522 void closep(int *fd);
523 void closedirp(DIR **d);
524 void umaskp(mode_t *u);
525
526 _malloc_  static inline void *malloc_multiply(size_t a, size_t b) {
527         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
528                 return NULL;
529
530         return malloc(a * b);
531 }
532
533 _malloc_ static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
534         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
535                 return NULL;
536
537         return memdup(p, a * b);
538 }
539
540 bool filename_is_safe(const char *p);
541 bool path_is_safe(const char *p);
542 bool string_is_safe(const char *p);
543 bool string_has_cc(const char *p);
544
545 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
546                  int (*compar) (const void *, const void *, void *),
547                  void *arg);
548
549 bool is_locale_utf8(void);
550
551 typedef enum DrawSpecialChar {
552         DRAW_TREE_VERT,
553         DRAW_TREE_BRANCH,
554         DRAW_TREE_RIGHT,
555         DRAW_TREE_SPACE,
556         DRAW_TRIANGULAR_BULLET,
557         _DRAW_SPECIAL_CHAR_MAX
558 } DrawSpecialChar;
559 const char *draw_special_char(DrawSpecialChar ch);
560
561 char *strreplace(const char *text, const char *old_string, const char *new_string);
562
563 char *strip_tab_ansi(char **p, size_t *l);
564
565 int on_ac_power(void);
566
567 int search_and_fopen(const char *path, const char *mode, const char **search, FILE **_f);
568 int search_and_fopen_nulstr(const char *path, const char *mode, const char *search, FILE **_f);
569
570 #define FOREACH_LINE(line, f, on_error)                         \
571         for (;;)                                                \
572                 if (!fgets(line, sizeof(line), f)) {            \
573                         if (ferror(f)) {                        \
574                                 on_error;                       \
575                         }                                       \
576                         break;                                  \
577                 } else
578
579 #define FOREACH_DIRENT(de, d, on_error)                                 \
580         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
581                 if (!de) {                                              \
582                         if (errno != 0) {                               \
583                                 on_error;                               \
584                         }                                               \
585                         break;                                          \
586                 } else if (ignore_file((de)->d_name))                   \
587                         continue;                                       \
588                 else