diff --git a/Makefile.am b/Makefile.am
index b4644fa75e..d6182f1b7a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -31,7 +31,7 @@ bashcompletiondir=$(sysconfdir)/bash_completion.d
# Our own, non-special dirs
pkgsysconfdir=$(sysconfdir)/systemd
userunitdir=$(prefix)/lib/systemd/user
-tmpfilesdir=$(sysconfdir)/tmpfiles.d
+tmpfilesdir=$(prefix)/lib/tmpfiles.d
usergeneratordir=$(pkglibexecdir)/user-generators
# And these are the special ones for /
@@ -1286,12 +1286,13 @@ CLEANFILES += \
install-data-hook:
$(MKDIR_P) -m 0755 \
$(DESTDIR)$(tmpfilesdir) \
- $(DESTDIR)$(sysconfdir)/modules-load.d \
+ $(DESTDIR)$(sysconfdir)/tmpfiles.d \
$(DESTDIR)$(prefix)/lib/modules-load.d \
- $(DESTDIR)$(sysconfdir)/sysctl.d \
+ $(DESTDIR)$(sysconfdir)/modules-load.d \
$(DESTDIR)$(prefix)/lib/sysctl.d \
- $(DESTDIR)$(sysconfdir)/binfmt.d \
+ $(DESTDIR)$(sysconfdir)/sysctl.d \
$(DESTDIR)$(prefix)/lib/binfmt.d \
+ $(DESTDIR)$(sysconfdir)/binfmt.d \
$(DESTDIR)$(systemshutdowndir) \
$(DESTDIR)$(systemgeneratordir) \
$(DESTDIR)$(usergeneratordir)
diff --git a/man/binfmt.d.xml b/man/binfmt.d.xml
index 5a8803f661..966778ded2 100644
--- a/man/binfmt.d.xml
+++ b/man/binfmt.d.xml
@@ -57,9 +57,7 @@
systemd uses
files from the above directories to configure
additional binary formats to register during boot in
- the kernel. Each configuration file is named in the
- style of
- <program>.conf.
+ the kernel.
@@ -75,7 +73,9 @@
ignored. Note that this means you may not use ; and #
as delimiter in binary format rules.
- Files in /etc/ overwrite
+ Each configuration file is named in the style of
+ <program>.conf.
+ Files in /etc/ overwrite
files with the same name in /usr/lib/.
Files in /run overwrite files with
the same name in /etc/ and
diff --git a/man/modules-load.d.xml b/man/modules-load.d.xml
index b2f15dc7b6..b633663475 100644
--- a/man/modules-load.d.xml
+++ b/man/modules-load.d.xml
@@ -74,7 +74,9 @@
newlines. Empty lines and lines whose first
non-whitespace character is # or ; are ignored.
- Files in /etc/ overwrite
+ Each configuration file is named in the style of
+ <program>.conf.
+ Files in /etc/ overwrite
files with the same name in /usr/lib/.
Files in /run overwrite files with
the same name in /etc/ and
diff --git a/man/sysctl.d.xml b/man/sysctl.d.xml
index 51afbfa77a..240aa81137 100644
--- a/man/sysctl.d.xml
+++ b/man/sysctl.d.xml
@@ -54,12 +54,10 @@
Description
- systemd uses
- /etc/sysctl.d/ to configure
+ systemd uses configuration files
+ from the above directories to configure
sysctl8
- kernel parameters to load during boot. Each
- configuration file is named in the style of
- /etc/sysctl.d/<program>.conf.
+ kernel parameters to load during boot.
@@ -73,7 +71,9 @@
Note that both / and . are accepted as
separators in sysctl variable names.
- Files in /etc/ overwrite
+ Each configuration file is named in the style of
+ <program>.conf.
+ Files in /etc/ overwrite
files with the same name in /usr/lib/.
Files in /run overwrite files with
the same name in /etc/ and
diff --git a/man/tmpfiles.d.xml b/man/tmpfiles.d.xml
index 8568fcd59c..abc74ef6f1 100644
--- a/man/tmpfiles.d.xml
+++ b/man/tmpfiles.d.xml
@@ -47,26 +47,41 @@
+ /usr/lib/tmpfiles.d/*.conf
/etc/tmpfiles.d/*.conf
+ /run/tmpfiles.d/*.conf
Description
systemd-tmpfiles uses the
- configuration files in
- /etc/tmpfiles.d/ to describe the
+ configuration files from the above directories to describe the
creation, cleaning and removal of volatile and
temporary files and directories which usually reside
in directories such as /run
- or /tmp. Each configuration file
- is named in the style of
- /etc/tmpfiles.d/<program>.conf.
+ or /tmp.
Configuration Format
+ Each configuration file is named in the style of
+ <program>.conf.
+ Files in /etc/ overwrite
+ files with the same name in /usr/lib/.
+ Files in /run overwrite files with
+ the same name in /etc/ and
+ /usr/lib/. Packages should install their
+ configuration files in /usr/lib/, files
+ in /etc/ are reserved for the local
+ administration, which possibly decides to overwrite the
+ configurations installed from packages. All files are sorted
+ by filename in alphabetical order, regardless in which of the
+ directories they reside, to ensure that a specific
+ configuration file takes precedence over another file with
+ an alphabetically later name.
+
The configuration format is one line per path
containing action, mode, ownership and age
fields:
@@ -181,10 +196,12 @@ d /run/user 0755 root root 10d
us
- If multiple integers and units are specified the time values are summed up.
-
- The age field only applies to lines starting with d, D and x. If omitted or set to - no automatic clean-up is done.
+ If multiple integers and units are specified the time
+ values are summed up.
+ The age field only applies to lines starting with
+ d, D and x. If omitted or set to - no automatic clean-up
+ is done.
diff --git a/src/tmpfiles.c b/src/tmpfiles.c
index 2526d1e915..1574a199fb 100644
--- a/src/tmpfiles.c
+++ b/src/tmpfiles.c
@@ -804,20 +804,6 @@ finish:
return r;
}
-static int scandir_filter(const struct dirent *d) {
- assert(d);
-
- if (ignore_file(d->d_name))
- return 0;
-
- if (d->d_type != DT_REG &&
- d->d_type != DT_LNK &&
- d->d_type != DT_UNKNOWN)
- return 0;
-
- return endswith(d->d_name, ".conf");
-}
-
static int help(void) {
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
@@ -912,6 +898,7 @@ static int read_config_file(const char *fn, bool ignore_enoent) {
return -errno;
}
+ log_debug("apply: %s\n", fn);
for (;;) {
char line[LINE_MAX], *l;
int k;
@@ -974,41 +961,24 @@ int main(int argc, char *argv[]) {
r = EXIT_FAILURE;
} else {
- int n, j;
- struct dirent **de = NULL;
+ char **files, **f;
- if ((n = scandir("/etc/tmpfiles.d/", &de, scandir_filter, alphasort)) < 0) {
+ files = conf_files_list(".conf",
+ "/run/tmpfiles.d",
+ "/etc/tmpfiles.d",
+ "/usr/lib/tmpfiles.d",
+ NULL);
- if (errno != ENOENT) {
- log_error("Failed to enumerate /etc/tmpfiles.d/ files: %m");
+ STRV_FOREACH(f, files) {
+ if (read_config_file(*f, true) < 0)
r = EXIT_FAILURE;
- }
-
- goto finish;
}
- for (j = 0; j < n; j++) {
- int k;
- char *fn;
-
- k = asprintf(&fn, "/etc/tmpfiles.d/%s", de[j]->d_name);
- free(de[j]);
-
- if (k < 0) {
- log_error("Failed to allocate file name.");
- r = EXIT_FAILURE;
- continue;
- }
-
- if (read_config_file(fn, true) < 0)
- r = EXIT_FAILURE;
-
- free(fn);
- }
-
- free(de);
+ strv_free(files);
}
+
+
HASHMAP_FOREACH(i, globs, iterator)
if (process_item(i) < 0)
r = EXIT_FAILURE;