X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftmpfiles%2Ftmpfiles.c;h=10c5a63dbf4d7734db6121e0fa42c1b58db28af6;hb=27cc6f166bdebc0e698fb692993b801db2618866;hp=917bb3c52898f0cdf80fedbeb5e90478550bdce6;hpb=d873e8778c92014c02a9122852758b436fa95c0e;p=elogind.git diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 917bb3c52..10c5a63db 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -1506,23 +1506,25 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { _cleanup_(item_free_contents) Item i = {}; ItemArray *existing; Hashmap *h; - int r, c = -1, pos; + int r, pos; bool force = false, boot = false; assert(fname); assert(line >= 1); assert(buffer); - r = sscanf(buffer, - "%ms %ms %ms %ms %ms %ms %n", + r = unquote_many_words(&buffer, &action, &path, &mode, &user, &group, &age, - &c); - if (r < 2) { + &i.argument, + NULL); + if (r < 0) + return log_error_errno(r, "[%s:%u] Failed to parse line: %m", fname, line); + else if (r < 2) { log_error("[%s:%u] Syntax error.", fname, line); return -EIO; } @@ -1559,15 +1561,6 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { return r; } - if (c >= 0) { - c += strspn(buffer+c, WHITESPACE); - if (buffer[c] != 0 && (buffer[c] != '-' || buffer[c+1] != 0)) { - i.argument = unquote(buffer+c, "\""); - if (!i.argument) - return log_oom(); - } - } - switch (i.type) { case CREATE_FILE: @@ -1746,9 +1739,11 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { unsigned n; for (n = 0; n < existing->count; n++) { - if (!item_compatible(existing->items + n, &i)) + if (!item_compatible(existing->items + n, &i)) { log_warning("[%s:%u] Duplicate line for path \"%s\", ignoring.", fname, line, i.path); + return 0; + } } } else { existing = new0(ItemArray, 1);