summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am9
-rw-r--r--man/binfmt.d.xml8
-rw-r--r--man/modules-load.d.xml4
-rw-r--r--man/sysctl.d.xml12
-rw-r--r--man/tmpfiles.d.xml33
-rw-r--r--src/tmpfiles.c52
6 files changed, 54 insertions, 64 deletions
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 @@
<para><command>systemd</command> 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
- <filename>&lt;program&gt;.conf</filename>.</para>
+ the kernel.</para>
</refsect1>
<refsect1>
@@ -75,7 +73,9 @@
ignored. Note that this means you may not use ; and #
as delimiter in binary format rules.</para>
- <para>Files in <filename>/etc/</filename> overwrite
+ <para>Each configuration file is named in the style of
+ <filename>&lt;program&gt;.conf</filename>.
+ Files in <filename>/etc/</filename> overwrite
files with the same name in <filename>/usr/lib/</filename>.
Files in <filename>/run</filename> overwrite files with
the same name in <filename>/etc/</filename> 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.</para>
- <para>Files in <filename>/etc/</filename> overwrite
+ <para>Each configuration file is named in the style of
+ <filename>&lt;program&gt;.conf</filename>.
+ Files in <filename>/etc/</filename> overwrite
files with the same name in <filename>/usr/lib/</filename>.
Files in <filename>/run</filename> overwrite files with
the same name in <filename>/etc/</filename> 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 @@
<refsect1>
<title>Description</title>
- <para><command>systemd</command> uses
- <filename>/etc/sysctl.d/</filename> to configure
+ <para><command>systemd</command> uses configuration files
+ from the above directories to configure
<citerefentry><refentrytitle>sysctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
- kernel parameters to load during boot. Each
- configuration file is named in the style of
- <filename>/etc/sysctl.d/&lt;program&gt;.conf</filename>.</para>
+ kernel parameters to load during boot.</para>
</refsect1>
<refsect1>
@@ -73,7 +71,9 @@
<para>Note that both / and . are accepted as
separators in sysctl variable names.</para>
- <para>Files in <filename>/etc/</filename> overwrite
+ <para>Each configuration file is named in the style of
+ <filename>&lt;program&gt;.conf</filename>.
+ Files in <filename>/etc/</filename> overwrite
files with the same name in <filename>/usr/lib/</filename>.
Files in <filename>/run</filename> overwrite files with
the same name in <filename>/etc/</filename> 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 @@
</refnamediv>
<refsynopsisdiv>
+ <para><filename>/usr/lib/tmpfiles.d/*.conf</filename></para>
<para><filename>/etc/tmpfiles.d/*.conf</filename></para>
+ <para><filename>/run/tmpfiles.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para><command>systemd-tmpfiles</command> uses the
- configuration files in
- <filename>/etc/tmpfiles.d/</filename> 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 <filename>/run</filename>
- or <filename>/tmp</filename>. Each configuration file
- is named in the style of
- <filename>/etc/tmpfiles.d/&lt;program&gt;.conf</filename>.</para>
+ or <filename>/tmp</filename>.</para>
</refsect1>
<refsect1>
<title>Configuration Format</title>
+ <para>Each configuration file is named in the style of
+ <filename>&lt;program&gt;.conf</filename>.
+ Files in <filename>/etc/</filename> overwrite
+ files with the same name in <filename>/usr/lib/</filename>.
+ Files in <filename>/run</filename> overwrite files with
+ the same name in <filename>/etc/</filename> and
+ <filename>/usr/lib/</filename>. Packages should install their
+ configuration files in <filename>/usr/lib/</filename>, files
+ in <filename>/etc/</filename> 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.</para>
+
<para>The configuration format is one line per path
containing action, mode, ownership and age
fields:</para>
@@ -181,10 +196,12 @@ d /run/user 0755 root root 10d</programlisting>
<term><varname>us</varname></term></varlistentry>
</variablelist>
- <para>If multiple integers and units are specified the time values are summed up.</para>
-
- <para>The age field only applies to lines starting with d, D and x. If omitted or set to - no automatic clean-up is done.</para>
+ <para>If multiple integers and units are specified the time
+ values are summed up.</para>
+ <para>The age field only applies to lines starting with
+ d, D and x. If omitted or set to - no automatic clean-up
+ is done.</para>
</refsect2>
</refsect1>
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,40 +961,23 @@ 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;
- }
+ strv_free(files);
+ }
- if (read_config_file(fn, true) < 0)
- r = EXIT_FAILURE;
- free(fn);
- }
-
- free(de);
- }
HASHMAP_FOREACH(i, globs, iterator)
if (process_item(i) < 0)