From 0809ca2a5a48ba63a3ba0d5d579d897547751c36 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 1 Jun 2018 14:11:37 +0900 Subject: [PATCH] path-util: introduce path_simplify_and_warn() --- src/basic/path-util.c | 50 +++++++++++++++++++++++++++++++++++++++++++ src/basic/path-util.h | 8 +++++++ 2 files changed, 58 insertions(+) diff --git a/src/basic/path-util.c b/src/basic/path-util.c index 4bca37266..7246bc8c0 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -32,6 +32,7 @@ #include "string-util.h" #include "strv.h" #include "time-util.h" +//#include "utf8.h" bool path_is_absolute(const char *p) { return p[0] == '/'; @@ -999,3 +1000,52 @@ bool empty_or_root(const char *root) { return root[strspn(root, "/")] == 0; } + +int path_simplify_and_warn( + char *path, + unsigned flag, + const char *unit, + const char *filename, + unsigned line, + const char *lvalue) { + + bool fatal, absolute; + + assert((flag & (PATH_CHECK_ABSOLUTE | PATH_CHECK_RELATIVE)) != (PATH_CHECK_ABSOLUTE | PATH_CHECK_RELATIVE)); + + fatal = flag & PATH_CHECK_FATAL; + + if (!utf8_is_valid(path)) { + log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, path); + return -EINVAL; + } + + if (flag & (PATH_CHECK_ABSOLUTE | PATH_CHECK_RELATIVE)) { + absolute = path_is_absolute(path); + + if (!absolute && (flag & PATH_CHECK_ABSOLUTE)) { + log_syntax(unit, LOG_ERR, filename, line, 0, + "%s= path is not absolute%s: %s", + fatal ? "" : ", ignoring", lvalue, path); + return -EINVAL; + } + + if (absolute && (flag & PATH_CHECK_RELATIVE)) { + log_syntax(unit, LOG_ERR, filename, line, 0, + "%s= path is absolute%s: %s", + fatal ? "" : ", ignoring", lvalue, path); + return -EINVAL; + } + } + + path_simplify(path, true); + + if (!path_is_normalized(path)) { + log_syntax(unit, LOG_ERR, filename, line, 0, + "%s= path is not normalized%s: %s", + fatal ? "" : ", ignoring", lvalue, path); + return -EINVAL; + } + + return 0; +} diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 4fabe06e6..489a6c472 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -181,3 +181,11 @@ bool empty_or_root(const char *root); static inline const char *empty_to_root(const char *path) { return isempty(path) ? "/" : path; } + +enum { + PATH_CHECK_FATAL = 1 << 0, /* If not set, then error message is appended with 'ignoring'. */ + PATH_CHECK_ABSOLUTE = 1 << 1, + PATH_CHECK_RELATIVE = 1 << 2, +}; + +int path_simplify_and_warn(char *path, unsigned flag, const char *unit, const char *filename, unsigned line, const char *lvalue); -- 2.30.2