X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftmpfiles%2Ftmpfiles.c;h=6e36dc79ddd9bf738cb221a63dd78ce8aa8a64ca;hb=90e633a7901060063e62bf53948c4c239a9f55d1;hp=b7f6a2e058bcdcf539c5aaa7e06c7cf69b60b710;hpb=eb9da376d76b48585b3b63b4f91903b54f7abd36;p=elogind.git diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index b7f6a2e05..6e36dc79d 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -107,6 +107,7 @@ static Set *unix_sockets = NULL; static bool arg_create = false; static bool arg_clean = false; static bool arg_remove = false; +static bool arg_boot = false; static char **include_prefixes = NULL; static char **exclude_prefixes = NULL; @@ -360,7 +361,7 @@ static int dir_cleanup( continue; if (i->type != IGNORE_DIRECTORY_PATH || !streq(dent->d_name, p)) { - log_debug("rmdir '%s'\n", sub_path); + log_debug("rmdir '%s'", sub_path); if (unlinkat(dirfd(d), dent->d_name, AT_REMOVEDIR) < 0) { if (errno != ENOENT && errno != ENOTEMPTY) { @@ -408,7 +409,7 @@ static int dir_cleanup( if (age >= cutoff) continue; - log_debug("unlink '%s'\n", sub_path); + log_debug("unlink '%s'", sub_path); if (unlinkat(dirfd(d), dent->d_name, 0) < 0) { if (errno != ENOENT) { @@ -435,8 +436,6 @@ finish: } static int item_set_perms_full(Item *i, const char *path, bool ignore_enoent) { - int r; - /* not using i->path directly because it may be a glob */ if (i->mode_set) if (chmod(path, i->mode) < 0) { @@ -457,8 +456,7 @@ static int item_set_perms_full(Item *i, const char *path, bool ignore_enoent) { } } - r = label_fix(path, false, false); - return r == -ENOENT && ignore_enoent ? 0 : r; + return label_fix(path, ignore_enoent, false); } static int item_set_perms(Item *i, const char *path) { @@ -543,15 +541,15 @@ static int recursive_relabel_children(Item *i, const char *path) { for (;;) { struct dirent *de; - union dirent_storage buf; bool is_dir; int r; _cleanup_free_ char *entry_path = NULL; - r = readdir_r(d, &buf.de, &de); - if (r != 0) { + errno = 0; + de = readdir(d); + if (!de && errno != 0) { if (ret == 0) - ret = -r; + ret = -errno; break; } @@ -733,7 +731,7 @@ static int create_item(Item *i) { break; case CREATE_SYMLINK: { - char *x; + _cleanup_free_ char *x = NULL; label_context_set(i->path, S_IFLNK); r = symlink(i->argument, i->path); @@ -753,12 +751,10 @@ static int create_item(Item *i) { } if (!streq(i->argument, x)) { - free(x); log_error("%s is not the right symlinks.", i->path); return -EEXIST; } - free(x); break; } @@ -1077,7 +1073,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { _cleanup_item_free_ Item *i = NULL; Item *existing; _cleanup_free_ char - *mode = NULL, *user = NULL, *group = NULL, *age = NULL, *path = NULL; + *action = NULL, *mode = NULL, *user = NULL, *group = NULL, *age = NULL, *path = NULL; char type; Hashmap *h; int r, n = -1; @@ -1087,8 +1083,8 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { assert(buffer); r = sscanf(buffer, - "%c %ms %ms %ms %ms %ms %n", - &type, + "%ms %ms %ms %ms %ms %ms %n", + &action, &path, &mode, &user, @@ -1100,6 +1096,14 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { return -EIO; } + if (strlen(action) > 2 || (strlen(action) > 1 && action[1] != '!')) { + log_error("[%s:%u] Unknown modifier '%s'", fname, line, action); + return -EINVAL; + } else if (strlen(action) > 1 && !arg_boot) + return 0; + + type = action[0]; + i = new0(Item, 1); if (!i) return log_oom(); @@ -1271,6 +1275,7 @@ static int help(void) { " --create Create marked files/directories\n" " --clean Clean up marked directories\n" " --remove Remove marked files/directories\n" + " --boot Execute actions only safe at boot\n" " --prefix=PATH Only apply rules that apply to paths with the specified prefix\n" " --exclude-prefix=PATH Ignore rules that apply to paths with the specified prefix\n", program_invocation_short_name); @@ -1285,6 +1290,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_CREATE, ARG_CLEAN, ARG_REMOVE, + ARG_BOOT, ARG_PREFIX, ARG_EXCLUDE_PREFIX, }; @@ -1295,6 +1301,7 @@ static int parse_argv(int argc, char *argv[]) { { "create", no_argument, NULL, ARG_CREATE }, { "clean", no_argument, NULL, ARG_CLEAN }, { "remove", no_argument, NULL, ARG_REMOVE }, + { "boot", no_argument, NULL, ARG_BOOT }, { "prefix", required_argument, NULL, ARG_PREFIX }, { "exclude-prefix", required_argument, NULL, ARG_EXCLUDE_PREFIX }, {} @@ -1329,13 +1336,17 @@ static int parse_argv(int argc, char *argv[]) { arg_remove = true; break; + case ARG_BOOT: + arg_boot = true; + break; + case ARG_PREFIX: - if (strv_extend(&include_prefixes, optarg) < 0) + if (strv_push(&include_prefixes, optarg) < 0) return log_oom(); break; case ARG_EXCLUDE_PREFIX: - if (strv_extend(&exclude_prefixes, optarg) < 0) + if (strv_push(&exclude_prefixes, optarg) < 0) return log_oom(); break; @@ -1495,7 +1506,8 @@ finish: hashmap_free(items); hashmap_free(globs); - strv_free(include_prefixes); + free(include_prefixes); + free(exclude_prefixes); set_free_free(unix_sockets);