]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/parse-helpers.c
Move path_simplify_and_warn() to new shared/parse-helpers.c
[thirdparty/systemd.git] / src / shared / parse-helpers.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "log.h"
4 #include "parse-helpers.h"
5 #include "path-util.h"
6 #include "utf8.h"
7
8 int path_simplify_and_warn(
9 char *path,
10 unsigned flag,
11 const char *unit,
12 const char *filename,
13 unsigned line,
14 const char *lvalue) {
15
16 bool fatal = flag & PATH_CHECK_FATAL;
17
18 assert(!FLAGS_SET(flag, PATH_CHECK_ABSOLUTE | PATH_CHECK_RELATIVE));
19
20 if (!utf8_is_valid(path))
21 return log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, path);
22
23 if (flag & (PATH_CHECK_ABSOLUTE | PATH_CHECK_RELATIVE)) {
24 bool absolute;
25
26 absolute = path_is_absolute(path);
27
28 if (!absolute && (flag & PATH_CHECK_ABSOLUTE))
29 return log_syntax(unit, LOG_ERR, filename, line, SYNTHETIC_ERRNO(EINVAL),
30 "%s= path is not absolute%s: %s",
31 lvalue, fatal ? "" : ", ignoring", path);
32
33 if (absolute && (flag & PATH_CHECK_RELATIVE))
34 return log_syntax(unit, LOG_ERR, filename, line, SYNTHETIC_ERRNO(EINVAL),
35 "%s= path is absolute%s: %s",
36 lvalue, fatal ? "" : ", ignoring", path);
37 }
38
39 path_simplify(path);
40
41 if (!path_is_valid(path))
42 return log_syntax(unit, LOG_ERR, filename, line, SYNTHETIC_ERRNO(EINVAL),
43 "%s= path has invalid length (%zu bytes)%s.",
44 lvalue, strlen(path), fatal ? "" : ", ignoring");
45
46 if (!path_is_normalized(path))
47 return log_syntax(unit, LOG_ERR, filename, line, SYNTHETIC_ERRNO(EINVAL),
48 "%s= path is not normalized%s: %s",
49 lvalue, fatal ? "" : ", ignoring", path);
50
51 return 0;
52 }