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

This commit is contained in:
Kay Sievers 2011-04-25 21:38:21 +02:00
parent db1413d738
commit 772f83719e
6 changed files with 55 additions and 65 deletions

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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;