Commit 772f8371 authored by Kay Sievers's avatar Kay Sievers

tmpfiles.d: switch to stacked config dirs in /lib, /etc, /run

parent db1413d7
......@@ -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)
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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>
......
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment