From: Zbigniew Jędrzejewski-Szmek Date: Fri, 9 Jan 2015 06:11:01 +0000 (-0500) Subject: tmpfiles: detect all combinations of + and ! X-Git-Tag: v219~376 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=5f255144ae1ca7162b15e712a79d2eb9d83015f7 tmpfiles: detect all combinations of + and ! The same algorithm as with - and @ in ExecStart= is used. --- 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;