From 84601ab5c6e6c17bd489423b693b85377b9b1be9 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Wed, 24 Jul 2013 11:19:24 -0400 Subject: [PATCH] tmpfiles: introduce --exclude-prefix The opposite of --prefix, allows specifying path prefixes which should be skipped when processing rules. --- man/systemd-tmpfiles.xml | 7 +++++ shell-completion/systemd-zsh-completion.zsh | 1 + src/tmpfiles/tmpfiles.c | 44 ++++++++++++++++++----------- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/man/systemd-tmpfiles.xml b/man/systemd-tmpfiles.xml index b0f2d9c..403592d 100644 --- a/man/systemd-tmpfiles.xml +++ b/man/systemd-tmpfiles.xml @@ -124,6 +124,13 @@ prefix. This option can be specified multiple times. + + + Ignore rules that + apply to paths with the specified + prefix. This option can be specified + multiple times. + diff --git a/shell-completion/systemd-zsh-completion.zsh b/shell-completion/systemd-zsh-completion.zsh index c85e00e..7aebbcd 100644 --- a/shell-completion/systemd-zsh-completion.zsh +++ b/shell-completion/systemd-zsh-completion.zsh @@ -249,6 +249,7 @@ _ctls() '--clean[Clean up all files and directories with an age parameter configured.]' \ '--remove[All files and directories marked with r, R in the configuration files are removed.]' \ '--prefix=[Only apply rules that apply to paths with the specified prefix.]' \ + '--exclude-prefix=[Ignore rules that apply to paths with the specified prefix.]' \ '--help[Prints a short help text and exits.]' \ '*::files:_files' ;; diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index cb15133..5eca82a 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -106,6 +106,7 @@ static bool arg_clean = false; static bool arg_remove = false; static char **include_prefixes = NULL; +static char **exclude_prefixes = NULL; static const char conf_file_dirs[] = "/etc/tmpfiles.d\0" @@ -1021,16 +1022,19 @@ static bool item_equal(Item *a, Item *b) { static bool should_include_path(const char *path) { char **prefix; - /* no explicit paths specified for inclusion, so everything is valid */ - if (strv_length(include_prefixes) == 0) - return true; + STRV_FOREACH(prefix, exclude_prefixes) { + if (path_startswith(path, *prefix)) + return false; + } STRV_FOREACH(prefix, include_prefixes) { if (path_startswith(path, *prefix)) return true; } - return false; + /* no matches, so we should include this path only if we + * have no whitelist at all */ + return strv_length(include_prefixes) == 0; } static int parse_line(const char *fname, unsigned line, const char *buffer) { @@ -1219,11 +1223,12 @@ static int help(void) { printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n" "Creates, deletes and cleans up volatile and temporary files and directories.\n\n" - " -h --help Show this help\n" - " --create Create marked files/directories\n" - " --clean Clean up marked directories\n" - " --remove Remove marked files/directories\n" - " --prefix=PATH Only apply rules that apply to paths with the specified prefix\n", + " -h --help Show this help\n" + " --create Create marked files/directories\n" + " --clean Clean up marked directories\n" + " --remove Remove marked files/directories\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); return 0; @@ -1235,16 +1240,18 @@ static int parse_argv(int argc, char *argv[]) { ARG_CREATE, ARG_CLEAN, ARG_REMOVE, - ARG_PREFIX + ARG_PREFIX, + ARG_EXCLUDE_PREFIX, }; static const struct option options[] = { - { "help", no_argument, NULL, 'h' }, - { "create", no_argument, NULL, ARG_CREATE }, - { "clean", no_argument, NULL, ARG_CLEAN }, - { "remove", no_argument, NULL, ARG_REMOVE }, - { "prefix", required_argument, NULL, ARG_PREFIX }, - { NULL, 0, NULL, 0 } + { "help", no_argument, NULL, 'h' }, + { "create", no_argument, NULL, ARG_CREATE }, + { "clean", no_argument, NULL, ARG_CLEAN }, + { "remove", no_argument, NULL, ARG_REMOVE }, + { "prefix", required_argument, NULL, ARG_PREFIX }, + { "exclude-prefix", required_argument, NULL, ARG_EXCLUDE_PREFIX }, + { NULL, 0, NULL, 0 } }; int c; @@ -1277,6 +1284,11 @@ static int parse_argv(int argc, char *argv[]) { return log_oom(); break; + case ARG_EXCLUDE_PREFIX: + if (strv_extend(&exclude_prefixes, optarg) < 0) + return log_oom(); + break; + case '?': return -EINVAL;