LCOV - code coverage report
Current view: top level - basic - path-util.h (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 7 7 100.0 %
Date: 2019-08-22 15:41:25 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: LGPL-2.1+ */
       2             : #pragma once
       3             : 
       4             : #include <alloca.h>
       5             : #include <stdbool.h>
       6             : #include <stddef.h>
       7             : 
       8             : #include "macro.h"
       9             : #include "string-util.h"
      10             : #include "strv.h"
      11             : #include "time-util.h"
      12             : 
      13             : #define PATH_SPLIT_SBIN_BIN(x) x "sbin:" x "bin"
      14             : #define PATH_SPLIT_SBIN_BIN_NULSTR(x) x "sbin\0" x "bin\0"
      15             : 
      16             : #define PATH_NORMAL_SBIN_BIN(x) x "bin"
      17             : #define PATH_NORMAL_SBIN_BIN_NULSTR(x) x "bin\0"
      18             : 
      19             : #if HAVE_SPLIT_BIN
      20             : #  define PATH_SBIN_BIN(x) PATH_SPLIT_SBIN_BIN(x)
      21             : #  define PATH_SBIN_BIN_NULSTR(x) PATH_SPLIT_SBIN_BIN_NULSTR(x)
      22             : #else
      23             : #  define PATH_SBIN_BIN(x) PATH_NORMAL_SBIN_BIN(x)
      24             : #  define PATH_SBIN_BIN_NULSTR(x) PATH_NORMAL_SBIN_BIN_NULSTR(x)
      25             : #endif
      26             : 
      27             : #define DEFAULT_PATH_NORMAL PATH_SBIN_BIN("/usr/local/") ":" PATH_SBIN_BIN("/usr/")
      28             : #define DEFAULT_PATH_NORMAL_NULSTR PATH_SBIN_BIN_NULSTR("/usr/local/") PATH_SBIN_BIN_NULSTR("/usr/")
      29             : #define DEFAULT_PATH_SPLIT_USR DEFAULT_PATH_NORMAL ":" PATH_SBIN_BIN("/")
      30             : #define DEFAULT_PATH_SPLIT_USR_NULSTR DEFAULT_PATH_NORMAL_NULSTR PATH_SBIN_BIN_NULSTR("/")
      31             : #define DEFAULT_PATH_COMPAT PATH_SPLIT_SBIN_BIN("/usr/local/") ":" PATH_SPLIT_SBIN_BIN("/usr/") ":" PATH_SPLIT_SBIN_BIN("/")
      32             : 
      33             : #if HAVE_SPLIT_USR
      34             : #  define DEFAULT_PATH DEFAULT_PATH_SPLIT_USR
      35             : #  define DEFAULT_PATH_NULSTR DEFAULT_PATH_SPLIT_USR_NULSTR
      36             : #else
      37             : #  define DEFAULT_PATH DEFAULT_PATH_NORMAL
      38             : #  define DEFAULT_PATH_NULSTR DEFAULT_PATH_NORMAL_NULSTR
      39             : #endif
      40             : 
      41             : bool is_path(const char *p) _pure_;
      42             : int path_split_and_make_absolute(const char *p, char ***ret);
      43             : bool path_is_absolute(const char *p) _pure_;
      44             : char* path_make_absolute(const char *p, const char *prefix);
      45             : int safe_getcwd(char **ret);
      46             : int path_make_absolute_cwd(const char *p, char **ret);
      47             : int path_make_relative(const char *from_dir, const char *to_path, char **_r);
      48             : char* path_startswith(const char *path, const char *prefix) _pure_;
      49             : int path_compare(const char *a, const char *b) _pure_;
      50             : bool path_equal(const char *a, const char *b) _pure_;
      51             : bool path_equal_or_files_same(const char *a, const char *b, int flags);
      52             : char* path_join_internal(const char *first, ...);
      53             : #define path_join(x, ...) path_join_internal(x, __VA_ARGS__, (const char*) -1)
      54             : 
      55             : char* path_simplify(char *path, bool kill_dots);
      56             : 
      57             : enum {
      58             :         PATH_CHECK_FATAL    = 1 << 0,  /* If not set, then error message is appended with 'ignoring'. */
      59             :         PATH_CHECK_ABSOLUTE = 1 << 1,
      60             :         PATH_CHECK_RELATIVE = 1 << 2,
      61             : };
      62             : 
      63             : int path_simplify_and_warn(char *path, unsigned flag, const char *unit, const char *filename, unsigned line, const char *lvalue);
      64             : 
      65        4750 : static inline bool path_equal_ptr(const char *a, const char *b) {
      66        4750 :         return !!a == !!b && (!a || path_equal(a, b));
      67             : }
      68             : 
      69             : /* Note: the search terminates on the first NULL item. */
      70             : #define PATH_IN_SET(p, ...)                                     \
      71             :         ({                                                      \
      72             :                 char **_s;                                      \
      73             :                 bool _found = false;                            \
      74             :                 STRV_FOREACH(_s, STRV_MAKE(__VA_ARGS__))        \
      75             :                         if (path_equal(p, *_s)) {               \
      76             :                                _found = true;                   \
      77             :                                break;                           \
      78             :                         }                                       \
      79             :                 _found;                                         \
      80             :         })
      81             : 
      82             : char* path_startswith_strv(const char *p, char **set);
      83             : #define PATH_STARTSWITH_SET(p, ...) path_startswith_strv(p, STRV_MAKE(__VA_ARGS__))
      84             : 
      85             : int path_strv_make_absolute_cwd(char **l);
      86             : char** path_strv_resolve(char **l, const char *root);
      87             : char** path_strv_resolve_uniq(char **l, const char *root);
      88             : 
      89             : int find_binary(const char *name, char **filename);
      90             : 
      91             : bool paths_check_timestamp(const char* const* paths, usec_t *paths_ts_usec, bool update);
      92             : 
      93             : int fsck_exists(const char *fstype);
      94             : int mkfs_exists(const char *fstype);
      95             : 
      96             : /* Iterates through the path prefixes of the specified path, going up
      97             :  * the tree, to root. Also returns "" (and not "/"!) for the root
      98             :  * directory. Excludes the specified directory itself */
      99             : #define PATH_FOREACH_PREFIX(prefix, path)                               \
     100             :         for (char *_slash = ({                                          \
     101             :                                 path_simplify(strcpy(prefix, path), false); \
     102             :                                 streq(prefix, "/") ? NULL : strrchr(prefix, '/'); \
     103             :                         });                                             \
     104             :              _slash && ((*_slash = 0), true);                           \
     105             :              _slash = strrchr((prefix), '/'))
     106             : 
     107             : /* Same as PATH_FOREACH_PREFIX but also includes the specified path itself */
     108             : #define PATH_FOREACH_PREFIX_MORE(prefix, path)                          \
     109             :         for (char *_slash = ({                                          \
     110             :                                 path_simplify(strcpy(prefix, path), false); \
     111             :                                 if (streq(prefix, "/"))                 \
     112             :                                         prefix[0] = 0;                  \
     113             :                                 strrchr(prefix, 0);                     \
     114             :                         });                                             \
     115             :              _slash && ((*_slash = 0), true);                           \
     116             :              _slash = strrchr((prefix), '/'))
     117             : 
     118             : /* Similar to path_join(), but only works for two components, and only the first one may be NULL and returns
     119             :  * an alloca() buffer, or possibly a const pointer into the path parameter. */
     120             : #define prefix_roota(root, path)                                        \
     121             :         ({                                                              \
     122             :                 const char* _path = (path), *_root = (root), *_ret;     \
     123             :                 char *_p, *_n;                                          \
     124             :                 size_t _l;                                              \
     125             :                 while (_path[0] == '/' && _path[1] == '/')              \
     126             :                         _path ++;                                       \
     127             :                 if (isempty(_root))                                     \
     128             :                         _ret = _path;                                   \
     129             :                 else {                                                  \
     130             :                         _l = strlen(_root) + 1 + strlen(_path) + 1;     \
     131             :                         _n = newa(char, _l);                            \
     132             :                         _p = stpcpy(_n, _root);                         \
     133             :                         while (_p > _n && _p[-1] == '/')                \
     134             :                                 _p--;                                   \
     135             :                         if (_path[0] != '/')                            \
     136             :                                 *(_p++) = '/';                          \
     137             :                         strcpy(_p, _path);                              \
     138             :                         _ret = _n;                                      \
     139             :                 }                                                       \
     140             :                 _ret;                                                   \
     141             :         })
     142             : 
     143             : int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg);
     144             : 
     145             : char* dirname_malloc(const char *path);
     146             : const char *last_path_component(const char *path);
     147             : int path_extract_filename(const char *p, char **ret);
     148             : 
     149             : bool filename_is_valid(const char *p) _pure_;
     150             : bool path_is_valid(const char *p) _pure_;
     151             : bool path_is_normalized(const char *p) _pure_;
     152             : 
     153             : char *file_in_same_dir(const char *path, const char *filename);
     154             : 
     155             : bool hidden_or_backup_file(const char *filename) _pure_;
     156             : 
     157             : bool is_device_path(const char *path);
     158             : 
     159             : bool valid_device_node_path(const char *path);
     160             : bool valid_device_allow_pattern(const char *path);
     161             : 
     162             : int systemd_installation_has_version(const char *root, unsigned minimal_version);
     163             : 
     164             : bool dot_or_dot_dot(const char *path);
     165             : 
     166          36 : static inline const char *skip_dev_prefix(const char *p) {
     167             :         const char *e;
     168             : 
     169             :         /* Drop any /dev prefix if there is any */
     170             : 
     171          36 :         e = path_startswith(p, "/dev/");
     172             : 
     173          36 :         return e ?: p;
     174             : }
     175             : 
     176             : bool empty_or_root(const char *root);
     177          18 : static inline const char *empty_to_root(const char *path) {
     178          18 :         return isempty(path) ? "/" : path;
     179             : }

Generated by: LCOV version 1.14