From 772f83719e3c2262d948a4c4e70fe9babc4c4610 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Mon, 25 Apr 2011 21:38:21 +0200 Subject: [PATCH] tmpfiles.d: switch to stacked config dirs in /lib, /etc, /run --- Makefile.am | 9 +++---- man/binfmt.d.xml | 8 +++---- man/modules-load.d.xml | 4 +++- man/sysctl.d.xml | 12 +++++----- man/tmpfiles.d.xml | 33 +++++++++++++++++++------- src/tmpfiles.c | 54 ++++++++++-------------------------------- 6 files changed, 55 insertions(+), 65 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 @@ systemd 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 - <program>.conf. + the kernel. @@ -75,7 +73,9 @@ ignored. Note that this means you may not use ; and # as delimiter in binary format rules. - Files in /etc/ overwrite + Each configuration file is named in the style of + <program>.conf. + Files in /etc/ overwrite files with the same name in /usr/lib/. Files in /run overwrite files with the same name in /etc/ 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. - Files in /etc/ overwrite + Each configuration file is named in the style of + <program>.conf. + Files in /etc/ overwrite files with the same name in /usr/lib/. Files in /run overwrite files with the same name in /etc/ 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 @@ Description - systemd uses - /etc/sysctl.d/ to configure + systemd uses configuration files + from the above directories to configure sysctl8 - kernel parameters to load during boot. Each - configuration file is named in the style of - /etc/sysctl.d/<program>.conf. + kernel parameters to load during boot. @@ -73,7 +71,9 @@ Note that both / and . are accepted as separators in sysctl variable names. - Files in /etc/ overwrite + Each configuration file is named in the style of + <program>.conf. + Files in /etc/ overwrite files with the same name in /usr/lib/. Files in /run overwrite files with the same name in /etc/ 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 @@ + /usr/lib/tmpfiles.d/*.conf /etc/tmpfiles.d/*.conf + /run/tmpfiles.d/*.conf Description systemd-tmpfiles uses the - configuration files in - /etc/tmpfiles.d/ 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 /run - or /tmp. Each configuration file - is named in the style of - /etc/tmpfiles.d/<program>.conf. + or /tmp. Configuration Format + Each configuration file is named in the style of + <program>.conf. + Files in /etc/ overwrite + files with the same name in /usr/lib/. + Files in /run overwrite files with + the same name in /etc/ and + /usr/lib/. Packages should install their + configuration files in /usr/lib/, files + in /etc/ 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. + The configuration format is one line per path containing action, mode, ownership and age fields: @@ -181,10 +196,12 @@ d /run/user 0755 root root 10d us - If multiple integers and units are specified the time values are summed up. - - The age field only applies to lines starting with d, D and x. If omitted or set to - no automatic clean-up is done. + If multiple integers and units are specified the time + values are summed up. + The age field only applies to lines starting with + d, D and x. If omitted or set to - no automatic clean-up + is done. 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,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;