forked from pool/systemd
70c63e98f9
- mark more subpackages as !bootstrap for systemd-mini usage. - spec : remove --with-firmware-path, firmware loader was removed in v217 - spec: remove --disable-multi-seat-x, gone.(fixed in xorg) - spec: Do not enable systemd-readahead-collect.service and systemd-readahead-replay.service as these do not exist anymore. - spec: drop timedate-add-support-for-openSUSE-version-of-etc-sysconfig.patch Yast was fixed to write all timezone changes exactly how timedated expects things to be done. - spec: remove handle-etc-HOSTNAME.patch, since late 2014 the netcfg package handles the migration from /etc/HOSTNAME to /etc/hostname and owns both files. -spec: remove boot.udev and systemd-journald.init as they currently serve no purpose. - suse-sysv-bootd-support.diff: Remove HAVE_SYSVINIT conditions, we are in sysvcompat-only codepath, also remove the code targetting other distributions, never compiled as the TARGET_$DISTRO macros are never defined. - systemd-powerd-initctl-support.patch guard with HAVE_SYSV_COMPAT - set-and-use-default-logconsole.patch: fix HAVE_SYSV_COMPAT guards - insserv-generator.patch: Only build when sysvcompat is enabled - vhangup-on-all-consoles.patch add a comment indicating this is a workaround for a kernel bug. - spec: Add option to allow disabling sysvinit compat at build time. - spec: Add option to enable resolved at build time. - spec: Remove all %ifs for !factory products, current systemd releases can neither be built nor installed in older products without upgrading several components of the base system. (removed: 1008-add-msft-compability-rules.patch was only for =< 13.1) - spec: remove all dummy "aliases" to /etc/init.d, that made sense only when those init scripts still existed. (dummy localfs.service source: gone) OBS-URL: https://build.opensuse.org/request/show/286653 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=215
86 lines
3.8 KiB
Diff
86 lines
3.8 KiB
Diff
---
|
|
man/tmpfiles.d.xml | 3 +++
|
|
src/tmpfiles/tmpfiles.c | 48 ++++++++++++++++++++++++++++++++++++++++--------
|
|
2 files changed, 43 insertions(+), 8 deletions(-)
|
|
|
|
Index: systemd/man/tmpfiles.d.xml
|
|
===================================================================
|
|
--- systemd.orig/man/tmpfiles.d.xml
|
|
+++ systemd/man/tmpfiles.d.xml
|
|
@@ -489,6 +489,9 @@
|
|
<varname>f</varname>, <varname>F</varname>, and
|
|
<varname>w</varname> may be used to specify a short string that
|
|
is written to the file, suffixed by a newline. For
|
|
+ <varname>x</varname>, <varname>X</varname>, a comma separated list of
|
|
+ usernames. If given, only paths belonging to these users will be excluded
|
|
+ during directory cleanup. Ignored for all other lines. For
|
|
<varname>C</varname>, specifies the source file or
|
|
directory. For <varname>t</varname> determines extended
|
|
attributes to be set. For <varname>a</varname> determines
|
|
Index: systemd/src/tmpfiles/tmpfiles.c
|
|
===================================================================
|
|
--- systemd.orig/src/tmpfiles/tmpfiles.c
|
|
+++ systemd/src/tmpfiles/tmpfiles.c
|
|
@@ -345,6 +345,7 @@ static int dir_cleanup(
|
|
struct timespec times[2];
|
|
bool deleted = false;
|
|
int r = 0;
|
|
+ Item *found = NULL;
|
|
|
|
while ((dent = readdir(d))) {
|
|
struct stat s;
|
|
@@ -395,14 +396,45 @@ static int dir_cleanup(
|
|
}
|
|
|
|
/* Is there an item configured for this path? */
|
|
- if (hashmap_get(items, sub_path)) {
|
|
- log_debug("Ignoring \"%s\": a separate entry exists.", sub_path);
|
|
- continue;
|
|
- }
|
|
-
|
|
- if (find_glob(globs, sub_path)) {
|
|
- log_debug("Ignoring \"%s\": a separate glob exists.", sub_path);
|
|
- continue;
|
|
+ bool found_glob = false;
|
|
+ found = hashmap_get(items, sub_path);
|
|
+ if (!found) {
|
|
+ found_glob = true;
|
|
+ found = find_glob(globs, sub_path);
|
|
+ }
|
|
+ if (found) {
|
|
+ struct passwd *pw;
|
|
+ char *userfound = NULL, *args;
|
|
+ bool match = false;
|
|
+ uid_t uid = -1;
|
|
+
|
|
+ /* evaluate username arguments in ignore statements */
|
|
+ if ((found->type != IGNORE_PATH && found->type != IGNORE_DIRECTORY_PATH) ||
|
|
+ !found->argument) {
|
|
+ if (found_glob)
|
|
+ log_debug("Ignoring \"%s\": a separate glob exists.", sub_path);
|
|
+ else
|
|
+ log_debug("Ignoring \"%s\": a separate entry exists.", sub_path);
|
|
+ continue;
|
|
+ }
|
|
+ args = strdup(found->argument);
|
|
+ assert_se(args != NULL);
|
|
+ while ((userfound = strsep(&args, ",")) != NULL) {
|
|
+ pw = getpwnam(userfound);
|
|
+ if (pw == NULL) {
|
|
+ log_error("Unknown user '%s' in ignore statement.", userfound);
|
|
+ continue;
|
|
+ }
|
|
+ uid = pw->pw_uid;
|
|
+ if (s.st_uid == uid) {
|
|
+ match = true;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ if (match) {
|
|
+ found = NULL;
|
|
+ continue;
|
|
+ }
|
|
}
|
|
|
|
if (S_ISDIR(s.st_mode)) {
|