diff options
-rw-r--r-- | Makefile.am | 9 | ||||
-rw-r--r-- | man/binfmt.d.xml | 8 | ||||
-rw-r--r-- | man/modules-load.d.xml | 4 | ||||
-rw-r--r-- | man/sysctl.d.xml | 12 | ||||
-rw-r--r-- | man/tmpfiles.d.xml | 33 | ||||
-rw-r--r-- | src/tmpfiles.c | 52 |
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><program>.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><program>.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><program>.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/<program>.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><program>.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/<program>.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><program>.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) |