summaryrefslogtreecommitdiff
path: root/src/tmpfiles/tmpfiles.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-01-09 01:11:01 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-01-22 01:14:52 -0500
commit5f255144ae1ca7162b15e712a79d2eb9d83015f7 (patch)
tree7923398746f92ada21759cee78fd42918c4979b2 /src/tmpfiles/tmpfiles.c
parent505ef0e36c218f5c7a0987156a8d5bd5129a6773 (diff)
tmpfiles: detect all combinations of + and !
The same algorithm as with - and @ in ExecStart= is used.
Diffstat (limited to 'src/tmpfiles/tmpfiles.c')
-rw-r--r--src/tmpfiles/tmpfiles.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index 91ae62da4..8811f2748 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -1238,9 +1238,9 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
_cleanup_free_ char *action = NULL, *mode = NULL, *user = NULL, *group = NULL, *age = NULL, *path = NULL;
_cleanup_(item_freep) Item *i = NULL;
Item *existing;
- char type;
Hashmap *h;
- int r, n = -1;
+ int r, n = -1, pos;
+ bool force = false, boot = false;
assert(fname);
assert(line >= 1);
@@ -1265,21 +1265,27 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
return -EINVAL;
}
- if (strlen(action) > 1 && !in_charset(action+1, "!+")) {
- log_error("[%s:%u] Unknown modifiers in command '%s'", fname, line, action);
- return -EINVAL;
+ for (pos = 1; action[pos]; pos++) {
+ if (action[pos] == '!' && !boot)
+ boot = true;
+ else if (action[pos] == '+' && !force)
+ force = true;
+ else {
+ log_error("[%s:%u] Unknown modifiers in command '%s'",
+ fname, line, action);
+ return -EINVAL;
+ }
}
- if (strchr(action+1, '!') && !arg_boot)
+ if (boot && !arg_boot)
return 0;
- type = action[0];
-
i = new0(Item, 1);
if (!i)
return log_oom();
- i->force = !!strchr(action+1, '+');
+ i->type = action[0];
+ i->force = force;
r = specifier_printf(path, specifier_table, NULL, &i->path);
if (r < 0) {
@@ -1296,7 +1302,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
}
}
- switch (type) {
+ switch (i->type) {
case CREATE_FILE:
case TRUNCATE_FILE:
@@ -1372,12 +1378,10 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
break;
default:
- log_error("[%s:%u] Unknown command type '%c'.", fname, line, type);
+ log_error("[%s:%u] Unknown command type '%c'.", fname, line, i->type);
return -EBADMSG;
}
- i->type = type;
-
if (!path_is_absolute(i->path)) {
log_error("[%s:%u] Path '%s' not absolute.", fname, line, i->path);
return -EBADMSG;