mirror of
https://github.com/systemd/systemd.git
synced 2025-03-24 14:50:17 +03:00
path-util: introduce path_simplify_and_warn()
This commit is contained in:
parent
4805426279
commit
58a53adde5
@ -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] == '/';
|
||||
@ -989,3 +990,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;
|
||||
}
|
||||
|
@ -167,3 +167,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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user