LCOV - code coverage report
Current view: top level - basic - util.h (source / functions) Hit Total Coverage
Test: systemd test coverage Lines: 84 99 84.8 %
Date: 2015-07-29 18:47:03 Functions: 28 33 84.8 %

          Line data    Source code
       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             : #include <sys/statfs.h>
      44             : 
      45             : #include "macro.h"
      46             : #include "missing.h"
      47             : #include "time-util.h"
      48             : #include "formats-util.h"
      49             : 
      50             : /* What is interpreted as whitespace? */
      51             : #define WHITESPACE " \t\n\r"
      52             : #define NEWLINE    "\n\r"
      53             : #define QUOTES     "\"\'"
      54             : #define COMMENTS   "#;"
      55             : #define GLOB_CHARS "*?["
      56             : 
      57             : /* What characters are special in the shell? */
      58             : /* must be escaped outside and inside double-quotes */
      59             : #define SHELL_NEED_ESCAPE "\"\\`$"
      60             : /* can be escaped or double-quoted */
      61             : #define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;"
      62             : 
      63             : #define FORMAT_BYTES_MAX 8
      64             : 
      65             : size_t page_size(void) _pure_;
      66             : #define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
      67             : 
      68             : #define streq(a,b) (strcmp((a),(b)) == 0)
      69             : #define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
      70             : #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
      71             : #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
      72             : 
      73             : bool streq_ptr(const char *a, const char *b) _pure_;
      74             : 
      75             : #define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
      76             : 
      77             : #define new0(t, n) ((t*) calloc((n), sizeof(t)))
      78             : 
      79             : #define newa(t, n) ((t*) alloca(sizeof(t)*(n)))
      80             : 
      81             : #define newa0(t, n) ((t*) alloca0(sizeof(t)*(n)))
      82             : 
      83             : #define newdup(t, p, n) ((t*) memdup_multiply(p, sizeof(t), (n)))
      84             : 
      85             : #define malloc0(n) (calloc((n), 1))
      86             : 
      87        3897 : static inline const char* yes_no(bool b) {
      88        3897 :         return b ? "yes" : "no";
      89             : }
      90             : 
      91           5 : static inline const char* true_false(bool b) {
      92           5 :         return b ? "true" : "false";
      93             : }
      94             : 
      95           0 : static inline const char* one_zero(bool b) {
      96           0 :         return b ? "1" : "0";
      97             : }
      98             : 
      99       32149 : static inline const char* strempty(const char *s) {
     100       32149 :         return s ? s : "";
     101             : }
     102             : 
     103             : static inline const char* strnull(const char *s) {
     104             :         return s ? s : "(null)";
     105             : }
     106             : 
     107        3584 : static inline const char *strna(const char *s) {
     108        3584 :         return s ? s : "n/a";
     109             : }
     110             : 
     111      147074 : static inline bool isempty(const char *p) {
     112      147074 :         return !p || !p[0];
     113             : }
     114             : 
     115       47166 : static inline char *startswith(const char *s, const char *prefix) {
     116             :         size_t l;
     117             : 
     118       47166 :         l = strlen(prefix);
     119       47166 :         if (strncmp(s, prefix, l) == 0)
     120       32913 :                 return (char*) s + l;
     121             : 
     122       14253 :         return NULL;
     123             : }
     124             : 
     125        2040 : static inline char *startswith_no_case(const char *s, const char *prefix) {
     126             :         size_t l;
     127             : 
     128        2040 :         l = strlen(prefix);
     129        2040 :         if (strncasecmp(s, prefix, l) == 0)
     130         172 :                 return (char*) s + l;
     131             : 
     132        1868 :         return NULL;
     133             : }
     134             : 
     135             : char *endswith(const char *s, const char *postfix) _pure_;
     136             : char *endswith_no_case(const char *s, const char *postfix) _pure_;
     137             : 
     138             : char *first_word(const char *s, const char *word) _pure_;
     139             : 
     140             : int close_nointr(int fd);
     141             : int safe_close(int fd);
     142             : void safe_close_pair(int p[]);
     143             : 
     144             : void close_many(const int fds[], unsigned n_fd);
     145             : 
     146             : int parse_size(const char *t, off_t base, off_t *size);
     147             : 
     148             : int parse_boolean(const char *v) _pure_;
     149             : int parse_pid(const char *s, pid_t* ret_pid);
     150             : int parse_uid(const char *s, uid_t* ret_uid);
     151             : #define parse_gid(s, ret_uid) parse_uid(s, ret_uid)
     152             : 
     153             : int safe_atou(const char *s, unsigned *ret_u);
     154             : int safe_atoi(const char *s, int *ret_i);
     155             : 
     156             : int safe_atollu(const char *s, unsigned long long *ret_u);
     157             : int safe_atolli(const char *s, long long int *ret_i);
     158             : 
     159             : int safe_atod(const char *s, double *ret_d);
     160             : 
     161             : int safe_atou8(const char *s, uint8_t *ret);
     162             : 
     163             : #if LONG_MAX == INT_MAX
     164             : static inline int safe_atolu(const char *s, unsigned long *ret_u) {
     165             :         assert_cc(sizeof(unsigned long) == sizeof(unsigned));
     166             :         return safe_atou(s, (unsigned*) ret_u);
     167             : }
     168             : static inline int safe_atoli(const char *s, long int *ret_u) {
     169             :         assert_cc(sizeof(long int) == sizeof(int));
     170             :         return safe_atoi(s, (int*) ret_u);
     171             : }
     172             : #else
     173         357 : static inline int safe_atolu(const char *s, unsigned long *ret_u) {
     174             :         assert_cc(sizeof(unsigned long) == sizeof(unsigned long long));
     175         357 :         return safe_atollu(s, (unsigned long long*) ret_u);
     176             : }
     177           0 : static inline int safe_atoli(const char *s, long int *ret_u) {
     178             :         assert_cc(sizeof(long int) == sizeof(long long int));
     179           0 :         return safe_atolli(s, (long long int*) ret_u);
     180             : }
     181             : #endif
     182             : 
     183           0 : static inline int safe_atou32(const char *s, uint32_t *ret_u) {
     184             :         assert_cc(sizeof(uint32_t) == sizeof(unsigned));
     185           0 :         return safe_atou(s, (unsigned*) ret_u);
     186             : }
     187             : 
     188           0 : static inline int safe_atoi32(const char *s, int32_t *ret_i) {
     189             :         assert_cc(sizeof(int32_t) == sizeof(int));
     190           0 :         return safe_atoi(s, (int*) ret_i);
     191             : }
     192             : 
     193       15713 : static inline int safe_atou64(const char *s, uint64_t *ret_u) {
     194             :         assert_cc(sizeof(uint64_t) == sizeof(unsigned long long));
     195       15713 :         return safe_atollu(s, (unsigned long long*) ret_u);
     196             : }
     197             : 
     198             : static inline int safe_atoi64(const char *s, int64_t *ret_i) {
     199             :         assert_cc(sizeof(int64_t) == sizeof(long long int));
     200             :         return safe_atolli(s, (long long int*) ret_i);
     201             : }
     202             : 
     203             : int safe_atou16(const char *s, uint16_t *ret);
     204             : int safe_atoi16(const char *s, int16_t *ret);
     205             : 
     206             : const char* split(const char **state, size_t *l, const char *separator, bool quoted);
     207             : 
     208             : #define FOREACH_WORD(word, length, s, state)                            \
     209             :         _FOREACH_WORD(word, length, s, WHITESPACE, false, state)
     210             : 
     211             : #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state)       \
     212             :         _FOREACH_WORD(word, length, s, separator, false, state)
     213             : 
     214             : #define FOREACH_WORD_QUOTED(word, length, s, state)                     \
     215             :         _FOREACH_WORD(word, length, s, WHITESPACE, true, state)
     216             : 
     217             : #define _FOREACH_WORD(word, length, s, separator, quoted, state)        \
     218             :         for ((state) = (s), (word) = split(&(state), &(length), (separator), (quoted)); (word); (word) = split(&(state), &(length), (separator), (quoted)))
     219             : 
     220             : char *strappend(const char *s, const char *suffix);
     221             : char *strnappend(const char *s, const char *suffix, size_t length);
     222             : 
     223             : int readlinkat_malloc(int fd, const char *p, char **ret);
     224             : int readlink_malloc(const char *p, char **r);
     225             : int readlink_value(const char *p, char **ret);
     226             : int readlink_and_make_absolute(const char *p, char **r);
     227             : int readlink_and_canonicalize(const char *p, char **r);
     228             : 
     229             : char *strstrip(char *s);
     230             : char *delete_chars(char *s, const char *bad);
     231             : char *truncate_nl(char *s);
     232             : 
     233             : char *file_in_same_dir(const char *path, const char *filename);
     234             : 
     235             : int rmdir_parents(const char *path, const char *stop);
     236             : 
     237             : char hexchar(int x) _const_;
     238             : int unhexchar(char c) _const_;
     239             : char octchar(int x) _const_;
     240             : int unoctchar(char c) _const_;
     241             : char decchar(int x) _const_;
     242             : int undecchar(char c) _const_;
     243             : char base32hexchar(int x) _const_;
     244             : int unbase32hexchar(char c) _const_;
     245             : char base64char(int x) _const_;
     246             : int unbase64char(char c) _const_;
     247             : 
     248             : char *cescape(const char *s);
     249             : size_t cescape_char(char c, char *buf);
     250             : 
     251             : typedef enum UnescapeFlags {
     252             :         UNESCAPE_RELAX = 1,
     253             : } UnescapeFlags;
     254             : 
     255             : int cunescape(const char *s, UnescapeFlags flags, char **ret);
     256             : int cunescape_length(const char *s, size_t length, UnescapeFlags flags, char **ret);
     257             : int cunescape_length_with_prefix(const char *s, size_t length, const char *prefix, UnescapeFlags flags, char **ret);
     258             : 
     259             : char *xescape(const char *s, const char *bad);
     260             : 
     261             : char *ascii_strlower(char *path);
     262             : 
     263             : bool dirent_is_file(const struct dirent *de) _pure_;
     264             : bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
     265             : 
     266             : bool hidden_file(const char *filename) _pure_;
     267             : 
     268             : bool chars_intersect(const char *a, const char *b) _pure_;
     269             : 
     270             : /* For basic lookup tables with strictly enumerated entries */
     271             : #define _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope)          \
     272             :         scope const char *name##_to_string(type i) {                    \
     273             :                 if (i < 0 || i >= (type) ELEMENTSOF(name##_table))      \
     274             :                         return NULL;                                    \
     275             :                 return name##_table[i];                                 \
     276             :         }
     277             : 
     278             : ssize_t string_table_lookup(const char * const *table, size_t len, const char *key);
     279             : 
     280             : #define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope)                                \
     281             :         scope inline type name##_from_string(const char *s) {                                   \
     282             :                 return (type)string_table_lookup(name##_table, ELEMENTSOF(name##_table), s);    \
     283             :         }
     284             : 
     285             : #define _DEFINE_STRING_TABLE_LOOKUP(name,type,scope)                    \
     286             :         _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope)          \
     287             :         _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,scope)        \
     288             :         struct __useless_struct_to_allow_trailing_semicolon__
     289             : 
     290             : #define DEFINE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,)
     291             : #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) _DEFINE_STRING_TABLE_LOOKUP(name,type,static)
     292             : #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,static)
     293             : #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name,type,static)
     294             : 
     295             : /* For string conversions where numbers are also acceptable */
     296             : #define DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(name,type,max)         \
     297             :         int name##_to_string_alloc(type i, char **str) {                \
     298             :                 char *s;                                                \
     299             :                 int r;                                                  \
     300             :                 if (i < 0 || i > max)                                   \
     301             :                         return -ERANGE;                                 \
     302             :                 if (i < (type) ELEMENTSOF(name##_table)) {              \
     303             :                         s = strdup(name##_table[i]);                    \
     304             :                         if (!s)                                         \
     305             :                                 return log_oom();                       \
     306             :                 } else {                                                \
     307             :                         r = asprintf(&s, "%i", i);                      \
     308             :                         if (r < 0)                                      \
     309             :                                 return log_oom();                       \
     310             :                 }                                                       \
     311             :                 *str = s;                                               \
     312             :                 return 0;                                               \
     313             :         }                                                               \
     314             :         type name##_from_string(const char *s) {                        \
     315             :                 type i;                                                 \
     316             :                 unsigned u = 0;                                         \
     317             :                 assert(s);                                              \
     318             :                 for (i = 0; i < (type)ELEMENTSOF(name##_table); i++)    \
     319             :                         if (name##_table[i] &&                          \
     320             :                             streq(name##_table[i], s))                  \
     321             :                                 return i;                               \
     322             :                 if (safe_atou(s, &u) >= 0 && u <= max)                  \
     323             :                         return (type) u;                                \
     324             :                 return (type) -1;                                       \
     325             :         }                                                               \
     326             :         struct __useless_struct_to_allow_trailing_semicolon__
     327             : 
     328             : int fd_nonblock(int fd, bool nonblock);
     329             : int fd_cloexec(int fd, bool cloexec);
     330             : 
     331             : int close_all_fds(const int except[], unsigned n_except);
     332             : 
     333             : bool fstype_is_network(const char *fstype);
     334             : 
     335             : int flush_fd(int fd);
     336             : 
     337             : int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
     338             : 
     339             : ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
     340             : int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll);
     341             : int 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             : char* lookup_uid(uid_t uid);
     349             : char* getlogname_malloc(void);
     350             : char* getusername_malloc(void);
     351             : 
     352             : int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
     353             : int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
     354             : 
     355             : bool is_temporary_fs(const struct statfs *s) _pure_;
     356             : int fd_is_temporary_fs(int fd);
     357             : 
     358             : int pipe_eof(int fd);
     359             : 
     360             : cpu_set_t* cpu_set_malloc(unsigned *ncpus);
     361             : 
     362             : #define xsprintf(buf, fmt, ...) assert_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf))
     363             : 
     364             : int files_same(const char *filea, const char *fileb);
     365             : 
     366             : int running_in_chroot(void);
     367             : 
     368             : char *ellipsize(const char *s, size_t length, unsigned percent);
     369             :                                    /* bytes                 columns */
     370             : char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent);
     371             : 
     372             : int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode);
     373             : int touch(const char *path);
     374             : 
     375             : noreturn void freeze(void);
     376             : 
     377             : bool null_or_empty(struct stat *st) _pure_;
     378             : int null_or_empty_path(const char *fn);
     379             : int null_or_empty_fd(int fd);
     380             : 
     381             : DIR *xopendirat(int dirfd, const char *name, int flags);
     382             : 
     383             : char *fstab_node_to_udev_node(const char *p);
     384             : 
     385             : void execute_directories(const char* const* directories, usec_t timeout, char *argv[]);
     386             : 
     387             : bool nulstr_contains(const char*nulstr, const char *needle);
     388             : 
     389             : bool plymouth_running(void);
     390             : 
     391             : bool machine_name_is_valid(const char *s) _pure_;
     392             : 
     393             : char* strshorten(char *s, size_t l);
     394             : 
     395             : int symlink_idempotent(const char *from, const char *to);
     396             : 
     397             : int symlink_atomic(const char *from, const char *to);
     398             : int mknod_atomic(const char *path, mode_t mode, dev_t dev);
     399             : int mkfifo_atomic(const char *path, mode_t mode);
     400             : 
     401             : int fchmod_umask(int fd, mode_t mode);
     402             : 
     403             : bool display_is_local(const char *display) _pure_;
     404             : int socket_from_display(const char *display, char **path);
     405             : 
     406             : int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
     407             : int get_group_creds(const char **groupname, gid_t *gid);
     408             : 
     409             : int in_gid(gid_t gid);
     410             : int in_group(const char *name);
     411             : 
     412             : char* uid_to_name(uid_t uid);
     413             : char* gid_to_name(gid_t gid);
     414             : 
     415             : int glob_exists(const char *path);
     416             : int glob_extend(char ***strv, const char *path);
     417             : 
     418             : int dirent_ensure_type(DIR *d, struct dirent *de);
     419             : 
     420             : int get_files_in_directory(const char *path, char ***list);
     421             : 
     422             : char *strjoin(const char *x, ...) _sentinel_;
     423             : 
     424             : bool is_main_thread(void);
     425             : 
     426         274 : static inline bool _pure_ in_charset(const char *s, const char* charset) {
     427         274 :         assert(s);
     428         274 :         assert(charset);
     429         274 :         return s[strspn(s, charset)] == '\0';
     430             : }
     431             : 
     432             : int block_get_whole_disk(dev_t d, dev_t *ret);
     433             : 
     434             : #define NULSTR_FOREACH(i, l)                                    \
     435             :         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
     436             : 
     437             : #define NULSTR_FOREACH_PAIR(i, j, l)                             \
     438             :         for ((i) = (l), (j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i))
     439             : 
     440             : int ioprio_class_to_string_alloc(int i, char **s);
     441             : int ioprio_class_from_string(const char *s);
     442             : 
     443             : const char *sigchld_code_to_string(int i) _const_;
     444             : int sigchld_code_from_string(const char *s) _pure_;
     445             : 
     446             : int log_facility_unshifted_to_string_alloc(int i, char **s);
     447             : int log_facility_unshifted_from_string(const char *s);
     448             : 
     449             : int log_level_to_string_alloc(int i, char **s);
     450             : int log_level_from_string(const char *s);
     451             : 
     452             : int sched_policy_to_string_alloc(int i, char **s);
     453             : int sched_policy_from_string(const char *s);
     454             : 
     455             : const char *rlimit_to_string(int i) _const_;
     456             : int rlimit_from_string(const char *s) _pure_;
     457             : 
     458             : int ip_tos_to_string_alloc(int i, char **s);
     459             : int ip_tos_from_string(const char *s);
     460             : 
     461             : extern int saved_argc;
     462             : extern char **saved_argv;
     463             : 
     464             : bool kexec_loaded(void);
     465             : 
     466             : int prot_from_flags(int flags) _const_;
     467             : 
     468             : char *format_bytes(char *buf, size_t l, off_t t);
     469             : 
     470             : int fd_wait_for_event(int fd, int event, usec_t timeout);
     471             : 
     472             : void* memdup(const void *p, size_t l) _alloc_(2);
     473             : 
     474             : int fd_inc_sndbuf(int fd, size_t n);
     475             : int fd_inc_rcvbuf(int fd, size_t n);
     476             : 
     477             : int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *path, ...);
     478             : 
     479             : int setrlimit_closest(int resource, const struct rlimit *rlim);
     480             : 
     481             : bool http_url_is_valid(const char *url) _pure_;
     482             : bool documentation_url_is_valid(const char *url) _pure_;
     483             : 
     484             : bool http_etag_is_valid(const char *etag);
     485             : 
     486             : bool in_initrd(void);
     487             : 
     488             : int get_home_dir(char **ret);
     489             : int get_shell(char **_ret);
     490             : 
     491      186965 : static inline void freep(void *p) {
     492      186965 :         free(*(void**) p);
     493      186965 : }
     494             : 
     495        2451 : static inline void closep(int *fd) {
     496        2451 :         safe_close(*fd);
     497        2451 : }
     498             : 
     499          57 : static inline void umaskp(mode_t *u) {
     500          57 :         umask(*u);
     501          57 : }
     502             : 
     503           4 : static inline void close_pairp(int (*p)[2]) {
     504           4 :         safe_close_pair(*p);
     505           4 : }
     506             : 
     507        3768 : DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, fclose);
     508             : DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, pclose);
     509        2867 : DEFINE_TRIVIAL_CLEANUP_FUNC(DIR*, closedir);
     510             : DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent);
     511             : 
     512             : #define _cleanup_free_ _cleanup_(freep)
     513             : #define _cleanup_close_ _cleanup_(closep)
     514             : #define _cleanup_umask_ _cleanup_(umaskp)
     515             : #define _cleanup_globfree_ _cleanup_(globfree)
     516             : #define _cleanup_fclose_ _cleanup_(fclosep)
     517             : #define _cleanup_pclose_ _cleanup_(pclosep)
     518             : #define _cleanup_closedir_ _cleanup_(closedirp)
     519             : #define _cleanup_endmntent_ _cleanup_(endmntentp)
     520             : #define _cleanup_close_pair_ _cleanup_(close_pairp)
     521             : 
     522       39051 : _malloc_  _alloc_(1, 2) static inline void *malloc_multiply(size_t a, size_t b) {
     523       39051 :         if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
     524           0 :                 return NULL;
     525             : 
     526       39051 :         return malloc(a * b);
     527             : }
     528             : 
     529         699 : _alloc_(2, 3) static inline void *realloc_multiply(void *p, size_t a, size_t b) {
     530         699 :         if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
     531           0 :                 return NULL;
     532             : 
     533         699 :         return realloc(p, a * b);
     534             : }
     535             : 
     536           3 : _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_t b) {
     537           3 :         if (_unlikely_(b != 0 && a > ((size_t) -1) / b))
     538           0 :                 return NULL;
     539             : 
     540           3 :         return memdup(p, a * b);
     541             : }
     542             : 
     543             : bool filename_is_valid(const char *p) _pure_;
     544             : bool path_is_safe(const char *p) _pure_;
     545             : bool string_is_safe(const char *p) _pure_;
     546             : bool string_has_cc(const char *p, const char *ok) _pure_;
     547             : 
     548             : /**
     549             :  * Check if a string contains any glob patterns.
     550             :  */
     551             : _pure_ static inline bool string_is_glob(const char *p) {
     552             :         return !!strpbrk(p, GLOB_CHARS);
     553             : }
     554             : 
     555             : void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
     556             :                  int (*compar) (const void *, const void *, void *),
     557             :                  void *arg);
     558             : 
     559             : #define _(String) gettext (String)
     560             : void init_gettext(void);
     561             : bool is_locale_utf8(void);
     562             : 
     563             : typedef enum DrawSpecialChar {
     564             :         DRAW_TREE_VERTICAL,
     565             :         DRAW_TREE_BRANCH,
     566             :         DRAW_TREE_RIGHT,
     567             :         DRAW_TREE_SPACE,
     568             :         DRAW_TRIANGULAR_BULLET,
     569             :         DRAW_BLACK_CIRCLE,
     570             :         DRAW_ARROW,
     571             :         DRAW_DASH,
     572             :         _DRAW_SPECIAL_CHAR_MAX
     573             : } DrawSpecialChar;
     574             : 
     575             : const char *draw_special_char(DrawSpecialChar ch);
     576             : 
     577             : char *strreplace(const char *text, const char *old_string, const char *new_string);
     578             : 
     579             : char *strip_tab_ansi(char **p, size_t *l);
     580             : 
     581             : int on_ac_power(void);
     582             : 
     583             : int search_and_fopen(const char *path, const char *mode, const char *root, const char **search, FILE **_f);
     584             : int search_and_fopen_nulstr(const char *path, const char *mode, const char *root, const char *search, FILE **_f);
     585             : 
     586             : #define FOREACH_LINE(line, f, on_error)                         \
     587             :         for (;;)                                                \
     588             :                 if (!fgets(line, sizeof(line), f)) {            \
     589             :                         if (ferror(f)) {                        \
     590             :                                 on_error;                       \
     591             :                         }                                       \
     592             :                         break;                                  \
     593             :                 } else
     594             : 
     595             : #define FOREACH_DIRENT(de, d, on_error)                                 \
     596             :         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
     597             :                 if (!de) {                                              \
     598             :                         if (errno > 0) {                                \
     599             :                                 on_error;                               \
     600             :                         }                                               \
     601             :                         break;                                          \
     602             :                 } else if (hidden_file((de)->d_name))                   \
     603             :                         continue;                                       \
     604             :                 else
     605             : 
     606             : #define FOREACH_DIRENT_ALL(de, d, on_error)                             \
     607             :         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
     608             :                 if (!de) {                                              \
     609             :                         if (errno > 0) {                                \
     610             :                                 on_error;                               \
     611             :                         }                                               \
     612             :                         break;                                          \
     613             :                 } else
     614             : 
     615       15384 : static inline void *mempset(void *s, int c, size_t n) {
     616       15384 :         memset(s, c, n);
     617       15384 :         return (uint8_t*)s + n;
     618             : }
     619             : 
     620             : char *hexmem(const void *p, size_t l);
     621             : int unhexmem(const char *p, size_t l, void **mem, size_t *len);
     622             : 
     623             : char *base32hexmem(const void *p, size_t l, bool padding);
     624             : int unbase32hexmem(const char *p, size_t l, bool padding, void **mem, size_t *len);
     625             : 
     626             : char *base64mem(const void *p, size_t l);
     627             : int unbase64mem(const char *p, size_t l, void **mem, size_t *len);
     628             : 
     629             : char *strextend(char **x, ...) _sentinel_;
     630             : char *strrep(const char *s, unsigned n);
     631             : 
     632             : void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size);
     633             : void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size);
     634             : #define GREEDY_REALLOC(array, allocated, need)                          \
     635             :         greedy_realloc((void**) &(array), &(allocated), (need), sizeof((array)[0]))
     636             : 
     637             : #define GREEDY_REALLOC0(array, allocated, need)                         \
     638             :         greedy_realloc0((void**) &(array), &(allocated), (need), sizeof((array)[0]))
     639             : 
     640       24612 : static inline void _reset_errno_(int *saved_errno) {
     641       24612 :         errno = *saved_errno;
     642       24612 : }
     643             : 
     644             : #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno
     645             : 
     646             : static inline int negative_errno(void) {
     647             :         /* This helper should be used to shut up gcc if you know 'errno' is
     648             :          * negative. Instead of "return -errno;", use "return negative_errno();"
     649             :          * It will suppress bogus gcc warnings in case it assumes 'errno' might
     650             :          * be 0 and thus the caller's error-handling might not be triggered. */
     651             :         assert_return(errno > 0, -EINVAL);
     652             :         return -errno;
     653             : }
     654             : 
     655             : struct _umask_struct_ {
     656             :         mode_t mask;
     657             :         bool quit;
     658             : };
     659             : 
     660           9 : static inline void _reset_umask_(struct _umask_struct_ *s) {
     661           9 :         umask(s->mask);
     662           9 : };
     663             : 
     664             : #define RUN_WITH_UMASK(mask)                                            \
     665             :         for (_cleanup_(_reset_umask_) struct _umask_struct_ _saved_umask_ = { umask(mask), false }; \
     666             :              !_saved_umask_.quit ;                                      \
     667             :              _saved_umask_.quit = true)
     668             : 
     669         584 : static inline unsigned u64log2(uint64_t n) {
     670             : #if __SIZEOF_LONG_LONG__ == 8
     671         584 :         return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0;
     672             : #else
     673             : #error "Wut?"
     674             : #endif
     675             : }
     676             : 
     677           0 : static inline unsigned u32ctz(uint32_t n) {
     678             : #if __SIZEOF_INT__ == 4
     679           0 :         return __builtin_ctz(n);
     680             : #else
     681             : #error "Wut?"
     682             : #endif
     683             : }
     684             : 
     685           8 : static inline unsigned log2i(int x) {
     686           8 :         assert(x > 0);
     687             : 
     688           8 :         return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
     689             : }
     690             : 
     691        1984 : static inline unsigned log2u(unsigned x) {
     692        1984 :         assert(x > 0);
     693             : 
     694        1984 :         return sizeof(unsigned) * 8 - __builtin_clz(x) - 1;
     695             : }
     696             : 
     697        1984 : static inline unsigned log2u_round_up(unsigned x) {
     698        1984 :         assert(x > 0);
     699             : 
     700        1984 :         if (x == 1)
     701           0 :                 return 0;
     702             : 
     703        1984 :         return log2u(x - 1) + 1;
     704             : }
     705             : 
     706             : static inline bool logind_running(void) {
     707             :         return access("/run/systemd/seats/", F_OK) >= 0;
     708             : }
     709             : 
     710             : #define DECIMAL_STR_WIDTH(x)                            \
     711             :         ({                                              \
     712             :                 typeof(x) _x_ = (x);                    \
     713             :                 unsigned ans = 1;                       \
     714             :                 while (_x_ /= 10)                       \
     715             :                         ans++;                          \
     716             :                 ans;                                    \
     717             :         })
     718             : 
     719             : int unlink_noerrno(const char *path);
     720             : 
     721             : #define alloca0(n)                                      \
     722             :         ({                                              \
     723             :                 char *_new_;                            \
     724             :                 size_t _len_ = n;                       \
     725             :                 _new_ = alloca(_len_);                  \
     726             :                 (void *) memset(_new_, 0, _len_);       \
     727             :         })
     728             : 
     729             : /* It's not clear what alignment glibc/gcc alloca() guarantee, hence provide a guaranteed safe version */
     730             : #define alloca_align(size, align)                                       \
     731             :         ({                                                              \
     732             :                 void *_ptr_;                                            \
     733             :                 size_t _mask_ = (align) - 1;                            \
     734             :                 _ptr_ = alloca((size) + _mask_);                        \
     735             :                 (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_);         \
     736             :         })
     737             : 
     738             : #define alloca0_align(size, align)                                      \
     739             :         ({                                                              \
     740             :                 void *_new_;                                            \
     741             :                 size_t _size_ = (size);                                 \
     742             :                 _new_ = alloca_align(_size_, (align));                  \
     743             :                 (void*)memset(_new_, 0, _size_);                        \
     744             :         })
     745             : 
     746             : #define strjoina(a, ...)                                                \
     747             :         ({                                                              \
     748             :                 const char *_appendees_[] = { a, __VA_ARGS__ };         \
     749             :                 char *_d_, *_p_;                                        \
     750             :                 int _len_ = 0;                                          \
     751             :                 unsigned _i_;                                           \
     752             :                 for (_i_ = 0; _i_ < ELEMENTSOF(_appendees_) && _appendees_[_i_]; _i_++) \
     753             :                         _len_ += strlen(_appendees_[_i_]);              \
     754             :                 _p_ = _d_ = alloca(_len_ + 1);                          \
     755             :                 for (_i_ = 0; _i_ < ELEMENTSOF(_appendees_) && _appendees_[_i_]; _i_++) \
     756             :                         _p_ = stpcpy(_p_, _appendees_[_i_]);            \
     757             :                 *_p_ = 0;                                               \
     758             :                 _d_;                                                    \
     759             :         })
     760             : 
     761             : bool id128_is_valid(const char *s) _pure_;
     762             : 
     763             : int split_pair(const char *s, const char *sep, char **l, char **r);
     764             : 
     765             : int shall_restore_state(void);
     766             : 
     767             : /**
     768             :  * Normal qsort requires base to be nonnull. Here were require
     769             :  * that only if nmemb > 0.
     770             :  */
     771        6353 : static inline void qsort_safe(void *base, size_t nmemb, size_t size, comparison_fn_t compar) {
     772        6353 :         if (nmemb <= 1)
     773        6073 :                 return;
     774             : 
     775         280 :         assert(base);
     776         280 :         qsort(base, nmemb, size, compar);
     777             : }
     778             : 
     779             : /* Normal memmem() requires haystack to be nonnull, which is annoying for zero-length buffers */
     780          27 : static inline void *memmem_safe(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) {
     781             : 
     782          27 :         if (needlelen <= 0)
     783           0 :                 return (void*) haystack;
     784             : 
     785          27 :         if (haystacklen < needlelen)
     786          18 :                 return NULL;
     787             : 
     788           9 :         assert(haystack);
     789           9 :         assert(needle);
     790             : 
     791           9 :         return memmem(haystack, haystacklen, needle, needlelen);
     792             : }
     793             : 
     794             : int proc_cmdline(char **ret);
     795             : int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
     796             : int get_proc_cmdline_key(const char *parameter, char **value);
     797             : 
     798             : int container_get_leader(const char *machine, pid_t *pid);
     799             : 
     800             : int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *root_fd);
     801             : int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int root_fd);
     802             : 
     803             : int getpeercred(int fd, struct ucred *ucred);
     804             : int getpeersec(int fd, char **ret);
     805             : 
     806             : int writev_safe(int fd, const struct iovec *w, int j);
     807             : 
     808             : int mkostemp_safe(char *pattern, int flags);
     809             : int open_tmpfile(const char *path, int flags);
     810             : 
     811             : int fd_warn_permissions(const char *path, int fd);
     812             : 
     813             : #ifndef PERSONALITY_INVALID
     814             : /* personality(7) documents that 0xffffffffUL is used for querying the
     815             :  * current personality, hence let's use that here as error
     816             :  * indicator. */
     817             : #define PERSONALITY_INVALID 0xffffffffLU
     818             : #endif
     819             : 
     820             : unsigned long personality_from_string(const char *p);
     821             : const char *personality_to_string(unsigned long);
     822             : 
     823             : uint64_t physical_memory(void);
     824             : 
     825             : void hexdump(FILE *f, const void *p, size_t s);
     826             : 
     827             : union file_handle_union {
     828             :         struct file_handle handle;
     829             :         char padding[sizeof(struct file_handle) + MAX_HANDLE_SZ];
     830             : };
     831             : #define FILE_HANDLE_INIT { .handle.handle_bytes = MAX_HANDLE_SZ }
     832             : 
     833             : int update_reboot_param_file(const char *param);
     834             : 
     835             : int umount_recursive(const char *target, int flags);
     836             : 
     837             : int bind_remount_recursive(const char *prefix, bool ro);
     838             : 
     839             : int fflush_and_check(FILE *f);
     840             : 
     841             : int tempfn_xxxxxx(const char *p, const char *extra, char **ret);
     842             : int tempfn_random(const char *p, const char *extra, char **ret);
     843             : int tempfn_random_child(const char *p, const char *extra, char **ret);
     844             : 
     845             : int take_password_lock(const char *root);
     846             : 
     847             : int is_symlink(const char *path);
     848             : int is_dir(const char *path, bool follow);
     849             : int is_device_node(const char *path);
     850             : 
     851             : typedef enum UnquoteFlags {
     852             :         UNQUOTE_RELAX           = 1,
     853             :         UNQUOTE_CUNESCAPE       = 2,
     854             :         UNQUOTE_CUNESCAPE_RELAX = 4,
     855             : } UnquoteFlags;
     856             : 
     857             : int unquote_first_word(const char **p, char **ret, UnquoteFlags flags);
     858             : int unquote_first_word_and_warn(const char **p, char **ret, UnquoteFlags flags, const char *unit, const char *filename, unsigned line, const char *rvalue);
     859             : int unquote_many_words(const char **p, UnquoteFlags flags, ...) _sentinel_;
     860             : 
     861             : int free_and_strdup(char **p, const char *s);
     862             : 
     863             : #define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1)
     864             : 
     865             : #define FOREACH_INOTIFY_EVENT(e, buffer, sz) \
     866             :         for ((e) = &buffer.ev;                                \
     867             :              (uint8_t*) (e) < (uint8_t*) (buffer.raw) + (sz); \
     868             :              (e) = (struct inotify_event*) ((uint8_t*) (e) + sizeof(struct inotify_event) + (e)->len))
     869             : 
     870             : union inotify_event_buffer {
     871             :         struct inotify_event ev;
     872             :         uint8_t raw[INOTIFY_EVENT_MAX];
     873             : };
     874             : 
     875             : #define laccess(path, mode) faccessat(AT_FDCWD, (path), (mode), AT_SYMLINK_NOFOLLOW)
     876             : 
     877             : int ptsname_malloc(int fd, char **ret);
     878             : 
     879             : int openpt_in_namespace(pid_t pid, int flags);
     880             : 
     881             : ssize_t fgetxattrat_fake(int dirfd, const char *filename, const char *attribute, void *value, size_t size, int flags);
     882             : 
     883             : int fd_setcrtime(int fd, usec_t usec);
     884             : int fd_getcrtime(int fd, usec_t *usec);
     885             : int path_getcrtime(const char *p, usec_t *usec);
     886             : int fd_getcrtime_at(int dirfd, const char *name, usec_t *usec, int flags);
     887             : 
     888             : int same_fd(int a, int b);
     889             : 
     890             : int chattr_fd(int fd, unsigned value, unsigned mask);
     891             : int chattr_path(const char *p, unsigned value, unsigned mask);
     892             : 
     893             : int read_attr_fd(int fd, unsigned *ret);
     894             : int read_attr_path(const char *p, unsigned *ret);
     895             : 
     896             : #define RLIMIT_MAKE_CONST(lim) ((struct rlimit) { lim, lim })
     897             : 
     898             : ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
     899             : 
     900             : void sigkill_wait(pid_t *pid);
     901             : #define _cleanup_sigkill_wait_ _cleanup_(sigkill_wait)
     902             : 
     903             : int syslog_parse_priority(const char **p, int *priority, bool with_facility);
     904             : 
     905             : void cmsg_close_all(struct msghdr *mh);
     906             : 
     907             : int rename_noreplace(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
     908             : 
     909             : char *shell_maybe_quote(const char *s);
     910             : 
     911             : int parse_mode(const char *s, mode_t *ret);
     912             : 
     913             : int mount_move_root(const char *path);
     914             : 
     915             : int reset_uid_gid(void);

Generated by: LCOV version 1.11