X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftmpfiles%2Ftmpfiles.c;h=8811f274824bfc7165d728cd20f7861ad118cf6c;hp=b830850879b951c80d9f4f5bec20432b533ea002;hb=5f255144ae1ca7162b15e712a79d2eb9d83015f7;hpb=d7b8eec7dc7fe307d3a08b32cf1a9ad4276ce6d5 diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index b83085087..8811f2748 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -34,10 +33,11 @@ #include #include #include -#include -#include #include #include +#include +#include +#include #include #include "log.h" @@ -230,10 +230,7 @@ static bool unix_socket_alive(const char *fn) { static int dir_is_mount_point(DIR *d, const char *subdir) { - union file_handle_union h = { - .handle.handle_bytes = MAX_HANDLE_SZ - }; - + union file_handle_union h = FILE_HANDLE_INIT; int mount_id_parent, mount_id; int r_p, r; @@ -483,11 +480,9 @@ static int item_set_perms(Item *i, const char *path) { (i->uid_set || i->gid_set)) if (chown(path, i->uid_set ? i->uid : UID_INVALID, - i->gid_set ? i->gid : GID_INVALID) < 0) { + i->gid_set ? i->gid : GID_INVALID) < 0) - log_error_errno(errno, "chown(%s) failed: %m", path); - return -errno; - } + return log_error_errno(errno, "chown(%s) failed: %m", path); return label_fix(path, false, false); } @@ -498,36 +493,36 @@ static int get_xattrs_from_arg(Item *i) { int r; assert(i); + assert(i->argument); - if (!i->argument) { - log_error("%s: Argument can't be empty!", i->path); - return -EBADMSG; - } p = i->argument; while ((r = unquote_first_word(&p, &xattr, false)) > 0) { - _cleanup_free_ char *tmp = NULL, *name = NULL, *value = NULL; + _cleanup_free_ char *tmp = NULL, *name = NULL, + *value = NULL, *value2 = NULL, *_xattr = xattr; + r = split_pair(xattr, "=", &name, &value); if (r < 0) { log_warning("Illegal xattr found: \"%s\" - ignoring.", xattr); - free(xattr); continue; } - free(xattr); - if (streq(name, "") || streq(value, "")) { - log_warning("Malformed xattr found: \"%s=%s\" - ignoring.", name, value); + + if (strempty(name) || strempty(value)) { + log_warning("Malformed xattr found: \"%s\" - ignoring.", xattr); continue; } + tmp = unquote(value, "\""); if (!tmp) return log_oom(); - free(value); - value = cunescape(tmp); - if (!value) + + value2 = cunescape(tmp); + if (!value2) return log_oom(); - if (strv_consume_pair(&i->xattrs, name, value) < 0) + + if (strv_push_pair(&i->xattrs, name, value2) < 0) return log_oom(); - name = value = NULL; + name = value2 = NULL; } return r; @@ -539,14 +534,13 @@ static int item_set_xattrs(Item *i, const char *path) { assert(i); assert(path); - if (strv_isempty(i->xattrs)) - return 0; - STRV_FOREACH_PAIR(name, value, i->xattrs) { int n; + n = strlen(*value); if (lsetxattr(path, *name, *value, n, 0) < 0) { - log_error("Setting extended attribute %s=%s on %s failed: %m", *name, *value, path); + log_error("Setting extended attribute %s=%s on %s failed: %m", + *name, *value, path); return -errno; } } @@ -774,7 +768,7 @@ static int create_item(Item *i) { } else r = 0; - if (i->type == CREATE_DIRECTORY || r == -ENOTTY) { + if (IN_SET(i->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY) || r == -ENOTTY) { RUN_WITH_UMASK(0000) r = mkdir_label(i->path, i->mode); } @@ -1123,7 +1117,7 @@ static int clean_item(Item *i) { } static int process_item(Item *i) { - int r, q, p; + int r, q, p, t = 0; _cleanup_free_ char *prefix = NULL; assert(i); @@ -1141,21 +1135,23 @@ static int process_item(Item *i) { Item *j; j = hashmap_get(items, prefix); - if (j) - process_item(j); + if (j) { + int s; + + s = process_item(j); + if (s < 0 && t == 0) + t = s; + } } r = arg_create ? create_item(i) : 0; q = arg_remove ? remove_item(i) : 0; p = arg_clean ? clean_item(i) : 0; - if (r < 0) - return r; - - if (q < 0) - return q; - - return p; + return t < 0 ? t : + r < 0 ? r : + q < 0 ? q : + p; } static void item_free(Item *i) { @@ -1242,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); @@ -1269,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) { @@ -1300,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: @@ -1376,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; @@ -1487,7 +1487,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { } else { /* Two identical items are fine */ if (!item_equal(existing, i)) - log_warning("Two or more conflicting lines for %s configured, ignoring.", i->path); + log_warning("[%s:%u] Duplicate line for path \"%s\", ignoring.", + fname, line, i->path); return 0; } } else { @@ -1735,11 +1736,17 @@ int main(int argc, char *argv[]) { } } - HASHMAP_FOREACH(i, globs, iterator) - process_item(i); + HASHMAP_FOREACH(i, globs, iterator) { + k = process_item(i); + if (k < 0 && r == 0) + r = k; + } - HASHMAP_FOREACH(i, items, iterator) - process_item(i); + HASHMAP_FOREACH(i, items, iterator) { + k = process_item(i); + if (k < 0 && r == 0) + r = k; + } finish: while ((i = hashmap_steal_first(items)))