Initialize for systemd

This commit is contained in:
zyppe 2024-02-05 14:59:02 +08:00
commit 2de24fe84c
43 changed files with 14931 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
systemd-v249.17+suse.218.g2cb4d40f1c.tar.xz

1
.systemd.metadata Normal file
View file

@ -0,0 +1 @@
0c67d91505a6aa5709b3f51f6957c55b2b32113f999dcdf6c8effc6e17e970e9 systemd-v249.17+suse.218.g2cb4d40f1c.tar.xz

View file

@ -0,0 +1,347 @@
From 4ff82a9455d7b6672e79f2938728a3a8299c3158 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Fri, 22 Jan 2021 14:57:08 +0100
Subject: [PATCH 01/11] conf-parser: introduce 'early' drop-ins
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
As formerly known as "downstream conf file drop-ins should never override main
user conf file".
Previously all drop-ins, including those shipped by downstream, shipped in
/usr, could override user's main configuration file (located in /etc) because
the main file was always parsed first.
This was problematic for downstreams because their customization should never
override the users one in general. Therefore the only way to make this logic
usable was by teaching users to never use the main conf files and to put all
theirs settings in drop-ins with a higher priority than the one downsteam would
use. However customizing the defaults through the main conf file is something
very well established since a long time hence this is not something
conceivable.
This patch reworks the way we parse configuration files by introducing "early"
conf files (idea from Zbigniew Jędrzejewski-Szmek), which always have a
priority lower than the main config file and hence other conf file drop-ins
too.
Early conf files can be located in any locations where regular conf snippets
can be installed and are sorted between them using the same sorting rules that
apply to other conf files. A conf file is considered as an early one if its
filename is prefixed with "__" (double underscore).
Hence for example, drop-in "/usr/lib/systemd/logind.conf.d/__99-foo.conf" will
always be parsed before:
/etc/systemd/logind.conf
/etc/systemd/logind.conf.d/00-foo.conf
/usr/lib/systemd/logind.conf.d/00-foo.conf
This change isn't backwards-compatible, but the '__' prefix is something that
is unlikely used. Hence the risk should be very low.
Unfortunately upstream is not seing this problem as a serious one and accept
that vendors' configuration files can take precedence over the main
configuration files (placed in /etc). See the following links for the
related discussions:
https://github.com/systemd/systemd/issues/2121 (initial issue report)
https://github.com/systemd/systemd/pull/17161 (first attempt to solve this issue)
https://github.com/systemd/systemd/pull/18347 (introduction of early drop-in)
Since SUSE heavily relies on drop-ins to customize some of the upstream default
settings, there was no other choice than to diverge from upstream in this
regard.
But it should be noted that these early drop-ins are strictly reserved for SUSE
own purpose only. IOW users should never use them and early drop-ins should
never be created in /etc but only in /usr. We reserve the right to change or
drop this feature at any time.
Fixes: #2121
---
src/shared/conf-parser.c | 48 ++++++++++--
src/test/test-conf-parser.c | 152 ++++++++++++++++++++++++++++++++++++
2 files changed, 195 insertions(+), 5 deletions(-)
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index d0ac1b2660..cb453fa50d 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -430,6 +430,7 @@ int config_parse(
static int config_parse_many_files(
const char* const* conf_files,
+ char **early_files,
char **files,
const char *sections,
ConfigItemLookup lookup,
@@ -442,6 +443,12 @@ static int config_parse_many_files(
char **fn;
int r;
+ STRV_FOREACH(fn, early_files) {
+ r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &mtime);
+ if (r < 0)
+ return r;
+ }
+
/* First read the first found main config file. */
STRV_FOREACH(fn, (char**) conf_files) {
r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &mtime);
@@ -464,6 +471,28 @@ static int config_parse_many_files(
return 0;
}
+static int config_parse_split_conf_files(char **files, char ***early_files, char ***late_files) {
+ char **f;
+
+ assert(files);
+ assert(early_files);
+ assert(late_files);
+
+ STRV_FOREACH(f, files) {
+ char ***s, *p;
+
+ p = strdup(*f);
+ if (!p)
+ return log_oom();
+
+ s = startswith(basename(*f), "__") ? early_files : late_files;
+ if (strv_push(s, p) < 0)
+ return log_oom();
+ }
+
+ return 0;
+}
+
/* Parse each config file in the directories specified as nulstr. */
int config_parse_many_nulstr(
const char *conf_file,
@@ -475,15 +504,19 @@ int config_parse_many_nulstr(
void *userdata,
usec_t *ret_mtime) {
- _cleanup_strv_free_ char **files = NULL;
+ _cleanup_strv_free_ char **files = NULL, **early_files = NULL, **late_files = NULL;
int r;
r = conf_files_list_nulstr(&files, ".conf", NULL, 0, conf_file_dirs);
if (r < 0)
return r;
- return config_parse_many_files(STRV_MAKE_CONST(conf_file),
- files, sections, lookup, table, flags, userdata,
+ r = config_parse_split_conf_files(files, &early_files, &late_files);
+ if (r < 0)
+ return r;
+
+ return config_parse_many_files(STRV_MAKE_CONST(conf_file), early_files, late_files,
+ sections, lookup, table, flags, userdata,
ret_mtime);
}
@@ -499,8 +532,8 @@ int config_parse_many(
void *userdata,
usec_t *ret_mtime) {
+ _cleanup_strv_free_ char **files = NULL, **early_files = NULL, **late_files = NULL;
_cleanup_strv_free_ char **dropin_dirs = NULL;
- _cleanup_strv_free_ char **files = NULL;
const char *suffix;
int r;
@@ -513,7 +546,12 @@ int config_parse_many(
if (r < 0)
return r;
- return config_parse_many_files(conf_files, files, sections, lookup, table, flags, userdata, ret_mtime);
+ r = config_parse_split_conf_files(files, &early_files, &late_files);
+ if (r < 0)
+ return r;
+
+ return config_parse_many_files(conf_files, early_files, late_files,
+ sections, lookup, table, flags, userdata, ret_mtime);
}
#define DEFINE_PARSER(type, vartype, conv_func) \
diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c
index 5da864347e..77d9f28a79 100644
--- a/src/test/test-conf-parser.c
+++ b/src/test/test-conf-parser.c
@@ -5,6 +5,9 @@
#include "fs-util.h"
#include "log.h"
#include "macro.h"
+#include "mkdir.h"
+#include "path-util.h"
+#include "rm-rf.h"
#include "string-util.h"
#include "strv.h"
#include "tmpfile-util.h"
@@ -385,6 +388,152 @@ static void test_config_parse(unsigned i, const char *s) {
}
}
+static void setup_conf_files(const char *root, bool is_main, char **conf_files, char ***ret_conf_dirs) {
+ char **path;
+
+ /* If 'is_main' is true then 'conf_files' should only contain an entry
+ * for the main conf file. */
+ if (is_main)
+ assert_se(strv_length(conf_files) <= 1);
+
+ STRV_FOREACH(path, conf_files) {
+ _cleanup_free_ char *abspath = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+
+ abspath = path_join(root, *path);
+ assert_se(abspath);
+
+ (void) mkdir_parents(abspath, 0755);
+
+ f = fopen(abspath, "w");
+ assert_se(f);
+ fprintf(f,
+ "[Section]\n"
+ "name=%s\n",
+ *path);
+
+ if (!is_main)
+ fprintf(f,
+ "%s=%s\n",
+ startswith(basename(*path), "__") ? "early" : "late",
+ *path);
+
+ if (ret_conf_dirs) {
+ char *d;
+
+ assert_se((d = dirname_malloc(abspath)));
+ assert_se(strv_push(ret_conf_dirs, d) == 0);
+ }
+ }
+
+ if (ret_conf_dirs) {
+ strv_uniq(*ret_conf_dirs);
+ strv_sort(*ret_conf_dirs);
+ }
+}
+
+static void test_config_parse_many_one(bool nulstr, const char *main, char **conf_files,
+ const char *name, const char *early, const char *late) {
+
+ _cleanup_free_ char *parsed_name = NULL, *parsed_early = NULL, *parsed_late = NULL;
+ _cleanup_strv_free_ char **conf_dirs = NULL;
+ _cleanup_free_ char *conf_dirs_nulstr = NULL;
+ char *conf_file;
+ char *tmp_dir;
+ size_t size;
+ int r;
+
+ const ConfigTableItem items[] = {
+ { "Section", "name", config_parse_string, 0, &parsed_name},
+ { "Section", "late", config_parse_string, 0, &parsed_late},
+ { "Section", "early", config_parse_string, 0, &parsed_early},
+ };
+
+ tmp_dir = strdupa("/tmp/test-conf-parser-XXXXXX");
+ assert_se(mkdtemp(tmp_dir));
+
+ setup_conf_files(tmp_dir, true, STRV_MAKE(main), NULL);
+ setup_conf_files(tmp_dir, false, conf_files, &conf_dirs);
+
+ conf_file = main ? strjoina(tmp_dir, "/", main) : NULL;
+
+ if (nulstr) {
+ r = strv_make_nulstr(conf_dirs, &conf_dirs_nulstr, &size);
+ assert_se(r == 0);
+
+ r = config_parse_many_nulstr(conf_file, conf_dirs_nulstr,
+ "Section\0",
+ config_item_table_lookup, items,
+ CONFIG_PARSE_WARN,
+ NULL,
+ NULL);
+ } else {
+ r = config_parse_many(STRV_MAKE_CONST(conf_file),
+ (const char * const*) conf_dirs, "",
+ "Section\0",
+ config_item_table_lookup, items,
+ CONFIG_PARSE_WARN,
+ NULL,
+ NULL);
+ }
+
+ assert_se(r == 0);
+ assert_se((!name && !parsed_name) || streq(name, parsed_name));
+ assert_se((!late && !parsed_late) || streq(late, parsed_late));
+ assert_se((!early && !parsed_early) || streq(early, parsed_early));
+
+ assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
+}
+
+static void test_config_parse_many(bool nulstr) {
+ log_info("== %s%s ==", __func__, nulstr ? "_nulstr" : "");
+
+ test_config_parse_many_one(nulstr, NULL, NULL, NULL, NULL, NULL);
+
+ test_config_parse_many_one(nulstr,
+ "dir/main.conf", NULL,
+ "dir/main.conf", NULL, NULL);
+
+ test_config_parse_many_one(nulstr,
+ NULL, STRV_MAKE("dir1/50-foo.conf"),
+ "dir1/50-foo.conf", NULL, "dir1/50-foo.conf");
+
+ test_config_parse_many_one(nulstr,
+ NULL, STRV_MAKE("dir1/__50-foo.conf"),
+ "dir1/__50-foo.conf", "dir1/__50-foo.conf", NULL);
+
+ test_config_parse_many_one(nulstr,
+ NULL, STRV_MAKE("dir1/10-foo.conf", "dir1/50-bar.conf"),
+ "dir1/50-bar.conf", NULL, "dir1/50-bar.conf");
+
+ test_config_parse_many_one(nulstr,
+ NULL, STRV_MAKE("dir1/50-foo.conf", "dir2/10-bar.conf"),
+ "dir1/50-foo.conf", NULL, "dir1/50-foo.conf");
+
+ test_config_parse_many_one(nulstr,
+ NULL, STRV_MAKE("dir1/10-foo.conf", "dir2/10-foo.conf"),
+ "dir1/10-foo.conf", NULL, "dir1/10-foo.conf");
+
+ /* Early conf files should never override the main one whatever their
+ * priority/location. */
+ test_config_parse_many_one(nulstr,
+ "dir/10-main.conf",
+ STRV_MAKE("dir1/__10-foo.conf", "dir2/__99-foo.conf"),
+ "dir/10-main.conf", "dir2/__99-foo.conf", NULL);
+
+ /* Late conf files always take precendence over the early conf files
+ * and the main one. */
+ test_config_parse_many_one(nulstr,
+ "dir/50-main.conf", STRV_MAKE("dir1/10-foo.conf"),
+ "dir1/10-foo.conf", NULL, "dir1/10-foo.conf");
+
+ test_config_parse_many_one(nulstr,
+ "dir/10-main.conf",
+ STRV_MAKE("dir1/__10-foo.conf", "dir2/__99-foo.conf",
+ "dir2/10-foo.conf"),
+ "dir2/10-foo.conf", "dir2/__99-foo.conf", "dir2/10-foo.conf");
+}
+
int main(int argc, char **argv) {
unsigned i;
@@ -407,5 +556,8 @@ int main(int argc, char **argv) {
for (i = 0; i < ELEMENTSOF(config_file); i++)
test_config_parse(i, config_file[i]);
+ test_config_parse_many(true);
+ test_config_parse_many(false);
+
return 0;
}
--
2.26.2

View file

@ -0,0 +1,27 @@
From ddf3a821b51fbd3064914eb00a03bbecce9ee361 Mon Sep 17 00:00:00 2001
From: Thomas Blume <thomas.blume@suse.com>
Date: Tue, 25 Mar 2014 13:08:56 +0000
Subject: [PATCH 03/11] rc-local: fix ordering startup for
/etc/init.d/boot.local
[tblume: fixes bnc#869142]
---
units/rc-local.service.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/units/rc-local.service.in b/units/rc-local.service.in
index 55e83dfe00..8b20f8d1af 100644
--- a/units/rc-local.service.in
+++ b/units/rc-local.service.in
@@ -13,7 +13,7 @@
Description={{RC_LOCAL_PATH}} Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable={{RC_LOCAL_PATH}}
-After=network.target
+After=basic.target
[Service]
Type=forking
--
2.26.2

View file

@ -0,0 +1,42 @@
From 9e6a1f4b085b29abaf90ecd05859537b837b39fe Mon Sep 17 00:00:00 2001
From: Thomas Blume <Thomas.Blume@suse.com>
Date: Wed, 4 May 2016 17:40:04 +0200
Subject: [PATCH 8/8] sysv-generator: translate "Required-Start" into a "Wants"
dependency
'Required-Start:' used to be supported by insserv but this functionality was
dropped when insserv was rewritten into a compat perl wrapper (insserv-compat),
which happened when systemd was introduced in SUSE, I guess.
It's been decided to add back the support in systemd instead of insserv-compat,
see the comments in bsc#857204.
[tblume: Port of SLES12SP1 patch 0018-Make-LSB-Skripts-know-about-Required-and-Should.patch]
[wfink: fixes bsc#857204]
---
src/sysv-generator/sysv-generator.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index bf23c48662..c6e1953839 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -409,8 +409,13 @@ static int handle_dependencies(SysvStub *s, unsigned line, const char *full_text
return log_oom();
r = strv_extend(&s->wants, m);
- } else
+ } else {
r = strv_extend(is_before ? &s->before : &s->after, m);
+
+ if (startswith_no_case(full_text, "Required-Start:"))
+ r = strv_extend(&s->wants, m);
+ }
+
if (r < 0)
return log_oom();
}
--
2.31.1

View file

@ -0,0 +1,60 @@
From dedd52f920cf7ae718bb31ac7286d3f7314540c6 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Fri, 10 Jun 2016 15:19:57 +0200
Subject: [PATCH 09/11] pid1: handle console specificities/weirdness for s390
arch
The 3270 console on S/390 can do color but not the 3215 console.
Partial forward port of
0001-On_s390_con3270_disable_ANSI_colour_esc.patch from SLE12-SP1. A
bunch of the previous code has been dropped since some changes
imported from upsteam made them uneeded.
The remaining bits are probably hackish but at least they are now
minimal.
It was an attempt to address bnc#860937. And yes turning the console
color mode off by passing $TERM=dumb via the kernel command line would
have been much more easier and enough.
This is actually implemented by recent systemd. There's also another
command line option: systemd.log_color=off.
See also a short discussion which happened on @systemd-maintainers
whose $subject is "[PATCH] support conmode setting on command line".
[fbui: fixes bsc#860937]
---
src/basic/terminal-util.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c
index d769423d6e..1a65391146 100644
--- a/src/basic/terminal-util.c
+++ b/src/basic/terminal-util.c
@@ -779,7 +779,20 @@ bool tty_is_vc_resolve(const char *tty) {
}
const char *default_term_for_tty(const char *tty) {
- return tty && tty_is_vc_resolve(tty) ? "linux" : "vt220";
+ if (tty && tty_is_vc_resolve(tty))
+ return "linux";
+
+#if defined (__s390__) || defined (__s390x__)
+ if (tty && tty_is_console(tty)) {
+ _cleanup_free_ char *mode = NULL;
+
+ /* Simply return "dumb" in case of OOM. */
+ (void) proc_cmdline_get_key("conmode", 0, &mode);
+ (void) proc_cmdline_value_missing("conmode", mode);
+ return streq_ptr(mode, "3270") ? "ibm327x" : "dumb";
+ }
+#endif
+ return "vt220";
}
int fd_columns(int fd) {
--
2.26.2

View file

@ -0,0 +1,510 @@
From 212aa5e819ced67e152a4efc43e0fab38a3f60a0 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Wed, 3 Mar 2021 17:34:39 +0100
Subject: [PATCH 1001/1001] udev: use lock when selecting the highest priority
devlink
Commit 30f6dce62cb3a738b20253f2192270607c31b55b introduced a lock-less
algorithm, which is a kind of spinlock in userspace spinning on a heavy loop
(!?!), that is supposed to fix the race that might happen when multiple
workers/devices claim for the same symlink.
But the algorithm is boggus as every worker will prefer itself and will try to
"steal" the link from another worker with the same priority.
Rather than trying to fix the algorithm and close all possible races, let's use
a much simplest approach which consists in using a lock. This was originally
implemented by Martin Wilck: https://github.com/systemd/systemd/pull/8667 but
somehow upstream preferred the more complex lock-less algo without any proof of
benefits (quite the opposite since there're only drawback AFAICS).
In fact the figures we collected so far tends to show that the lock approach is
even faster than the racy version without any fix.
This patch basically drop the lock-less algo introduced by commit
30f6dce62cb3a738b20253f2192270607c31b55b and reuses Martin's lock approach with
some minor improvements.
Compare to the old implementation (before commit 30f6dce62cb3a738b20253f21), it
changes the moment when the symlink are created: it's now done *after* udev DB
has been updated, hence removing the risk for another worker to overwrite a
just created symlink with a higher priority which has not yet been registed in
the DB. Latest versions of upstream calls update_devnode() twice, see
https://github.com/systemd/systemd/pull/19560#issuecomment-836693914 for the
"rationale".
Update v2:
----------
v249.13 includes a bunch of reworks of this lock-less algorithm, which confirm
how this design was a bad idea (upstream eventually got rid of it and replaced
it with the lock approach since v252). This patch was rebased to drop these
changes as they're useless when the link directories are protected with locks.
v249.13 also introduced a new format for the link directory entries. I'm not
sure how relevant such changes are for a stable release but it increases the
risk of regression significantly. So this part was also dropped.
[fbui: fixes bsc#1181192]
Update v3:
---------
Optimize the case where hundred workers claim the same symlink with the same
priority.
Each time a new device claimed a symlink, the worker searched for the device
claiming the symlink with the highest prio by examining the prio of each device
(including the new one) and recreate the symlink accordingly. However this can
be improved by stopping the search as soon as it encounters a device with the
same prio since in this case it can assume that the symlink is currently owned
by a device with equal or greater prio.
[fbui: fixes bsc#1203141]
---
src/udev/udev-event.c | 9 +-
src/udev/udev-node.c | 321 ++++++++++--------------------------------
2 files changed, 82 insertions(+), 248 deletions(-)
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index 2661ed7933..173cd37618 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -1051,10 +1051,6 @@ int udev_event_execute_rules(
if (r < 0)
return r;
- r = update_devnode(event);
- if (r < 0)
- return r;
-
/* preserve old, or get new initialization timestamp */
r = device_ensure_usec_initialized(dev, event->dev_db_clone);
if (r < 0)
@@ -1069,8 +1065,11 @@ int udev_event_execute_rules(
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
- device_set_is_initialized(dev);
+ r = update_devnode(event);
+ if (r < 0)
+ return r;
+ device_set_is_initialized(dev);
return 0;
}
diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c
index d9309efa25..7be933a90f 100644
--- a/src/udev/udev-node.c
+++ b/src/udev/udev-node.c
@@ -17,26 +17,19 @@
#include "format-util.h"
#include "fs-util.h"
#include "hexdecoct.h"
+#include "lockfile-util.h"
#include "mkdir.h"
-#include "parse-util.h"
#include "path-util.h"
-#include "random-util.h"
#include "selinux-util.h"
#include "smack-util.h"
#include "stat-util.h"
#include "stdio-util.h"
#include "string-util.h"
#include "strxcpyx.h"
-#include "time-util.h"
#include "udev-node.h"
#include "user-util.h"
#define CREATE_LINK_MAX_RETRIES 128
-#define LINK_UPDATE_MAX_RETRIES 128
-#define CREATE_STACK_LINK_MAX_RETRIES 128
-#define UPDATE_TIMESTAMP_MAX_RETRIES 128
-#define MAX_RANDOM_DELAY (250 * USEC_PER_MSEC)
-#define MIN_RANDOM_DELAY ( 50 * USEC_PER_MSEC)
#define UDEV_NODE_HASH_KEY SD_ID128_MAKE(b9,6a,f1,ce,40,31,44,1a,9e,19,ec,8b,ae,f3,e3,2f)
static int create_symlink(const char *target, const char *slink) {
@@ -122,8 +115,14 @@ static int link_find_prioritized(sd_device *dev, bool add, const char *stackdir,
assert(stackdir);
assert(ret);
- /* Find device node of device with highest priority. This returns 1 if a device found, 0 if no
- * device found, or a negative errno. */
+ /* When 'add' is true, search for a device having the same or a higher prio. If such a device is
+ * found, return 0 and 'ret' is unchanged. Otherwise return 1 and 'ret' contains the device node of
+ * the passed device.
+ *
+ * When 'add' is false, find device node of device with highest priority. This returns 1 if a device
+ * found 0 if no device found.
+ *
+ * In both cases it returns a negative errno in case of errors. */
if (add) {
const char *devnode;
@@ -139,6 +138,8 @@ static int link_find_prioritized(sd_device *dev, bool add, const char *stackdir,
target = strdup(devnode);
if (!target)
return -ENOMEM;
+
+ log_device_debug(dev, "Attempting to claim '%s' with priority %i", stackdir, priority);
}
dir = opendir(stackdir);
@@ -157,67 +158,50 @@ static int link_find_prioritized(sd_device *dev, bool add, const char *stackdir,
return r;
FOREACH_DIRENT_ALL(dent, dir, break) {
- _cleanup_free_ char *path = NULL, *buf = NULL;
- int tmp_prio;
+ _cleanup_(sd_device_unrefp) sd_device *dev_db = NULL;
+ const char *devnode;
+ int db_prio = 0;
+ if (dent->d_name[0] == '\0')
+ break;
if (dent->d_name[0] == '.')
continue;
- /* skip ourself */
+ /* did we find ourself? */
if (streq(dent->d_name, id))
continue;
- path = path_join(stackdir, dent->d_name);
- if (!path)
- return -ENOMEM;
-
- if (readlink_malloc(path, &buf) >= 0) {
- char *devnode;
-
- /* New format. The devnode and priority can be obtained from symlink. */
-
- devnode = strchr(buf, ':');
- if (!devnode || devnode == buf)
- continue;
+ log_device_debug(dev, "Found '%s' claiming '%s'", dent->d_name, stackdir);
- *(devnode++) = '\0';
- if (!path_startswith(devnode, "/dev"))
- continue;
-
- if (safe_atoi(buf, &tmp_prio) < 0)
- continue;
-
- if (target && tmp_prio <= priority)
- continue;
-
- r = free_and_strdup(&target, devnode);
- if (r < 0)
- return r;
- } else {
- _cleanup_(sd_device_unrefp) sd_device *tmp_dev = NULL;
- const char *devnode;
+ if (sd_device_new_from_device_id(&dev_db, dent->d_name) < 0)
+ continue;
- /* Old format. The devnode and priority must be obtained from uevent and
- * udev database files. */
+ if (sd_device_get_devname(dev_db, &devnode) < 0)
+ continue;
- if (sd_device_new_from_device_id(&tmp_dev, dent->d_name) < 0)
- continue;
+ if (device_get_devlink_priority(dev_db, &db_prio) < 0)
+ continue;
- if (device_get_devlink_priority(tmp_dev, &tmp_prio) < 0)
- continue;
+ if (target && db_prio < priority)
+ continue;
- if (target && tmp_prio <= priority)
- continue;
+ if (add) {
+ assert(target);
+ /* Exit early as we found an existing device claiming the symlink with same or higher
+ * prio. */
+ log_device_debug(dev, "Giving up '%s' in favor of %s (prio=%i)", stackdir, dent->d_name, db_prio);
+ return 0;
+ }
- if (sd_device_get_devname(tmp_dev, &devnode) < 0)
- continue;
+ if (target && db_prio == priority)
+ continue;
- r = free_and_strdup(&target, devnode);
- if (r < 0)
- return r;
- }
+ log_device_debug(dev_db, "Device claims priority %i for '%s'", db_prio, stackdir);
- priority = tmp_prio;
+ r = free_and_strdup(&target, devnode);
+ if (r < 0)
+ return r;
+ priority = db_prio;
}
*ret = TAKE_PTR(target);
@@ -266,160 +250,12 @@ toolong:
return size - 1;
}
-static int update_timestamp(sd_device *dev, const char *path, struct stat *prev) {
- assert(path);
- assert(prev);
-
- /* Even if a symlink in the stack directory is created/removed, the mtime of the directory may
- * not be changed. Why? Let's consider the following situation. For simplicity, let's assume
- * there exist two udev workers (A and B) and all of them calls link_update() for the same
- * devlink simultaneously.
- *
- * 1. A creates/removes a symlink in the stack directory.
- * 2. A calls the first stat() in the loop of link_update().
- * 3. A calls link_find_prioritized().
- * 4. B creates/removes another symlink in the stack directory, so the result of the step 3 is outdated.
- * 5. B finishes link_update().
- * 6. A creates/removes devlink according to the outdated result in the step 3.
- * 7. A calls the second stat() in the loop of link_update().
- *
- * If these 7 steps are processed in this order within a short time period that kernel's timer
- * does not increase, then even if the contents in the stack directory is changed, the results
- * of two stat() called by A shows the same timestamp, and A cannot detect the change.
- *
- * By calling this function after creating/removing symlinks in the stack directory, the
- * timestamp of the stack directory is always increased at least in the above step 5, so A can
- * detect the update. */
-
- if ((prev->st_mode & S_IFMT) == 0)
- return 0; /* Does not exist, or previous stat() failed. */
-
- for (unsigned i = 0; i < UPDATE_TIMESTAMP_MAX_RETRIES; i++) {
- struct stat st;
-
- if (stat(path, &st) < 0)
- return -errno;
-
- if (!stat_inode_unmodified(prev, &st))
- return 0;
-
- log_device_debug(dev,
- "%s is modified, but its timestamp is not changed, "
- "updating timestamp after 10ms.",
- path);
-
- (void) usleep(10 * USEC_PER_MSEC);
- if (utimensat(AT_FDCWD, path, NULL, 0) < 0)
- return -errno;
- }
-
- return -ELOOP;
-}
-
-static int update_stack_directory(sd_device *dev, const char *dirname, bool add) {
- _cleanup_free_ char *filename = NULL, *data = NULL, *buf = NULL;
- const char *devname, *id;
- struct stat st = {};
- int priority, r;
-
- assert(dev);
- assert(dirname);
-
- r = device_get_device_id(dev, &id);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to get device id: %m");
-
- filename = path_join(dirname, id);
- if (!filename)
- return log_oom_debug();
-
- if (!add) {
- int unlink_error = 0, stat_error = 0;
-
- if (stat(dirname, &st) < 0) {
- if (errno == ENOENT)
- return 0; /* The stack directory is already removed. That's OK. */
- stat_error = -errno;
- }
-
- if (unlink(filename) < 0)
- unlink_error = -errno;
-
- if (rmdir(dirname) >= 0 || errno == ENOENT)
- return 0;
-
- if (unlink_error < 0) {
- if (unlink_error == -ENOENT)
- return 0;
-
- /* If we failed to remove the symlink, then there is almost nothing we can do. */
- return log_device_debug_errno(dev, unlink_error, "Failed to remove %s: %m", filename);
- }
-
- if (stat_error < 0)
- return log_device_debug_errno(dev, stat_error, "Failed to stat %s: %m", dirname);
-
- /* The symlink was removed. Check if the timestamp of directory is changed. */
- r = update_timestamp(dev, dirname, &st);
- if (r < 0 && r != -ENOENT)
- return log_device_debug_errno(dev, r, "Failed to update timestamp of %s: %m", dirname);
-
- return 0;
- }
-
- r = sd_device_get_devname(dev, &devname);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to get device node: %m");
-
- r = device_get_devlink_priority(dev, &priority);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to get priority of device node symlink: %m");
-
- if (asprintf(&data, "%i:%s", priority, devname) < 0)
- return log_oom_debug();
-
- if (readlink_malloc(filename, &buf) >= 0 && streq(buf, data))
- return 0;
-
- if (unlink(filename) < 0 && errno != ENOENT)
- log_device_debug_errno(dev, errno, "Failed to remove %s, ignoring: %m", filename);
-
- for (unsigned j = 0; j < CREATE_STACK_LINK_MAX_RETRIES; j++) {
- /* This may fail with -ENOENT when the parent directory is removed during
- * creating the file by another udevd worker. */
- r = mkdir_p(dirname, 0755);
- if (r == -ENOENT)
- continue;
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to create directory %s: %m", dirname);
-
- if (stat(dirname, &st) < 0) {
- if (errno == ENOENT)
- continue;
- return log_device_debug_errno(dev, errno, "Failed to stat %s: %m", dirname);
- }
-
- if (symlink(data, filename) < 0) {
- if (errno == ENOENT)
- continue;
- return log_device_debug_errno(dev, errno, "Failed to create symbolic link %s: %m", filename);
- }
-
- /* The symlink was created. Check if the timestamp of directory is changed. */
- r = update_timestamp(dev, dirname, &st);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to update timestamp of %s: %m", dirname);
-
- return 0;
- }
-
- return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ELOOP), "Failed to create symbolic link %s: %m", filename);
-}
-
/* manage "stack of names" with possibly specified device priorities */
static int link_update(sd_device *dev, const char *slink_in, bool add) {
- _cleanup_free_ char *slink = NULL, *dirname = NULL;
- const char *slink_name;
+ _cleanup_(release_lock_file) LockFile lf = LOCK_FILE_INIT;
+ _cleanup_free_ char *slink = NULL, *filename = NULL, *dirname = NULL;
+ _cleanup_free_ char *target = NULL;
+ const char *slink_name, *id;
char name_enc[NAME_MAX+1];
int r;
@@ -439,57 +275,56 @@ static int link_update(sd_device *dev, const char *slink_in, bool add) {
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EINVAL),
"Invalid symbolic link of device node: %s", slink);
+ r = device_get_device_id(dev, &id);
+ if (r < 0)
+ return log_device_debug_errno(dev, r, "Failed to get device id: %m");
+
(void) udev_node_escape_path(slink_name, name_enc, sizeof(name_enc));
dirname = path_join("/run/udev/links", name_enc);
if (!dirname)
return log_oom_debug();
- r = update_stack_directory(dev, dirname, add);
- if (r < 0)
- return r;
-
- for (unsigned i = 0; i < LINK_UPDATE_MAX_RETRIES; i++) {
- _cleanup_free_ char *target = NULL;
- struct stat st1 = {}, st2 = {};
-
- if (i > 0) {
- char buf[FORMAT_TIMESPAN_MAX];
- usec_t delay = MIN_RANDOM_DELAY + random_u64_range(MAX_RANDOM_DELAY - MIN_RANDOM_DELAY);
+ filename = path_join(dirname, id);
+ if (!filename)
+ return log_oom_debug();
- log_device_debug(dev, "Directory %s was updated, retrying to update devlink %s after %s.",
- dirname, slink, format_timespan(buf, sizeof(buf), delay, USEC_PER_MSEC));
- (void) usleep(delay);
- }
+ mkdir_parents(dirname, 0755);
+ r = make_lock_file_for(dirname, LOCK_EX, &lf);
+ if (r < 0)
+ return log_error_errno(r, "failed to lock %s", dirname);
- if (stat(dirname, &st1) < 0 && errno != ENOENT)
- return log_device_debug_errno(dev, errno, "Failed to stat %s: %m", dirname);
+ if (!add) {
+ if (unlink(filename) < 0 && errno != ENOENT)
+ log_device_error_errno(dev, errno, "Failed to remove %s, ignoring: %m", filename);
- r = link_find_prioritized(dev, add, dirname, &target);
+ (void) rmdir(dirname);
+ } else {
+ r = touch_file(filename, true, USEC_INFINITY, UID_INVALID, GID_INVALID, 0444);
if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to determine device node with the highest priority for '%s': %m", slink);
- if (r == 0) {
+ return log_device_error_errno(dev, r, "Failed to create %s: %m", filename);
+ }
+
+ r = link_find_prioritized(dev, add, dirname, &target);
+ if (r < 0)
+ return log_device_error_errno(dev, r, "Failed to find highest priority for symlink '%s': %m", slink);
+ if (r == 0) {
+ if (!add) {
log_device_debug(dev, "No reference left for '%s', removing", slink);
- if (unlink(slink) < 0 && errno != ENOENT)
- log_device_debug_errno(dev, errno, "Failed to remove '%s', ignoring: %m", slink);
+ if (unlink(slink) < 0)
+ return log_device_error_errno(dev, errno,
+ "Failed to remove '%s', ignoring: %m", slink);
(void) rmdir_parents(slink, "/dev");
- return 0;
}
-
- r = node_symlink(dev, target, slink);
- if (r < 0)
- return r;
-
- if (stat(dirname, &st2) < 0 && errno != ENOENT)
- return log_device_debug_errno(dev, errno, "Failed to stat %s: %m", dirname);
-
- if (((st1.st_mode & S_IFMT) == 0 && (st2.st_mode & S_IFMT) == 0) ||
- stat_inode_unmodified(&st1, &st2))
- return 0;
+ return 0;
}
- return -ELOOP;
+ r = node_symlink(dev, target, slink);
+ if (r < 0)
+ (void) unlink(filename);
+
+ return r;
}
static int device_get_devpath_by_devnum(sd_device *dev, char **ret) {
--
2.35.3

View file

@ -0,0 +1,183 @@
From 217b7855c3b95c1b20458c58f3e7ef756728d3d5 Mon Sep 17 00:00:00 2001
From: Jeff Mahoney <jeffm@suse.com>
Date: Sun, 27 Jul 2014 14:20:36 +0200
Subject: [PATCH 1002/1007] udev: add option to generate old 'buggy' SCSI
serials
Prior to udev 184, scsi_id would truncate the last character of the model
string when generating the ID_SERIAL value. If a system was installed
prior to that fix being available in udev, there may be configuration
information that refers to the truncated link.
This patch adds a --truncated-serial option and a udev rule will created
the old truncated links.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
[fbui: forward ported from commit b5dafd57359b6e92b35dd419df2b2dd503057ebc]
[fbui: fix error detected by the rule syntax checker in 61-persistent-storage-compat.rules]
[fbui: adjust context]
[fbui: fixes bnc#886852]
---
rules.d/61-persistent-storage-compat.rules | 4 ++++
src/udev/scsi_id/scsi_id.c | 13 ++++++++++++-
src/udev/scsi_id/scsi_id.h | 1 +
src/udev/scsi_id/scsi_serial.c | 17 +++++++++++------
4 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/rules.d/61-persistent-storage-compat.rules b/rules.d/61-persistent-storage-compat.rules
index bd229f619b..a49e5e54eb 100644
--- a/rules.d/61-persistent-storage-compat.rules
+++ b/rules.d/61-persistent-storage-compat.rules
@@ -126,6 +126,10 @@ ENV{DEVTYPE}=="disk", ENV{ID_BUS}=="ata|nvme|scsi", DEVPATH!="*/virtual/*", IMPO
ENV{DEVTYPE}=="disk", ENV{ID_PATH_COMPAT2}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_COMPAT2}"
ENV{DEVTYPE}=="partition", ENV{ID_PATH_COMPAT2}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH_COMPAT2}-part%n"
+# scsi compat links for ATA devices (for compatibility with udev < 184) (bnc#886852)
+KERNEL=="sd*[!0-9]", ENV{ID_BUS}=="ata", PROGRAM=="scsi_id --truncated-serial --whitelisted --replace-whitespace -p0x80 -d$tempnode", RESULT=="?*", ENV{ID_SCSI_COMPAT_TRUNCATED}="$result", SYMLINK+="disk/by-id/scsi-$env{ID_SCSI_COMPAT_TRUNCATED}"
+KERNEL=="sd*[0-9]", ENV{ID_SCSI_COMPAT_TRUNCATED}=="?*", SYMLINK+="disk/by-id/scsi-$env{ID_SCSI_COMPAT_TRUNCATED}-part%n"
+
#
# Generation #2
#
diff --git a/src/udev/scsi_id/scsi_id.c b/src/udev/scsi_id/scsi_id.c
index b2d8154d86..a058880b8d 100644
--- a/src/udev/scsi_id/scsi_id.c
+++ b/src/udev/scsi_id/scsi_id.c
@@ -37,6 +37,7 @@ static const struct option options[] = {
{ "replace-whitespace", no_argument, NULL, 'u' },
{ "sg-version", required_argument, NULL, 's' },
{ "verbose", no_argument, NULL, 'v' },
+ { "truncated-serial", no_argument, NULL, '9' },
{ "version", no_argument, NULL, 'V' }, /* don't advertise -V */
{ "export", no_argument, NULL, 'x' },
{ "help", no_argument, NULL, 'h' },
@@ -48,6 +49,7 @@ static bool dev_specified = false;
static char config_file[MAX_PATH_LEN] = "/etc/scsi_id.config";
static enum page_code default_page_code = PAGE_UNSPECIFIED;
static int sg_version = 4;
+static bool compat_truncated = false;
static bool reformat_serial = false;
static bool export = false;
static char vendor_str[64];
@@ -226,6 +228,7 @@ static void help(void) {
" -g --whitelisted Treat device as whitelisted\n"
" -u --replace-whitespace Replace all whitespace by underscores\n"
" -v --verbose Verbose logging\n"
+ " --truncated-serial truncated serial for compatibility with systems configured with by-id links created by udev < 184\n"
" -x --export Print values as environment keys\n",
program_invocation_short_name);
}
@@ -294,6 +297,10 @@ static int set_options(int argc, char **argv,
log_open();
break;
+ case '9':
+ compat_truncated = true;
+ break;
+
case 'V':
printf("%s\n", GIT_VERSION);
exit(EXIT_SUCCESS);
@@ -430,6 +437,9 @@ static int scsi_id(char *maj_min_dev) {
udev_replace_whitespace(dev_scsi.serial_short, serial_str, sizeof(serial_str)-1);
udev_replace_chars(serial_str, NULL);
printf("ID_SERIAL_SHORT=%s\n", serial_str);
+ udev_replace_whitespace(dev_scsi.serial_compat, serial_str, sizeof(serial_str)-1);
+ udev_replace_chars(serial_str, NULL);
+ printf("ID_SERIAL_COMPAT=%s\n", serial_str);
}
if (dev_scsi.wwn[0] != '\0') {
printf("ID_WWN=0x%s\n", dev_scsi.wwn);
@@ -452,9 +462,10 @@ static int scsi_id(char *maj_min_dev) {
}
if (reformat_serial) {
+ char *p = compat_truncated ? dev_scsi.serial_compat : dev_scsi.serial;
char serial_str[MAX_SERIAL_LEN];
- udev_replace_whitespace(dev_scsi.serial, serial_str, sizeof(serial_str)-1);
+ udev_replace_whitespace(p, serial_str, sizeof(serial_str)-1);
udev_replace_chars(serial_str, NULL);
printf("%s\n", serial_str);
goto out;
diff --git a/src/udev/scsi_id/scsi_id.h b/src/udev/scsi_id/scsi_id.h
index 9ab3341855..b8cb1e5e2e 100644
--- a/src/udev/scsi_id/scsi_id.h
+++ b/src/udev/scsi_id/scsi_id.h
@@ -32,6 +32,7 @@ struct scsi_id_device {
char kernel[64];
char serial[MAX_SERIAL_LEN];
char serial_short[MAX_SERIAL_LEN];
+ char serial_compat[MAX_SERIAL_LEN];
unsigned type;
int use_sg;
diff --git a/src/udev/scsi_id/scsi_serial.c b/src/udev/scsi_id/scsi_serial.c
index 489f5ad16a..04fc5f7cc9 100644
--- a/src/udev/scsi_id/scsi_serial.c
+++ b/src/udev/scsi_id/scsi_serial.c
@@ -83,7 +83,7 @@ static const char hex_str[]="0123456789abcdef";
#define SG_ERR_CAT_OTHER 99 /* Some other error/warning */
static int do_scsi_page80_inquiry(struct scsi_id_device *dev_scsi, int fd,
- char *serial, char *serial_short, int max_len);
+ char *serial, char *serial_short, char *serial_compat, int max_len);
static int sg_err_category_new(int scsi_status, int msg_status, int
host_status, int driver_status, const
@@ -557,7 +557,7 @@ static int do_scsi_page83_inquiry(struct scsi_id_device *dev_scsi, int fd,
unsigned char page_83[SCSI_INQ_BUFF_LEN];
/* also pick up the page 80 serial number */
- do_scsi_page80_inquiry(dev_scsi, fd, NULL, unit_serial_number, MAX_SERIAL_LEN);
+ do_scsi_page80_inquiry(dev_scsi, fd, NULL, unit_serial_number, NULL, MAX_SERIAL_LEN);
memzero(page_83, SCSI_INQ_BUFF_LEN);
retval = scsi_inquiry(dev_scsi, fd, 1, PAGE_83, page_83,
@@ -697,7 +697,7 @@ static int do_scsi_page83_prespc3_inquiry(struct scsi_id_device *dev_scsi, int f
/* Get unit serial number VPD page */
static int do_scsi_page80_inquiry(struct scsi_id_device *dev_scsi, int fd,
- char *serial, char *serial_short, int max_len) {
+ char *serial, char *serial_short, char *serial_compat, int max_len) {
int retval;
int ser_ind;
int i;
@@ -730,9 +730,14 @@ static int do_scsi_page80_inquiry(struct scsi_id_device *dev_scsi, int fd,
ser_ind = append_vendor_model(dev_scsi, serial + 1);
if (ser_ind < 0)
return 1;
+ if (serial_compat)
+ strcpy(serial_compat, serial);
ser_ind++; /* for the leading 'S' */
- for (i = 4; i < len + 4; i++, ser_ind++)
+ for (i = 4; i < len + 4; i++, ser_ind++) {
serial[ser_ind] = buf[i];
+ if (serial_compat)
+ serial_compat[ser_ind - 1] = buf[i];
+ }
}
if (serial_short) {
memcpy(serial_short, buf + 4, len);
@@ -804,7 +809,7 @@ int scsi_get_serial(struct scsi_id_device *dev_scsi, const char *devname,
return 1;
if (page_code == PAGE_80) {
- if (do_scsi_page80_inquiry(dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, len)) {
+ if (do_scsi_page80_inquiry(dev_scsi, fd, dev_scsi->serial, dev_scsi->serial_short, dev_scsi->serial_compat, len)) {
retval = 1;
goto completed;
} else {
@@ -878,7 +883,7 @@ int scsi_get_serial(struct scsi_id_device *dev_scsi, const char *devname,
for (ind = 4; ind <= page0[3] + 3; ind++)
if (page0[ind] == PAGE_80)
if (!do_scsi_page80_inquiry(dev_scsi, fd,
- dev_scsi->serial, dev_scsi->serial_short, len)) {
+ dev_scsi->serial, dev_scsi->serial_short, dev_scsi->serial_compat, len)) {
/*
* Success
*/
--
2.31.1

View file

@ -0,0 +1,113 @@
From 95da8cb13e13d7a85ddcc810784900e71298de6e Mon Sep 17 00:00:00 2001
From: Federico Mena Quintero <federico@gnome.org>
Date: Thu, 16 Jun 2016 17:38:44 -0500
Subject: [PATCH 1003/1007] logind: store a timestamp when the ACPI power
button is pressed
When we get a D-Bus call to shutdown, we'll use the corresponding
timestamp to see if this call is due to GDM responding to the ACPI
power button itself, or just due to any random program calling the
D-Bus shutdown method.
[federico: fixes bsc#981830]
[federico: fixes bsc#888612]
[fbui: fixes bsc#1072933]
---
src/basic/login-util.h | 3 ++-
src/login/logind-action.c | 4 ++++
src/login/logind-dbus.c | 19 +++++++++++++++++--
3 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/src/basic/login-util.h b/src/basic/login-util.h
index 841fd324f1..2b606873e0 100644
--- a/src/basic/login-util.h
+++ b/src/basic/login-util.h
@@ -8,10 +8,11 @@
#define SD_LOGIND_REBOOT_VIA_KEXEC (UINT64_C(1) << 1)
/* For internal use only */
+#define SD_LOGIND_SLEEP_VERB (UINT64_C(1) << 62)
#define SD_LOGIND_INTERACTIVE (UINT64_C(1) << 63)
#define SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC (SD_LOGIND_ROOT_CHECK_INHIBITORS|SD_LOGIND_REBOOT_VIA_KEXEC)
-#define SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_ALL (SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC|SD_LOGIND_INTERACTIVE)
+#define SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_ALL (SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC|SD_LOGIND_INTERACTIVE|SD_LOGIND_SLEEP_VERB)
bool session_id_valid(const char *id);
diff --git a/src/login/logind-action.c b/src/login/logind-action.c
index 8ed066c25e..bc6fffd075 100644
--- a/src/login/logind-action.c
+++ b/src/login/logind-action.c
@@ -7,6 +7,7 @@
#include "bus-util.h"
#include "conf-parser.h"
#include "format-util.h"
+#include "fs-util.h"
#include "logind-action.h"
#include "logind-dbus.h"
#include "logind-session-dbus.h"
@@ -83,6 +84,9 @@ int manager_handle_action(
/* If the key handling is inhibited, don't do anything */
if (inhibit_key > 0) {
+ if (inhibit_key == INHIBIT_HANDLE_POWER_KEY)
+ (void) touch("/run/systemd/acpi-shutdown");
+
if (manager_is_inhibited(m, inhibit_key, INHIBIT_BLOCK, NULL, true, false, 0, NULL)) {
log_debug("Refusing %s operation, %s is inhibited.",
handle_action_to_string(handle),
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 19c3f9bd6e..1f33740357 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1784,6 +1784,7 @@ static int verify_shutdown_creds(
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
bool multiple_sessions, blocked, interactive;
+ bool shutdown_through_acpi;
uid_t uid;
int r;
@@ -1808,7 +1809,19 @@ static int verify_shutdown_creds(
blocked = manager_is_inhibited(m, w, INHIBIT_BLOCK, NULL, false, true, uid, NULL);
interactive = flags & SD_LOGIND_INTERACTIVE;
- if (multiple_sessions && action_multiple_sessions) {
+ shutdown_through_acpi = false;
+ if (access("/run/systemd/acpi-shutdown", F_OK) == 0) {
+ struct stat buf;
+
+ if (!(flags & SD_LOGIND_SLEEP_VERB) &&
+ stat("/run/systemd/acpi-shutdown", &buf) == 0)
+ /* FIXME: this is really ugly. */
+ shutdown_through_acpi = (time(NULL) - buf.st_mtime) <= 65;
+
+ unlink("/run/systemd/acpi-shutdown");
+ }
+
+ if (multiple_sessions && action_multiple_sessions && !shutdown_through_acpi) {
r = bus_verify_polkit_async(message, CAP_SYS_BOOT, action_multiple_sessions, NULL, interactive, UID_INVALID, &m->polkit_registry, error);
if (r < 0)
return r;
@@ -1831,7 +1844,7 @@ static int verify_shutdown_creds(
}
}
- if (!multiple_sessions && !blocked && action) {
+ if (!multiple_sessions && !blocked && action && !shutdown_through_acpi) {
r = bus_verify_polkit_async(message, CAP_SYS_BOOT, action, NULL, interactive, UID_INVALID, &m->polkit_registry, error);
if (r < 0)
return r;
@@ -1903,6 +1916,8 @@ static int method_do_shutdown_or_sleep(
"Sleep verb \"%s\" not supported", sleep_operation_to_string(sleep_operation));
if (r < 0)
return r;
+
+ flags |= SD_LOGIND_SLEEP_VERB;
}
r = verify_shutdown_creds(m, message, w, action, action_multiple_sessions,
--
2.31.1

View file

@ -0,0 +1,74 @@
From 7f1527dfc0e606ddf41738c2d871058903ac5cb4 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Mon, 16 Apr 2018 23:03:27 +0200
Subject: [PATCH 1004/1007] udev: don't create by-partlabel/primary and
.../logical symlinks
These links are created by libstorage / parted by default. They are ambiguous
and may be present hundred- or thousandfold on large systems. They are
meaningless for device identification and may slow down udev processing. They
aren't used anywhere. Don't create them.
A service has been added to detect at boot cases that likely need to be fixed:
a warning is thrown at both the console and syslog to encourage sysadmin to
consult the relevant TID explaining how to permanently fix the issue.
[fbui: added the detection part]
[fbui: fixes bsc#1089761]
---
rules.d/60-persistent-storage.rules | 2 +-
units/detect-part-label-duplicates.service | 16 ++++++++++++++++
units/meson.build | 2 ++
3 files changed, 19 insertions(+), 1 deletion(-)
create mode 100644 units/detect-part-label-duplicates.service
diff --git a/rules.d/60-persistent-storage.rules b/rules.d/60-persistent-storage.rules
index 6ac17f2b64..450c271678 100644
--- a/rules.d/60-persistent-storage.rules
+++ b/rules.d/60-persistent-storage.rules
@@ -119,6 +119,6 @@ ENV{DEVTYPE}=="partition", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-i
# by-partlabel/by-partuuid links (partition metadata)
ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
-ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
+ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", ENV{ID_PART_ENTRY_NAME}!="primary|logical", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
LABEL="persistent_storage_end"
diff --git a/units/detect-part-label-duplicates.service b/units/detect-part-label-duplicates.service
new file mode 100644
index 0000000000..11a187c763
--- /dev/null
+++ b/units/detect-part-label-duplicates.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Detect if the system suffers from bsc#1089761
+ConditionDirectoryNotEmpty=/run/udev/data
+
+[Service]
+RemainAfterExit=true
+StandardOutput=journal+console
+SyslogLevel=warning
+ExecStart=/bin/sh -c " \
+ if [ $(grep -r "E:ID_PART_ENTRY_NAME=primary" /run/udev/data | wc -l) -ge 100 ]; then \
+ echo 'Warning: a high number of partitions uses \"primary\" or \"logical\" as'; \
+ echo 'partition label name, which may cause slow-down in the boot process.'; \
+ echo 'To prevent it, a workaround is temporarly in place but we recommend to'; \
+ echo 'refer to TID #7023057 in order to permanently fix this issue (as the'; \
+ echo 'workaround will be dropped in the future).'; \
+ fi"
diff --git a/units/meson.build b/units/meson.build
index 17e9ead9c1..86e2f77b95 100644
--- a/units/meson.build
+++ b/units/meson.build
@@ -13,6 +13,8 @@ units = [
['veritysetup-pre.target', 'HAVE_LIBCRYPTSETUP'],
['veritysetup.target', 'HAVE_LIBCRYPTSETUP',
'sysinit.target.wants/'],
+ ['detect-part-label-duplicates.service', '',
+ 'sysinit.target.wants/'],
['dev-hugepages.mount', '',
'sysinit.target.wants/'],
['dev-mqueue.mount', '',
--
2.31.1

View file

@ -0,0 +1,42 @@
From 6ec3bc08b0b5b37844e02c37caa72c15d27f98d6 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Tue, 21 Aug 2018 16:21:53 +0200
Subject: [PATCH 1005/1007] udev: optionally disable the generation of the
'partlabel' symlinks
We already addressed bsc#1089761 to prevent the generation of
"primary" or "logical".
But it wasn't enough: some users could also have used their own
name other than "primary" and "logical" of course...
For them, we introduce "udev.no-partlabel-links" kernel command-line
option to prevent the generation of all by-partlabel symlinks
regardless of the name which was choosen.
This option should be *only* used to address performance issue related
to bsc#1089761 because it will be removed as soon as the udev
performance issue will be addressed.
[fbui: fixes bsc#1089761]
---
rules.d/60-persistent-storage.rules | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/rules.d/60-persistent-storage.rules b/rules.d/60-persistent-storage.rules
index 450c271678..ffffbf7bcc 100644
--- a/rules.d/60-persistent-storage.rules
+++ b/rules.d/60-persistent-storage.rules
@@ -119,6 +119,8 @@ ENV{DEVTYPE}=="partition", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-i
# by-partlabel/by-partuuid links (partition metadata)
ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
-ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", ENV{ID_PART_ENTRY_NAME}!="primary|logical", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
+
+IMPORT{cmdline}="udev.no-partlabel-links"
+ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", ENV{ID_PART_ENTRY_NAME}!="primary|logical", ENV{udev.no-partlabel-links}!="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
LABEL="persistent_storage_end"
--
2.31.1

View file

@ -0,0 +1,200 @@
From 296e3938b60610679e333ca5c0757d4ceeb23a87 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Tue, 6 Nov 2018 11:51:26 +0100
Subject: [PATCH 1006/1007] logind: keep backward compatibility with
UserTasksMax= in logind.conf
Since commit 284149392755f086d0a71, UserTasksMax= support has been simply
dropped.
A generator is used to automatically create an appropriate dropin that has the
same effect. However since the snippet is generated in /run, sysadmin is
encouraged to copy it in /etc to make it persistent.
The main advantages to use a generator are:
- sysadmin is aware of this backward incompatible change
- he will be the one who will fix logind.conf manually (to remove the use of
UserTasksMax=)
- he will decide how to name the snippet and possibly merge it with an
existing one
Expect this generator to be dropped in the future.
---
meson.build | 8 ++++
src/login/compat-tasks-max-generator.c | 56 ++++++++++++++++++++++++++
src/login/logind-core.c | 2 +
src/login/logind-gperf.gperf | 2 +-
src/login/logind-user.c | 16 +++++---
src/login/logind.c | 2 +
src/login/logind.h | 3 ++
7 files changed, 82 insertions(+), 7 deletions(-)
create mode 100644 src/login/compat-tasks-max-generator.c
diff --git a/meson.build b/meson.build
index 0760a793ac..40885a81ae 100644
--- a/meson.build
+++ b/meson.build
@@ -2132,6 +2132,14 @@ if conf.get('ENABLE_LOGIND') == 1
install_rpath : rootlibexecdir,
install : true,
install_dir : rootlibexecdir)
+
+ executable('logind-compat-tasks-max-generator',
+ 'src/login/compat-tasks-max-generator.c',
+ include_directories : includes,
+ link_with : [libshared, liblogind_core],
+ install_rpath : rootlibexecdir,
+ install : true,
+ install_dir : systemgeneratordir)
endif
if conf.get('HAVE_PAM') == 1
diff --git a/src/login/compat-tasks-max-generator.c b/src/login/compat-tasks-max-generator.c
new file mode 100644
index 0000000000..2fe1c92ba7
--- /dev/null
+++ b/src/login/compat-tasks-max-generator.c
@@ -0,0 +1,56 @@
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "alloc-util.h"
+#include "dropin.h"
+#include "generator.h"
+#include "logind.h"
+#include "path-util.h"
+
+static int read_manager_configuration(char **user_tasks_max) {
+ Manager m = {};
+ int r;
+
+ manager_reset_config(&m);
+ m.user_tasks_max = NULL;
+
+ r = manager_parse_config_file(&m);
+ if (r < 0)
+ return log_warning_errno(r, "Failed to parse logind.conf: %m");
+
+ if (!m.user_tasks_max)
+ return 0;
+
+ *user_tasks_max = m.user_tasks_max;
+ return 1;
+}
+
+static int run(const char *dest, const char *dest_early, const char *dest_late) {
+ _cleanup_free_ char *p = NULL;
+ char *user_tasks_max;
+ int r = 0;
+
+ umask(0022);
+
+ r = read_manager_configuration(&user_tasks_max);
+ if (r == 0)
+ return EXIT_SUCCESS;
+ if (r < 0)
+ return EXIT_FAILURE;
+
+ p = path_join(dest, "user-.slice.d", "50-limits.conf");
+ if (!p)
+ return EXIT_FAILURE;
+
+ log_warning("Creating %s to keep compatibility\n"
+ "Please copy the snippet in /etc/systemd/system/user-.slice.d/ and remove any uses of UserTasksMax=\n", p);
+
+ r = write_drop_in_format(dest, "user-.slice", 50, "limits",
+ "# Automatically generated by logind-compat-tasks-max-generator\n\n"
+ "[Slice]\nTasksMax=%s", user_tasks_max);
+
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
+DEFINE_MAIN_GENERATOR_FUNCTION(run);
diff --git a/src/login/logind-core.c b/src/login/logind-core.c
index 22031f485a..585971c738 100644
--- a/src/login/logind-core.c
+++ b/src/login/logind-core.c
@@ -53,6 +53,8 @@ void manager_reset_config(Manager *m) {
m->holdoff_timeout_usec = 30 * USEC_PER_SEC;
+ m->user_tasks_max = mfree(m->user_tasks_max);
+
m->idle_action_usec = 30 * USEC_PER_MINUTE;
m->idle_action = HANDLE_IGNORE;
diff --git a/src/login/logind-gperf.gperf b/src/login/logind-gperf.gperf
index 25e429c5a3..0b99c9f58d 100644
--- a/src/login/logind-gperf.gperf
+++ b/src/login/logind-gperf.gperf
@@ -45,4 +45,4 @@ Login.RuntimeDirectoryInodesMax, config_parse_uint64, 0, offse
Login.RemoveIPC, config_parse_bool, 0, offsetof(Manager, remove_ipc)
Login.InhibitorsMax, config_parse_uint64, 0, offsetof(Manager, inhibitors_max)
Login.SessionsMax, config_parse_uint64, 0, offsetof(Manager, sessions_max)
-Login.UserTasksMax, config_parse_compat_user_tasks_max, 0, 0
+Login.UserTasksMax, config_parse_compat_user_tasks_max, 0, offsetof(Manager, user_tasks_max)
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index a2c468e8dd..4b753d8929 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -942,16 +942,20 @@ int config_parse_compat_user_tasks_max(
void *data,
void *userdata) {
+ char **m = data;
+ int r;
+
assert(filename);
assert(lvalue);
assert(rvalue);
- log_syntax(unit, LOG_NOTICE, filename, line, 0,
- "Support for option %s= has been removed.",
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Support for option %s= is deprecated and will be removed.",
lvalue);
- log_info("Hint: try creating /etc/systemd/system/user-.slice.d/50-limits.conf with:\n"
- " [Slice]\n"
- " TasksMax=%s",
- rvalue);
+
+ r = free_and_strdup(m, rvalue);
+ if (r < 0)
+ return log_oom();
+
return 0;
}
diff --git a/src/login/logind.c b/src/login/logind.c
index ec52a57acb..2514e747cd 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -164,6 +164,8 @@ static Manager* manager_unref(Manager *m) {
strv_free(m->kill_only_users);
strv_free(m->kill_exclude_users);
+ free(m->user_tasks_max);
+
free(m->scheduled_shutdown_type);
free(m->scheduled_shutdown_tty);
free(m->wall_message);
diff --git a/src/login/logind.h b/src/login/logind.h
index 761763a476..eefea7c227 100644
--- a/src/login/logind.h
+++ b/src/login/logind.h
@@ -124,6 +124,9 @@ struct Manager {
uint64_t runtime_dir_size;
uint64_t runtime_dir_inodes;
+
+ char *user_tasks_max;
+
uint64_t sessions_max;
uint64_t inhibitors_max;
--
2.31.1

View file

@ -0,0 +1,187 @@
From 3e49abe2fbae626c61af73d163f6e74be54fed2b Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Wed, 30 Sep 2020 21:20:32 +0200
Subject: [PATCH 1007/1007] sysv: restore support for halt.local
This patch basically reverts the following commits:
- commit 44508946534eee032927c263b79464832656dd6e.
"Drop support for /usr/sbin/halt.local"
- commit c0d11245d2bdcf2a4333c3d49c973d83dfbe3791.
"Drop no longer needed halt-local.service.in"
The paths of the scripts in man/systemd-rc-local-generator.xml have been
changed to match those used by SUSE.
The use of halt.local is now deprecated and its usage is logged at notice
level.
---
docs/DISTRO_PORTING.md | 1 +
man/custom-entities.ent.in | 1 +
man/systemd-rc-local-generator.xml | 17 +++++++++++++---
meson.build | 2 ++
meson_options.txt | 2 ++
src/rc-local-generator/rc-local-generator.c | 8 ++++++++
units/halt-local.service.in | 22 +++++++++++++++++++++
units/meson.build | 1 +
8 files changed, 51 insertions(+), 3 deletions(-)
create mode 100644 units/halt-local.service.in
diff --git a/docs/DISTRO_PORTING.md b/docs/DISTRO_PORTING.md
index 2e4782f401..8c2af4f82f 100644
--- a/docs/DISTRO_PORTING.md
+++ b/docs/DISTRO_PORTING.md
@@ -17,6 +17,7 @@ distribution:
* `-Dsysvinit-path=`
* `-Dsysvrcnd-path=`
* `-Drc-local=`
+ * `-Dhalt-local=`
* `-Dloadkeys-path=`
* `-Dsetfont-path=`
* `-Dtty-gid=`
diff --git a/man/custom-entities.ent.in b/man/custom-entities.ent.in
index 0e9a1b84e3..8da038c991 100644
--- a/man/custom-entities.ent.in
+++ b/man/custom-entities.ent.in
@@ -11,6 +11,7 @@
<!ENTITY KILL_USER_PROCESSES "{{ 'yes' if KILL_USER_PROCESSES else 'no' }}">
<!ENTITY DEBUGTTY "{{DEBUGTTY}}">
<!ENTITY RC_LOCAL_PATH "{{RC_LOCAL_PATH}}">
+<!ENTITY RC_LOCAL_SCRIPT_PATH_STOP "{{RC_LOCAL_SCRIPT_PATH_STOP}}">
<!ENTITY HIGH_RLIMIT_NOFILE "{{HIGH_RLIMIT_NOFILE}}">
<!ENTITY DEFAULT_DNSSEC_MODE "{{DEFAULT_DNSSEC_MODE_STR}}">
<!ENTITY DEFAULT_DNS_OVER_TLS_MODE "{{DEFAULT_DNS_OVER_TLS_MODE_STR}}">
diff --git a/man/systemd-rc-local-generator.xml b/man/systemd-rc-local-generator.xml
index f0e38ead47..39c1fc9340 100644
--- a/man/systemd-rc-local-generator.xml
+++ b/man/systemd-rc-local-generator.xml
@@ -20,7 +20,7 @@
<refnamediv>
<refname>systemd-rc-local-generator</refname>
<refname>rc-local.service</refname>
- <refpurpose>Compatibility generator and service to start <filename>&RC_LOCAL_PATH;</filename> during boot</refpurpose>
+ <refpurpose>Compatibility generator and service to start <filename>&RC_LOCAL_PATH;</filename> and <filename>&RC_LOCAL_SCRIPT_PATH_STOP;</filename> during boot and shutdown</refpurpose>
</refnamediv>
<refsynopsisdiv>
@@ -53,11 +53,22 @@ Wants=network-online.target
After=network-online.target
</programlisting>
- <para>Support for <filename>&RC_LOCAL_PATH;</filename> is provided for compatibility with specific System
- V systems only. However, it is strongly recommended to avoid making use of this script today, and instead
+ <para><filename>systemd-rc-local-generator</filename> also checks whether
+ <filename>&RC_LOCAL_SCRIPT_PATH_STOP;</filename> exists and is executable, and if it is pulls the
+ <filename>halt-local.service</filename> unit into the shutdown process. This unit is responsible for
+ running this script during later shutdown.</para>
+
+ <para>Support for <filename>&RC_LOCAL_PATH;</filename> and
+ <filename>&RC_LOCAL_SCRIPT_PATH_STOP;</filename> is provided for compatibility with specific System V
+ systems only. However, it is strongly recommended to avoid making use of this script today, and instead
provide proper unit files with appropriate dependencies for any scripts to run during the boot process.
Note that the path to the script is set at compile time and varies between distributions.</para>
+ <para>Please note that the support for <filename>&RC_LOCAL_SCRIPT_PATH_STOP;</filename> will be removed in
+ the future. It is recommended to use the use the mechanism described in
+ <citerefentry><refentrytitle>systemd-shutdown</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ instead.</para>
+
<para><filename>systemd-rc-local-generator</filename> implements
<citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
</refsect1>
diff --git a/meson.build b/meson.build
index 511024f28e..09f90c8bcf 100644
--- a/meson.build
+++ b/meson.build
@@ -227,6 +227,7 @@ conf.set_quoted('PREFIX', prefixdir)
conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
+conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
conf.set_quoted('ROOTBINDIR', rootbindir)
conf.set_quoted('ROOTLIBDIR', rootlibdir)
conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
@@ -3758,6 +3759,7 @@ status = [
'bash completions directory: @0@'.format(bashcompletiondir),
'zsh completions directory: @0@'.format(zshcompletiondir),
'extra start script: @0@'.format(get_option('rc-local')),
+ 'extra stop script: @0@'.format(get_option('halt-local')),
'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
get_option('debug-tty')),
'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
diff --git a/meson_options.txt b/meson_options.txt
index cbefe7aa83..88fb91d5ec 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -40,6 +40,8 @@ option('telinit-path', type : 'string', value : '/lib/sysvinit/telinit',
description : 'path to telinit')
option('rc-local', type : 'string',
value : '/etc/rc.local')
+option('halt-local', type : 'string',
+ value : '/usr/sbin/halt.local')
option('initrd', type : 'boolean',
description : 'install services for use when running systemd in initrd')
option('compat-mutable-uid-boundaries', type : 'boolean', value : 'false',
diff --git a/src/rc-local-generator/rc-local-generator.c b/src/rc-local-generator/rc-local-generator.c
index 99cffee3ec..96ee56854c 100644
--- a/src/rc-local-generator/rc-local-generator.c
+++ b/src/rc-local-generator/rc-local-generator.c
@@ -65,6 +65,14 @@ static int run(const char *dest, const char *dest_early, const char *dest_late)
r = add_symlink("rc-local.service", "multi-user.target");
}
+ if (check_executable(RC_LOCAL_SCRIPT_PATH_STOP) >= 0) {
+ log_debug("Automatically adding halt-local.service.");
+ log_notice("Use of %s is deprecated, see systemd-shutdown(8) man page for an alternative.",
+ RC_LOCAL_SCRIPT_PATH_STOP);
+
+ k = add_symlink("halt-local.service", "final.target");
+ }
+
return r < 0 ? r : k;
}
diff --git a/units/halt-local.service.in b/units/halt-local.service.in
new file mode 100644
index 0000000000..5fc78b5580
--- /dev/null
+++ b/units/halt-local.service.in
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: LGPL-2.1+
+#
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description={{RC_LOCAL_SCRIPT_PATH_STOP}} Compatibility
+ConditionFileIsExecutable={{RC_LOCAL_SCRIPT_PATH_STOP}}
+DefaultDependencies=no
+After=shutdown.target
+Before=final.target
+
+[Service]
+Type=oneshot
+ExecStart={{RC_LOCAL_SCRIPT_PATH_STOP}}
+TimeoutSec=0
+StandardOutput=tty
+RemainAfterExit=yes
diff --git a/units/meson.build b/units/meson.build
index 72d9a48a60..c2364da948 100644
--- a/units/meson.build
+++ b/units/meson.build
@@ -175,6 +175,7 @@ in_units = [
'sysinit.target.wants/'],
['quotaon.service', 'ENABLE_QUOTACHECK'],
['rc-local.service', 'HAVE_SYSV_COMPAT'],
+ ['halt-local.service', 'HAVE_SYSV_COMPAT'],
['rescue.service', ''],
['serial-getty@.service', ''],
['systemd-backlight@.service', 'ENABLE_BACKLIGHT'],
--
2.31.1

View file

@ -0,0 +1,75 @@
From 3a8fea22109e74e90307efa44fe103a266c9c90a Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Tue, 29 Jun 2021 16:54:56 +0200
Subject: [PATCH 1008/1008] login: mark again framebuffer devices as
master-of-seat devices
This reverts commit 6260d28b8a002a401eab7511f96fd62f471dccdb and all subsequent
commits that addressed the regressions due to the initial change.
Upstream decided that frame-buffer devices were obsolete and DRM drivers
should be used instead, see https://github.com/systemd/systemd/issues/10435.
However not all graphic chips have a DRM drivers currently and
fallback to vesafb for example, which is graphic capable. There're
probably more fallouts so this change seems a bit premature. It would
still be possible to work around these cases by adding "nomodeset" to
the kernel command line but the user-experience would be pretty bad.
Furthermore nobody has complained about the issue fixed by the switch
to DRM driver so far. Only GDM reported a case where it doesn't handle
the transition from frame-buffer to DRM during the boot process but
GDM has been improved since then and the risk of introducing
regressions through a distro minor update exists.
Hence let's keep the frame-buffer devices available a bit longer until
simpledrm driver is out and drivers that don't export the DRM
interface (such as nVidia, HyperV, vmware, ...) provide udev rules.
See bsc#1187154 for details.
[fbui: fixes bsc#1187154]
---
src/login/71-seat.rules.in | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in
index 25e4ee7e58..d9c173ec1b 100644
--- a/src/login/71-seat.rules.in
+++ b/src/login/71-seat.rules.in
@@ -12,19 +12,24 @@ ACTION=="remove", GOTO="seat_end"
TAG=="uaccess", SUBSYSTEM!="sound", TAG+="seat"
SUBSYSTEM=="sound", KERNEL=="card*", TAG+="seat"
SUBSYSTEM=="input", KERNEL=="input*", TAG+="seat"
-SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat"
# Assign keyboard and LCD backlights to the seat
SUBSYSTEM=="leds", TAG+="seat"
SUBSYSTEM=="backlight", TAG+="seat"
-# Allow efifb / uvesafb to be a master if KMS is disabled
-SUBSYSTEM=="graphics", KERNEL=="fb[0-9]", IMPORT{cmdline}="nomodeset", TAG+="master-of-seat"
-
-# Allow any PCI graphics device to be a master and synthesize a seat if KMS
-# is disabled and the kernel doesn't have a driver that would work with this device.
-SUBSYSTEM=="pci", ENV{ID_PCI_CLASS_FROM_DATABASE}=="Display controller", \
- ENV{DRIVER}=="", IMPORT{cmdline}="nomodeset", TAG+="seat", TAG+="master-of-seat"
+# Upstream decided that frame-buffer devices were obsolete and DRM drivers
+# should be used instead. However not all graphic chips have a DRM drivers
+# currently and fallback to vesafb for example. There're probably more fallouts
+# so this change seems a bit premature. It would still be possible to work
+# around these cases by adding "nomodeset" to the kernel command line but the
+# user-experience would be pretty bad.
+#
+# Hence let's keep the frame-buffer devices available a bit longer until
+# simpledrm driver is out and drivers that don't export the DRM interface (such
+# as nVidia, HyperV, vmware, ...) provide udev rules. See bsc#1187154 for
+# details.
+#
+SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat", TAG+="master-of-seat"
# Synthesize a seat for graphic devices without DRM and that fall back to fb
# device instead. Such HWs are listed in hwdb.
--
2.31.1

View file

@ -0,0 +1,67 @@
From f69b9903a941bfeafc879fda2a2988dcfe0dc17f Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Thu, 21 Oct 2021 11:29:31 +0200
Subject: [PATCH 1009/1009] Drop or soften some of the deprecation warnings
- Don't taint systems using the hybrid hierarchy since it's the default on SLE.
- Reword the deprecation warning about KillMode=none (bsc#1193086)
- Decrease log level of messages about use of KillMode=none (jsc#PED-944)
[fbui: fixes bsc#1193086]
[fbui: fixes jsc#PED-944]
---
src/core/load-fragment.c | 7 +++----
src/core/manager.c | 2 +-
src/core/unit.c | 2 +-
3 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index cd07f3e60d..d73adc2e00 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -665,11 +665,10 @@ int config_parse_kill_mode(
}
if (m == KILL_NONE)
- log_syntax(unit, LOG_WARNING, filename, line, 0,
+ log_syntax(unit, LOG_DEBUG, filename, line, 0,
"Unit configured to use KillMode=none. "
- "This is unsafe, as it disables systemd's process lifecycle management for the service. "
- "Please update your service to use a safer KillMode=, such as 'mixed' or 'control-group'. "
- "Support for KillMode=none is deprecated and will eventually be removed.");
+ "Support for KillMode=none is deprecated and will be eventually removed in future SLE versions. "
+ "Please see SUSE TID https://www.suse.com/support/kb/doc/?id=000020394 for more details.");
*k = m;
return 0;
diff --git a/src/core/manager.c b/src/core/manager.c
index 69ced2e3de..1625e76e21 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -4838,7 +4838,7 @@ char *manager_taint_string(Manager *m) {
if (access("/proc/cgroups", F_OK) < 0)
e = stpcpy(e, "cgroups-missing:");
- if (cg_all_unified() == 0)
+ if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) <= 0)
e = stpcpy(e, "cgroupsv1:");
if (clock_is_localtime(NULL) > 0)
diff --git a/src/core/unit.c b/src/core/unit.c
index 0e8a01966a..96105a6fc1 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -5448,7 +5448,7 @@ int unit_log_leftover_process_start(pid_t pid, int sig, void *userdata) {
/* During start we print a warning */
- log_unit_warning(userdata,
+ log_unit_debug(userdata,
"Found left-over process " PID_FMT " (%s) in control group while starting unit. Ignoring.\n"
"This usually indicates unclean termination of a previous run, or service implementation deficiencies.",
pid, strna(comm));
--
2.35.3

View file

@ -0,0 +1,43 @@
From 6f4d9d9688ad65bb46d09ac09f570c6ee4bc3671 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Fri, 14 Jan 2022 08:17:38 +0100
Subject: [PATCH 1010/1010] sysv: add back support for '$all' virtual facility
and '+' facitity name prefix
'$all' was probably a Debian thing and has probably never been supported by RH,
which explains why systemd upstream never supported it too. At least I couldn't
find any reference of this facility name in
http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic.html#FACILNAME. OTOH
'$all' is described in https://wiki.debian.org/LSBInitScripts
Regarding the '+' prefix, I couldn't find any mention of it
anywhere. Apparently it was equivalent to '$' in facility names.
[wfink: bsc#858864]
---
src/sysv-generator/sysv-generator.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index c6e1953839..0aadb397ed 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -243,6 +243,7 @@ static int sysv_translate_facility(SysvStub *s, unsigned line, const char *name,
"remote_fs", SPECIAL_REMOTE_FS_TARGET,
"syslog", NULL,
"time", SPECIAL_TIME_SYNC_TARGET,
+ "all", SPECIAL_DEFAULT_TARGET,
};
const char *filename;
@@ -257,6 +258,7 @@ static int sysv_translate_facility(SysvStub *s, unsigned line, const char *name,
filename = basename(s->path);
+ n = *name == '+' ? ++name : name;
n = *name == '$' ? name + 1 : name;
for (i = 0; i < ELEMENTSOF(table); i += 2) {
--
2.31.1

View file

@ -0,0 +1,123 @@
From 1bd48f23ea7750b354bfb94482f9f035bf8b7841 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Thu, 26 May 2016 08:59:41 +0200
Subject: [PATCH 06/11] sysv-generator: add (back) support for SysV scripts for
the early boot
For the record, the upstream support was removed by commit
3cdebc217c42c8529086f2965319b6a48eaaeabe.
The sysv-generator has some weirdos: for example a service at the rc0
runlevel won't be started during shutdown since it will get both
"WantedBy=poweroff.target" and "Conflicts=shutdown.target".
Anyways what's the current patch implements the following:
- a symlink /etc/init.d/boot.d/S??boot.foo will add
"WantedBy/Before=sysinit.target" constraints and make sure that the
default dependencies added by systemd are turned off.
- a symlink /etc/init.d/boot.d/K??boot.foo will add
"Conflicts/Before=shutdown.target" so "foo" service will be stopped
like any other regular services. If this symlink is not installed
however, "foo" will be stopped lately during the systemd killing
spree.
This is a forward-port of commit 29db8537e1ca10796797d9854d1 in SP1.
[Since v232]
Support for S* symlinks in runlevel 0 or 6 has been completely and silently
removed by 788d2b088b13a2444b9eb2ea82c0cc57d9f0980f. Since it was already
broken as pointed out above, this probably wasn't really used and therefore
no one will really care. So let's drop it too.
However this has the side effect to make the support of early sysv scripts more
difficult. To make things easy, the support of K* symlinks in boot.d/ has been
removed too: this is probably not used (anymore) (at least intentionally).
The consequence is that early sysv services are stopped during shutdown at
the same time as 'normal' services.
---
src/sysv-generator/sysv-generator.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index bf23c48662..fa5355c964 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -31,6 +31,9 @@ static const struct {
const char *path;
const char *target;
} rcnd_table[] = {
+ /* SUSE style boot.d */
+ { "boot.d", SPECIAL_SYSINIT_TARGET },
+
/* Standard SysV runlevels for start-up */
{ "rc1.d", SPECIAL_RESCUE_TARGET },
{ "rc2.d", SPECIAL_MULTI_USER_TARGET },
@@ -57,6 +60,7 @@ typedef struct SysvStub {
bool has_lsb;
bool reload;
bool loaded;
+ bool early;
} SysvStub;
static SysvStub* free_sysvstub(SysvStub *s) {
@@ -146,6 +150,12 @@ static int generate_unit_file(SysvStub *s) {
fprintf(f, "Description=%s\n", t);
}
+ if (s->early) {
+ fprintf(f, "DefaultDependencies=no\n");
+ fprintf(f, "Conflicts=%s\n", SPECIAL_SHUTDOWN_TARGET);
+ fprintf(f, "Before=%s\n", SPECIAL_SHUTDOWN_TARGET);
+ }
+
STRV_FOREACH(p, s->before)
fprintf(f, "Before=%s\n", *p);
STRV_FOREACH(p, s->after)
@@ -212,6 +222,10 @@ static char *sysv_translate_name(const char *name) {
_cleanup_free_ char *c = NULL;
char *res;
+ if (startswith(name, "boot."))
+ /* Drop SuSE-style boot. prefix */
+ name += 5;
+
c = strdup(name);
if (!c)
return NULL;
@@ -288,6 +302,11 @@ static int sysv_translate_facility(SysvStub *s, unsigned line, const char *name,
return 1;
}
+ /* Strip "boot." prefix from file name for comparison (Suse specific) */
+ e = startswith(filename, "boot.");
+ if (e)
+ filename += 5;
+
/* Strip ".sh" suffix from file name for comparison */
filename_no_sh = strdupa(filename);
e = endswith(filename_no_sh, ".sh");
@@ -651,6 +670,9 @@ static int fix_order(SysvStub *s, Hashmap *all_services) {
if (other->sysv_start_priority < 0)
continue;
+ if (s->early != other->early)
+ continue;
+
/* If both units have modern headers we don't care
* about the priorities */
if (s->has_lsb && other->has_lsb)
@@ -775,6 +797,7 @@ static int enumerate_sysv(const LookupPaths *lp, Hashmap *all_services) {
.sysv_start_priority = -1,
.name = TAKE_PTR(name),
.path = TAKE_PTR(fpath),
+ .early = !!startswith(de->d_name, "boot."),
};
r = hashmap_put(all_services, service->name, service);
--
2.26.2

View file

@ -0,0 +1,67 @@
From b5e3ca17a2cee98d0fdae4cee0f285a9052c908c Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Mon, 10 Oct 2022 16:31:39 +0200
Subject: [PATCH 1012/1012] man: describe the net naming schemes specific to
SLE
Fixes: bsc#1204179
---
man/systemd.net-naming-scheme.xml | 42 +++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml
index 6c14810a3e..9b94eff52e 100644
--- a/man/systemd.net-naming-scheme.xml
+++ b/man/systemd.net-naming-scheme.xml
@@ -395,6 +395,48 @@
particular version of systemd).</para>
</refsect1>
+ <refsect1>
+ <title>SLE History</title>
+
+ <para>Additionally, the following "naming schemes" have also been defined on SLE products:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><constant>sle15-sp3</constant></term>
+
+ <listitem><para>This naming scheme is available since <varname>SLE15-SP3</varname> and is based on
+ the <constant>v238</constant> naming scheme described previously but also includes the following
+ changes.</para>
+
+ <para>When a PCI slot is associated with a PCI bridge that has multiple child network
+ controllers, the same value of the <varname>ID_NET_NAME_SLOT</varname> property might be derived
+ for those controllers. This would cause a naming conflict if the property is selected as the device
+ name. Now, we detect this situation and don't produce the <varname>ID_NET_NAME_SLOT</varname>
+ property.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><constant>sle15-sp4</constant></term>
+
+ <listitem><para>Available since <varname>SLE15-SP4</varname> and is based on the
+ <constant>sle15-sp3</constant> naming scheme described previously but also includes the following
+ change.</para>
+
+ <para>PCI hotplug slot names for the s390 PCI driver are a hexadecimal representation
+ of the <filename>function_id</filename> device attribute. This attribute is now used to build the
+ <varname>ID_NET_NAME_SLOT</varname>. Before that, all slot names were parsed as decimal
+ numbers, which could either result in an incorrect value of the <varname>ID_NET_NAME_SLOT</varname>
+ property or none at all.</para>
+
+ <para>Some firmware and hypervisor implementations report unreasonable high numbers for the onboard
+ index. To prevent the generation of bogus onbard interface names, index numbers greater than 16381
+ (2^14-1) were ignored. For s390 PCI devices index values up to 65535 (2^16-1) are valid. To account
+ for that, the limit is increased to now 65535.</para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
<refsect1>
<title>Examples</title>
--
2.35.3

View file

@ -0,0 +1,39 @@
From c6ed74889adade0287ee609150611544d8d5c6d2 Mon Sep 17 00:00:00 2001
From: Frederic Crozat <fcrozat@suse.com>
Date: Tue, 28 May 2013 15:17:35 +0200
Subject: [PATCH 04/11] strip the domain part from /etc/hostname when setting
system host name
[fbui: fixes bnc#820213]
[fbui: forwardported from bfd2462b8ddec591d953841ab22bb30bdc6f9085]
[fbui: adjust context and make sure that strip of the domain name is
only done when setting the system host name. Therefore it's
still possible to pass an FQDN to hostnamectl]
[fbui: I'm still not sure that it was the right thing to do. Other
possibility was to fix the installer to create a correct
/etc/hostname file. Need to investigate...]
---
src/shared/hostname-setup.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/shared/hostname-setup.c b/src/shared/hostname-setup.c
index 511aa7d031..351d0e761d 100644
--- a/src/shared/hostname-setup.c
+++ b/src/shared/hostname-setup.c
@@ -189,6 +189,13 @@ int hostname_setup(bool really) {
else
log_warning_errno(r, "Failed to read configured hostname: %m");
} else {
+ char *domain;
+
+ /* SUSE: strip the domain name */
+ domain = strchr(b, '.');
+ if (domain)
+ *domain = '\0';
+
hn = b;
source = HOSTNAME_STATIC;
}
--
2.26.2

View file

@ -0,0 +1,31 @@
From 0643276850f9d331da9f58eba80029ee7f28d6eb Mon Sep 17 00:00:00 2001
From: Robert Milasan <rmilasan@suse.com>
Date: Sat, 12 Jul 2014 14:20:36 +0200
Subject: [PATCH 05/11] udev: create default symlinks for primary cd_dvd drive
Imported from SLE12-SP1, commit 4f8bacfbffd7049608b5076.
[fbui: updated for SLE15-SP4: since commit 38f3e20883ff658935aae5c9 (v248), the
symlinks /dev/cdrw and /dev/dvdrw could no longer be created. Futhermore
the rule added by this patch dealing with /dev/cdrom was redundant with
the upstream one]
[rmilasan: fixes bnc#783054]
---
rules.d/60-cdrom_id.rules | 1 +
1 file changed, 1 insertion(+)
diff --git a/rules.d/60-cdrom_id.rules b/rules.d/60-cdrom_id.rules
index 288f8ce2f9..58e8ccb54b 100644
--- a/rules.d/60-cdrom_id.rules
+++ b/rules.d/60-cdrom_id.rules
@@ -25,5 +25,6 @@ IMPORT{program}="cdrom_id --lock-media $devnode"
ENV{DISK_MEDIA_CHANGE}=="?*", ENV{ID_CDROM_MEDIA}!="?*", ENV{SYSTEMD_READY}="0"
KERNEL=="sr0", SYMLINK+="cdrom", OPTIONS+="link_priority=-100"
+KERNEL=="sr0", ENV{ID_CDROM_DVD}=="1", SYMLINK+="dvd", OPTIONS+="link_priority=-100"
LABEL="cdrom_end"
--
2.35.3

View file

@ -0,0 +1,29 @@
From 533a1b6996c3d99cf27ae05f0cd8131dcd9bbf30 Mon Sep 17 00:00:00 2001
From: Pawel Wieczorkiewicz <pwieczorkiewicz@suse.de>
Date: Tue, 2 Jun 2015 13:33:24 +0000
Subject: [PATCH 07/11] networkd: make network.service an alias of
systemd-networkd.service
NetworkManager and wicked does this already. This is needed by yast2
and other parts of the system.
[fixes boo#933092]
---
units/systemd-networkd.service.in | 1 +
1 file changed, 1 insertion(+)
diff --git a/units/systemd-networkd.service.in b/units/systemd-networkd.service.in
index ffa45ba049..6a5d0dea3c 100644
--- a/units/systemd-networkd.service.in
+++ b/units/systemd-networkd.service.in
@@ -53,6 +53,7 @@ User=systemd-network
[Install]
WantedBy=multi-user.target
+Alias=network.service
Also=systemd-networkd.socket
Alias=dbus-org.freedesktop.network1.service
--
2.26.2

View file

@ -0,0 +1,45 @@
From 67f3fa5aa2781d42c809da9303f81b28544824d8 Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Thu, 6 Jul 2017 15:48:10 +0200
Subject: [PATCH 10/11] core: disable session keyring per system sevice
entirely for now
Until PAM module "pam_keyinit" is fully integrated in SUSE's PAM stack, this
feature has to be disabled.
openSUSE is still not ready for enabling the keyring stuff (see
bsc#1081947). Some services got fixed (sshd, getty@.service) but some still
haven't (xdm, login, ...)
So leave it disabled again otherwise different users might end up using the
same session keyring - the one created for the service used for logging in
(sshd, getty@.service, xdm, etc...)
The integration of pam_keyinit is tracked here:
https://bugzilla.opensuse.org/show_bug.cgi?id=1081947
See also:
https://github.com/systemd/systemd/pull/6286
[fbui: fixes boo#1045886]
---
src/core/execute.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/core/execute.c b/src/core/execute.c
index 2a337b55a2..b5a1a3b6e5 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -3356,6 +3356,9 @@ static int setup_keyring(
assert(context);
assert(p);
+ /* SUSE: pam_keyinit is still not fully integrated to SUSE's PAM stack... */
+ return 0;
+
/* Let's set up a new per-service "session" kernel keyring for each system service. This has the benefit that
* each service runs with its own keyring shared among all processes of the service, but with no hook-up beyond
* that scope, and in particular no link to the per-UID keyring. If we don't do this the keyring will be
--
2.26.2

View file

@ -0,0 +1,80 @@
From e78660b66efc6ab28b655ca584315504b76cb4dc Mon Sep 17 00:00:00 2001
From: Frederic Crozat <fcrozat@suse.com>
Date: Mon, 29 Oct 2012 13:01:20 +0000
Subject: [PATCH 02/11] restore /var/run and /var/lock bind mount if they
aren't symlink
---
units/meson.build | 2 ++
units/var-lock.mount | 19 +++++++++++++++++++
units/var-run.mount | 19 +++++++++++++++++++
3 files changed, 40 insertions(+)
create mode 100644 units/var-lock.mount
create mode 100644 units/var-run.mount
diff --git a/units/meson.build b/units/meson.build
index 17e9ead9c1..7b926f9f91 100644
--- a/units/meson.build
+++ b/units/meson.build
@@ -160,6 +160,8 @@ units = [
['umount.target', ''],
['usb-gadget.target', ''],
['user.slice', ''],
+ ['var-run.mount', 'HAVE_SYSV_COMPAT', 'local-fs.target.wants/'],
+ ['var-lock.mount', 'HAVE_SYSV_COMPAT', 'local-fs.target.wants/'],
['var-lib-machines.mount', 'ENABLE_MACHINED',
'remote-fs.target.wants/ machines.target.wants/'],
]
diff --git a/units/var-lock.mount b/units/var-lock.mount
new file mode 100644
index 0000000000..07277adac3
--- /dev/null
+++ b/units/var-lock.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Lock Directory
+Before=local-fs.target
+# skip mounting if the directory does not exist or is a symlink
+ConditionPathIsDirectory=/var/lock
+ConditionPathIsSymbolicLink=!/var/lock
+
+[Mount]
+What=/run/lock
+Where=/var/lock
+Type=bind
+Options=bind
diff --git a/units/var-run.mount b/units/var-run.mount
new file mode 100644
index 0000000000..ab4da424c9
--- /dev/null
+++ b/units/var-run.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Runtime Directory
+Before=local-fs.target
+# skip mounting if the directory does not exist or is a symlink
+ConditionPathIsDirectory=/var/run
+ConditionPathIsSymbolicLink=!/var/run
+
+[Mount]
+What=/run
+Where=/var/run
+Type=bind
+Options=bind
--
2.26.2

View file

@ -0,0 +1,83 @@
From 9cbb486f8bbef5c7a51762af841e593cdf0cdc8c Mon Sep 17 00:00:00 2001
From: Franck Bui <fbui@suse.com>
Date: Wed, 26 Jul 2023 17:04:10 +0200
Subject: [PATCH 5001/5001] sleep: don't init /sys/power/resume if 'resume='
option is missing and EFI is disabled
Otherwise in such case a first `systemctl hibernate` would fail but would still
initialize /sys/power/resume fooling a second `systemctl hibernate` into
believing that 'resume=' is correctly set and can be used by the resume process
to find the swap device to resume from.
Follow-up for #27330.
(cherry picked from commit f1f331a252d22c15f37d03524cce967664358c5c)
[fbui: fixes bsc#1186606]
[fbui: this version is pretty different from the original commit as the support
for specifying the hibernation location via an EFI variable has not been
backported.]
---
src/sleep/sleep.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
index a3aeb24633..134d315658 100644
--- a/src/sleep/sleep.c
+++ b/src/sleep/sleep.c
@@ -37,6 +37,7 @@
static SleepOperation arg_operation = _SLEEP_OPERATION_INVALID;
+#if 0
static int write_hibernate_location_info(const HibernateLocation *hibernate_location) {
char offset_str[DECIMAL_STR_MAX(uint64_t)];
char resume_str[DECIMAL_STR_MAX(unsigned) * 2 + STRLEN(":")];
@@ -82,6 +83,7 @@ static int write_hibernate_location_info(const HibernateLocation *hibernate_loca
return 0;
}
+#endif
static int write_mode(char **modes) {
int r = 0;
@@ -185,7 +187,6 @@ static int execute(
NULL
};
- _cleanup_(hibernate_location_freep) HibernateLocation *hibernate_location = NULL;
_cleanup_fclose_ FILE *f = NULL;
char **modes, **states;
int r;
@@ -213,16 +214,21 @@ static int execute(
/* Configure hibernation settings if we are supposed to hibernate */
if (!strv_isempty(modes)) {
+ _cleanup_(hibernate_location_freep) HibernateLocation *hibernate_location = NULL;
+
r = find_hibernate_location(&hibernate_location);
if (r < 0)
return log_error_errno(r, "Failed to find location to hibernate to: %m");
- if (r == 0) { /* 0 means: no hibernation location was configured in the kernel so far, let's
- * do it ourselves then. > 0 means: kernel already had a configured hibernation
- * location which we shouldn't touch. */
- r = write_hibernate_location_info(hibernate_location);
- if (r < 0)
- return log_error_errno(r, "Failed to prepare for hibernation: %m");
- }
+ if (r == 0)
+ /* r == 0 means: no hibernation location was configured in the kernel, IOW "resume="
+ * is missing or systemd-hibernate-resume-generator is not included in initrd. Either
+ * case refuse to proceed as the resume process wouldn't find the swap device to work
+ * with. */
+ return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
+ "resume= is wrong or missing (the resume generator might be missing in initrd), refusing.");
+
+ /* r > 0 means: kernel already had a configured hibernation location and it matches one of
+ * the swap device we found. All is good. */
r = write_mode(modes);
if (r < 0)
--
2.35.3

17
after-local.service Normal file
View file

@ -0,0 +1,17 @@
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
[Unit]
Description=/etc/init.d/after.local Compatibility
ConditionFileIsExecutable=/etc/init.d/after.local
After=getty.target
[Service]
Type=idle
ExecStart=/etc/init.d/after.local
TimeoutSec=0
RemainAfterExit=yes

11
baselibs.conf Normal file
View file

@ -0,0 +1,11 @@
#
# https://en.opensuse.org/openSUSE:Build_Service_baselibs.conf#Quickstart
#
systemd
supplements "packageand(systemd:pam-<targettype>)"
-/lib/systemd/system/
-/usr/lib/systemd/libsystemd-shared.*\.so
post "<prefix>%{_sbindir}/pam-config -a --systemd || :"
libsystemd0
libudev1
nss-myhostname

57
files.container Normal file
View file

@ -0,0 +1,57 @@
#
# Please keep the list sorted (with `LC_ALL=C sort`).
#
%dir %{_sysconfdir}/systemd/nspawn
%{_bindir}/systemd-nspawn
%if ! %{bootstrap}
%{_datadir}/bash-completion/completions/systemd-nspawn
%{_datadir}/zsh/site-functions/_systemd-nspawn
%{_mandir}/man1/systemd-nspawn.1.gz
%{_mandir}/man5/systemd.nspawn.5.gz
%{_mandir}/man8/libnss_mymachines.so.2.8.gz
%{_mandir}/man8/nss-mymachines.8.gz
%endif
%{_unitdir}/systemd-nspawn@.service
%if %{with machined}
%dir %{_unitdir}/machines.target.wants
%{_bindir}/machinectl
%{_datadir}/bash-completion/completions/machinectl
%{_datadir}/dbus-1/system-services/org.freedesktop.machine1.service
%{_datadir}/dbus-1/system.d/org.freedesktop.machine1.conf
%{_datadir}/polkit-1/actions/org.freedesktop.machine1.policy
%{_datadir}/zsh/site-functions/_machinectl
%{_datadir}/zsh/site-functions/_sd_machines
%{_libdir}/libnss_mymachines.so.2
%{_mandir}/man1/machinectl.1.gz
%{_mandir}/man5/org.freedesktop.machine1.5.gz
%{_mandir}/man8/systemd-machined.8.gz
%{_mandir}/man8/systemd-machined.service.8.gz
%{_systemd_util_dir}/rpm/fixlet-container-post.sh
%{_systemd_util_dir}/systemd-machined
%{_tmpfilesdir}/systemd-nspawn.conf
%{_unitdir}/dbus-org.freedesktop.machine1.service
%{_unitdir}/machine.slice
%{_unitdir}/machines.target
%{_unitdir}/machines.target.wants/var-lib-machines.mount
%{_unitdir}/remote-fs.target.wants/var-lib-machines.mount
%{_unitdir}/systemd-machined.service
%{_unitdir}/var-lib-machines.mount
%endif
%if %{with importd}
%{_datadir}/dbus-1/system-services/org.freedesktop.import1.service
%{_datadir}/dbus-1/system.d/org.freedesktop.import1.conf
%{_datadir}/polkit-1/actions/org.freedesktop.import1.policy
%{_mandir}/man5/org.freedesktop.import1.5.gz
%{_mandir}/man8/systemd-importd.8.gz
%{_mandir}/man8/systemd-importd.service.8.gz
%{_systemd_util_dir}/import-pubring.gpg
%{_systemd_util_dir}/systemd-export
%{_systemd_util_dir}/systemd-import
%{_systemd_util_dir}/systemd-import-fs
%{_systemd_util_dir}/systemd-importd
%{_systemd_util_dir}/systemd-pull
%{_unitdir}/dbus-org.freedesktop.import1.service
%{_unitdir}/systemd-importd.service
%endif

730
files.devel Normal file
View file

@ -0,0 +1,730 @@
#
# Please keep the list sorted (with `LC_ALL=C sort`).
#
%{_includedir}/libudev.h
%{_includedir}/systemd/
%{_libdir}/libsystemd.so
%{_libdir}/libudev.so
%{_libdir}/pkgconfig/libsystemd.pc
%{_libdir}/pkgconfig/libudev.pc
%if ! %{bootstrap}
%{_mandir}/man3/SD_ALERT.3.gz
%{_mandir}/man3/SD_BUS_ERROR_ACCESS_DENIED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_ADDRESS_IN_USE.3.gz
%{_mandir}/man3/SD_BUS_ERROR_AUTH_FAILED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_BAD_ADDRESS.3.gz
%{_mandir}/man3/SD_BUS_ERROR_DISCONNECTED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_END.3.gz
%{_mandir}/man3/SD_BUS_ERROR_FAILED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_FILE_EXISTS.3.gz
%{_mandir}/man3/SD_BUS_ERROR_FILE_NOT_FOUND.3.gz
%{_mandir}/man3/SD_BUS_ERROR_INCONSISTENT_MESSAGE.3.gz
%{_mandir}/man3/SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_INVALID_ARGS.3.gz
%{_mandir}/man3/SD_BUS_ERROR_INVALID_SIGNATURE.3.gz
%{_mandir}/man3/SD_BUS_ERROR_IO_ERROR.3.gz
%{_mandir}/man3/SD_BUS_ERROR_LIMITS_EXCEEDED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_MAKE_CONST.3.gz
%{_mandir}/man3/SD_BUS_ERROR_MAP.3.gz
%{_mandir}/man3/SD_BUS_ERROR_MATCH_RULE_INVALID.3.gz
%{_mandir}/man3/SD_BUS_ERROR_MATCH_RULE_NOT_FOUND.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NAME_HAS_NO_OWNER.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NOT_SUPPORTED.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NO_MEMORY.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NO_NETWORK.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NO_REPLY.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NO_SERVER.3.gz
%{_mandir}/man3/SD_BUS_ERROR_NULL.3.gz
%{_mandir}/man3/SD_BUS_ERROR_PROPERTY_READ_ONLY.3.gz
%{_mandir}/man3/SD_BUS_ERROR_SERVICE_UNKNOWN.3.gz
%{_mandir}/man3/SD_BUS_ERROR_TIMEOUT.3.gz
%{_mandir}/man3/SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN.3.gz
%{_mandir}/man3/SD_BUS_ERROR_UNKNOWN_INTERFACE.3.gz
%{_mandir}/man3/SD_BUS_ERROR_UNKNOWN_METHOD.3.gz
%{_mandir}/man3/SD_BUS_ERROR_UNKNOWN_OBJECT.3.gz
%{_mandir}/man3/SD_BUS_ERROR_UNKNOWN_PROPERTY.3.gz
%{_mandir}/man3/SD_BUS_MESSAGE_METHOD_CALL.3.gz
%{_mandir}/man3/SD_BUS_MESSAGE_METHOD_ERROR.3.gz
%{_mandir}/man3/SD_BUS_MESSAGE_METHOD_RETURN.3.gz
%{_mandir}/man3/SD_BUS_MESSAGE_SIGNAL.3.gz
%{_mandir}/man3/SD_BUS_METHOD.3.gz
%{_mandir}/man3/SD_BUS_METHOD_WITH_NAMES.3.gz
%{_mandir}/man3/SD_BUS_METHOD_WITH_NAMES_OFFSET.3.gz
%{_mandir}/man3/SD_BUS_METHOD_WITH_OFFSET.3.gz
%{_mandir}/man3/SD_BUS_PARAM.3.gz
%{_mandir}/man3/SD_BUS_PROPERTY.3.gz
%{_mandir}/man3/SD_BUS_SIGNAL.3.gz
%{_mandir}/man3/SD_BUS_SIGNAL_WITH_NAMES.3.gz
%{_mandir}/man3/SD_BUS_VTABLE_CAPABILITY.3.gz
%{_mandir}/man3/SD_BUS_VTABLE_END.3.gz
%{_mandir}/man3/SD_BUS_VTABLE_START.3.gz
%{_mandir}/man3/SD_BUS_WRITABLE_PROPERTY.3.gz
%{_mandir}/man3/SD_CRIT.3.gz
%{_mandir}/man3/SD_DEBUG.3.gz
%{_mandir}/man3/SD_EMERG.3.gz
%{_mandir}/man3/SD_ERR.3.gz
%{_mandir}/man3/SD_EVENT_ARMED.3.gz
%{_mandir}/man3/SD_EVENT_EXITING.3.gz
%{_mandir}/man3/SD_EVENT_FINISHED.3.gz
%{_mandir}/man3/SD_EVENT_INITIAL.3.gz
%{_mandir}/man3/SD_EVENT_OFF.3.gz
%{_mandir}/man3/SD_EVENT_ON.3.gz
%{_mandir}/man3/SD_EVENT_ONESHOT.3.gz
%{_mandir}/man3/SD_EVENT_PENDING.3.gz
%{_mandir}/man3/SD_EVENT_PREPARING.3.gz
%{_mandir}/man3/SD_EVENT_PRIORITY_IDLE.3.gz
%{_mandir}/man3/SD_EVENT_PRIORITY_IMPORTANT.3.gz
%{_mandir}/man3/SD_EVENT_PRIORITY_NORMAL.3.gz
%{_mandir}/man3/SD_EVENT_RUNNING.3.gz
%{_mandir}/man3/SD_HWDB_FOREACH_PROPERTY.3.gz
%{_mandir}/man3/SD_ID128_ALLF.3.gz
%{_mandir}/man3/SD_ID128_CONST_STR.3.gz
%{_mandir}/man3/SD_ID128_FORMAT_STR.3.gz
%{_mandir}/man3/SD_ID128_FORMAT_VAL.3.gz
%{_mandir}/man3/SD_ID128_MAKE.3.gz
%{_mandir}/man3/SD_ID128_MAKE_STR.3.gz
%{_mandir}/man3/SD_ID128_MAKE_UUID_STR.3.gz
%{_mandir}/man3/SD_ID128_NULL.3.gz
%{_mandir}/man3/SD_ID128_UUID_FORMAT_STR.3.gz
%{_mandir}/man3/SD_INFO.3.gz
%{_mandir}/man3/SD_JOURNAL_ALL_NAMESPACES.3.gz
%{_mandir}/man3/SD_JOURNAL_APPEND.3.gz
%{_mandir}/man3/SD_JOURNAL_CURRENT_USER.3.gz
%{_mandir}/man3/SD_JOURNAL_FOREACH.3.gz
%{_mandir}/man3/SD_JOURNAL_FOREACH_BACKWARDS.3.gz
%{_mandir}/man3/SD_JOURNAL_FOREACH_DATA.3.gz
%{_mandir}/man3/SD_JOURNAL_FOREACH_FIELD.3.gz
%{_mandir}/man3/SD_JOURNAL_FOREACH_UNIQUE.3.gz
%{_mandir}/man3/SD_JOURNAL_INCLUDE_DEFAULT_NAMESPACE.3.gz
%{_mandir}/man3/SD_JOURNAL_INVALIDATE.3.gz
%{_mandir}/man3/SD_JOURNAL_LOCAL_ONLY.3.gz
%{_mandir}/man3/SD_JOURNAL_NOP.3.gz
%{_mandir}/man3/SD_JOURNAL_OS_ROOT.3.gz
%{_mandir}/man3/SD_JOURNAL_RUNTIME_ONLY.3.gz
%{_mandir}/man3/SD_JOURNAL_SUPPRESS_LOCATION.3.gz
%{_mandir}/man3/SD_JOURNAL_SYSTEM.3.gz
%{_mandir}/man3/SD_LISTEN_FDS_START.3.gz
%{_mandir}/man3/SD_NOTICE.3.gz
%{_mandir}/man3/SD_WARNING.3.gz
%{_mandir}/man3/libudev.3.gz
%{_mandir}/man3/sd-bus-errors.3.gz
%{_mandir}/man3/sd-bus.3.gz
%{_mandir}/man3/sd-daemon.3.gz
%{_mandir}/man3/sd-event.3.gz
%{_mandir}/man3/sd-hwdb.3.gz
%{_mandir}/man3/sd-id128.3.gz
%{_mandir}/man3/sd-journal.3.gz
%{_mandir}/man3/sd-login.3.gz
%{_mandir}/man3/sd_booted.3.gz
%{_mandir}/man3/sd_bus_add_fallback.3.gz
%{_mandir}/man3/sd_bus_add_fallback_vtable.3.gz
%{_mandir}/man3/sd_bus_add_filter.3.gz
%{_mandir}/man3/sd_bus_add_match.3.gz
%{_mandir}/man3/sd_bus_add_match_async.3.gz
%{_mandir}/man3/sd_bus_add_node_enumerator.3.gz
%{_mandir}/man3/sd_bus_add_object.3.gz
%{_mandir}/man3/sd_bus_add_object_manager.3.gz
%{_mandir}/man3/sd_bus_add_object_vtable.3.gz
%{_mandir}/man3/sd_bus_attach_event.3.gz
%{_mandir}/man3/sd_bus_call.3.gz
%{_mandir}/man3/sd_bus_call_async.3.gz
%{_mandir}/man3/sd_bus_call_method.3.gz
%{_mandir}/man3/sd_bus_call_method_async.3.gz
%{_mandir}/man3/sd_bus_call_method_asyncv.3.gz
%{_mandir}/man3/sd_bus_call_methodv.3.gz
%{_mandir}/man3/sd_bus_can_send.3.gz
%{_mandir}/man3/sd_bus_close.3.gz
%{_mandir}/man3/sd_bus_close_unref.3.gz
%{_mandir}/man3/sd_bus_close_unrefp.3.gz
%{_mandir}/man3/sd_bus_creds_get_audit_login_uid.3.gz
%{_mandir}/man3/sd_bus_creds_get_audit_session_id.3.gz
%{_mandir}/man3/sd_bus_creds_get_augmented_mask.3.gz
%{_mandir}/man3/sd_bus_creds_get_cgroup.3.gz
%{_mandir}/man3/sd_bus_creds_get_cmdline.3.gz
%{_mandir}/man3/sd_bus_creds_get_comm.3.gz
%{_mandir}/man3/sd_bus_creds_get_description.3.gz
%{_mandir}/man3/sd_bus_creds_get_egid.3.gz
%{_mandir}/man3/sd_bus_creds_get_euid.3.gz
%{_mandir}/man3/sd_bus_creds_get_exe.3.gz
%{_mandir}/man3/sd_bus_creds_get_fsgid.3.gz
%{_mandir}/man3/sd_bus_creds_get_fsuid.3.gz
%{_mandir}/man3/sd_bus_creds_get_gid.3.gz
%{_mandir}/man3/sd_bus_creds_get_mask.3.gz
%{_mandir}/man3/sd_bus_creds_get_owner_uid.3.gz
%{_mandir}/man3/sd_bus_creds_get_pid.3.gz
%{_mandir}/man3/sd_bus_creds_get_ppid.3.gz
%{_mandir}/man3/sd_bus_creds_get_selinux_context.3.gz
%{_mandir}/man3/sd_bus_creds_get_session.3.gz
%{_mandir}/man3/sd_bus_creds_get_sgid.3.gz
%{_mandir}/man3/sd_bus_creds_get_slice.3.gz
%{_mandir}/man3/sd_bus_creds_get_suid.3.gz
%{_mandir}/man3/sd_bus_creds_get_supplementary_gids.3.gz
%{_mandir}/man3/sd_bus_creds_get_tid.3.gz
%{_mandir}/man3/sd_bus_creds_get_tid_comm.3.gz
%{_mandir}/man3/sd_bus_creds_get_tty.3.gz
%{_mandir}/man3/sd_bus_creds_get_uid.3.gz
%{_mandir}/man3/sd_bus_creds_get_unique_name.3.gz
%{_mandir}/man3/sd_bus_creds_get_unit.3.gz
%{_mandir}/man3/sd_bus_creds_get_user_slice.3.gz
%{_mandir}/man3/sd_bus_creds_get_user_unit.3.gz
%{_mandir}/man3/sd_bus_creds_get_well_known_names.3.gz
%{_mandir}/man3/sd_bus_creds_has_bounding_cap.3.gz
%{_mandir}/man3/sd_bus_creds_has_effective_cap.3.gz
%{_mandir}/man3/sd_bus_creds_has_inheritable_cap.3.gz
%{_mandir}/man3/sd_bus_creds_has_permitted_cap.3.gz
%{_mandir}/man3/sd_bus_creds_new_from_pid.3.gz
%{_mandir}/man3/sd_bus_creds_ref.3.gz
%{_mandir}/man3/sd_bus_creds_unref.3.gz
%{_mandir}/man3/sd_bus_creds_unrefp.3.gz
%{_mandir}/man3/sd_bus_default.3.gz
%{_mandir}/man3/sd_bus_default_flush_close.3.gz
%{_mandir}/man3/sd_bus_default_system.3.gz
%{_mandir}/man3/sd_bus_default_user.3.gz
%{_mandir}/man3/sd_bus_destroy_t.3.gz
%{_mandir}/man3/sd_bus_detach_event.3.gz
%{_mandir}/man3/sd_bus_emit_interfaces_added.3.gz
%{_mandir}/man3/sd_bus_emit_interfaces_added_strv.3.gz
%{_mandir}/man3/sd_bus_emit_interfaces_removed.3.gz
%{_mandir}/man3/sd_bus_emit_interfaces_removed_strv.3.gz
%{_mandir}/man3/sd_bus_emit_object_added.3.gz
%{_mandir}/man3/sd_bus_emit_object_removed.3.gz
%{_mandir}/man3/sd_bus_emit_properties_changed.3.gz
%{_mandir}/man3/sd_bus_emit_properties_changed_strv.3.gz
%{_mandir}/man3/sd_bus_emit_signal.3.gz
%{_mandir}/man3/sd_bus_emit_signalv.3.gz
%{_mandir}/man3/sd_bus_enqueue_for_read.3.gz
%{_mandir}/man3/sd_bus_error.3.gz
%{_mandir}/man3/sd_bus_error_add_map.3.gz
%{_mandir}/man3/sd_bus_error_copy.3.gz
%{_mandir}/man3/sd_bus_error_free.3.gz
%{_mandir}/man3/sd_bus_error_get_errno.3.gz
%{_mandir}/man3/sd_bus_error_has_name.3.gz
%{_mandir}/man3/sd_bus_error_has_names.3.gz
%{_mandir}/man3/sd_bus_error_has_names_sentinel.3.gz
%{_mandir}/man3/sd_bus_error_is_set.3.gz
%{_mandir}/man3/sd_bus_error_map.3.gz
%{_mandir}/man3/sd_bus_error_move.3.gz
%{_mandir}/man3/sd_bus_error_set.3.gz
%{_mandir}/man3/sd_bus_error_set_const.3.gz
%{_mandir}/man3/sd_bus_error_set_errno.3.gz
%{_mandir}/man3/sd_bus_error_set_errnof.3.gz
%{_mandir}/man3/sd_bus_error_set_errnofv.3.gz
%{_mandir}/man3/sd_bus_error_setf.3.gz
%{_mandir}/man3/sd_bus_flush.3.gz
%{_mandir}/man3/sd_bus_flush_close_unref.3.gz
%{_mandir}/man3/sd_bus_flush_close_unrefp.3.gz
%{_mandir}/man3/sd_bus_get_address.3.gz
%{_mandir}/man3/sd_bus_get_allow_interactive_authorization.3.gz
%{_mandir}/man3/sd_bus_get_bus_id.3.gz
%{_mandir}/man3/sd_bus_get_close_on_exit.3.gz
%{_mandir}/man3/sd_bus_get_connected_signal.3.gz
%{_mandir}/man3/sd_bus_get_creds_mask.3.gz
%{_mandir}/man3/sd_bus_get_current_handler.3.gz
%{_mandir}/man3/sd_bus_get_current_message.3.gz
%{_mandir}/man3/sd_bus_get_current_slot.3.gz
%{_mandir}/man3/sd_bus_get_current_userdata.3.gz
%{_mandir}/man3/sd_bus_get_description.3.gz
%{_mandir}/man3/sd_bus_get_event.3.gz
%{_mandir}/man3/sd_bus_get_events.3.gz
%{_mandir}/man3/sd_bus_get_exit_on_disconnect.3.gz
%{_mandir}/man3/sd_bus_get_fd.3.gz
%{_mandir}/man3/sd_bus_get_method_call_timeout.3.gz
%{_mandir}/man3/sd_bus_get_n_queued_read.3.gz
%{_mandir}/man3/sd_bus_get_n_queued_write.3.gz
%{_mandir}/man3/sd_bus_get_name_creds.3.gz
%{_mandir}/man3/sd_bus_get_name_machine_id.3.gz
%{_mandir}/man3/sd_bus_get_owner_creds.3.gz
%{_mandir}/man3/sd_bus_get_property.3.gz
%{_mandir}/man3/sd_bus_get_property_string.3.gz
%{_mandir}/man3/sd_bus_get_property_strv.3.gz
%{_mandir}/man3/sd_bus_get_property_trivial.3.gz
%{_mandir}/man3/sd_bus_get_scope.3.gz
%{_mandir}/man3/sd_bus_get_sender.3.gz
%{_mandir}/man3/sd_bus_get_tid.3.gz
%{_mandir}/man3/sd_bus_get_timeout.3.gz
%{_mandir}/man3/sd_bus_get_unique_name.3.gz
%{_mandir}/man3/sd_bus_get_watch_bind.3.gz
%{_mandir}/man3/sd_bus_interface_name_is_valid.3.gz
%{_mandir}/man3/sd_bus_is_anonymous.3.gz
%{_mandir}/man3/sd_bus_is_bus_client.3.gz
%{_mandir}/man3/sd_bus_is_monitor.3.gz
%{_mandir}/man3/sd_bus_is_open.3.gz
%{_mandir}/man3/sd_bus_is_ready.3.gz
%{_mandir}/man3/sd_bus_is_server.3.gz
%{_mandir}/man3/sd_bus_is_trusted.3.gz
%{_mandir}/man3/sd_bus_list_names.3.gz
%{_mandir}/man3/sd_bus_match_signal.3.gz
%{_mandir}/man3/sd_bus_match_signal_async.3.gz
%{_mandir}/man3/sd_bus_member_name_is_valid.3.gz
%{_mandir}/man3/sd_bus_message_append.3.gz
%{_mandir}/man3/sd_bus_message_append_array.3.gz
%{_mandir}/man3/sd_bus_message_append_array_iovec.3.gz
%{_mandir}/man3/sd_bus_message_append_array_memfd.3.gz
%{_mandir}/man3/sd_bus_message_append_array_space.3.gz
%{_mandir}/man3/sd_bus_message_append_basic.3.gz
%{_mandir}/man3/sd_bus_message_append_string_iovec.3.gz
%{_mandir}/man3/sd_bus_message_append_string_memfd.3.gz
%{_mandir}/man3/sd_bus_message_append_string_space.3.gz
%{_mandir}/man3/sd_bus_message_append_strv.3.gz
%{_mandir}/man3/sd_bus_message_appendv.3.gz
%{_mandir}/man3/sd_bus_message_at_end.3.gz
%{_mandir}/man3/sd_bus_message_close_container.3.gz
%{_mandir}/man3/sd_bus_message_copy.3.gz
%{_mandir}/man3/sd_bus_message_dump.3.gz
%{_mandir}/man3/sd_bus_message_enter_container.3.gz
%{_mandir}/man3/sd_bus_message_exit_container.3.gz
%{_mandir}/man3/sd_bus_message_get_allow_interactive_authorization.3.gz
%{_mandir}/man3/sd_bus_message_get_auto_start.3.gz
%{_mandir}/man3/sd_bus_message_get_bus.3.gz
%{_mandir}/man3/sd_bus_message_get_cookie.3.gz
%{_mandir}/man3/sd_bus_message_get_creds.3.gz
%{_mandir}/man3/sd_bus_message_get_destination.3.gz
%{_mandir}/man3/sd_bus_message_get_errno.3.gz
%{_mandir}/man3/sd_bus_message_get_error.3.gz
%{_mandir}/man3/sd_bus_message_get_expect_reply.3.gz
%{_mandir}/man3/sd_bus_message_get_interface.3.gz
%{_mandir}/man3/sd_bus_message_get_member.3.gz
%{_mandir}/man3/sd_bus_message_get_monotonic_usec.3.gz
%{_mandir}/man3/sd_bus_message_get_path.3.gz
%{_mandir}/man3/sd_bus_message_get_realtime_usec.3.gz
%{_mandir}/man3/sd_bus_message_get_reply_cookie.3.gz
%{_mandir}/man3/sd_bus_message_get_sender.3.gz
%{_mandir}/man3/sd_bus_message_get_seqnum.3.gz
%{_mandir}/man3/sd_bus_message_get_signature.3.gz
%{_mandir}/man3/sd_bus_message_get_type.3.gz
%{_mandir}/man3/sd_bus_message_has_signature.3.gz
%{_mandir}/man3/sd_bus_message_is_empty.3.gz
%{_mandir}/man3/sd_bus_message_is_method_call.3.gz
%{_mandir}/man3/sd_bus_message_is_method_error.3.gz
%{_mandir}/man3/sd_bus_message_is_signal.3.gz
%{_mandir}/man3/sd_bus_message_new.3.gz
%{_mandir}/man3/sd_bus_message_new_method_call.3.gz
%{_mandir}/man3/sd_bus_message_new_method_errno.3.gz
%{_mandir}/man3/sd_bus_message_new_method_errnof.3.gz
%{_mandir}/man3/sd_bus_message_new_method_error.3.gz
%{_mandir}/man3/sd_bus_message_new_method_errorf.3.gz
%{_mandir}/man3/sd_bus_message_new_method_return.3.gz
%{_mandir}/man3/sd_bus_message_new_signal.3.gz
%{_mandir}/man3/sd_bus_message_open_container.3.gz
%{_mandir}/man3/sd_bus_message_peek_type.3.gz
%{_mandir}/man3/sd_bus_message_read.3.gz
%{_mandir}/man3/sd_bus_message_read_array.3.gz
%{_mandir}/man3/sd_bus_message_read_basic.3.gz
%{_mandir}/man3/sd_bus_message_read_strv.3.gz
%{_mandir}/man3/sd_bus_message_readv.3.gz
%{_mandir}/man3/sd_bus_message_ref.3.gz
%{_mandir}/man3/sd_bus_message_rewind.3.gz
%{_mandir}/man3/sd_bus_message_seal.3.gz
%{_mandir}/man3/sd_bus_message_send.3.gz
%{_mandir}/man3/sd_bus_message_sensitive.3.gz
%{_mandir}/man3/sd_bus_message_set_allow_interactive_authorization.3.gz
%{_mandir}/man3/sd_bus_message_set_auto_start.3.gz
%{_mandir}/man3/sd_bus_message_set_destination.3.gz
%{_mandir}/man3/sd_bus_message_set_expect_reply.3.gz
%{_mandir}/man3/sd_bus_message_set_sender.3.gz
%{_mandir}/man3/sd_bus_message_skip.3.gz
%{_mandir}/man3/sd_bus_message_unref.3.gz
%{_mandir}/man3/sd_bus_message_unrefp.3.gz
%{_mandir}/man3/sd_bus_message_verify_type.3.gz
%{_mandir}/man3/sd_bus_negotiate_creds.3.gz
%{_mandir}/man3/sd_bus_negotiate_fds.3.gz
%{_mandir}/man3/sd_bus_negotiate_timestamp.3.gz
%{_mandir}/man3/sd_bus_new.3.gz
%{_mandir}/man3/sd_bus_object_path_is_valid.3.gz
%{_mandir}/man3/sd_bus_open.3.gz
%{_mandir}/man3/sd_bus_open_system.3.gz
%{_mandir}/man3/sd_bus_open_system_machine.3.gz
%{_mandir}/man3/sd_bus_open_system_remote.3.gz
%{_mandir}/man3/sd_bus_open_system_with_description.3.gz
%{_mandir}/man3/sd_bus_open_user.3.gz
%{_mandir}/man3/sd_bus_open_user_machine.3.gz
%{_mandir}/man3/sd_bus_open_user_with_description.3.gz
%{_mandir}/man3/sd_bus_open_with_description.3.gz
%{_mandir}/man3/sd_bus_path_decode.3.gz
%{_mandir}/man3/sd_bus_path_decode_many.3.gz
%{_mandir}/man3/sd_bus_path_encode.3.gz
%{_mandir}/man3/sd_bus_path_encode_many.3.gz
%{_mandir}/man3/sd_bus_process.3.gz
%{_mandir}/man3/sd_bus_query_sender_creds.3.gz
%{_mandir}/man3/sd_bus_query_sender_privilege.3.gz
%{_mandir}/man3/sd_bus_ref.3.gz
%{_mandir}/man3/sd_bus_release_name.3.gz
%{_mandir}/man3/sd_bus_release_name_async.3.gz
%{_mandir}/man3/sd_bus_reply_method_errno.3.gz
%{_mandir}/man3/sd_bus_reply_method_errnof.3.gz
%{_mandir}/man3/sd_bus_reply_method_errnofv.3.gz
%{_mandir}/man3/sd_bus_reply_method_error.3.gz
%{_mandir}/man3/sd_bus_reply_method_errorf.3.gz
%{_mandir}/man3/sd_bus_reply_method_errorfv.3.gz
%{_mandir}/man3/sd_bus_reply_method_return.3.gz
%{_mandir}/man3/sd_bus_reply_method_returnv.3.gz
%{_mandir}/man3/sd_bus_request_name.3.gz
%{_mandir}/man3/sd_bus_request_name_async.3.gz
%{_mandir}/man3/sd_bus_send.3.gz
%{_mandir}/man3/sd_bus_send_to.3.gz
%{_mandir}/man3/sd_bus_service_name_is_valid.3.gz
%{_mandir}/man3/sd_bus_set_address.3.gz
%{_mandir}/man3/sd_bus_set_allow_interactive_authorization.3.gz
%{_mandir}/man3/sd_bus_set_anonymous.3.gz
%{_mandir}/man3/sd_bus_set_bus_client.3.gz
%{_mandir}/man3/sd_bus_set_close_on_exit.3.gz
%{_mandir}/man3/sd_bus_set_connected_signal.3.gz
%{_mandir}/man3/sd_bus_set_description.3.gz
%{_mandir}/man3/sd_bus_set_exec.3.gz
%{_mandir}/man3/sd_bus_set_exit_on_disconnect.3.gz
%{_mandir}/man3/sd_bus_set_fd.3.gz
%{_mandir}/man3/sd_bus_set_method_call_timeout.3.gz
%{_mandir}/man3/sd_bus_set_monitor.3.gz
%{_mandir}/man3/sd_bus_set_property.3.gz
%{_mandir}/man3/sd_bus_set_propertyv.3.gz
%{_mandir}/man3/sd_bus_set_sender.3.gz
%{_mandir}/man3/sd_bus_set_server.3.gz
%{_mandir}/man3/sd_bus_set_trusted.3.gz
%{_mandir}/man3/sd_bus_set_watch_bind.3.gz
%{_mandir}/man3/sd_bus_slot_get_bus.3.gz
%{_mandir}/man3/sd_bus_slot_get_current_handler.3.gz
%{_mandir}/man3/sd_bus_slot_get_current_message.3.gz
%{_mandir}/man3/sd_bus_slot_get_current_userdata.3.gz
%{_mandir}/man3/sd_bus_slot_get_description.3.gz
%{_mandir}/man3/sd_bus_slot_get_destroy_callback.3.gz
%{_mandir}/man3/sd_bus_slot_get_floating.3.gz
%{_mandir}/man3/sd_bus_slot_get_userdata.3.gz
%{_mandir}/man3/sd_bus_slot_ref.3.gz
%{_mandir}/man3/sd_bus_slot_set_description.3.gz
%{_mandir}/man3/sd_bus_slot_set_destroy_callback.3.gz
%{_mandir}/man3/sd_bus_slot_set_floating.3.gz
%{_mandir}/man3/sd_bus_slot_set_userdata.3.gz
%{_mandir}/man3/sd_bus_slot_unref.3.gz
%{_mandir}/man3/sd_bus_slot_unrefp.3.gz
%{_mandir}/man3/sd_bus_start.3.gz
%{_mandir}/man3/sd_bus_track_add_name.3.gz
%{_mandir}/man3/sd_bus_track_add_sender.3.gz
%{_mandir}/man3/sd_bus_track_contains.3.gz
%{_mandir}/man3/sd_bus_track_count.3.gz
%{_mandir}/man3/sd_bus_track_count_name.3.gz
%{_mandir}/man3/sd_bus_track_count_sender.3.gz
%{_mandir}/man3/sd_bus_track_first.3.gz
%{_mandir}/man3/sd_bus_track_get_bus.3.gz
%{_mandir}/man3/sd_bus_track_get_destroy_callback.3.gz
%{_mandir}/man3/sd_bus_track_get_recursive.3.gz
%{_mandir}/man3/sd_bus_track_get_userdata.3.gz
%{_mandir}/man3/sd_bus_track_new.3.gz
%{_mandir}/man3/sd_bus_track_next.3.gz
%{_mandir}/man3/sd_bus_track_ref.3.gz
%{_mandir}/man3/sd_bus_track_remove_name.3.gz
%{_mandir}/man3/sd_bus_track_remove_sender.3.gz
%{_mandir}/man3/sd_bus_track_set_destroy_callback.3.gz
%{_mandir}/man3/sd_bus_track_set_recursive.3.gz
%{_mandir}/man3/sd_bus_track_set_userdata.3.gz
%{_mandir}/man3/sd_bus_track_unref.3.gz
%{_mandir}/man3/sd_bus_track_unrefp.3.gz
%{_mandir}/man3/sd_bus_unref.3.gz
%{_mandir}/man3/sd_bus_unrefp.3.gz
%{_mandir}/man3/sd_bus_wait.3.gz
%{_mandir}/man3/sd_event.3.gz
%{_mandir}/man3/sd_event_add_child.3.gz
%{_mandir}/man3/sd_event_add_child_pidfd.3.gz
%{_mandir}/man3/sd_event_add_defer.3.gz
%{_mandir}/man3/sd_event_add_exit.3.gz
%{_mandir}/man3/sd_event_add_inotify.3.gz
%{_mandir}/man3/sd_event_add_io.3.gz
%{_mandir}/man3/sd_event_add_post.3.gz
%{_mandir}/man3/sd_event_add_signal.3.gz
%{_mandir}/man3/sd_event_add_time.3.gz
%{_mandir}/man3/sd_event_add_time_relative.3.gz
%{_mandir}/man3/sd_event_child_handler_t.3.gz
%{_mandir}/man3/sd_event_default.3.gz
%{_mandir}/man3/sd_event_destroy_t.3.gz
%{_mandir}/man3/sd_event_dispatch.3.gz
%{_mandir}/man3/sd_event_exit.3.gz
%{_mandir}/man3/sd_event_get_exit_code.3.gz
%{_mandir}/man3/sd_event_get_fd.3.gz
%{_mandir}/man3/sd_event_get_iteration.3.gz
%{_mandir}/man3/sd_event_get_state.3.gz
%{_mandir}/man3/sd_event_get_tid.3.gz
%{_mandir}/man3/sd_event_get_watchdog.3.gz
%{_mandir}/man3/sd_event_handler_t.3.gz
%{_mandir}/man3/sd_event_inotify_handler_t.3.gz
%{_mandir}/man3/sd_event_io_handler_t.3.gz
%{_mandir}/man3/sd_event_loop.3.gz
%{_mandir}/man3/sd_event_new.3.gz
%{_mandir}/man3/sd_event_now.3.gz
%{_mandir}/man3/sd_event_prepare.3.gz
%{_mandir}/man3/sd_event_ref.3.gz
%{_mandir}/man3/sd_event_run.3.gz
%{_mandir}/man3/sd_event_set_watchdog.3.gz
%{_mandir}/man3/sd_event_signal_handler_t.3.gz
%{_mandir}/man3/sd_event_source.3.gz
%{_mandir}/man3/sd_event_source_disable_unref.3.gz
%{_mandir}/man3/sd_event_source_disable_unrefp.3.gz
%{_mandir}/man3/sd_event_source_get_child_pid.3.gz
%{_mandir}/man3/sd_event_source_get_child_pidfd.3.gz
%{_mandir}/man3/sd_event_source_get_child_pidfd_own.3.gz
%{_mandir}/man3/sd_event_source_get_child_process_own.3.gz
%{_mandir}/man3/sd_event_source_get_description.3.gz
%{_mandir}/man3/sd_event_source_get_destroy_callback.3.gz
%{_mandir}/man3/sd_event_source_get_enabled.3.gz
%{_mandir}/man3/sd_event_source_get_event.3.gz
%{_mandir}/man3/sd_event_source_get_exit_on_failure.3.gz
%{_mandir}/man3/sd_event_source_get_floating.3.gz
%{_mandir}/man3/sd_event_source_get_inotify_mask.3.gz
%{_mandir}/man3/sd_event_source_get_io_events.3.gz
%{_mandir}/man3/sd_event_source_get_io_fd.3.gz
%{_mandir}/man3/sd_event_source_get_io_fd_own.3.gz
%{_mandir}/man3/sd_event_source_get_io_revents.3.gz
%{_mandir}/man3/sd_event_source_get_pending.3.gz
%{_mandir}/man3/sd_event_source_get_priority.3.gz
%{_mandir}/man3/sd_event_source_get_ratelimit.3.gz
%{_mandir}/man3/sd_event_source_get_signal.3.gz
%{_mandir}/man3/sd_event_source_get_time.3.gz
%{_mandir}/man3/sd_event_source_get_time_accuracy.3.gz
%{_mandir}/man3/sd_event_source_get_time_clock.3.gz
%{_mandir}/man3/sd_event_source_get_userdata.3.gz
%{_mandir}/man3/sd_event_source_is_ratelimited.3.gz
%{_mandir}/man3/sd_event_source_ref.3.gz
%{_mandir}/man3/sd_event_source_send_child_signal.3.gz
%{_mandir}/man3/sd_event_source_set_child_pidfd_own.3.gz
%{_mandir}/man3/sd_event_source_set_child_process_own.3.gz
%{_mandir}/man3/sd_event_source_set_description.3.gz
%{_mandir}/man3/sd_event_source_set_destroy_callback.3.gz
%{_mandir}/man3/sd_event_source_set_enabled.3.gz
%{_mandir}/man3/sd_event_source_set_exit_on_failure.3.gz
%{_mandir}/man3/sd_event_source_set_floating.3.gz
%{_mandir}/man3/sd_event_source_set_io_events.3.gz
%{_mandir}/man3/sd_event_source_set_io_fd.3.gz
%{_mandir}/man3/sd_event_source_set_io_fd_own.3.gz
%{_mandir}/man3/sd_event_source_set_prepare.3.gz
%{_mandir}/man3/sd_event_source_set_priority.3.gz
%{_mandir}/man3/sd_event_source_set_ratelimit.3.gz
%{_mandir}/man3/sd_event_source_set_time.3.gz
%{_mandir}/man3/sd_event_source_set_time_accuracy.3.gz
%{_mandir}/man3/sd_event_source_set_time_relative.3.gz
%{_mandir}/man3/sd_event_source_set_userdata.3.gz
%{_mandir}/man3/sd_event_source_unref.3.gz
%{_mandir}/man3/sd_event_source_unrefp.3.gz
%{_mandir}/man3/sd_event_time_handler_t.3.gz
%{_mandir}/man3/sd_event_unref.3.gz
%{_mandir}/man3/sd_event_unrefp.3.gz
%{_mandir}/man3/sd_event_wait.3.gz
%{_mandir}/man3/sd_get_machine_names.3.gz
%{_mandir}/man3/sd_get_seats.3.gz
%{_mandir}/man3/sd_get_sessions.3.gz
%{_mandir}/man3/sd_get_uids.3.gz
%{_mandir}/man3/sd_hwdb_enumerate.3.gz
%{_mandir}/man3/sd_hwdb_get.3.gz
%{_mandir}/man3/sd_hwdb_new.3.gz
%{_mandir}/man3/sd_hwdb_ref.3.gz
%{_mandir}/man3/sd_hwdb_seek.3.gz
%{_mandir}/man3/sd_hwdb_unref.3.gz
%{_mandir}/man3/sd_id128_equal.3.gz
%{_mandir}/man3/sd_id128_from_string.3.gz
%{_mandir}/man3/sd_id128_get_boot.3.gz
%{_mandir}/man3/sd_id128_get_boot_app_specific.3.gz
%{_mandir}/man3/sd_id128_get_invocation.3.gz
%{_mandir}/man3/sd_id128_get_machine.3.gz
%{_mandir}/man3/sd_id128_get_machine_app_specific.3.gz
%{_mandir}/man3/sd_id128_in_set.3.gz
%{_mandir}/man3/sd_id128_in_set_sentinel.3.gz
%{_mandir}/man3/sd_id128_in_setv.3.gz
%{_mandir}/man3/sd_id128_is_allf.3.gz
%{_mandir}/man3/sd_id128_is_null.3.gz
%{_mandir}/man3/sd_id128_randomize.3.gz
%{_mandir}/man3/sd_id128_t.3.gz
%{_mandir}/man3/sd_id128_to_string.3.gz
%{_mandir}/man3/sd_is_fifo.3.gz
%{_mandir}/man3/sd_is_mq.3.gz
%{_mandir}/man3/sd_is_socket.3.gz
%{_mandir}/man3/sd_is_socket_inet.3.gz
%{_mandir}/man3/sd_is_socket_sockaddr.3.gz
%{_mandir}/man3/sd_is_socket_unix.3.gz
%{_mandir}/man3/sd_is_special.3.gz
%{_mandir}/man3/sd_journal.3.gz
%{_mandir}/man3/sd_journal_add_conjunction.3.gz
%{_mandir}/man3/sd_journal_add_disjunction.3.gz
%{_mandir}/man3/sd_journal_add_match.3.gz
%{_mandir}/man3/sd_journal_close.3.gz
%{_mandir}/man3/sd_journal_enumerate_available_data.3.gz
%{_mandir}/man3/sd_journal_enumerate_available_unique.3.gz
%{_mandir}/man3/sd_journal_enumerate_data.3.gz
%{_mandir}/man3/sd_journal_enumerate_fields.3.gz
%{_mandir}/man3/sd_journal_enumerate_unique.3.gz
%{_mandir}/man3/sd_journal_flush_matches.3.gz
%{_mandir}/man3/sd_journal_get_catalog.3.gz
%{_mandir}/man3/sd_journal_get_catalog_for_message_id.3.gz
%{_mandir}/man3/sd_journal_get_cursor.3.gz
%{_mandir}/man3/sd_journal_get_cutoff_monotonic_usec.3.gz
%{_mandir}/man3/sd_journal_get_cutoff_realtime_usec.3.gz
%{_mandir}/man3/sd_journal_get_data.3.gz
%{_mandir}/man3/sd_journal_get_data_threshold.3.gz
%{_mandir}/man3/sd_journal_get_events.3.gz
%{_mandir}/man3/sd_journal_get_fd.3.gz
%{_mandir}/man3/sd_journal_get_monotonic_usec.3.gz
%{_mandir}/man3/sd_journal_get_realtime_usec.3.gz
%{_mandir}/man3/sd_journal_get_timeout.3.gz
%{_mandir}/man3/sd_journal_get_usage.3.gz
%{_mandir}/man3/sd_journal_has_persistent_files.3.gz
%{_mandir}/man3/sd_journal_has_runtime_files.3.gz
%{_mandir}/man3/sd_journal_next.3.gz
%{_mandir}/man3/sd_journal_next_skip.3.gz
%{_mandir}/man3/sd_journal_open.3.gz
%{_mandir}/man3/sd_journal_open_directory.3.gz
%{_mandir}/man3/sd_journal_open_directory_fd.3.gz
%{_mandir}/man3/sd_journal_open_files.3.gz
%{_mandir}/man3/sd_journal_open_files_fd.3.gz
%{_mandir}/man3/sd_journal_open_namespace.3.gz
%{_mandir}/man3/sd_journal_perror.3.gz
%{_mandir}/man3/sd_journal_perror_with_location.3.gz
%{_mandir}/man3/sd_journal_previous.3.gz
%{_mandir}/man3/sd_journal_previous_skip.3.gz
%{_mandir}/man3/sd_journal_print.3.gz
%{_mandir}/man3/sd_journal_print_with_location.3.gz
%{_mandir}/man3/sd_journal_printv.3.gz
%{_mandir}/man3/sd_journal_printv_with_location.3.gz
%{_mandir}/man3/sd_journal_process.3.gz
%{_mandir}/man3/sd_journal_query_unique.3.gz
%{_mandir}/man3/sd_journal_reliable_fd.3.gz
%{_mandir}/man3/sd_journal_restart_data.3.gz
%{_mandir}/man3/sd_journal_restart_fields.3.gz
%{_mandir}/man3/sd_journal_restart_unique.3.gz
%{_mandir}/man3/sd_journal_seek_cursor.3.gz
%{_mandir}/man3/sd_journal_seek_head.3.gz
%{_mandir}/man3/sd_journal_seek_monotonic_usec.3.gz
%{_mandir}/man3/sd_journal_seek_realtime_usec.3.gz
%{_mandir}/man3/sd_journal_seek_tail.3.gz
%{_mandir}/man3/sd_journal_send.3.gz
%{_mandir}/man3/sd_journal_send_with_location.3.gz
%{_mandir}/man3/sd_journal_sendv.3.gz
%{_mandir}/man3/sd_journal_sendv_with_location.3.gz
%{_mandir}/man3/sd_journal_set_data_threshold.3.gz
%{_mandir}/man3/sd_journal_stream_fd.3.gz
%{_mandir}/man3/sd_journal_test_cursor.3.gz
%{_mandir}/man3/sd_journal_wait.3.gz
%{_mandir}/man3/sd_listen_fds.3.gz
%{_mandir}/man3/sd_listen_fds_with_names.3.gz
%{_mandir}/man3/sd_login_monitor.3.gz
%{_mandir}/man3/sd_login_monitor_flush.3.gz
%{_mandir}/man3/sd_login_monitor_get_events.3.gz
%{_mandir}/man3/sd_login_monitor_get_fd.3.gz
%{_mandir}/man3/sd_login_monitor_get_timeout.3.gz
%{_mandir}/man3/sd_login_monitor_new.3.gz
%{_mandir}/man3/sd_login_monitor_unref.3.gz
%{_mandir}/man3/sd_login_monitor_unrefp.3.gz
%{_mandir}/man3/sd_machine_get_class.3.gz
%{_mandir}/man3/sd_machine_get_ifindices.3.gz
%{_mandir}/man3/sd_notify.3.gz
%{_mandir}/man3/sd_notify_barrier.3.gz
%{_mandir}/man3/sd_notifyf.3.gz
%{_mandir}/man3/sd_path_lookup.3.gz
%{_mandir}/man3/sd_path_lookup_strv.3.gz
%{_mandir}/man3/sd_peer_get_cgroup.3.gz
%{_mandir}/man3/sd_peer_get_machine_name.3.gz
%{_mandir}/man3/sd_peer_get_owner_uid.3.gz
%{_mandir}/man3/sd_peer_get_session.3.gz
%{_mandir}/man3/sd_peer_get_slice.3.gz
%{_mandir}/man3/sd_peer_get_unit.3.gz
%{_mandir}/man3/sd_peer_get_user_slice.3.gz
%{_mandir}/man3/sd_peer_get_user_unit.3.gz
%{_mandir}/man3/sd_pid_get_cgroup.3.gz
%{_mandir}/man3/sd_pid_get_machine_name.3.gz
%{_mandir}/man3/sd_pid_get_owner_uid.3.gz
%{_mandir}/man3/sd_pid_get_session.3.gz
%{_mandir}/man3/sd_pid_get_slice.3.gz
%{_mandir}/man3/sd_pid_get_unit.3.gz
%{_mandir}/man3/sd_pid_get_user_slice.3.gz
%{_mandir}/man3/sd_pid_get_user_unit.3.gz
%{_mandir}/man3/sd_pid_notify.3.gz
%{_mandir}/man3/sd_pid_notify_with_fds.3.gz
%{_mandir}/man3/sd_pid_notifyf.3.gz
%{_mandir}/man3/sd_seat_can_graphical.3.gz
%{_mandir}/man3/sd_seat_can_tty.3.gz
%{_mandir}/man3/sd_seat_get_active.3.gz
%{_mandir}/man3/sd_seat_get_sessions.3.gz
%{_mandir}/man3/sd_session_get_class.3.gz
%{_mandir}/man3/sd_session_get_desktop.3.gz
%{_mandir}/man3/sd_session_get_display.3.gz
%{_mandir}/man3/sd_session_get_remote_host.3.gz
%{_mandir}/man3/sd_session_get_remote_user.3.gz
%{_mandir}/man3/sd_session_get_seat.3.gz
%{_mandir}/man3/sd_session_get_service.3.gz
%{_mandir}/man3/sd_session_get_state.3.gz
%{_mandir}/man3/sd_session_get_tty.3.gz
%{_mandir}/man3/sd_session_get_type.3.gz
%{_mandir}/man3/sd_session_get_uid.3.gz
%{_mandir}/man3/sd_session_get_vt.3.gz
%{_mandir}/man3/sd_session_is_active.3.gz
%{_mandir}/man3/sd_session_is_remote.3.gz
%{_mandir}/man3/sd_uid_get_display.3.gz
%{_mandir}/man3/sd_uid_get_seats.3.gz
%{_mandir}/man3/sd_uid_get_sessions.3.gz
%{_mandir}/man3/sd_uid_get_state.3.gz
%{_mandir}/man3/sd_uid_is_on_seat.3.gz
%{_mandir}/man3/sd_watchdog_enabled.3.gz
%{_mandir}/man3/udev_device_get_action.3.gz
%{_mandir}/man3/udev_device_get_current_tags_list_entry.3.gz
%{_mandir}/man3/udev_device_get_devlinks_list_entry.3.gz
%{_mandir}/man3/udev_device_get_devnode.3.gz
%{_mandir}/man3/udev_device_get_devnum.3.gz
%{_mandir}/man3/udev_device_get_devpath.3.gz
%{_mandir}/man3/udev_device_get_devtype.3.gz
%{_mandir}/man3/udev_device_get_driver.3.gz
%{_mandir}/man3/udev_device_get_is_initialized.3.gz
%{_mandir}/man3/udev_device_get_parent.3.gz
%{_mandir}/man3/udev_device_get_parent_with_subsystem_devtype.3.gz
%{_mandir}/man3/udev_device_get_properties_list_entry.3.gz
%{_mandir}/man3/udev_device_get_property_value.3.gz
%{_mandir}/man3/udev_device_get_subsystem.3.gz
%{_mandir}/man3/udev_device_get_sysattr_list_entry.3.gz
%{_mandir}/man3/udev_device_get_sysattr_value.3.gz
%{_mandir}/man3/udev_device_get_sysname.3.gz
%{_mandir}/man3/udev_device_get_sysnum.3.gz
%{_mandir}/man3/udev_device_get_syspath.3.gz
%{_mandir}/man3/udev_device_get_tags_list_entry.3.gz
%{_mandir}/man3/udev_device_get_udev.3.gz
%{_mandir}/man3/udev_device_has_current_tag.3.gz
%{_mandir}/man3/udev_device_has_tag.3.gz
%{_mandir}/man3/udev_device_new_from_device_id.3.gz
%{_mandir}/man3/udev_device_new_from_devnum.3.gz
%{_mandir}/man3/udev_device_new_from_environment.3.gz
%{_mandir}/man3/udev_device_new_from_subsystem_sysname.3.gz
%{_mandir}/man3/udev_device_new_from_syspath.3.gz
%{_mandir}/man3/udev_device_ref.3.gz
%{_mandir}/man3/udev_device_set_sysattr_value.3.gz
%{_mandir}/man3/udev_device_unref.3.gz
%{_mandir}/man3/udev_enumerate_add_match_is_initialized.3.gz
%{_mandir}/man3/udev_enumerate_add_match_parent.3.gz
%{_mandir}/man3/udev_enumerate_add_match_property.3.gz
%{_mandir}/man3/udev_enumerate_add_match_subsystem.3.gz
%{_mandir}/man3/udev_enumerate_add_match_sysattr.3.gz
%{_mandir}/man3/udev_enumerate_add_match_sysname.3.gz
%{_mandir}/man3/udev_enumerate_add_match_tag.3.gz
%{_mandir}/man3/udev_enumerate_add_nomatch_subsystem.3.gz
%{_mandir}/man3/udev_enumerate_add_nomatch_sysattr.3.gz
%{_mandir}/man3/udev_enumerate_add_syspath.3.gz
%{_mandir}/man3/udev_enumerate_get_list_entry.3.gz
%{_mandir}/man3/udev_enumerate_get_udev.3.gz
%{_mandir}/man3/udev_enumerate_new.3.gz
%{_mandir}/man3/udev_enumerate_ref.3.gz
%{_mandir}/man3/udev_enumerate_scan_devices.3.gz
%{_mandir}/man3/udev_enumerate_scan_subsystems.3.gz
%{_mandir}/man3/udev_enumerate_unref.3.gz
%{_mandir}/man3/udev_list_entry.3.gz
%{_mandir}/man3/udev_list_entry_get_by_name.3.gz
%{_mandir}/man3/udev_list_entry_get_name.3.gz
%{_mandir}/man3/udev_list_entry_get_next.3.gz
%{_mandir}/man3/udev_list_entry_get_value.3.gz
%{_mandir}/man3/udev_monitor_enable_receiving.3.gz
%{_mandir}/man3/udev_monitor_filter_add_match_subsystem_devtype.3.gz
%{_mandir}/man3/udev_monitor_filter_add_match_tag.3.gz
%{_mandir}/man3/udev_monitor_filter_remove.3.gz
%{_mandir}/man3/udev_monitor_filter_update.3.gz
%{_mandir}/man3/udev_monitor_get_fd.3.gz
%{_mandir}/man3/udev_monitor_get_udev.3.gz
%{_mandir}/man3/udev_monitor_new_from_netlink.3.gz
%{_mandir}/man3/udev_monitor_receive_device.3.gz
%{_mandir}/man3/udev_monitor_ref.3.gz
%{_mandir}/man3/udev_monitor_set_receive_buffer_size.3.gz
%{_mandir}/man3/udev_monitor_unref.3.gz
%{_mandir}/man3/udev_new.3.gz
%{_mandir}/man3/udev_ref.3.gz
%{_mandir}/man3/udev_unref.3.gz
%endif

61
files.network Normal file
View file

@ -0,0 +1,61 @@
#
# Please keep the list sorted (with `LC_ALL=C sort`).
#
%if %{with networkd}
%config(noreplace) %{_sysconfdir}/systemd/networkd.conf
%dir %{_sysconfdir}/systemd/network
%dir %{_systemd_util_dir}/network
%{_bindir}/networkctl
%{_datadir}/bash-completion/completions/networkctl
%{_datadir}/dbus-1/system-services/org.freedesktop.network1.service
%{_datadir}/dbus-1/system.d/org.freedesktop.network1.conf
%{_datadir}/polkit-1/actions/org.freedesktop.network1.policy
%{_datadir}/polkit-1/rules.d/60-systemd-networkd.rules
%{_datadir}/zsh/site-functions/_networkctl
%{_mandir}/man1/networkctl.1.gz
%{_mandir}/man5/networkd.conf.5.gz
%{_mandir}/man5/networkd.conf.d.5.gz
%{_mandir}/man5/systemd.network.5.gz
%{_mandir}/man8/systemd-networkd-wait-online.8.gz
%{_mandir}/man8/systemd-networkd-wait-online.service.8.gz
%{_mandir}/man8/systemd-networkd.8.gz
%{_mandir}/man8/systemd-networkd.service.8.gz
%{_systemd_util_dir}/network/80-container-host0.network
%{_systemd_util_dir}/network/80-container-ve.network
%{_systemd_util_dir}/network/80-container-vz.network
%{_systemd_util_dir}/network/80-vm-vt.network
%{_systemd_util_dir}/network/80-wifi-adhoc.network
%{_systemd_util_dir}/network/80-wifi-ap.network.example
%{_systemd_util_dir}/network/80-wifi-station.network.example
%{_systemd_util_dir}/systemd-networkd
%{_systemd_util_dir}/systemd-networkd-wait-online
%{_unitdir}/systemd-networkd-wait-online.service
%{_unitdir}/systemd-networkd.service
%{_unitdir}/systemd-networkd.socket
%endif
%if %{with resolved}
%config(noreplace) %{_sysconfdir}/systemd/resolved.conf
%{_bindir}/resolvectl
%{_bindir}/systemd-resolve
%{_datadir}/bash-completion/completions/resolvectl
%{_datadir}/bash-completion/completions/systemd-resolve
%{_datadir}/dbus-1/system-services/org.freedesktop.resolve1.service
%{_datadir}/dbus-1/system.d/org.freedesktop.resolve1.conf
%{_datadir}/polkit-1/actions/org.freedesktop.resolve1.policy
%{_datadir}/zsh/site-functions/_resolvectl
%{_libdir}/libnss_resolve.so.2
%{_mandir}/man1/resolvectl.1.gz
%{_mandir}/man5/org.freedesktop.resolve1.5.gz
%{_mandir}/man5/resolved.conf.5.gz
%{_mandir}/man5/resolved.conf.d.5.gz
%{_mandir}/man8/libnss_resolve.so.2.8.gz
%{_mandir}/man8/nss-resolve.8.gz
%{_mandir}/man8/systemd-resolved.8.gz
%{_mandir}/man8/systemd-resolved.service.8.gz
%{_systemd_util_dir}/resolv.conf
%{_systemd_util_dir}/systemd-resolved
%{_sysusersdir}/systemd-resolve.conf
%{_tmpfilesdir}/systemd-resolve.conf
%{_unitdir}/systemd-resolved.service
%endif

794
files.systemd Normal file
View file

@ -0,0 +1,794 @@
#
# Please keep the list sorted (with `LC_ALL=C sort`).
#
%config(noreplace) %{_sysconfdir}/pam.d/systemd-user
%config(noreplace) %{_sysconfdir}/systemd/journald.conf
%config(noreplace) %{_sysconfdir}/systemd/logind.conf
%config(noreplace) %{_sysconfdir}/systemd/sleep.conf
%config(noreplace) %{_sysconfdir}/systemd/system.conf
%config(noreplace) %{_sysconfdir}/systemd/timesyncd.conf
%config(noreplace) %{_sysconfdir}/systemd/user.conf
%dir %{_binfmtdir}
%if ! %{bootstrap}
%dir %{_datadir}/bash-completion
%dir %{_datadir}/bash-completion/completions
%endif
%dir %{_datadir}/dbus-1
%dir %{_datadir}/dbus-1/services
%dir %{_datadir}/dbus-1/system-services
%dir %{_datadir}/dbus-1/system.d
%dir %{_datadir}/factory
%dir %{_datadir}/polkit-1
%dir %{_datadir}/polkit-1/actions
%dir %{_datadir}/systemd
%if ! %{bootstrap}
%dir %{_datadir}/zsh
%dir %{_datadir}/zsh/site-functions
%endif
%dir %{_environmentdir}
%dir %{_journalcatalogdir}
%dir %{_localstatedir}/lib/systemd
%dir %{_localstatedir}/lib/systemd/catalog
%if %{with sysvcompat}
%dir %{_localstatedir}/lib/systemd/migrated
%endif
%dir %{_localstatedir}/lib/systemd/rpm
%if %{with sysvcompat}
%dir %{_localstatedir}/lib/systemd/sysv-convert
%endif
%dir %{_modprobedir}
%dir %{_sysconfdir}/X11/xorg.conf.d
%dir %{_sysconfdir}/binfmt.d
%dir %{_sysconfdir}/modules-load.d
%dir %{_sysconfdir}/sysctl.d
%dir %{_sysconfdir}/systemd
%dir %{_sysconfdir}/systemd/system
%dir %{_sysconfdir}/systemd/user
%dir %{_sysconfdir}/tmpfiles.d
%dir %{_sysconfdir}/xdg/systemd
%dir %{_sysctldir}
%dir %{_systemd_system_env_generator_dir}
%dir %{_systemd_user_env_generator_dir}
%dir %{_systemd_util_dir}
%dir %{_systemd_util_dir}/ntp-units.d
%dir %{_systemd_util_dir}/rpm
%dir %{_systemd_util_dir}/system-preset
%dir %{_systemd_util_dir}/system-shutdown
%dir %{_systemd_util_dir}/system-sleep
%dir %{_systemd_util_dir}/user
%dir %{_systemd_util_dir}/user-generators
%dir %{_systemd_util_dir}/user-preset
%dir %{_systemdgeneratordir}
%dir %{_systemdusergeneratordir}
%dir %{_sysusersdir}
%dir %{_tmpfilesdir}
%dir %{_unitdir}
%dir %{_unitdir}/basic.target.wants
%dir %{_unitdir}/dbus.target.wants
%dir %{_unitdir}/default.target.wants
%dir %{_unitdir}/graphical.target.wants
%dir %{_unitdir}/halt.target.wants
%dir %{_unitdir}/initrd-root-device.target.wants
%dir %{_unitdir}/initrd-root-fs.target.wants
%dir %{_unitdir}/kexec.target.wants
%dir %{_unitdir}/local-fs.target.wants
%dir %{_unitdir}/multi-user.target.wants
%dir %{_unitdir}/poweroff.target.wants
%dir %{_unitdir}/reboot.target.wants
%dir %{_unitdir}/remote-fs.target.wants
%dir %{_unitdir}/rescue.target.wants
%if %{with sysvcompat}
%dir %{_unitdir}/runlevel1.target.wants
%dir %{_unitdir}/runlevel2.target.wants
%dir %{_unitdir}/runlevel3.target.wants
%dir %{_unitdir}/runlevel4.target.wants
%dir %{_unitdir}/runlevel5.target.wants
%endif
%dir %{_unitdir}/shutdown.target.wants
%dir %{_unitdir}/sockets.target.wants
%dir %{_unitdir}/sysinit.target.wants
%dir %{_unitdir}/timers.target.wants
%dir %{_unitdir}/user@.service.d
%dir %{_unitdir}/user@0.service.d
%dir %{xinitconfdir}
%dir %{xinitconfdir}/xinitrc.d
%doc %{_modprobedir}/README
%doc %{_sysctldir}/README
%doc %{_sysusersdir}/README
%doc %{_tmpfilesdir}/README
%ghost %attr(0444,root,root) %config(noreplace) %{_sysconfdir}/machine-id
%ghost %attr(0600,root,root) %{_localstatedir}/lib/systemd/random-seed
%ghost %config(noreplace) %{_sysconfdir}/X11/xorg.conf.d/00-keyboard.conf
%ghost %config(noreplace) %{_sysconfdir}/locale.conf
%ghost %config(noreplace) %{_sysconfdir}/machine-info
%ghost %config(noreplace) %{_sysconfdir}/vconsole.conf
%ghost %dir %attr(2755, root, systemd-journal) %{_localstatedir}/log/journal
%ghost %{_localstatedir}/lib/systemd/backlight
%ghost %{_localstatedir}/lib/systemd/catalog/database
%license LICENSE.GPL2
%license LICENSE.LGPL2.1
%{_bindir}/busctl
%{_bindir}/hostnamectl
%{_bindir}/journalctl
%{_bindir}/localectl
%{_bindir}/loginctl
%{_bindir}/systemctl
%{_bindir}/systemd-analyze
%{_bindir}/systemd-ask-password
%{_bindir}/systemd-cat
%{_bindir}/systemd-cgls
%{_bindir}/systemd-cgtop
%{_bindir}/systemd-delta
%{_bindir}/systemd-detect-virt
%{_bindir}/systemd-dissect
%{_bindir}/systemd-escape
%{_bindir}/systemd-firstboot
%{_bindir}/systemd-id128
%{_bindir}/systemd-inhibit
%{_bindir}/systemd-machine-id-setup
%{_bindir}/systemd-mount
%{_bindir}/systemd-notify
%{_bindir}/systemd-path
%{_bindir}/systemd-run
%{_bindir}/systemd-socket-activate
%{_bindir}/systemd-stdio-bridge
%{_bindir}/systemd-sysext
%{_bindir}/systemd-sysusers
%{_bindir}/systemd-tmpfiles
%{_bindir}/systemd-tty-ask-password-agent
%{_bindir}/systemd-umount
%{_bindir}/timedatectl
%if ! %{bootstrap}
%{_datadir}/bash-completion/completions/busctl
%{_datadir}/bash-completion/completions/hostnamectl
%{_datadir}/bash-completion/completions/journalctl
%{_datadir}/bash-completion/completions/localectl
%{_datadir}/bash-completion/completions/loginctl
%{_datadir}/bash-completion/completions/portablectl
%{_datadir}/bash-completion/completions/systemctl
%{_datadir}/bash-completion/completions/systemd-analyze
%{_datadir}/bash-completion/completions/systemd-cat
%{_datadir}/bash-completion/completions/systemd-cgls
%{_datadir}/bash-completion/completions/systemd-cgtop
%{_datadir}/bash-completion/completions/systemd-delta
%{_datadir}/bash-completion/completions/systemd-detect-virt
%{_datadir}/bash-completion/completions/systemd-id128
%{_datadir}/bash-completion/completions/systemd-path
%{_datadir}/bash-completion/completions/systemd-run
%{_datadir}/bash-completion/completions/timedatectl
%endif
%{_datadir}/dbus-1/services/org.freedesktop.systemd1.service
%{_datadir}/dbus-1/system-services/org.freedesktop.hostname1.service
%{_datadir}/dbus-1/system-services/org.freedesktop.locale1.service
%{_datadir}/dbus-1/system-services/org.freedesktop.login1.service
%{_datadir}/dbus-1/system-services/org.freedesktop.systemd1.service
%{_datadir}/dbus-1/system-services/org.freedesktop.timedate1.service
%{_datadir}/dbus-1/system-services/org.freedesktop.timesync1.service
%{_datadir}/dbus-1/system.d/org.freedesktop.hostname1.conf
%{_datadir}/dbus-1/system.d/org.freedesktop.locale1.conf
%{_datadir}/dbus-1/system.d/org.freedesktop.login1.conf
%{_datadir}/dbus-1/system.d/org.freedesktop.systemd1.conf
%{_datadir}/dbus-1/system.d/org.freedesktop.timedate1.conf
%{_datadir}/dbus-1/system.d/org.freedesktop.timesync1.conf
%{_datadir}/pkgconfig/systemd.pc
%{_datadir}/polkit-1/actions/org.freedesktop.hostname1.policy
%{_datadir}/polkit-1/actions/org.freedesktop.locale1.policy
%{_datadir}/polkit-1/actions/org.freedesktop.login1.policy
%{_datadir}/polkit-1/actions/org.freedesktop.systemd1.policy
%{_datadir}/polkit-1/actions/org.freedesktop.timedate1.policy
%{_datadir}/systemd/kbd-model-map
%{_datadir}/systemd/language-fallback-map
%{_datadir}/systemd/tmp.mount
%if ! %{bootstrap}
%{_datadir}/zsh/site-functions/_busctl
%{_datadir}/zsh/site-functions/_hostnamectl
%{_datadir}/zsh/site-functions/_journalctl
%{_datadir}/zsh/site-functions/_localectl
%{_datadir}/zsh/site-functions/_loginctl
%{_datadir}/zsh/site-functions/_sd_hosts_or_user_at_host
%{_datadir}/zsh/site-functions/_sd_outputmodes
%{_datadir}/zsh/site-functions/_sd_unit_files
%{_datadir}/zsh/site-functions/_systemctl
%{_datadir}/zsh/site-functions/_systemd
%{_datadir}/zsh/site-functions/_systemd-analyze
%{_datadir}/zsh/site-functions/_systemd-delta
%{_datadir}/zsh/site-functions/_systemd-inhibit
%{_datadir}/zsh/site-functions/_systemd-path
%{_datadir}/zsh/site-functions/_systemd-run
%{_datadir}/zsh/site-functions/_systemd-tmpfiles
%{_datadir}/zsh/site-functions/_timedatectl
%endif
%{_environmentdir}/99-environment.conf
%{_journalcatalogdir}/systemd.be.catalog
%{_journalcatalogdir}/systemd.be@latin.catalog
%{_journalcatalogdir}/systemd.bg.catalog
%{_journalcatalogdir}/systemd.catalog
%{_journalcatalogdir}/systemd.de.catalog
%{_journalcatalogdir}/systemd.fr.catalog
%{_journalcatalogdir}/systemd.it.catalog
%{_journalcatalogdir}/systemd.pl.catalog
%{_journalcatalogdir}/systemd.pt_BR.catalog
%{_journalcatalogdir}/systemd.ru.catalog
%{_journalcatalogdir}/systemd.zh_CN.catalog
%{_journalcatalogdir}/systemd.zh_TW.catalog
%if ! 0%{bootstrap}
%{_mandir}/man1/busctl.1.gz
%{_mandir}/man1/hostnamectl.1.gz
%{_mandir}/man1/journalctl.1.gz
%{_mandir}/man1/localectl.1.gz
%{_mandir}/man1/loginctl.1.gz
%{_mandir}/man1/systemctl.1.gz
%{_mandir}/man1/systemd-analyze.1.gz
%{_mandir}/man1/systemd-ask-password.1.gz
%{_mandir}/man1/systemd-cat.1.gz
%{_mandir}/man1/systemd-cgls.1.gz
%{_mandir}/man1/systemd-cgtop.1.gz
%{_mandir}/man1/systemd-delta.1.gz
%{_mandir}/man1/systemd-detect-virt.1.gz
%{_mandir}/man1/systemd-dissect.1.gz
%{_mandir}/man1/systemd-escape.1.gz
%{_mandir}/man1/systemd-firstboot.1.gz
%{_mandir}/man1/systemd-firstboot.service.1.gz
%{_mandir}/man1/systemd-id128.1.gz
%{_mandir}/man1/systemd-inhibit.1.gz
%{_mandir}/man1/systemd-machine-id-setup.1.gz
%{_mandir}/man1/systemd-mount.1.gz
%{_mandir}/man1/systemd-notify.1.gz
%{_mandir}/man1/systemd-path.1.gz
%{_mandir}/man1/systemd-run.1.gz
%{_mandir}/man1/systemd-socket-activate.1.gz
%{_mandir}/man1/systemd-tty-ask-password-agent.1.gz
%{_mandir}/man1/systemd-umount.1.gz
%{_mandir}/man1/systemd.1.gz
%{_mandir}/man1/timedatectl.1.gz
%{_mandir}/man5/binfmt.d.5.gz
%{_mandir}/man5/crypttab.5.gz
%{_mandir}/man5/dnssec-trust-anchors.d.5.gz
%{_mandir}/man5/environment.d.5.gz
%{_mandir}/man5/hostname.5.gz
%{_mandir}/man5/initrd-release.5.gz
%{_mandir}/man5/journald.conf.5.gz
%{_mandir}/man5/journald.conf.d.5.gz
%{_mandir}/man5/journald@.conf.5.gz
%{_mandir}/man5/locale.conf.5.gz
%{_mandir}/man5/localtime.5.gz
%{_mandir}/man5/logind.conf.5.gz
%{_mandir}/man5/logind.conf.d.5.gz
%{_mandir}/man5/machine-id.5.gz
%{_mandir}/man5/machine-info.5.gz
%{_mandir}/man5/modules-load.d.5.gz
%{_mandir}/man5/org.freedesktop.LogControl1.5.gz
%{_mandir}/man5/org.freedesktop.hostname1.5.gz
%{_mandir}/man5/org.freedesktop.locale1.5.gz
%{_mandir}/man5/org.freedesktop.login1.5.gz
%{_mandir}/man5/org.freedesktop.portable1.5.gz
%{_mandir}/man5/org.freedesktop.systemd1.5.gz
%{_mandir}/man5/org.freedesktop.timedate1.5.gz
%{_mandir}/man5/os-release.5.gz
%{_mandir}/man5/sleep.conf.d.5.gz
%{_mandir}/man5/sysctl.d.5.gz
%{_mandir}/man5/system.conf.d.5.gz
%{_mandir}/man5/systemd-sleep.conf.5.gz
%{_mandir}/man5/systemd-system.conf.5.gz
%{_mandir}/man5/systemd-user-runtime-dir.5.gz
%{_mandir}/man5/systemd-user.conf.5.gz
%{_mandir}/man5/systemd.automount.5.gz
%{_mandir}/man5/systemd.device.5.gz
%{_mandir}/man5/systemd.dnssd.5.gz
%{_mandir}/man5/systemd.exec.5.gz
%{_mandir}/man5/systemd.kill.5.gz
%{_mandir}/man5/systemd.link.5.gz
%{_mandir}/man5/systemd.mount.5.gz
%{_mandir}/man5/systemd.negative.5.gz
%{_mandir}/man5/systemd.netdev.5.gz
%{_mandir}/man5/systemd.path.5.gz
%{_mandir}/man5/systemd.positive.5.gz
%{_mandir}/man5/systemd.preset.5.gz
%{_mandir}/man5/systemd.resource-control.5.gz
%{_mandir}/man5/systemd.scope.5.gz
%{_mandir}/man5/systemd.service.5.gz
%{_mandir}/man5/systemd.slice.5.gz
%{_mandir}/man5/systemd.socket.5.gz
%{_mandir}/man5/systemd.swap.5.gz
%{_mandir}/man5/systemd.target.5.gz
%{_mandir}/man5/systemd.timer.5.gz
%{_mandir}/man5/systemd.unit.5.gz
%{_mandir}/man5/sysusers.d.5.gz
%{_mandir}/man5/timesyncd.conf.5.gz
%{_mandir}/man5/timesyncd.conf.d.5.gz
%{_mandir}/man5/tmpfiles.d.5.gz
%{_mandir}/man5/user-runtime-dir@.service.5.gz
%{_mandir}/man5/user.conf.d.5.gz
%{_mandir}/man5/user@.service.5.gz
%{_mandir}/man5/vconsole.conf.5.gz
%{_mandir}/man5/veritytab.5.gz
%{_mandir}/man7/bootup.7.gz
%{_mandir}/man7/daemon.7.gz
%{_mandir}/man7/file-hierarchy.7.gz
%{_mandir}/man7/kernel-command-line.7.gz
%{_mandir}/man7/systemd.directives.7.gz
%{_mandir}/man7/systemd.environment-generator.7.gz
%{_mandir}/man7/systemd.generator.7.gz
%{_mandir}/man7/systemd.index.7.gz
%{_mandir}/man7/systemd.journal-fields.7.gz
%{_mandir}/man7/systemd.net-naming-scheme.7.gz
%{_mandir}/man7/systemd.offline-updates.7.gz
%{_mandir}/man7/systemd.special.7.gz
%{_mandir}/man7/systemd.syntax.7.gz
%{_mandir}/man7/systemd.time.7.gz
%{_mandir}/man8/30-systemd-environment-d-generator.8.gz
%{_mandir}/man8/pam_systemd.8.gz
%{_mandir}/man8/rc-local.service.8.gz
%{_mandir}/man8/systemd-ask-password-console.path.8.gz
%{_mandir}/man8/systemd-ask-password-console.service.8.gz
%{_mandir}/man8/systemd-ask-password-wall.path.8.gz
%{_mandir}/man8/systemd-ask-password-wall.service.8.gz
%{_mandir}/man8/systemd-backlight.8.gz
%{_mandir}/man8/systemd-backlight@.service.8.gz
%{_mandir}/man8/systemd-binfmt.8.gz
%{_mandir}/man8/systemd-binfmt.service.8.gz
%{_mandir}/man8/systemd-boot-check-no-failures.8.gz
%{_mandir}/man8/systemd-boot-check-no-failures.service.8.gz
%{_mandir}/man8/systemd-cryptsetup-generator.8.gz
%{_mandir}/man8/systemd-cryptsetup.8.gz
%{_mandir}/man8/systemd-cryptsetup@.service.8.gz
%{_mandir}/man8/systemd-debug-generator.8.gz
%{_mandir}/man8/systemd-environment-d-generator.8.gz
%{_mandir}/man8/systemd-fsck-root.service.8.gz
%{_mandir}/man8/systemd-fsck.8.gz
%{_mandir}/man8/systemd-fsck@.service.8.gz
%{_mandir}/man8/systemd-fstab-generator.8.gz
%{_mandir}/man8/systemd-getty-generator.8.gz
%{_mandir}/man8/systemd-gpt-auto-generator.8.gz
%{_mandir}/man8/systemd-growfs.8.gz
%{_mandir}/man8/systemd-growfs@.service.8.gz
%{_mandir}/man8/systemd-halt.service.8.gz
%{_mandir}/man8/systemd-hibernate-resume-generator.8.gz
%{_mandir}/man8/systemd-hibernate-resume.8.gz
%{_mandir}/man8/systemd-hibernate-resume@.service.8.gz
%{_mandir}/man8/systemd-hibernate.service.8.gz
%{_mandir}/man8/systemd-hostnamed.8.gz
%{_mandir}/man8/systemd-hostnamed.service.8.gz
%{_mandir}/man8/systemd-hybrid-sleep.service.8.gz
%{_mandir}/man8/systemd-initctl.8.gz
%{_mandir}/man8/systemd-initctl.service.8.gz
%{_mandir}/man8/systemd-initctl.socket.8.gz
%{_mandir}/man8/systemd-journald-audit.socket.8.gz
%{_mandir}/man8/systemd-journald-dev-log.socket.8.gz
%{_mandir}/man8/systemd-journald-varlink@.socket.8.gz
%{_mandir}/man8/systemd-journald.8.gz
%{_mandir}/man8/systemd-journald.service.8.gz
%{_mandir}/man8/systemd-journald.socket.8.gz
%{_mandir}/man8/systemd-journald@.service.8.gz
%{_mandir}/man8/systemd-journald@.socket.8.gz
%{_mandir}/man8/systemd-kexec.service.8.gz
%{_mandir}/man8/systemd-localed.8.gz
%{_mandir}/man8/systemd-localed.service.8.gz
%{_mandir}/man8/systemd-logind.8.gz
%{_mandir}/man8/systemd-logind.service.8.gz
%{_mandir}/man8/systemd-machine-id-commit.service.8.gz
%{_mandir}/man8/systemd-makefs.8.gz
%{_mandir}/man8/systemd-makefs@.service.8.gz
%{_mandir}/man8/systemd-mkswap@.service.8.gz
%{_mandir}/man8/systemd-modules-load.8.gz
%{_mandir}/man8/systemd-modules-load.service.8.gz
%{_mandir}/man8/systemd-poweroff.service.8.gz
%{_mandir}/man8/systemd-quotacheck.8.gz
%{_mandir}/man8/systemd-quotacheck.service.8.gz
%{_mandir}/man8/systemd-random-seed.8.gz
%{_mandir}/man8/systemd-random-seed.service.8.gz
%{_mandir}/man8/systemd-rc-local-generator.8.gz
%{_mandir}/man8/systemd-reboot.service.8.gz
%{_mandir}/man8/systemd-remount-fs.8.gz
%{_mandir}/man8/systemd-remount-fs.service.8.gz
%{_mandir}/man8/systemd-rfkill.8.gz
%{_mandir}/man8/systemd-rfkill.service.8.gz
%{_mandir}/man8/systemd-rfkill.socket.8.gz
%{_mandir}/man8/systemd-run-generator.8.gz
%{_mandir}/man8/systemd-shutdown.8.gz
%{_mandir}/man8/systemd-sleep.8.gz
%{_mandir}/man8/systemd-socket-proxyd.8.gz
%{_mandir}/man8/systemd-suspend-then-hibernate.service.8.gz
%{_mandir}/man8/systemd-suspend.service.8.gz
%{_mandir}/man8/systemd-sysctl.8.gz
%{_mandir}/man8/systemd-sysctl.service.8.gz
%{_mandir}/man8/systemd-sysext.8.gz
%{_mandir}/man8/systemd-sysext.service.8.gz
%{_mandir}/man8/systemd-system-update-generator.8.gz
%{_mandir}/man8/systemd-sysusers.8.gz
%{_mandir}/man8/systemd-sysusers.service.8.gz
%{_mandir}/man8/systemd-sysv-generator.8.gz
%{_mandir}/man8/systemd-time-wait-sync.8.gz
%{_mandir}/man8/systemd-time-wait-sync.service.8.gz
%{_mandir}/man8/systemd-timedated.8.gz
%{_mandir}/man8/systemd-timedated.service.8.gz
%{_mandir}/man8/systemd-timesyncd.8.gz
%{_mandir}/man8/systemd-timesyncd.service.8.gz
%{_mandir}/man8/systemd-tmpfiles-clean.service.8.gz
%{_mandir}/man8/systemd-tmpfiles-clean.timer.8.gz
%{_mandir}/man8/systemd-tmpfiles-setup-dev.service.8.gz
%{_mandir}/man8/systemd-tmpfiles-setup.service.8.gz
%{_mandir}/man8/systemd-tmpfiles.8.gz
%{_mandir}/man8/systemd-update-done.8.gz
%{_mandir}/man8/systemd-update-done.service.8.gz
%{_mandir}/man8/systemd-update-utmp-runlevel.service.8.gz
%{_mandir}/man8/systemd-update-utmp.8.gz
%{_mandir}/man8/systemd-update-utmp.service.8.gz
%{_mandir}/man8/systemd-user-sessions.8.gz
%{_mandir}/man8/systemd-user-sessions.service.8.gz
%{_mandir}/man8/systemd-vconsole-setup.8.gz
%{_mandir}/man8/systemd-vconsole-setup.service.8.gz
%{_mandir}/man8/systemd-veritysetup-generator.8.gz
%{_mandir}/man8/systemd-veritysetup.8.gz
%{_mandir}/man8/systemd-veritysetup@.service.8.gz
%{_mandir}/man8/systemd-volatile-root.8.gz
%{_mandir}/man8/systemd-volatile-root.service.8.gz
%{_mandir}/man8/systemd-xdg-autostart-generator.8.gz
%endif
%{_modprobedir}/systemd.conf
%{_pam_moduledir}/pam_systemd.so
%if %{with sysvcompat}
%{_sbindir}/systemd-sysv-convert
%endif
%{_sysconfdir}/xdg/systemd/user
%{_sysctldir}/99-sysctl.conf
%{_systemd_user_env_generator_dir}/30-systemd-environment-d-generator
%{_systemd_util_dir}/libsystemd-shared-249.so
%{_systemd_util_dir}/ntp-units.d/80-systemd-timesync.list
%{_systemd_util_dir}/rpm/fixlet-systemd-post.sh
%{_systemd_util_dir}/system-preset/99-default.preset
%{_systemd_util_dir}/systemd
%{_systemd_util_dir}/systemd-ac-power
%{_systemd_util_dir}/systemd-backlight
%{_systemd_util_dir}/systemd-binfmt
%{_systemd_util_dir}/systemd-boot-check-no-failures
%{_systemd_util_dir}/systemd-cgroups-agent
%if ! %{bootstrap}
%{_systemd_util_dir}/systemd-cryptsetup
%endif
%{_systemd_util_dir}/systemd-fsck
%{_systemd_util_dir}/systemd-growfs
%{_systemd_util_dir}/systemd-hibernate-resume
%{_systemd_util_dir}/systemd-hostnamed
%if %{with sysvcompat}
%{_systemd_util_dir}/systemd-initctl
%endif
%{_systemd_util_dir}/systemd-journald
%{_systemd_util_dir}/systemd-localed
%{_systemd_util_dir}/systemd-logind
%{_systemd_util_dir}/systemd-makefs
%{_systemd_util_dir}/systemd-modules-load
%{_systemd_util_dir}/systemd-quotacheck
%{_systemd_util_dir}/systemd-random-seed
%{_systemd_util_dir}/systemd-remount-fs
%{_systemd_util_dir}/systemd-reply-password
%{_systemd_util_dir}/systemd-rfkill
%{_systemd_util_dir}/systemd-shutdown
%{_systemd_util_dir}/systemd-sleep
%{_systemd_util_dir}/systemd-socket-proxyd
%{_systemd_util_dir}/systemd-sulogin-shell
%{_systemd_util_dir}/systemd-sysctl
%if %{with sysvcompat}
%{_systemd_util_dir}/systemd-sysv-install
%endif
%{_systemd_util_dir}/systemd-time-wait-sync
%{_systemd_util_dir}/systemd-timedated
%{_systemd_util_dir}/systemd-timesyncd
%{_systemd_util_dir}/systemd-update-done
%{_systemd_util_dir}/systemd-update-utmp
%{_systemd_util_dir}/systemd-user-runtime-dir
%{_systemd_util_dir}/systemd-user-sessions
%{_systemd_util_dir}/systemd-vconsole-setup
%if ! %{bootstrap}
%{_systemd_util_dir}/systemd-veritysetup
%endif
%{_systemd_util_dir}/systemd-volatile-root
%{_systemd_util_dir}/systemd-xdg-autostart-condition
%{_systemd_util_dir}/user-generators/systemd-xdg-autostart-generator
%{_systemd_util_dir}/user-preset/90-systemd.preset
%{_systemd_util_dir}/user-preset/99-default.preset
%{_systemd_util_dir}/user/app.slice
%{_systemd_util_dir}/user/background.slice
%{_systemd_util_dir}/user/basic.target
%{_systemd_util_dir}/user/bluetooth.target
%{_systemd_util_dir}/user/default.target
%{_systemd_util_dir}/user/exit.target
%{_systemd_util_dir}/user/graphical-session-pre.target
%{_systemd_util_dir}/user/graphical-session.target
%{_systemd_util_dir}/user/paths.target
%{_systemd_util_dir}/user/printer.target
%{_systemd_util_dir}/user/session.slice
%{_systemd_util_dir}/user/shutdown.target
%{_systemd_util_dir}/user/smartcard.target
%{_systemd_util_dir}/user/sockets.target
%{_systemd_util_dir}/user/sound.target
%{_systemd_util_dir}/user/systemd-exit.service
%{_systemd_util_dir}/user/systemd-tmpfiles-clean.service
%{_systemd_util_dir}/user/systemd-tmpfiles-clean.timer
%{_systemd_util_dir}/user/systemd-tmpfiles-setup.service
%{_systemd_util_dir}/user/timers.target
%{_systemd_util_dir}/user/xdg-desktop-autostart.target
%{_systemdgeneratordir}/logind-compat-tasks-max-generator
%if ! %{bootstrap}
%{_systemdgeneratordir}/systemd-cryptsetup-generator
%endif
%{_systemdgeneratordir}/systemd-debug-generator
%{_systemdgeneratordir}/systemd-fstab-generator
%{_systemdgeneratordir}/systemd-getty-generator
%{_systemdgeneratordir}/systemd-gpt-auto-generator
%{_systemdgeneratordir}/systemd-hibernate-resume-generator
%if %{with sysvcompat}
%{_systemdgeneratordir}/systemd-rc-local-generator
%endif
%{_systemdgeneratordir}/systemd-run-generator
%{_systemdgeneratordir}/systemd-system-update-generator
%if %{with sysvcompat}
%{_systemdgeneratordir}/systemd-sysv-generator
%endif
%if ! %{bootstrap}
%{_systemdgeneratordir}/systemd-veritysetup-generator
%endif
%{_sysusersdir}/systemd-journal.conf
%if %{with networkd}
# Yes, systemd-network.conf really belongs here, see
# https://github.com/systemd/systemd/pull/22416#issuecomment-1029828592
%{_sysusersdir}/systemd-network.conf
%endif
%{_sysusersdir}/systemd-timesync.conf
%{_tmpfilesdir}/journal-nocow.conf
%{_tmpfilesdir}/suse.conf
%{_tmpfilesdir}/systemd-nologin.conf
%{_tmpfilesdir}/systemd-tmp.conf
%{_tmpfilesdir}/systemd.conf
%{_tmpfilesdir}/x11.conf
%{_udevrulesdir}/70-uaccess.rules
%{_udevrulesdir}/71-seat.rules
%{_udevrulesdir}/73-seat-late.rules
%{_udevrulesdir}/99-systemd.rules
%{_unitdir}/after-local.service
%{_unitdir}/autovt@.service
%{_unitdir}/basic.target
%{_unitdir}/blockdev@.target
%{_unitdir}/bluetooth.target
%{_unitdir}/boot-complete.target
%{_unitdir}/console-getty.service
%{_unitdir}/container-getty@.service
%if ! %{bootstrap}
%{_unitdir}/cryptsetup-pre.target
%{_unitdir}/cryptsetup.target
%endif
%{_unitdir}/ctrl-alt-del.target
%{_unitdir}/dbus-org.freedesktop.hostname1.service
%{_unitdir}/dbus-org.freedesktop.locale1.service
%{_unitdir}/dbus-org.freedesktop.login1.service
%{_unitdir}/dbus-org.freedesktop.timedate1.service
%{_unitdir}/debug-shell.service
%{_unitdir}/default.target
%{_unitdir}/detect-part-label-duplicates.service
%{_unitdir}/dev-hugepages.mount
%{_unitdir}/dev-mqueue.mount
%{_unitdir}/emergency.service
%{_unitdir}/emergency.target
%{_unitdir}/exit.target
%{_unitdir}/final.target
%{_unitdir}/first-boot-complete.target
%{_unitdir}/getty-pre.target
%{_unitdir}/getty.target
%{_unitdir}/getty@.service
%{_unitdir}/graphical.target
%if %{with sysvcompat}
%{_unitdir}/graphical.target.wants/systemd-update-utmp-runlevel.service
%{_unitdir}/halt-local.service
%endif
%{_unitdir}/halt.target
%{_unitdir}/hibernate.target
%{_unitdir}/hybrid-sleep.target
%{_unitdir}/initrd-cleanup.service
%{_unitdir}/initrd-fs.target
%{_unitdir}/initrd-parse-etc.service
%{_unitdir}/initrd-root-device.target
%if ! %{bootstrap}
%{_unitdir}/initrd-root-device.target.wants/remote-cryptsetup.target
%{_unitdir}/initrd-root-device.target.wants/remote-veritysetup.target
%endif
%{_unitdir}/initrd-root-fs.target
%{_unitdir}/initrd-switch-root.service
%{_unitdir}/initrd-switch-root.target
%{_unitdir}/initrd-usr-fs.target
%{_unitdir}/initrd.target
%{_unitdir}/kexec.target
%{_unitdir}/local-fs-pre.target
%{_unitdir}/local-fs.target
%if %{with sysvcompat}
%{_unitdir}/local-fs.target.wants/var-lock.mount
%{_unitdir}/local-fs.target.wants/var-run.mount
%endif
%{_unitdir}/modprobe@.service
%{_unitdir}/multi-user.target
%{_unitdir}/multi-user.target.wants/after-local.service
%{_unitdir}/multi-user.target.wants/getty.target
%{_unitdir}/multi-user.target.wants/systemd-logind.service
%if %{with sysvcompat}
%{_unitdir}/multi-user.target.wants/systemd-update-utmp-runlevel.service
%endif
%{_unitdir}/multi-user.target.wants/systemd-user-sessions.service
%{_unitdir}/network-online.target
%{_unitdir}/network-pre.target
%{_unitdir}/network.target
%{_unitdir}/nss-lookup.target
%{_unitdir}/nss-user-lookup.target
%{_unitdir}/paths.target
%{_unitdir}/poweroff.target
%{_unitdir}/printer.target
%{_unitdir}/proc-sys-fs-binfmt_misc.automount
%{_unitdir}/proc-sys-fs-binfmt_misc.mount
%{_unitdir}/quotaon.service
%if %{with sysvcompat}
%{_unitdir}/rc-local.service
%endif
%{_unitdir}/reboot.target
%if ! %{bootstrap}
%{_unitdir}/remote-cryptsetup.target
%endif
%{_unitdir}/remote-fs-pre.target
%{_unitdir}/remote-fs.target
%if ! %{bootstrap}
%{_unitdir}/remote-veritysetup.target
%endif
%{_unitdir}/rescue.service
%{_unitdir}/rescue.target
%if %{with sysvcompat}
%{_unitdir}/rescue.target.wants/systemd-update-utmp-runlevel.service
%endif
%{_unitdir}/rpcbind.target
%if %{with sysvcompat}
%{_unitdir}/runlevel0.target
%{_unitdir}/runlevel1.target
%{_unitdir}/runlevel2.target
%{_unitdir}/runlevel3.target
%{_unitdir}/runlevel4.target
%{_unitdir}/runlevel5.target
%{_unitdir}/runlevel6.target
%endif
%{_unitdir}/serial-getty@.service
%{_unitdir}/shutdown.target
%{_unitdir}/sigpwr.target
%{_unitdir}/sleep.target
%{_unitdir}/slices.target
%{_unitdir}/smartcard.target
%{_unitdir}/sockets.target
%if %{with sysvcompat}
%{_unitdir}/sockets.target.wants/systemd-initctl.socket
%endif
%{_unitdir}/sockets.target.wants/systemd-journald-dev-log.socket
%{_unitdir}/sockets.target.wants/systemd-journald.socket
%{_unitdir}/sound.target
%{_unitdir}/suspend-then-hibernate.target
%{_unitdir}/suspend.target
%{_unitdir}/swap.target
%{_unitdir}/sys-fs-fuse-connections.mount
%{_unitdir}/sys-kernel-config.mount
%{_unitdir}/sys-kernel-debug.mount
%{_unitdir}/sys-kernel-tracing.mount
%{_unitdir}/sysinit.target
%if ! %{bootstrap}
%{_unitdir}/sysinit.target.wants/cryptsetup.target
%endif
%{_unitdir}/sysinit.target.wants/detect-part-label-duplicates.service
%{_unitdir}/sysinit.target.wants/dev-hugepages.mount
%{_unitdir}/sysinit.target.wants/dev-mqueue.mount
%{_unitdir}/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount
%{_unitdir}/sysinit.target.wants/sys-fs-fuse-connections.mount
%{_unitdir}/sysinit.target.wants/sys-kernel-config.mount
%{_unitdir}/sysinit.target.wants/sys-kernel-debug.mount
%{_unitdir}/sysinit.target.wants/sys-kernel-tracing.mount
%{_unitdir}/sysinit.target.wants/systemd-ask-password-console.path
%{_unitdir}/sysinit.target.wants/systemd-binfmt.service
%{_unitdir}/sysinit.target.wants/systemd-firstboot.service
%{_unitdir}/sysinit.target.wants/systemd-journal-catalog-update.service
%{_unitdir}/sysinit.target.wants/systemd-journal-flush.service
%{_unitdir}/sysinit.target.wants/systemd-journald.service
%{_unitdir}/sysinit.target.wants/systemd-machine-id-commit.service
%{_unitdir}/sysinit.target.wants/systemd-modules-load.service
%{_unitdir}/sysinit.target.wants/systemd-random-seed.service
%{_unitdir}/sysinit.target.wants/systemd-sysctl.service
%{_unitdir}/sysinit.target.wants/systemd-sysusers.service
%{_unitdir}/sysinit.target.wants/systemd-tmpfiles-setup-dev.service
%{_unitdir}/sysinit.target.wants/systemd-tmpfiles-setup.service
%{_unitdir}/sysinit.target.wants/systemd-update-done.service
%{_unitdir}/sysinit.target.wants/systemd-update-utmp.service
%if ! %{bootstrap}
%{_unitdir}/sysinit.target.wants/veritysetup.target
%endif
%{_unitdir}/syslog.socket
%if ! %{bootstrap}
%{_unitdir}/system-systemd\x2dcryptsetup.slice
%endif
%{_unitdir}/system-update-cleanup.service
%{_unitdir}/system-update-pre.target
%{_unitdir}/system-update.target
%{_unitdir}/systemd-ask-password-console.path
%{_unitdir}/systemd-ask-password-console.service
%{_unitdir}/systemd-ask-password-wall.path
%{_unitdir}/systemd-ask-password-wall.service
%{_unitdir}/systemd-backlight@.service
%{_unitdir}/systemd-binfmt.service
%{_unitdir}/systemd-boot-check-no-failures.service
%{_unitdir}/systemd-exit.service
%{_unitdir}/systemd-firstboot.service
%{_unitdir}/systemd-fsck-root.service
%{_unitdir}/systemd-fsck@.service
%{_unitdir}/systemd-halt.service
%{_unitdir}/systemd-hibernate-resume@.service
%{_unitdir}/systemd-hibernate.service
%{_unitdir}/systemd-hostnamed.service
%{_unitdir}/systemd-hybrid-sleep.service
%if %{with sysvcompat}
%{_unitdir}/systemd-initctl.service
%{_unitdir}/systemd-initctl.socket
%endif
%{_unitdir}/systemd-journal-catalog-update.service
%{_unitdir}/systemd-journal-flush.service
%{_unitdir}/systemd-journald-dev-log.socket
%{_unitdir}/systemd-journald-varlink@.socket
%{_unitdir}/systemd-journald.service
%{_unitdir}/systemd-journald.socket
%{_unitdir}/systemd-journald@.service
%{_unitdir}/systemd-journald@.socket
%{_unitdir}/systemd-kexec.service
%{_unitdir}/systemd-localed.service
%{_unitdir}/systemd-logind.service
%{_unitdir}/systemd-machine-id-commit.service
%{_unitdir}/systemd-modules-load.service
%{_unitdir}/systemd-poweroff.service
%{_unitdir}/systemd-quotacheck.service
%{_unitdir}/systemd-random-seed.service
%{_unitdir}/systemd-reboot.service
%{_unitdir}/systemd-remount-fs.service
%{_unitdir}/systemd-rfkill.service
%{_unitdir}/systemd-rfkill.socket
%{_unitdir}/systemd-suspend-then-hibernate.service
%{_unitdir}/systemd-suspend.service
%{_unitdir}/systemd-sysctl.service
%{_unitdir}/systemd-sysext.service
%{_unitdir}/systemd-sysusers.service
%{_unitdir}/systemd-time-wait-sync.service
%{_unitdir}/systemd-timedated.service
%{_unitdir}/systemd-timesyncd.service
%{_unitdir}/systemd-tmpfiles-clean.service
%{_unitdir}/systemd-tmpfiles-clean.timer
%{_unitdir}/systemd-tmpfiles-setup-dev.service
%{_unitdir}/systemd-tmpfiles-setup.service
%{_unitdir}/systemd-update-done.service
%if %{with sysvcompat}
%{_unitdir}/systemd-update-utmp-runlevel.service
%endif
%{_unitdir}/systemd-update-utmp.service
%{_unitdir}/systemd-user-sessions.service
%{_unitdir}/systemd-vconsole-setup.service
%{_unitdir}/systemd-volatile-root.service
%{_unitdir}/time-set.target
%{_unitdir}/time-sync.target
%{_unitdir}/timers.target
%{_unitdir}/timers.target.wants/systemd-tmpfiles-clean.timer
%{_unitdir}/umount.target
%{_unitdir}/usb-gadget.target
%{_unitdir}/user-.slice.d
%{_unitdir}/user-.slice.d/10-defaults.conf
%{_unitdir}/user-runtime-dir@.service
%{_unitdir}/user.slice
%{_unitdir}/user@.service
%{_unitdir}/user@.service.d/10-login-barrier.conf
%{_unitdir}/user@0.service.d/10-login-barrier.conf
%if %{with sysvcompat}
%{_unitdir}/var-lock.mount
%{_unitdir}/var-run.mount
%endif
%if ! %{bootstrap}
%{_unitdir}/veritysetup-pre.target
%{_unitdir}/veritysetup.target
%endif
%{xinitconfdir}/xinitrc.d/50-systemd-user.sh
%if %{with split_usr}
/bin/systemctl
%endif

147
files.udev Normal file
View file

@ -0,0 +1,147 @@
#
# Please keep the list sorted (with `LC_ALL=C sort`).
#
%config(noreplace) %{_sysconfdir}/systemd/pstore.conf
%config(noreplace) %{_sysconfdir}/udev/udev.conf
%dir %{_prefix}/lib/udev
%dir %{_sysconfdir}/systemd/network
%dir %{_sysconfdir}/udev
%dir %{_sysconfdir}/udev/rules.d
%dir %{_systemd_util_dir}/network
%dir %{_udevhwdbdir}
%dir %{_udevrulesdir}
%doc %{_udevhwdbdir}/README
%doc %{_udevrulesdir}/README
%ghost %attr(444, root, root) %{_sysconfdir}/udev/hwdb.bin
%ghost %attr(644, root, root) %{_prefix}/lib/udev/compat-symlink-generation
%if ! %{bootstrap}
%{_bindir}/systemd-cryptenroll
%endif
%{_bindir}/systemd-hwdb
%{_bindir}/udevadm
%if ! %{bootstrap}
%{_datadir}/bash-completion/completions/udevadm
%endif
%{_datadir}/pkgconfig/udev.pc
%if ! %{bootstrap}
%{_datadir}/zsh/site-functions/_udevadm
%endif
%if ! %{bootstrap}
%{_mandir}/man1/systemd-cryptenroll.1.gz
%{_mandir}/man5/pstore.conf.5.gz
%{_mandir}/man5/pstore.conf.d.5.gz
%{_mandir}/man5/udev.conf.5.gz
%{_mandir}/man7/hwdb.7.gz
%{_mandir}/man7/udev.7.gz
%{_mandir}/man8/systemd-hwdb.8.gz
%{_mandir}/man8/systemd-network-generator.8.gz
%{_mandir}/man8/systemd-network-generator.service.8.gz
%{_mandir}/man8/systemd-pstore.8.gz
%{_mandir}/man8/systemd-pstore.service.8.gz
%{_mandir}/man8/systemd-udev-settle.service.8.gz
%{_mandir}/man8/systemd-udevd-control.socket.8.gz
%{_mandir}/man8/systemd-udevd-kernel.socket.8.gz
%{_mandir}/man8/systemd-udevd.8.gz
%{_mandir}/man8/systemd-udevd.service.8.gz
%{_mandir}/man8/udevadm.8.gz
%endif
%{_prefix}/lib/udev/ata_id
%{_prefix}/lib/udev/cdrom_id
# dmi_memory_id is only relevant on arches with DMI
%ifarch %{arm} aarch64 %{ix86} x86_64 ia64 mips
%{_prefix}/lib/udev/dmi_memory_id
%endif
%{_prefix}/lib/udev/fido_id
%{_prefix}/lib/udev/mtd_probe
%{_prefix}/lib/udev/path_id_compat
%{_prefix}/lib/udev/rule_generator.functions
%{_prefix}/lib/udev/scsi_id
%{_prefix}/lib/udev/v4l_id
%{_prefix}/lib/udev/write_net_rules
%{_systemd_util_dir}/network/99-default.link
%{_systemd_util_dir}/rpm/fixlet-udev-post.sh
%{_systemd_util_dir}/systemd-network-generator
%{_systemd_util_dir}/systemd-pstore
%{_systemd_util_dir}/systemd-udevd
%{_tmpfilesdir}/static-nodes-permissions.conf
%{_tmpfilesdir}/systemd-pstore.conf
%{_udevhwdbdir}/20-OUI.hwdb
%{_udevhwdbdir}/20-acpi-vendor.hwdb
%{_udevhwdbdir}/20-bluetooth-vendor-product.hwdb
%{_udevhwdbdir}/20-dmi-id.hwdb
%{_udevhwdbdir}/20-net-ifname.hwdb
%{_udevhwdbdir}/20-pci-classes.hwdb
%{_udevhwdbdir}/20-pci-vendor-model.hwdb
%{_udevhwdbdir}/20-sdio-classes.hwdb
%{_udevhwdbdir}/20-sdio-vendor-model.hwdb
%{_udevhwdbdir}/20-usb-classes.hwdb
%{_udevhwdbdir}/20-usb-vendor-model.hwdb
%{_udevhwdbdir}/20-vmbus-class.hwdb
%{_udevhwdbdir}/60-autosuspend-chromiumos.hwdb
%{_udevhwdbdir}/60-autosuspend-fingerprint-reader.hwdb
%{_udevhwdbdir}/60-autosuspend.hwdb
%{_udevhwdbdir}/60-evdev.hwdb
%{_udevhwdbdir}/60-input-id.hwdb
%{_udevhwdbdir}/60-keyboard.hwdb
%{_udevhwdbdir}/60-seat.hwdb
%{_udevhwdbdir}/60-sensor.hwdb
%{_udevhwdbdir}/70-analyzers.hwdb
%{_udevhwdbdir}/70-av-production.hwdb
%{_udevhwdbdir}/70-cameras.hwdb
%{_udevhwdbdir}/70-joystick.hwdb
%{_udevhwdbdir}/70-mouse.hwdb
%{_udevhwdbdir}/70-pointingstick.hwdb
%{_udevhwdbdir}/70-touchpad.hwdb
%{_udevhwdbdir}/80-ieee1394-unit-function.hwdb
%{_udevrulesdir}/50-udev-default.rules
%{_udevrulesdir}/60-autosuspend.rules
%{_udevrulesdir}/60-block.rules
%{_udevrulesdir}/60-cdrom_id.rules
%{_udevrulesdir}/60-drm.rules
%{_udevrulesdir}/60-evdev.rules
%{_udevrulesdir}/60-fido-id.rules
%{_udevrulesdir}/60-input-id.rules
%{_udevrulesdir}/60-persistent-alsa.rules
%{_udevrulesdir}/60-persistent-input.rules
%{_udevrulesdir}/60-persistent-storage-tape.rules
%{_udevrulesdir}/60-persistent-storage.rules
%{_udevrulesdir}/60-persistent-v4l.rules
%{_udevrulesdir}/60-sensor.rules
%{_udevrulesdir}/60-serial.rules
%{_udevrulesdir}/61-persistent-storage-compat.rules
%{_udevrulesdir}/64-btrfs.rules
%{_udevrulesdir}/70-camera.rules
%{_udevrulesdir}/70-joystick.rules
%ifarch %{arm} aarch64 %{ix86} x86_64 ia64 mips
%{_udevrulesdir}/70-memory.rules
%endif
%{_udevrulesdir}/70-mouse.rules
%{_udevrulesdir}/70-power-switch.rules
%{_udevrulesdir}/70-touchpad.rules
%{_udevrulesdir}/75-net-description.rules
%{_udevrulesdir}/75-persistent-net-generator.rules
%{_udevrulesdir}/75-probe_mtd.rules
%{_udevrulesdir}/78-sound-card.rules
%{_udevrulesdir}/80-drivers.rules
%{_udevrulesdir}/80-net-setup-link.rules
%{_udevrulesdir}/81-net-dhcp.rules
%{_udevrulesdir}/90-vconsole.rules
%{_unitdir}/initrd-udevadm-cleanup-db.service
%{_unitdir}/kmod-static-nodes.service
%{_unitdir}/sockets.target.wants/systemd-udevd-control.socket
%{_unitdir}/sockets.target.wants/systemd-udevd-kernel.socket
%{_unitdir}/sysinit.target.wants/kmod-static-nodes.service
%{_unitdir}/sysinit.target.wants/systemd-hwdb-update.service
%{_unitdir}/sysinit.target.wants/systemd-udev-trigger.service
%{_unitdir}/sysinit.target.wants/systemd-udevd.service
%{_unitdir}/systemd-hwdb-update.service
%{_unitdir}/systemd-network-generator.service
%{_unitdir}/systemd-pstore.service
%{_unitdir}/systemd-udev-settle.service
%{_unitdir}/systemd-udev-trigger.service
%{_unitdir}/systemd-udevd-control.socket
%{_unitdir}/systemd-udevd-kernel.socket
%{_unitdir}/systemd-udevd.service
%if %{with split_usr}
/sbin/udevadm
%endif

38
files.uefi-boot Normal file
View file

@ -0,0 +1,38 @@
#
# Please keep the list sorted (with `LC_ALL=C sort`).
#
%if %{with sd_boot}
%dir %{_prefix}/lib/kernel
%dir %{_prefix}/lib/kernel/install.d
%dir %{_systemd_util_dir}/boot
%dir %{_systemd_util_dir}/boot/efi
%{_bindir}/bootctl
%{_bindir}/kernel-install
%if %{without bootstrap}
%{_datadir}/bash-completion/completions/bootctl
%{_datadir}/bash-completion/completions/kernel-install
%{_datadir}/zsh/site-functions/_bootctl
%{_datadir}/zsh/site-functions/_kernel-install
%{_mandir}/man1/bootctl.1.gz
%{_mandir}/man5/loader.conf.5.gz
%{_mandir}/man7/sd-boot.7.gz
%{_mandir}/man7/systemd-boot.7.gz
%{_mandir}/man8/kernel-install.8.gz
%{_mandir}/man8/systemd-bless-boot-generator.8.gz
%{_mandir}/man8/systemd-bless-boot.8.gz
%{_mandir}/man8/systemd-bless-boot.service.8.gz
%{_mandir}/man8/systemd-boot-system-token.service.8.gz
%endif
%{_prefix}/lib/kernel/install.d/00-entry-directory.install
%{_prefix}/lib/kernel/install.d/50-depmod.install
%{_prefix}/lib/kernel/install.d/90-loaderentry.install
# These are the few exceptions where glob pattern is allowed.
%{_systemd_util_dir}/boot/efi/linux*.efi.stub
%{_systemd_util_dir}/boot/efi/linux*.elf.stub
%{_systemd_util_dir}/boot/efi/systemd-boot*.efi
%{_systemd_util_dir}/systemd-bless-boot
%{_systemdgeneratordir}/systemd-bless-boot-generator
%{_unitdir}/sysinit.target.wants/systemd-boot-system-token.service
%{_unitdir}/systemd-bless-boot.service
%{_unitdir}/systemd-boot-system-token.service
%endif

146
fixlet-container-post.sh Normal file
View file

@ -0,0 +1,146 @@
#! /bin/bash
#
# This script contains all the fixups run when systemd-container package is
# installed or updated.
#
warn() {
echo >&2 "warning: $@"
}
is_btrfs_subvolume() {
# On btrfs subvolumes always have the inode 256
test $(stat --format=%i "$1") -eq 256
}
# This assumes the directory/subvol is emptied by the caller.
rm_subvolume_or_directory() {
is_btrfs_subvolume "$1" && {
btrfs subvolume delete "$1"
return
}
rmdir "$1"
}
# On systems using BTRFS, convert /var/lib/machines into a subvolume suitable
# for snapper to perform snapshots, rollbacks.. in case it was not properly set
# up, see bsc#992573. The installer has been fixed to properly initialize it at
# installation time.
#
# The conversion might only be problematic for openSUSE distros (TW/Factory)
# where the subvolume was created at the wrong place (via tmpfiles for example)
# and it got populated before we had time to fix it. In this case we'll let the
# user fix it manually.
#
# On SLE12 this subvolume was only introduced during the upgrade from v210 to
# v228 (ie SLE12-SP[01] -> SLE12-SP2+ when we added this workaround hence no
# user should had time to populate it. Note that the subvolume is still created
# at the wrong place due to the call to tmpfiles_create macro in the %post
# section however it's empty so again we shouldn't face any issue to convert it.
#
# In order to avoid ugly dependencies added in systemd package, this function
# should only be called during package updates when mksubvolume(8) is
# available. During installation, /var/lib/machines is supposed to be created by
# the installer now.
#
# See bsc#992573
#
fix_machines_subvol() {
local tagfile=/var/lib/systemd/rpm/container-machines_subvol
if [ -e $tagfile ]; then
return 0
fi
touch $tagfile
#
# If there's already an entry in fstab for /var/lib/machines, it
# means that:
#
# - the installer initialized /var/lib/machines correctly (default)
# - we already fixed it
# - the sysadmin added it manually
#
# In any cases we should return.
#
# Note: we can't simply check if /var/lib/machines has been mounted
# because an update through a chroot might be in progress (see
# bsc#1030290).
#
if mount --fake /var/lib/machines 2>/dev/null; then
return
fi
#
# If there is already an entry in fstab for /var, it means that:
#
# - the system has a seperate /var subvolume (default from Feb 2018)
# - the system has a seperate /var partition
#
# In any case we should return.
#
if mount --fake /var 2>/dev/null; then
return
fi
#
# If something is already mounted don't try to fix anything, it's been
# done manually by the sysadmin.
#
if mountpoint -q /var/lib/machines; then
return
fi
#
# Let's try to figure out if the current filesystem uses a Snapper
# BTRFS specific layout. Note that TW uses a different layout than
# SLE...
#
# FIXME: not sure if it's correct, reliable or optimal.
#
case $(findmnt -nr -t btrfs -o FSROOT / 2>/dev/null) in
*.snapshots/*/snapshot*)
;;
*)
return 0
esac
if test -d /var/lib/machines; then
#
# Ok, we're on a system supporting rollbacks and
# /var/lib/machines is not a subvolume remotely mounted so it
# cannot be suitable for systems supporting rollback. Fix it.
#
echo "Making /var/lib/machines suitable for rollbacks..."
type mksubvolume >/dev/null 2>&1 || {
warn "mksubvolume(8) is not installed, aborting."
return 1
}
test "$(ls -A /var/lib/machines/)" && {
warn "/var/lib/machines is not empty, aborting."
return 1
}
echo "Deleting empty /var/lib/machines directory/subvolume"
rm_subvolume_or_directory /var/lib/machines || {
warn "fail to delete /var/lib/machines"
return 1
}
fi
# At this point /var/lib/machines shouldn't exist.
echo "Creating /var/lib/machines subvolume suitable for rollbacks."
mksubvolume /var/lib/machines
}
r=0
if [ $1 -gt 1 ]; then
# During upgrade
fix_machines_subvol || {
warn "Please fix /var/lib/machines manually."
r=1
}
fi
exit $r

250
fixlet-systemd-post.sh Normal file
View file

@ -0,0 +1,250 @@
#! /bin/bash
#
# This script contains all the fixups run when systemd package is installed or
# updated.
#
# /etc/sysconfig/console | /etc/vconsole.conf
# -------------------------+---------------------
# CONSOLE_FONT | FONT
# CONSOLE_SCREENMAP | FONT_MAP
# CONSOLE_UNICODEMAP | FONT_UNIMAP
migrate_locale () {
local migrated=""
if ! test -f /etc/sysconfig/console; then
return
fi
source /etc/sysconfig/console || return
if test -f /etc/vconsole.conf; then
source /etc/vconsole.conf || return
fi
if test -n "$CONSOLE_FONT" && test -z "$FONT"; then
echo "FONT=$CONSOLE_FONT" >>/etc/vconsole.conf
migrated+="CONSOLE_FONT "
fi
if test -n "$CONSOLE_SCREENMAP" && test -z "$FONT_MAP"; then
echo "FONT_MAP=$CONSOLE_SCREENMAP" >>/etc/vconsole.conf
migrated+="CONSOLE_SCREENMAP "
fi
if test -n "$CONSOLE_UNICODEMAP" && test -z "$FONT_UNIMAP"; then
echo "FONT_UNIMAP=$CONSOLE_UNICODEMAP" >>/etc/vconsole.conf
migrated+="CONSOLE_UNICODEMAP "
fi
if test -n "$migrated"; then
echo >&2 "The following variables from /etc/sysconfig/console have been migrated"
echo >&2 "into /etc/vconsole.conf:"
echo >&2
for v in $migrated; do echo " - $v=${!v}"; done
echo >&2
echo >&2 "Please edit /etc/vconsole.conf if you need to tune these settings"
echo >&2 "as /etc/sysconfig/console won't be considered anymore."
echo >&2
fi
}
# /etc/sysconfig/keyboard | /etc/vconsole.conf
# -------------------------+---------------------
# KEYTABLE | KEYMAP
migrate_keyboard () {
local migrated=""
if ! test -f /etc/sysconfig/keyboard; then
return
fi
source /etc/sysconfig/keyboard || return
if test -f /etc/vconsole.conf; then
source /etc/vconsole.conf || return
fi
if test -n "$KEYTABLE" && test -z "$KEYMAP"; then
echo "KEYMAP=$KEYTABLE" >>/etc/vconsole.conf
migrated+="KEYTABLE "
fi
if test -n "$migrated"; then
echo >&2 "The following variables from /etc/sysconfig/keyboard have been migrated"
echo >&2 "into /etc/vconsole.conf:"
echo >&2
for v in $migrated; do echo " - $v=${!v}"; done
echo >&2
echo >&2 "Please use localectl(1) if you need to tune these settings since"
echo >&2 "/etc/sysconfig/keyboard won't be considered anymore."
echo >&2
fi
}
# According to
# https://www.suse.com/documentation/sles-12/book_sle_admin/data/sec_suse_l10n.html,
# variables in /etc/sysconfig/language are supposed to be passed to the users'
# shell *only*. However it seems that there has been some confusion and they
# ended up configuring the system-wide locale as well. The logic followed by
# systemd was implemented in commit 01c4b6f4f0d951d17f6873f68156ecd7763429c6,
# which was reverted. The code below follows the same logic to migrate content
# of /etc/sysconfig/language into locale.conf.
migrate_language () {
local lang=
local migrated=false
if ! test -f /etc/sysconfig/language; then
return
fi
source /etc/sysconfig/language || return
lang=$(grep ^LANG= /etc/locale.conf 2>/dev/null)
lang=${lang#LANG=}
case "$ROOT_USES_LANG" in
yes)
if test -z "$lang" && test -n "$RC_LANG"; then
echo "LANG=$RC_LANG" >>/etc/locale.conf
migrated=true
fi
;;
ctype)
if ! grep -q ^LC_CTYPE= /etc/locale.conf 2>/dev/null; then
: ${lc_ctype:="$lang"}
: ${lc_ctype:="$RC_LC_CTYPE"}
: ${lc_ctype:="$RC_LANG"}
if test -n "$lc_ctype"; then
echo "LC_CTYPE=$lc_ctype" >>/etc/locale.conf
migrated=true
fi
fi
;;
esac
if $migrated; then
echo >&2 "The content of /etc/sysconfig/language has been migrated into"
echo >&2 "/etc/locale.conf. The former file is now only used for setting"
echo >&2 "the locale used by user's shells. The system-wide locale is"
echo >&2 "only read from /etc/locale.conf since now."
echo >&2
echo >&2 "Please only use localectl(1) or YaST if you need to change the"
echo >&2 "settings of the *system-wide* locale from now."
fi
}
# Migrate old i18n settings previously configured in /etc/sysconfig to the new
# locations used by systemd (/etc/locale.conf, /etc/vconsole.conf, ...). Recent
# versions of systemd parse the new locations only.
#
# This is needed both at package updates and package installations because we
# might be upgrading from a system which was running SysV init (systemd package
# is being installed).
#
# It's run only once.
migrate_sysconfig_i18n() {
local tagfile=/var/lib/systemd/rpm/systemd-i18n_migrated
local -i rv=0
if [ -e $tagfile ]; then
return 0
fi
# The marker could have been incorrectly put in /usr/lib.
mv /usr/lib/systemd/scripts/.migrate-sysconfig-i18n.sh~done $tagfile &>/dev/null
# The tag files have been moved to /var/lib/systemd/rpm later.
mv /var/lib/systemd/i18n-migrated $tagfile &>/dev/null
if [ -e $tagfile ]; then
return 0
fi
touch $tagfile
migrate_locale; rv+=$?
migrate_keyboard; rv+=$?
migrate_language; rv+=$?
if [ $rv -gt 0 ]; then
echo >&2 "Failed to migrate i18n settings from /etc/sysconfig, ignoring."
fi
return $rv
}
#
# This function is supposed to be called from the %post section of the main
# package. It contains all the fixups needed when the system was running a
# version of systemd older than v210.
#
# All hacks can potentially break the admin settings since they work in /etc.
#
fix_pre_210() {
local tagfile=/var/lib/systemd/rpm/systemd-pre_210_fixed
if [ -e $tagfile ]; then
return 0
fi
touch $tagfile
#
# During migration from sysvinit to systemd, we used to set the systemd
# default target to one of the 'runlevel*.target' after reading the
# default runlevel from /etc/inittab. We don't do that anymore because
# in most cases using the graphical.target target, which is the default,
# will do the right thing. Moreover the runlevel targets are considered
# as deprecated, so we convert them into "true" systemd targets instead
# here.
#
if target=$(readlink /etc/systemd/system/default.target); then
target=$(basename $target)
case "$target" in
runlevel?.target)
echo "Default target is '$target' but use of runlevels is deprecated, converting"
systemctl --no-reload set-default $target
esac
fi
#
# Migrate any symlink which may refer to the old path (ie /lib/systemd).
#
for f in $(find /etc/systemd/system -type l -xtype l); do
new_target="/usr$(readlink $f)"
[ -f "$new_target" ] && ln -s -f "$new_target" "$f"
done
}
#
# /etc/machine-id might have been created writeable incorrectly (boo#1092269).
#
# Note: run at each package update.
#
fix_machine_id_perms() {
if [ "$(stat -c%a /etc/machine-id)" != 444 ]; then
echo "Incorrect file mode bits for /etc/machine-id which should be 0444, fixing..."
chmod 444 /etc/machine-id
fi
}
#
# v228 wrongly set world writable suid root permissions on timestamp files used
# by permanent timers. Fix the timestamps that might have been created by the
# affected versions of systemd (bsc#1020601).
#
# Note: run at each package update.
#
fix_bsc_1020601() {
for stamp in $(ls /var/lib/systemd/timers/stamp-*.timer 2>/dev/null); do
chmod 0644 $stamp
done
# Same for user lingering created by logind.
for username in $(ls /var/lib/systemd/linger/* 2>/dev/null); do
chmod 0644 $username
done
}
r=0
fix_machine_id_perms || r=1
fix_pre_210 || r=1
migrate_sysconfig_i18n || r=1
fix_bsc_1020601 || r=1
exit $r

73
fixlet-udev-post.sh Normal file
View file

@ -0,0 +1,73 @@
#!/bin/sh
# Convert legacy collect based udev rules for s390x device initialization to the
# new chzdev based scheme
s390_migrate_collect_to_chzdev() {
local tagfile=/var/lib/systemd/rpm/udev-s390_chzdev_migrated
[ -f /sbin/chzdev ] || return 0
if [ -e $tagfile ]; then
return 0
fi
touch $tagfile
for rule in /etc/udev/rules.d/*.rules; do
# The rule files might contain several occurences of
# IMPORT{program}="collect ..." but we're interested
# only in the first occurence, the rest are ignored.
import_builtin_collect=$(grep --max-count=1 -F 'IMPORT{program}="collect' $rule) ||
continue
echo "Migrating collect based udev rule $rule to new chzdev based scheme..."
CHANNEL=$(echo $import_builtin_collect | sed -n 's/.*collect \([[:graph:]]*\).*/\1/p')
if [ -z "$CHANNEL" ]; then
echo >&2 "Failed to retrieve CHANNEL info, skipping"
continue
fi
DEVICE=$(echo $import_builtin_collect | sed -n 's/.* //p')
DEVICE="${DEVICE%\"}"
echo "Updating udev rule $rule for device '$DEVICE' channel '$CHANNEL'"
mv $rule $rule.legacy
if [ "$DEVICE" == "dasd-eckd" ]; then
echo "running: /sbin/chzdev -e -p $DEVICE --no-root-update $CHANNEL"
/sbin/chzdev -e -p $DEVICE --no-root-update $CHANNEL
else
GROUP=$(sed -n '/SUBSYSTEM=="ccw"/s/.*group}=" *\([[:graph:]]*\),\([[:graph:]]*\),\([[:graph:]]*\)"/\1:\2:\3/p' $rule.legacy)
LAYER2=$(sed -n 's/.*layer2}="\([[:digit:]]\)"/layer2=\1/p' $rule.legacy)
PORTNO=$(chzdev --quiet --all $DEVICE --export - | grep portno)
echo "running: /sbin/chzdev -e -p $DEVICE --no-root-update ${PORTNO:=portno=0} $LAYER2 $GROUP"
/sbin/chzdev -e -p $DEVICE --no-root-update ${PORTNO:=portno=0} $LAYER2 $GROUP
fi
if [ $? != 0 ]; then
echo >&2 "Warning: Rule conversion failed, restoring original rule!"
mv $rule.legacy $rule
fi
done
}
fix_persistent_net_rules() {
# add KERNEL name match to existing persistent net rules
sed -ri '/KERNEL/ ! { s/NAME="(eth|wlan|ath)([0-9]+)"/KERNEL=="\1*", NAME="\1\2"/}' \
/etc/udev/rules.d/70-persistent-net.rules 2>/dev/null || :
}
cleanup_old_stuff() {
# cleanup old stuff
rm -f /etc/sysconfig/udev
rm -f /etc/udev/rules.d/{20,55,65}-cdrom.rules
}
r=0
s390_migrate_collect_to_chzdev || r=1
fix_persistent_net_rules || r=1
cleanup_old_stuff || r=1
exit $r

14
kbd-model-map.legacy Normal file
View file

@ -0,0 +1,14 @@
# Additional layouts offered by YaST arabic and ir (Iran) have never had a
# console layout, they are symlinks to 'us', but they are needed as YaST uses
# the console layout as a primary key for picking the X11 layout. 'arabic' is
# obsolete and 'ara' should be preferred but keep it until YaST switches to the
# new name.
ara ara,us pc105 - terminate:ctrl_alt_bksp,grp:shift_toggle
arabic ara,us pc105 - terminate:ctrl_alt_bksp,grp:shift_toggle
ir ir pc105 - terminate:ctrl_alt_bksp
# ruwin_alt-UTF-8 is needed because the X11 russian layouts contain no Latin
# letters and therefore the X->console conversion omits Russian entirely
ruwin_alt-UTF-8 us,ru pc105 ,winkeys terminate:ctrl_alt_bksp,grp:ctrl_shift_toggle,grp_led:scroll

30
systemd-rpmlintrc Normal file
View file

@ -0,0 +1,30 @@
addFilter("invalid-pkgconfig-file")
addFilter(".*dangling-symlink /sbin/(halt|init|poweroff|telinit|shutdown|runlevel|reboot).*")
addFilter(".*dangling-symlink .* /dev/null.*")
addFilter(".*files-duplicate .*/reboot\.8.*")
addFilter(".*files-duplicate .*/sd_is_socket\.3.*")
addFilter("non-conffile-in-etc /etc/bash_completion.d/systemd-bash-completion\.sh")
addFilter("non-conffile-in-etc /etc/rpm/macros\.systemd")
addFilter(".*dbus-policy-allow-receive")
addFilter(".*dangling-symlink /lib/udev/devices/std(in|out|err).*")
addFilter(".*dangling-symlink /lib/udev/devices/core.*")
addFilter(".*dangling-symlink /lib/udev/devices/fd.*")
addFilter(".*incoherent-init-script-name boot\.udev.*")
addFilter(".init-script-without-%stop_on_removal-preun /etc/init\.d/boot\.udev")
addFilter(".init-script-without-%restart_on_update-postun /etc/init\.d/boot\.udev")
addFilter(".*devel-file-in-non-devel-package.*udev.pc.*")
addFilter(".*suse-filelist-forbidden-systemd-userdirs.*")
addFilter("libudev-mini.*shlib-policy-name-error.*")
addFilter("nss-systemd.*shlib-policy-name-error.*")
addFilter("nss-myhostname.*shlib-policy-name-error.*")
addFilter("systemd-container.*shlib-policy-name-error.*")
addFilter("systemd-network.*shlib-policy-name-error.*")
addFilter("devel-file-in-non-devel-package.*/usr/share/pkgconfig/(udev|systemd)\.pc.*")
addFilter(".*script-without-shebang.*/usr/lib/udev/rule_generator.functions.*")
addFilter(".*missing-call-to-setgroups-before-setuid.*")
addFilter(".*missing-call-to-chdir-with-chroot.*")
addFilter(".*systemd-service-without-service.*")
addFilter(".*shlib-policy-missing-suffix.*")
addFilter(".*suse-missing-rclink.*")
addFilter("env-script-interpreter")
addFilter(".*files-duplicate /usr/lib/systemd/tests/.*")

120
systemd-sysv-convert Normal file
View file

@ -0,0 +1,120 @@
#!/bin/bash
info() {
echo "$(basename $0): $*"
}
warn() {
echo >&2 "$(basename $0): warning, $*"
}
usage() {
echo >&2 "usage: $(basename $0) --apply <service> [<service> ...]"
}
if [ "$UID" != "0" ]; then
warn "need to be root, aborting"
exit 1
fi
if [ $# -lt 2 ]; then
usage
exit 1
fi
database_lookup() {
local service unused
# 'priority' field is not used but is kept for backward compat reason.
while read service unused; do
if [ $service == $1 ]; then
return 0
fi
done </var/lib/systemd/sysv-convert/database
return 1
}
database_add() {
# Write a dumb priority as it is not used.
echo "$1 $2 50" >>/var/lib/systemd/sysv-convert/database
}
# Initialize the database.
if [ ! -e /var/lib/systemd/sysv-convert/database ]; then
touch /var/lib/systemd/sysv-convert/database
fi
case "$1" in
--save)
# --save is kept for backward compatibility.
;;
--apply)
shift
for service in $@; do
# For backward compat we accept the name of the
# service with or without the unit type suffix. If the
# suffix is not there, assume .service type.
case "$service" in
*.*) initscript="${service%.*}" ;;
*) initscript="$service"
service="$service.service"
esac
# Did we already migrate this service during a previous update ?
database_lookup $initscript &&
continue
# Sanity check.
unit="/usr/lib/systemd/system/$service"
if [ ! -f "$unit" ]; then
warn "$unit not found, skipping"
continue
fi
# Mark the service as processed to make sure we will do the migration only
# once. This is important especially for packages that keep their init
# scripts around even if they're no more used. Since the saved info won't
# be reused again we simply use an invalid runlevel and add the service
# in the db only once.
database_add $initscript -1
# Some services were renamed during the transition from SySV init to
# systemd (bsc#1181788). Rather than letting packages fixing that
# themselves by hacking our database directly, let's hard-code renames
# here. Not really nice but that's the least worst solution.
case $initscript in
ntpd) initscript=ntp ;;
esac
# The package is introducing new services and never has any sysv init
# scripts (bsc#982303).
if [ ! -r /etc/init.d/$initscript ] &&
[ ! -r /etc/init.d/boot.$initscript ]; then
continue
fi
for rcnd in rc2.d rc3.d rc4.d rc5.d boot.d; do
# Was the sysvinit script enabled ? (bsc#982211)
case $rcnd in
boot.d) [ -L /etc/rc.d/boot.d/S??boot.$initscript ] || continue ;;
*) [ -L /etc/rc.d/$rcnd/S??$initscript ] || continue
esac
case $rcnd in
boot.d) runlevel=3 ;;
*) runlevel=${rcnd:2:1}
esac
target=runlevel$runlevel.target
info "enabling $unit (wanted by $target)..."
mkdir -p "/etc/systemd/system/$target.wants"
ln -sf $unit /etc/systemd/system/$target.wants/$service
done
done
;;
*)
usage
exit 1
esac

148
systemd-sysv-install Normal file
View file

@ -0,0 +1,148 @@
#!/bin/bash
# This script is called by "systemctl enable/disable" when the given unit is a
# SysV init.d script. It needs to call the distribution's mechanism for
# enabling/disabling those, such as chkconfig, update-rc.d, or similar. This
# can optionally take a --root argument for enabling a SysV init script
# in a chroot or similar.
#
# chkconfig(8) and insserv(8) are no more available hence let's do the
# bare minimum and create/remote the symlinks for the well known
# runlevels and nothing more. Note that we don't take care of
# enabling/disabling the service dependencies as the sysv-generator
# will take care of them for us (openSUSE specific).
#
set -e
usage() {
echo >&2 "Usage: $0 [--quiet] [--root=path] enable|disable|is-enabled <sysv script name>"
exit 1
}
info() {
$quiet || echo "$*"
}
die() {
echo >&2 "error: $*, aborting."
exit 1
}
declare -A lsb_header
check_runlevels() {
for l in $*; do
# Sanity check
case $l in
0|1|2|3|4|5|6) continue ;;
*) return 1
esac
done
}
load_initscript() {
local found_lsb_start_marker=false
local found_lsb_end_marker=false
[ -r $1 ] || die "initscript /etc/init.d/$1 can't be read"
lsb_header=()
while read line; do
# skip anything that is not a comment
[[ "$line" =~ ^# ]] || continue
if ! $found_lsb_start_marker; then
[ "$line" == "### BEGIN INIT INFO" ] &&
found_lsb_start_marker=true
continue
fi
line=$(echo ${line:1})
case "$line" in
Default-Start:*)
levels=$(echo ${line:14})
check_runlevels $levels ||
die "Invalid runlevels specified in $line"
lsb_header[Default-Start]=$levels
;;
"## END INIT INFO")
found_lsb_end_marker=true
break ;;
esac
done <$1
$found_lsb_end_marker ||
die "malformated LSB header in $1: missing LSB end marker"
}
enable_initscript() {
load_initscript $1
for l in ${lsb_header[Default-Start]}; do
symlink="$(pwd)/rc${l}.d/S50$1"
info "ln -sf ../$1 $symlink"
ln -sf ../$1 "$symlink"
done
}
disable_initscript() {
for symlink in rc*.d/[SK]*; do
if [ -L $symlink ] && [ $(readlink $symlink) = "../$1" ]; then
info "rm $(pwd)/$symlink"
rm $symlink
fi
done
}
is_initscript_enabled() {
for symlink in rc*.d/S*; do
[ -L $symlink ] && [ $(readlink $symlink) = "../$1" ] &&
return 0
done
return 1
}
root=
quiet=false
# parse options
eval set -- "$(getopt --name $(basename $0) -o hqr: --long help,quiet,root: -- "$@")"
while true; do
case "$1" in
-h|--help)
usage ;;
-r|--root)
shift
root=$1 ;;
-q|--quiet)
quiet=true ;;
--)
shift
break ;;
*)
usage ;;
esac
shift
done
[ $# -eq 2 ] || usage
action=$1
name=$2
sysvinit_path=$(realpath -q -e $root/etc/init.d) ||
die "$root/etc/init.d: no such file or directory"
cd $sysvinit_path
case "$action" in
enable) enable_initscript $name ;;
disable) disable_initscript $name ;;
is-enabled) is_initscript_enabled $name ;;
*) usage
esac

25
systemd-user Normal file
View file

@ -0,0 +1,25 @@
# This file is part of systemd.
#
# Used by systemd --user instances.
# Override the default behavior of the "auth" PAM stack and don't throw a
# warning each time a user instance is started, which is the default behavior of
# the PAM stack when no auth is defined. Indeed PID1 calls pam_setcred() when
# the user instance is about to be started to allow some user services, such as
# gnome-terminal, to extend theirs credentials similar to the ones received by a
# user when he logs in (and the full PAM authentication stack is run). For some
# details, see:
#
# https://gitlab.gnome.org/GNOME/gdm/-/issues/393
# https://github.com/systemd/systemd/issues/11198
# https://bugzilla.suse.com/show_bug.cgi?id=1190515
#
auth required pam_deny.so
account include common-account
session required pam_selinux.so close
session required pam_selinux.so nottys open
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
session include common-session

8375
systemd.changes Normal file

File diff suppressed because it is too large Load diff

1407
systemd.spec Normal file

File diff suppressed because it is too large Load diff

19
tmpfiles-suse.conf Normal file
View file

@ -0,0 +1,19 @@
#
# See tmpfiles.d(5) for details
#
# Type Path Mode User Group Age Argument
# Legacy symlink. Maybe should be owned by util-linux ?
L+ /etc/mtab - - - - ../proc/self/mounts
# FIXME: Might be moved to lockded.
d /run/lock 0775 root lock -
# /run/lock/subsys is used for serializing SysV service execution, and
# hence without use on SysV-less systems.
d /run/lock/subsys 0755 root root -
# FIXME: Should these one be moved to shadow ?
f /var/log/wtmp 0664 root utmp -
f /var/log/btmp 0660 root utmp -
f /var/log/lastlog 0664 root utmp -