chiark / gitweb /
tmpfiles.d: switch to stacked config dirs in /lib, /etc, /run
authorKay Sievers <kay.sievers@vrfy.org>
Mon, 25 Apr 2011 19:38:21 +0000 (21:38 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Mon, 25 Apr 2011 19:38:21 +0000 (21:38 +0200)
Makefile.am
man/binfmt.d.xml
man/modules-load.d.xml
man/sysctl.d.xml
man/tmpfiles.d.xml
src/tmpfiles.c

index b4644fa..d6182f1 100644 (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)
index 5a8803f..966778d 100644 (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
index b2f15dc..b633663 100644 (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
index 51afbfa..240aa81 100644 (file)
         <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
index 8568fcd..abc74ef 100644 (file)
         </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>
index 2526d1e..1574a19 100644 (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,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)