tmpfiles: when processing lines, always process prefixes before suffixes

If two lines refer to paths that are suffix and prefix of each other,
then always process the prefix first, the suffix second. In all other
cases strictly process rules in the order they appear in the files.

This makes creating /var/run as symlink to /run a lot more fun, since it
is automatically created first.
This commit is contained in:
Lennart Poettering 2014-06-11 01:37:35 +02:00
parent 7bc040fab8
commit 1910cd0e05
2 changed files with 21 additions and 1 deletions

View File

@ -109,7 +109,11 @@
of the directories they reside in. If multiple files
specify the same path, the entry in the file with the
lexicographically earliest name will be applied, all
all other conflicting entries logged as errors.</para>
all other conflicting entries will be logged as
errors. When two lines are prefix and suffix of each
other, then the prefix is always processed first, the
suffix later. Otherwise the files/directories are
processed in the order they are listed.</para>
<para>If the administrator wants to disable a
configuration file supplied by the vendor, the

View File

@ -101,6 +101,8 @@ typedef struct Item {
bool age_set:1;
bool keep_first_level:1;
bool done:1;
} Item;
static bool arg_create = false;
@ -977,9 +979,23 @@ static int clean_item(Item *i) {
static int process_item(Item *i) {
int r, q, p;
char prefix[PATH_MAX];
assert(i);
if (i->done)
return 0;
i->done = true;
PATH_FOREACH_PREFIX(prefix, i->path) {
Item *j;
j = hashmap_get(items, prefix);
if (j)
process_item(j);
}
r = arg_create ? create_item(i) : 0;
q = arg_remove ? remove_item(i) : 0;
p = arg_clean ? clean_item(i) : 0;