# 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 /
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)
<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>
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
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
<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>
<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
</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>
<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>
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"
return -errno;
}
+ log_debug("apply: %s\n", fn);
for (;;) {
char line[LINE_MAX], *l;
int k;
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)