summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.clang-format1
-rw-r--r--.github/development-freeze.yml8
-rw-r--r--.github/labeler.yml3
-rw-r--r--.github/workflows/cifuzz.yml4
-rw-r--r--.github/workflows/codeql.yml6
-rw-r--r--.github/workflows/differential-shellcheck.yml9
-rw-r--r--.github/workflows/gather-pr-metadata.yml2
-rw-r--r--.github/workflows/mkosi.yml21
-rw-r--r--.github/workflows/requirements.txt6
-rwxr-xr-x.github/workflows/unit_tests.sh11
-rwxr-xr-x.semaphore/semaphore-runner.sh12
-rw-r--r--Makefile7
-rw-r--r--NEWS47
-rw-r--r--README2
-rw-r--r--TODO39
-rwxr-xr-xconfigure24
-rw-r--r--docs/API_FILE_SYSTEMS.md52
-rw-r--r--docs/ARCHITECTURE.md2
-rw-r--r--docs/AUTOPKGTEST.md92
-rw-r--r--docs/BACKPORTS.md25
-rw-r--r--docs/BOOT.md111
-rw-r--r--docs/BOOT_LOADER_INTERFACE.md2
-rw-r--r--docs/CATALOG.md67
-rw-r--r--docs/CODE_QUALITY.md2
-rw-r--r--docs/CODING_STYLE.md2
-rw-r--r--docs/CONTRIBUTING.md6
-rw-r--r--docs/CONTROL_GROUP_INTERFACE.md240
-rw-r--r--docs/CONVERTING_TO_HOMED.md8
-rw-r--r--docs/CREDENTIALS.md4
-rw-r--r--docs/DAEMON_SOCKET_ACTIVATION.md122
-rw-r--r--docs/DEBUGGING.md211
-rw-r--r--docs/ENVIRONMENT.md45
-rw-r--r--docs/FAQ.md114
-rw-r--r--docs/GROUP_RECORD.md2
-rw-r--r--docs/HACKING.md26
-rw-r--r--docs/HOME_DIRECTORY.md2
-rw-r--r--docs/INCOMPATIBILITIES.md33
-rw-r--r--docs/INHIBITOR_LOCKS.md160
-rw-r--r--docs/INITRD_INTERFACE.md4
-rw-r--r--docs/JOURNAL_EXPORT_FORMATS.md4
-rw-r--r--docs/JOURNAL_FILE_FORMAT.md2
-rw-r--r--docs/MINIMAL_BUILDS.md18
-rw-r--r--docs/MY_SERVICE_CANT_GET_REATLIME.md28
-rw-r--r--docs/OPTIMIZATIONS.md52
-rw-r--r--docs/PORTABILITY_AND_STABILITY.md12
-rw-r--r--docs/PORTABLE_SERVICES.md4
-rw-r--r--docs/PRESET.md44
-rw-r--r--docs/RANDOM_SEEDS.md2
-rw-r--r--docs/RELEASE.md2
-rw-r--r--docs/ROOT_STORAGE_DAEMONS.md4
-rw-r--r--docs/SEPARATE_USR_IS_BROKEN.md40
-rw-r--r--docs/SYSLOG.md50
-rw-r--r--docs/SYSTEMD_FILE_HIERARCHY_REQUIREMENTS.md20
-rw-r--r--docs/THE_CASE_FOR_THE_USR_MERGE.md115
-rw-r--r--docs/TIPS_AND_TRICKS.md185
-rw-r--r--docs/USERDB_AND_DESKTOPS.md10
-rw-r--r--docs/USER_GROUP_API.md4
-rw-r--r--docs/USER_RECORD.md27
-rw-r--r--docs/USER_RECORD_BLOB_DIRS.md2
-rw-r--r--docs/VIRTUALIZED_TESTING.md78
-rw-r--r--docs/WRITING_DESKTOP_ENVIRONMENTS.md30
-rw-r--r--docs/WRITING_DISPLAY_MANAGERS.md39
-rw-r--r--docs/WRITING_NETWORK_CONFIGURATION_MANAGERS.md64
-rw-r--r--docs/WRITING_RESOLVER_CLIENTS.md290
-rw-r--r--docs/WRITING_VM_AND_CONTAINER_MANAGERS.md29
-rw-r--r--docs/_data/extra_pages.json524
-rw-r--r--docs/assets/systemd-boot-menu.pngbin0 -> 7905 bytes
-rw-r--r--hwdb.d/60-keyboard.hwdb8
-rw-r--r--hwdb.d/60-sensor.hwdb2
-rw-r--r--hwdb.d/70-av-production.hwdb4
-rw-r--r--hwdb.d/70-sound-card.hwdb10
-rw-r--r--man/daemon.xml2
-rw-r--r--man/homectl.xml22
-rw-r--r--man/importctl.xml442
-rw-r--r--man/kernel-command-line.xml54
-rw-r--r--man/machinectl.xml337
-rw-r--r--man/meson.build10
-rw-r--r--man/networkctl.xml6
-rw-r--r--man/networkd.conf.xml28
-rw-r--r--man/org.freedesktop.import1.xml269
-rw-r--r--man/org.freedesktop.resolve1.xml47
-rw-r--r--man/portablectl.xml5
-rw-r--r--man/resolvectl.xml15
-rw-r--r--man/resolved.conf.xml4
-rw-r--r--man/rules/meson.build15
-rw-r--r--man/sd_bus_service_reconnect.c65
-rw-r--r--man/sd_event_exit.xml11
-rw-r--r--man/sd_notify.xml4
-rw-r--r--man/standard-options.xml9
-rw-r--r--man/systemctl.xml6
-rw-r--r--man/systemd-battery-check.service.xml2
-rw-r--r--man/systemd-bless-boot.service.xml2
-rw-r--r--man/systemd-bsod.service.xml14
-rw-r--r--man/systemd-debug-generator.xml2
-rw-r--r--man/systemd-importd.service.xml12
-rw-r--r--man/systemd-journal-gatewayd.service.xml2
-rw-r--r--man/systemd-journal-remote.service.xml2
-rw-r--r--man/systemd-journal-upload.service.xml2
-rw-r--r--man/systemd-measure.xml18
-rw-r--r--man/systemd-network-generator.service.xml2
-rw-r--r--man/systemd-nspawn.xml15
-rw-r--r--man/systemd-pcrlock.xml3
-rw-r--r--man/systemd-pcrphase.service.xml2
-rw-r--r--man/systemd-repart.xml12
-rw-r--r--man/systemd-resolved.service.xml7
-rw-r--r--man/systemd-ssh-generator.xml5
-rw-r--r--man/systemd-suspend.service.xml9
-rw-r--r--man/systemd-sysext.xml100
-rw-r--r--man/systemd-timedated.service.xml4
-rw-r--r--man/systemd-udevd.service.xml8
-rw-r--r--man/systemd-update-done.service.xml2
-rw-r--r--man/systemd-vmspawn.xml111
-rw-r--r--man/systemd.link.xml15
-rw-r--r--man/systemd.net-naming-scheme.xml4
-rw-r--r--man/systemd.netdev.xml26
-rw-r--r--man/systemd.network.xml61
-rw-r--r--man/systemd.unit.xml4
-rw-r--r--man/timedatectl.xml9
-rw-r--r--man/ukify.xml5
-rw-r--r--meson.build60
-rw-r--r--meson_options.txt16
-rw-r--r--mkosi.conf9
-rw-r--r--mkosi.conf.d/05-qemu-mem.conf11
-rw-r--r--mkosi.conf.d/10-opensuse.conf1
-rw-r--r--mkosi.conf.d/10-ubuntu.conf2
-rw-r--r--mkosi.conf.d/macros.db_backend1
-rwxr-xr-xmkosi.images/base/mkosi.build.chroot183
-rw-r--r--mkosi.images/base/mkosi.conf52
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-arch.conf33
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-arch/initrd/mkosi.postinst5
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-arch/mkosi.build.chroot53
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-arch/mkosi.conf48
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-arch/mkosi.prepare24
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-centos-fedora.conf78
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-centos-fedora/initrd/mkosi.postinst5
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.build.chroot47
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.conf54
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.prepare66
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-centos/mkosi.conf13
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-debian-ubuntu.conf77
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-debian-ubuntu/initrd/mkosi.postinst5
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.build.chroot89
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.conf61
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.prepare15
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf (renamed from mkosi.images/base/mkosi.conf.d/10-debian.conf)7
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf.d/amd64.conf (renamed from mkosi.images/system/mkosi.conf.d/10-debian-amd64.conf)2
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf.d/arm64.conf (renamed from mkosi.images/system/mkosi.conf.d/10-debian-arm64.conf)2
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-fedora.conf9
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-fedora/mkosi.conf (renamed from mkosi.images/system/mkosi.conf.d/10-fedora.conf)8
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-opensuse.conf95
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-opensuse/initrd/mkosi.postinst (renamed from mkosi.images/initrd/mkosi.postinst)2
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.build.chroot63
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.conf55
-rwxr-xr-xmkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.prepare61
-rw-r--r--mkosi.images/base/mkosi.conf.d/10-ubuntu/mkosi.conf (renamed from mkosi.images/base/mkosi.conf.d/10-ubuntu.conf)5
-rw-r--r--mkosi.images/base/mkosi.extra/etc/issue (renamed from mkosi.images/system/mkosi.extra/etc/issue)0
-rw-r--r--mkosi.images/base/mkosi.extra/usr/lib/systemd/journald.conf.d/50-persistent.conf (renamed from mkosi.images/system/mkosi.extra/usr/lib/systemd/journald.conf.d/50-persistent.conf)0
-rwxr-xr-xmkosi.images/base/mkosi.extra/usr/lib/systemd/mkosi-check-and-shutdown.sh (renamed from mkosi.images/system/mkosi.extra/usr/lib/systemd/mkosi-check-and-shutdown.sh)12
-rw-r--r--mkosi.images/base/mkosi.extra/usr/lib/systemd/system/mkosi-check-and-shutdown.service (renamed from mkosi.images/system/mkosi.extra/usr/lib/systemd/system/mkosi-check-and-shutdown.service)0
-rw-r--r--mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-mkosi.conf (renamed from mkosi.images/system/mkosi.extra/usr/lib/tmpfiles.d/99-mkosi.conf)0
-rw-r--r--mkosi.images/base/mkosi.extra/usr/share/factory/mkosi/gdbinit.d/systemd.gdb (renamed from mkosi.images/system/mkosi.extra/usr/share/factory/mkosi/gdbinit.d/systemd.gdb)0
-rwxr-xr-xmkosi.images/base/mkosi.finalize (renamed from mkosi.images/system/mkosi.finalize)0
-rwxr-xr-xmkosi.images/base/mkosi.postinst6
-rwxr-xr-xmkosi.images/base/mkosi.postinst.chroot (renamed from mkosi.images/system/mkosi.postinst.chroot)36
-rwxr-xr-xmkosi.images/base/mkosi.sync13
-rw-r--r--mkosi.images/initrd/mkosi.conf30
-rw-r--r--mkosi.images/initrd/mkosi.conf.d/10-centos.conf12
-rw-r--r--mkosi.images/initrd/mkosi.conf.d/10-default.conf12
-rw-r--r--mkosi.images/initrd/mkosi.conf.d/10-opensuse.conf11
-rw-r--r--mkosi.images/system/mkosi.conf44
-rw-r--r--mkosi.images/system/mkosi.conf.d/05-initrd.conf12
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-arch.conf27
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-centos-fedora.conf33
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-centos/mkosi.conf4
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-centos/mkosi.repart/10-usr.conf.d/squashfs.conf5
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-debian-ubuntu.conf30
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-opensuse.conf24
-rw-r--r--mkosi.images/system/mkosi.conf.d/10-ubuntu.conf14
-rw-r--r--mkosi.images/system/mkosi.repart/00-esp.conf4
-rw-r--r--po/POTFILES.skip3
-rw-r--r--po/be.po505
-rw-r--r--po/be@latin.po535
-rw-r--r--po/bg.po553
-rw-r--r--po/ca.po540
-rw-r--r--po/cs.po488
-rw-r--r--po/da.po477
-rw-r--r--po/de.po620
-rw-r--r--po/el.po461
-rw-r--r--po/es.po532
-rw-r--r--po/et.po362
-rw-r--r--po/eu.po317
-rw-r--r--po/fi.po523
-rw-r--r--po/fr.po619
-rw-r--r--po/gl.po535
-rw-r--r--po/he.po146
-rw-r--r--po/hr.po460
-rw-r--r--po/hu.po582
-rw-r--r--po/id.po466
-rw-r--r--po/it.po574
-rw-r--r--po/ja.po395
-rw-r--r--po/ka.po488
-rw-r--r--po/kab.po278
-rw-r--r--po/ko.po383
-rw-r--r--po/lt.po524
-rw-r--r--po/nl.po791
-rw-r--r--po/pa.po294
-rw-r--r--po/pl.po604
-rw-r--r--po/pt.po567
-rw-r--r--po/pt_BR.po524
-rw-r--r--po/ro.po591
-rw-r--r--po/ru.po710
-rw-r--r--po/si.po277
-rw-r--r--po/sk.po412
-rw-r--r--po/sr.po577
-rw-r--r--po/sv.po522
-rw-r--r--po/systemd.pot124
-rw-r--r--po/tr.po558
-rw-r--r--po/uk.po597
-rw-r--r--po/zh_CN.po290
-rw-r--r--po/zh_TW.po291
-rw-r--r--rules.d/60-persistent-media-controller.rules12
-rw-r--r--shell-completion/bash/bootctl1
-rw-r--r--shell-completion/bash/busctl1
-rw-r--r--shell-completion/bash/coredumpctl1
-rw-r--r--shell-completion/bash/homectl11
-rw-r--r--shell-completion/bash/hostnamectl1
-rw-r--r--shell-completion/bash/journalctl1
-rw-r--r--shell-completion/bash/kernel-install1
-rw-r--r--shell-completion/bash/localectl1
-rw-r--r--shell-completion/bash/loginctl1
-rw-r--r--shell-completion/bash/machinectl1
-rw-r--r--shell-completion/bash/networkctl1
-rw-r--r--shell-completion/bash/oomctl1
-rw-r--r--shell-completion/bash/portablectl1
-rw-r--r--shell-completion/bash/resolvectl1
-rw-r--r--shell-completion/bash/systemctl.in1
-rw-r--r--shell-completion/bash/systemd-analyze1
-rw-r--r--shell-completion/bash/systemd-cat1
-rw-r--r--shell-completion/bash/systemd-cgls1
-rw-r--r--shell-completion/bash/systemd-cgtop1
-rw-r--r--shell-completion/bash/systemd-confext1
-rw-r--r--shell-completion/bash/systemd-cryptenroll1
-rw-r--r--shell-completion/bash/systemd-delta1
-rw-r--r--shell-completion/bash/systemd-detect-virt1
-rw-r--r--shell-completion/bash/systemd-dissect1
-rw-r--r--shell-completion/bash/systemd-id1281
-rw-r--r--shell-completion/bash/systemd-nspawn1
-rw-r--r--shell-completion/bash/systemd-path1
-rw-r--r--shell-completion/bash/systemd-resolve1
-rw-r--r--shell-completion/bash/systemd-run1
-rw-r--r--shell-completion/bash/systemd-sysext1
-rw-r--r--shell-completion/bash/timedatectl1
-rw-r--r--shell-completion/bash/udevadm1
-rw-r--r--shell-completion/zsh/_journalctl6
-rw-r--r--src/analyze/analyze-unit-files.c2
-rw-r--r--src/analyze/analyze-unit-paths.c2
-rw-r--r--src/analyze/analyze.c3
-rw-r--r--src/basic/build-path.c267
-rw-r--r--src/basic/build-path.h8
-rw-r--r--src/basic/build.c1
-rw-r--r--src/basic/compress.c408
-rw-r--r--src/basic/compress.h24
-rw-r--r--src/basic/constants.h3
-rw-r--r--src/basic/dlfcn-util.c (renamed from src/shared/dlfcn-util.c)0
-rw-r--r--src/basic/dlfcn-util.h (renamed from src/shared/dlfcn-util.h)20
-rw-r--r--src/basic/env-util.c4
-rw-r--r--src/basic/env-util.h4
-rw-r--r--src/basic/escape.c6
-rw-r--r--src/basic/extract-word.c35
-rw-r--r--src/basic/extract-word.h5
-rw-r--r--src/basic/fd-util.c32
-rw-r--r--src/basic/fd-util.h17
-rw-r--r--src/basic/glyph-util.c6
-rw-r--r--src/basic/glyph-util.h3
-rw-r--r--src/basic/hashmap.h2
-rw-r--r--src/basic/in-addr-util.c16
-rw-r--r--src/basic/in-addr-util.h2
-rw-r--r--src/basic/initrd-util.c2
-rw-r--r--src/basic/linux/btrfs.h19
-rw-r--r--src/basic/linux/btrfs_tree.h74
-rw-r--r--src/basic/linux/fou.h56
-rw-r--r--src/basic/linux/if_bridge.h32
-rw-r--r--src/basic/linux/if_link.h568
-rw-r--r--src/basic/linux/in.h2
-rw-r--r--src/basic/linux/netfilter/nf_tables.h31
-rw-r--r--src/basic/linux/netlink.h5
-rw-r--r--src/basic/linux/nl80211.h351
-rw-r--r--src/basic/linux/pkt_sched.h152
-rw-r--r--src/basic/linux/rtnetlink.h20
-rw-r--r--src/basic/linux/stddef.h13
-rw-r--r--src/basic/locale-util.c2
-rw-r--r--src/basic/log.c2
-rw-r--r--src/basic/meson.build26
-rw-r--r--src/basic/mkdir.c2
-rw-r--r--src/basic/path-lookup.c5
-rw-r--r--src/basic/path-lookup.h2
-rw-r--r--src/basic/process-util.c2
-rw-r--r--src/basic/signal-util.c28
-rw-r--r--src/basic/signal-util.h9
-rw-r--r--src/basic/stat-util.c217
-rw-r--r--src/basic/stat-util.h32
-rw-r--r--src/basic/string-util.c3
-rw-r--r--src/basic/strv.c2
-rw-r--r--src/basic/terminal-util.c19
-rw-r--r--src/basic/time-util.c6
-rw-r--r--src/basic/virt.c14
-rw-r--r--src/battery-check/battery-check.c4
-rw-r--r--src/boot/bootctl.c3
-rw-r--r--src/boot/efi/UEFI_SECURITY.md57
-rw-r--r--src/boot/efi/boot.c24
-rw-r--r--src/boot/efi/measure.c89
-rw-r--r--src/boot/efi/meson.build13
-rw-r--r--src/boot/efi/proto/tcg.h34
-rw-r--r--src/boot/efi/util.c6
-rw-r--r--src/boot/efi/util.h6
-rw-r--r--src/boot/measure.c143
-rw-r--r--src/busctl/busctl.c9
-rw-r--r--src/core/cgroup.c2
-rw-r--r--src/core/dbus-execute.c4
-rw-r--r--src/core/dbus-manager.c107
-rw-r--r--src/core/dbus-service.c2
-rw-r--r--src/core/dbus-unit.c2
-rw-r--r--src/core/dynamic-user.c2
-rw-r--r--src/core/exec-invoke.c2
-rw-r--r--src/core/execute-serialize.c52
-rw-r--r--src/core/load-fragment.c8
-rw-r--r--src/core/main.c30
-rw-r--r--src/core/manager.c40
-rw-r--r--src/core/namespace.c3
-rw-r--r--src/core/service.c94
-rw-r--r--src/coredump/coredumpctl.c3
-rw-r--r--src/coredump/meson.build15
-rw-r--r--src/dissect/dissect.c3
-rw-r--r--src/firstboot/firstboot.c7
-rw-r--r--src/fstab-generator/fstab-generator.c6
-rw-r--r--src/home/homectl.c13
-rw-r--r--src/home/homed-bus.c18
-rw-r--r--src/home/homed-home.c11
-rw-r--r--src/home/homed.c2
-rw-r--r--src/home/homework.c48
-rw-r--r--src/home/pam_systemd_home.c30
-rw-r--r--src/hostname/hostnamectl.c65
-rw-r--r--src/hostname/hostnamed.c146
-rw-r--r--src/import/curl-util.c38
-rw-r--r--src/import/curl-util.h1
-rw-r--r--src/import/export.c60
-rw-r--r--src/import/import-common.c7
-rw-r--r--src/import/import-common.h37
-rw-r--r--src/import/import-fs.c28
-rw-r--r--src/import/import-raw.c3
-rw-r--r--src/import/import-tar.c3
-rw-r--r--src/import/import.c42
-rw-r--r--src/import/importctl.c1245
-rw-r--r--src/import/importd.c616
-rw-r--r--src/import/meson.build6
-rw-r--r--src/import/org.freedesktop.import1.conf36
-rw-r--r--src/import/org.freedesktop.import1.policy22
-rw-r--r--src/import/pull-common.c15
-rw-r--r--src/import/pull-common.h21
-rw-r--r--src/import/pull-job.c2
-rw-r--r--src/import/pull-raw.c146
-rw-r--r--src/import/pull-raw.h2
-rw-r--r--src/import/pull-tar.c125
-rw-r--r--src/import/pull-tar.h2
-rw-r--r--src/import/pull.c117
-rw-r--r--src/journal-remote/journal-remote-main.c2
-rw-r--r--src/journal-remote/journal-upload.c2
-rw-r--r--src/journal-remote/meson.build10
-rw-r--r--src/journal/bsod.c112
-rw-r--r--src/journal/fuzz-journald-native-fd.c4
-rw-r--r--src/journal/journalctl.c3
-rw-r--r--src/journal/journald-native.c159
-rw-r--r--src/journal/journald-native.h2
-rw-r--r--src/journal/journald-server.c4
-rw-r--r--src/journal/meson.build20
-rwxr-xr-xsrc/kernel-install/60-ukify.install.in2
-rwxr-xr-xsrc/kernel-install/90-loaderentry.install.in6
-rw-r--r--src/kernel-install/kernel-install.c5
-rw-r--r--src/libsystemd-network/fuzz-lldp-rx.c9
-rw-r--r--src/libsystemd-network/icmp6-packet.c121
-rw-r--r--src/libsystemd-network/icmp6-packet.h28
-rw-r--r--src/libsystemd-network/icmp6-util-unix.c10
-rw-r--r--src/libsystemd-network/icmp6-util.c84
-rw-r--r--src/libsystemd-network/icmp6-util.h4
-rw-r--r--src/libsystemd-network/lldp-neighbor.c61
-rw-r--r--src/libsystemd-network/lldp-neighbor.h2
-rw-r--r--src/libsystemd-network/lldp-rx-internal.h3
-rw-r--r--src/libsystemd-network/meson.build1
-rw-r--r--src/libsystemd-network/ndisc-internal.h1
-rw-r--r--src/libsystemd-network/ndisc-protocol.c39
-rw-r--r--src/libsystemd-network/ndisc-protocol.h10
-rw-r--r--src/libsystemd-network/ndisc-router-internal.h12
-rw-r--r--src/libsystemd-network/sd-lldp-rx.c25
-rw-r--r--src/libsystemd-network/sd-ndisc-router.c144
-rw-r--r--src/libsystemd-network/sd-ndisc.c166
-rw-r--r--src/libsystemd-network/sd-radv.c112
-rw-r--r--src/libsystemd-network/test-ndisc-ra.c119
-rw-r--r--src/libsystemd-network/test-ndisc-rs.c4
-rw-r--r--src/libsystemd/meson.build3
-rw-r--r--src/libsystemd/sd-bus/bus-common-errors.c1
-rw-r--r--src/libsystemd/sd-bus/bus-common-errors.h1
-rw-r--r--src/libsystemd/sd-device/sd-device.c2
-rw-r--r--src/libsystemd/sd-event/sd-event.c6
-rw-r--r--src/libsystemd/sd-event/test-event.c10
-rw-r--r--src/libsystemd/sd-journal/catalog.c3
-rw-r--r--src/libsystemd/sd-netlink/netlink-types-rtnl.c1
-rw-r--r--src/libsystemd/sd-netlink/netlink-util.c2
-rw-r--r--src/libsystemd/sd-path/sd-path.c2
-rw-r--r--src/locale/xkbcommon-util.c19
-rw-r--r--src/locale/xkbcommon-util.h21
-rw-r--r--src/login/logind-core.c6
-rw-r--r--src/login/logind-dbus.c2
-rw-r--r--src/login/logind-device.h2
-rw-r--r--src/login/logind-seat.c13
-rw-r--r--src/login/logind-seat.h4
-rw-r--r--src/login/logind-session.c21
-rw-r--r--src/login/logind-session.h7
-rw-r--r--src/login/logind-user.c7
-rw-r--r--src/login/logind-user.h4
-rw-r--r--src/login/logind.c4
-rw-r--r--src/login/meson.build6
-rw-r--r--src/login/pam_systemd.c2
-rw-r--r--src/machine-id-setup/machine-id-setup-main.c3
-rw-r--r--src/machine/machinectl.c794
-rw-r--r--src/machine/machined.c2
-rw-r--r--src/machine/meson.build6
-rw-r--r--src/network/generator/network-generator.c22
-rw-r--r--src/network/netdev/bond.c6
-rw-r--r--src/network/netdev/bond.h1
-rw-r--r--src/network/netdev/macvlan.c59
-rw-r--r--src/network/netdev/macvlan.h2
-rw-r--r--src/network/netdev/netdev-gperf.gperf2
-rw-r--r--src/network/networkctl.c339
-rw-r--r--src/network/networkd-address.c3
-rw-r--r--src/network/networkd-dhcp-common.c32
-rw-r--r--src/network/networkd-dhcp-common.h4
-rw-r--r--src/network/networkd-dhcp6.c2
-rw-r--r--src/network/networkd-gperf.gperf2
-rw-r--r--src/network/networkd-json.c35
-rw-r--r--src/network/networkd-link.c13
-rw-r--r--src/network/networkd-link.h1
-rw-r--r--src/network/networkd-lldp-rx.c69
-rw-r--r--src/network/networkd-lldp-rx.h1
-rw-r--r--src/network/networkd-lldp-tx.c6
-rw-r--r--src/network/networkd-manager-varlink.c113
-rw-r--r--src/network/networkd-manager.c3
-rw-r--r--src/network/networkd-manager.h3
-rw-r--r--src/network/networkd-ndisc.c152
-rw-r--r--src/network/networkd-ndisc.h8
-rw-r--r--src/network/networkd-network-gperf.gperf42
-rw-r--r--src/network/networkd-network.c39
-rw-r--r--src/network/networkd-network.h47
-rw-r--r--src/network/networkd-route-nexthop.c2
-rw-r--r--src/network/networkd-route.c3
-rw-r--r--src/network/networkd-state-file.c10
-rw-r--r--src/network/networkd-sysctl.c125
-rw-r--r--src/network/networkd-sysctl.h5
-rw-r--r--src/network/networkd-util.c42
-rw-r--r--src/network/networkd-util.h1
-rw-r--r--src/network/networkd.c19
-rw-r--r--src/network/wait-online/wait-online.c2
-rw-r--r--src/nspawn/nspawn-mount.c2
-rw-r--r--src/nspawn/nspawn-register.c8
-rw-r--r--src/nspawn/nspawn.c31
-rw-r--r--src/nss-resolve/nss-resolve.c3
-rw-r--r--src/nss-systemd/nss-systemd.c12
-rw-r--r--src/nss-systemd/userdb-glue.c2
-rw-r--r--src/oom/oomd.c2
-rw-r--r--src/partition/repart.c55
-rw-r--r--src/pcrlock/pcrlock.c21
-rw-r--r--src/portable/portable.c47
-rw-r--r--src/portable/portablectl.c2
-rw-r--r--src/portable/portabled.c2
-rw-r--r--src/pstore/meson.build6
-rw-r--r--src/resolve/resolvectl.c15
-rw-r--r--src/resolve/resolved-bus.c11
-rw-r--r--src/resolve/resolved-def.h4
-rw-r--r--src/resolve/resolved-dns-cache.c32
-rw-r--r--src/resolve/resolved-dns-cache.h2
-rw-r--r--src/resolve/resolved-dns-dnssec.c21
-rw-r--r--src/resolve/resolved-dns-dnssec.h9
-rw-r--r--src/resolve/resolved-dns-packet.c48
-rw-r--r--src/resolve/resolved-dns-query.c8
-rw-r--r--src/resolve/resolved-dns-rr.c81
-rw-r--r--src/resolve/resolved-dns-rr.h10
-rw-r--r--src/resolve/resolved-dns-scope.c139
-rw-r--r--src/resolve/resolved-dns-scope.h8
-rw-r--r--src/resolve/resolved-dns-stream.c41
-rw-r--r--src/resolve/resolved-dns-stream.h1
-rw-r--r--src/resolve/resolved-dns-stub.c7
-rw-r--r--src/resolve/resolved-dns-synthesize.c21
-rw-r--r--src/resolve/resolved-dns-synthesize.h2
-rw-r--r--src/resolve/resolved-dns-transaction.c19
-rw-r--r--src/resolve/resolved-dns-trust-anchor.c11
-rw-r--r--src/resolve/resolved-etc-hosts.c17
-rw-r--r--src/resolve/resolved-mdns.c43
-rw-r--r--src/resolve/resolved-varlink.c164
-rw-r--r--src/resolve/resolved.c2
-rw-r--r--src/resolve/test-resolved-packet.c187
-rw-r--r--src/resolve/test-resolved-stream.c19
-rw-r--r--src/rpm/macros.systemd.in5
-rw-r--r--src/run/run.c23
-rw-r--r--src/shared/ask-password-api.c2
-rw-r--r--src/shared/bootspec.c28
-rw-r--r--src/shared/bootspec.h6
-rw-r--r--src/shared/bpf-dlopen.c38
-rw-r--r--src/shared/bpf-dlopen.h37
-rw-r--r--src/shared/bus-map-properties.c11
-rw-r--r--src/shared/bus-unit-util.c109
-rw-r--r--src/shared/bus-unit-util.h15
-rw-r--r--src/shared/bus-util.c29
-rw-r--r--src/shared/bus-util.h2
-rw-r--r--src/shared/cgroup-setup.c45
-rw-r--r--src/shared/cgroup-setup.h1
-rw-r--r--src/shared/condition.c8
-rw-r--r--src/shared/cpu-set-util.c77
-rw-r--r--src/shared/cpu-set-util.h5
-rw-r--r--src/shared/creds-util.c4
-rw-r--r--src/shared/cryptsetup-util.c82
-rw-r--r--src/shared/cryptsetup-util.h83
-rw-r--r--src/shared/discover-image.c42
-rw-r--r--src/shared/discover-image.h2
-rw-r--r--src/shared/dissect-image.c51
-rw-r--r--src/shared/dissect-image.h1
-rw-r--r--src/shared/efi-loader.c2
-rw-r--r--src/shared/elf-util.c82
-rw-r--r--src/shared/firewall-util-nft.c2
-rw-r--r--src/shared/format-table.h2
-rw-r--r--src/shared/idn-util.c12
-rw-r--r--src/shared/idn-util.h14
-rw-r--r--src/shared/install.c343
-rw-r--r--src/shared/install.h9
-rw-r--r--src/shared/libfido2-util.c94
-rw-r--r--src/shared/libfido2-util.h96
-rw-r--r--src/shared/meson.build7
-rw-r--r--src/shared/mount-setup.c272
-rw-r--r--src/shared/mount-setup.h8
-rw-r--r--src/shared/mount-util.c14
-rw-r--r--src/shared/mount-util.h1
-rw-r--r--src/shared/netif-naming-scheme.c2
-rw-r--r--src/shared/open-file.c2
-rw-r--r--src/shared/openssl-util.c74
-rw-r--r--src/shared/openssl-util.h19
-rw-r--r--src/shared/pager.c2
-rw-r--r--src/shared/pam-util.c30
-rw-r--r--src/shared/pam-util.h1
-rw-r--r--src/shared/password-quality-util-passwdqc.c12
-rw-r--r--src/shared/password-quality-util-passwdqc.h12
-rw-r--r--src/shared/password-quality-util-pwquality.c16
-rw-r--r--src/shared/password-quality-util-pwquality.h18
-rw-r--r--src/shared/pcre2-util.c14
-rw-r--r--src/shared/pcre2-util.h16
-rw-r--r--src/shared/pkcs11-util.c32
-rw-r--r--src/shared/pkcs11-util.h34
-rw-r--r--src/shared/pretty-print.c71
-rw-r--r--src/shared/pretty-print.h3
-rw-r--r--src/shared/ptyfwd.c83
-rw-r--r--src/shared/ptyfwd.h3
-rw-r--r--src/shared/qrcode-util.c4
-rw-r--r--src/shared/seccomp-util.c2
-rw-r--r--src/shared/tpm2-util.c122
-rw-r--r--src/shared/user-record-show.c5
-rw-r--r--src/shared/user-record.c7
-rw-r--r--src/shared/user-record.h3
-rw-r--r--src/shared/userdb.c2
-rw-r--r--src/shared/varlink-idl.c3
-rw-r--r--src/shared/varlink-io.systemd.Network.c51
-rw-r--r--src/shared/varlink-io.systemd.PCRLock.c2
-rw-r--r--src/shared/varlink-io.systemd.Resolve.Monitor.c91
-rw-r--r--src/shared/varlink-io.systemd.Resolve.c95
-rw-r--r--src/shared/varlink-io.systemd.Resolve.h3
-rw-r--r--src/sleep/battery-capacity.c2
-rw-r--r--src/sleep/sleep.c46
-rw-r--r--src/ssh-generator/ssh-generator.c15
-rw-r--r--src/sysext/sysext.c758
-rw-r--r--src/systemctl/meson.build6
-rw-r--r--src/systemctl/systemctl-edit.c4
-rw-r--r--src/systemctl/systemctl-enable.c2
-rw-r--r--src/systemctl/systemctl-mount.c2
-rw-r--r--src/systemctl/systemctl-show.c94
-rw-r--r--src/systemctl/systemctl-sysv-compat.c2
-rw-r--r--src/systemctl/systemctl-util.c152
-rw-r--r--src/systemctl/systemctl-util.h3
-rw-r--r--src/systemctl/systemctl-whoami.c162
-rw-r--r--src/systemctl/systemctl.c3
-rw-r--r--src/systemd/sd-dhcp-client-id.h1
-rw-r--r--src/systemd/sd-dhcp-duid.h1
-rw-r--r--src/systemd/sd-dhcp-option.h1
-rw-r--r--src/systemd/sd-dhcp-server-lease.h1
-rw-r--r--src/systemd/sd-lldp-rx.h2
-rw-r--r--src/systemd/sd-ndisc-protocol.h2
-rw-r--r--src/systemd/sd-ndisc-router.h4
-rw-r--r--src/systemd/sd-ndisc.h3
-rw-r--r--src/sysupdate/sysupdate-resource.c7
-rw-r--r--src/sysupdate/sysupdate-transfer.c90
-rw-r--r--src/sysupdate/sysupdate.c3
-rw-r--r--src/sysupdate/sysupdate.h12
-rw-r--r--src/sysusers/sysusers.c7
-rw-r--r--src/sysv-generator/sysv-generator.c2
-rw-r--r--src/test/meson.build16
-rw-r--r--src/test/test-af-list.c1
-rw-r--r--src/test/test-async.c2
-rw-r--r--src/test/test-build-path.c20
-rw-r--r--src/test/test-cgroup-setup.c4
-rw-r--r--src/test/test-compress.c57
-rw-r--r--src/test/test-cpu-set-util.c79
-rw-r--r--src/test/test-dlopen-so.c13
-rw-r--r--src/test/test-execute.c28
-rw-r--r--src/test/test-extract-word.c20
-rw-r--r--src/test/test-locale-util.c5
-rw-r--r--src/test/test-loopback.c2
-rw-r--r--src/test/test-mempress.c2
-rw-r--r--src/test/test-mount-util.c19
-rw-r--r--src/test/test-nss-hosts.c8
-rw-r--r--src/test/test-path-lookup.c6
-rw-r--r--src/test/test-progress-bar.c34
-rw-r--r--src/test/test-string-util.c5
-rw-r--r--src/test/test-uid-range.c2
-rw-r--r--src/test/test-unit-file.c2
-rw-r--r--src/test/test-varlink-idl.c2
-rw-r--r--src/timedate/timedatectl.c26
-rw-r--r--src/timesync/timesyncd.c2
-rw-r--r--src/timesync/wait-sync.c2
-rw-r--r--src/tmpfiles/tmpfiles.c101
-rw-r--r--src/tpm2-setup/tpm2-generator.c4
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c4
-rw-r--r--src/udev/net/link-config-gperf.gperf1
-rw-r--r--src/udev/net/link-config.c105
-rw-r--r--src/udev/net/link-config.h3
-rw-r--r--src/udev/scsi_id/scsi_id.c6
-rw-r--r--src/udev/test-udev-rule-runner.c2
-rw-r--r--src/udev/test-udev-spawn.c2
-rw-r--r--src/udev/udev-builtin-net_id.c12
-rw-r--r--src/udev/udev-manager.c2
-rw-r--r--src/udev/udevadm-info.c2
-rw-r--r--src/udev/udevadm-monitor.c2
-rwxr-xr-xsrc/ukify/test/test_ukify.py34
-rwxr-xr-xsrc/ukify/ukify.py90
-rw-r--r--src/userdb/userdbd-manager.c12
-rw-r--r--src/userdb/userdbd.c2
-rw-r--r--src/version/version.h.in2
-rw-r--r--src/vmspawn/meson.build11
-rw-r--r--src/vmspawn/test-vmspawn-util.c28
-rw-r--r--src/vmspawn/vmspawn-register.c51
-rw-r--r--src/vmspawn/vmspawn-register.h7
-rw-r--r--src/vmspawn/vmspawn-scope.c9
-rw-r--r--src/vmspawn/vmspawn-scope.h1
-rw-r--r--src/vmspawn/vmspawn-settings.c10
-rw-r--r--src/vmspawn/vmspawn-settings.h16
-rw-r--r--src/vmspawn/vmspawn-util.c36
-rw-r--r--src/vmspawn/vmspawn-util.h28
-rw-r--r--src/vmspawn/vmspawn.c409
-rw-r--r--test/README.testsuite13
-rwxr-xr-xtest/TEST-69-SHUTDOWN/test.sh1
-rw-r--r--test/fuzz/fuzz-execute-serialize/initial1
-rw-r--r--test/test-functions1
-rw-r--r--test/test-network/conf/21-macvlan.netdev4
-rw-r--r--test/test-network/conf/24-rps-cpu-disable.link6
-rw-r--r--test/test-network/conf/24-rps-cpu-empty.link6
-rw-r--r--test/test-network/conf/24-rps-cpu-invalid.link6
-rw-r--r--test/test-network/conf/25-agent-client-peer.network2
-rw-r--r--test/test-network/conf/25-agent-client.network2
-rw-r--r--test/test-network/conf/25-agent-server-peer.network2
-rw-r--r--test/test-network/conf/25-agent-server.network2
-rw-r--r--test/test-network/conf/25-bond-property.netdev1
-rw-r--r--test/test-network/conf/25-ipv6-proxy-ndp.network1
-rw-r--r--test/test-network/conf/25-rps-cpu-0-1.link6
-rw-r--r--test/test-network/conf/25-rps-cpu-0-empty.link7
-rw-r--r--test/test-network/conf/25-rps-cpu-0-invalid.link7
-rw-r--r--test/test-network/conf/25-rps-cpu-0.link6
-rw-r--r--test/test-network/conf/25-rps-cpu-1.link6
-rw-r--r--test/test-network/conf/25-rps-cpu-all.link6
-rw-r--r--test/test-network/conf/25-rps-cpu-multi.link7
-rw-r--r--test/test-network/conf/25-sysctl.network3
-rw-r--r--test/test-network/conf/26-bridge-vlan-master-issue-20373.network1
-rw-r--r--test/test-network/conf/26-bridge-vlan-slave-issue-20373.network1
-rwxr-xr-xtest/test-network/systemd-networkd-tests.py255
-rwxr-xr-xtest/units/end.sh4
-rwxr-xr-xtest/units/testsuite-13.importctl.sh66
-rwxr-xr-xtest/units/testsuite-13.machinectl.sh3
-rwxr-xr-xtest/units/testsuite-46.sh55
-rwxr-xr-xtest/units/testsuite-50.sh724
-rwxr-xr-xtest/units/testsuite-55.sh3
-rwxr-xr-xtest/units/testsuite-74.socket.sh29
-rwxr-xr-xtest/units/testsuite-74.ssh.sh4
-rwxr-xr-xtest/units/testsuite-75.sh41
-rw-r--r--tmpfiles.d/systemd-network.conf1
-rw-r--r--tmpfiles.d/systemd.conf.in11
-rwxr-xr-xtools/meson-render-jinja2.py9
-rwxr-xr-xtools/meson-vcs-tag.sh42
-rw-r--r--units/systemd-battery-check.service.in2
691 files changed, 30788 insertions, 12455 deletions
diff --git a/.clang-format b/.clang-format
index fe360a648b..5377abc23e 100644
--- a/.clang-format
+++ b/.clang-format
@@ -26,6 +26,7 @@
---
AccessModifierOffset: -4
AlignAfterOpenBracket: AlwaysBreak
+AlignArrayOfStructures: Right
AlignEscapedNewlines: Left
AlignOperands: false
AllowShortFunctionsOnASingleLine: None
diff --git a/.github/development-freeze.yml b/.github/development-freeze.yml
index 564e5f02f1..999654b3e7 100644
--- a/.github/development-freeze.yml
+++ b/.github/development-freeze.yml
@@ -6,7 +6,9 @@ policy:
- tags: ['^\S*-rc\d+$']
feedback:
frozen-state: |
- An -rc1 tag has been created and a release is being prepared, so please note that PRs introducing new features and APIs will be held back until the new version has been released.
+ > [!IMPORTANT]
+ > An -rc1 tag has been created and a release is being prepared, so please note that PRs introducing new features and APIs will be held back until the new version has been released.
unfreeze-state: |
- We had successfully released a new major release. We are no longer in a development freeze phase.
- We will try our best to get back to your PR as soon as possible. Thank you for your patience.
+ > [!NOTE]
+ > We had successfully released a new major release. We are no longer in a development freeze phase.
+ > We will try our best to get back to your PR as soon as possible. Thank you for your patience.
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 832e6911a3..86a31776f4 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -136,6 +136,9 @@ sd-resolve:
selinux:
- changed-files:
- any-glob-to-any-file: '**/*selinux*'
+shell-completion:
+ - changed-files:
+ - any-glob-to-any-file: 'shell-completion/*'
sleep:
- changed-files:
- any-glob-to-any-file: ['src/shared/*sleep*', 'src/sleep/*']
diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml
index 983dca8b33..2b1ae84421 100644
--- a/.github/workflows/cifuzz.yml
+++ b/.github/workflows/cifuzz.yml
@@ -60,14 +60,14 @@ jobs:
sanitizer: ${{ matrix.sanitizer }}
output-sarif: true
- name: Upload Crash
- uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8
+ uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
if: failure() && steps.build.outcome == 'success'
with:
name: ${{ matrix.sanitizer }}-${{ matrix.architecture }}-artifacts
path: ./out/artifacts
- name: Upload Sarif
if: always() && steps.build.outcome == 'success'
- uses: github/codeql-action/upload-sarif@012739e5082ff0c22ca6d6ab32e07c36df03c4a4
+ uses: github/codeql-action/upload-sarif@8a470fddafa5cbb6266ee11b37ef4d8aae19c571
with:
# Path to SARIF file relative to the root of the repository
sarif_file: cifuzz-sarif/results.sarif
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 92e5308e03..caf6800772 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -45,7 +45,7 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- name: Initialize CodeQL
- uses: github/codeql-action/init@012739e5082ff0c22ca6d6ab32e07c36df03c4a4
+ uses: github/codeql-action/init@8a470fddafa5cbb6266ee11b37ef4d8aae19c571
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql-config.yml
@@ -53,7 +53,7 @@ jobs:
- run: sudo -E .github/workflows/unit_tests.sh SETUP
- name: Autobuild
- uses: github/codeql-action/autobuild@012739e5082ff0c22ca6d6ab32e07c36df03c4a4
+ uses: github/codeql-action/autobuild@8a470fddafa5cbb6266ee11b37ef4d8aae19c571
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@012739e5082ff0c22ca6d6ab32e07c36df03c4a4
+ uses: github/codeql-action/analyze@8a470fddafa5cbb6266ee11b37ef4d8aae19c571
diff --git a/.github/workflows/differential-shellcheck.yml b/.github/workflows/differential-shellcheck.yml
index b04aabb14a..01e4a246e9 100644
--- a/.github/workflows/differential-shellcheck.yml
+++ b/.github/workflows/differential-shellcheck.yml
@@ -28,8 +28,13 @@ jobs:
fetch-depth: 0
- name: Differential ShellCheck
- uses: redhat-plumbers-in-action/differential-shellcheck@91e2582e40236f831458392d905578d680baa138
+ uses: redhat-plumbers-in-action/differential-shellcheck@b9df2a9417f69c056e0aeaf870abd9a2065a403e
with:
# exclude all `.in` files because they may contain unsupported syntax, and they have to be preprocessed first
- exclude-path: '**/*.in'
+ # TEMPORARY: exclude bash completion files, they would generate too many defects in Code scanning dashboard (600+)
+ # exclude zsh completion files, zsh is not supported by ShellCheck
+ exclude-path: |
+ '**/*.in'
+ 'shell-completion/bash/*'
+ 'shell-completion/zsh/*'
token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/gather-pr-metadata.yml b/.github/workflows/gather-pr-metadata.yml
index eb6f54e528..cfd1ac1fc0 100644
--- a/.github/workflows/gather-pr-metadata.yml
+++ b/.github/workflows/gather-pr-metadata.yml
@@ -30,7 +30,7 @@ jobs:
echo ${{ github.event.number }} >./${{ env.PULL_REQUEST_METADATA_DIR }}/${{ env.PULL_REQUEST_METADATA_FILE }}
- name: Upload Pull Request Metadata artifact
- uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8
+ uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
with:
name: ${{ env.PULL_REQUEST_METADATA_FILE }}
path: ${{ env.PULL_REQUEST_METADATA_DIR }}
diff --git a/.github/workflows/mkosi.yml b/.github/workflows/mkosi.yml
index bca6261cb3..6663dfe0cc 100644
--- a/.github/workflows/mkosi.yml
+++ b/.github/workflows/mkosi.yml
@@ -59,24 +59,29 @@ jobs:
- distro: debian
release: testing
- distro: ubuntu
- release: jammy
+ release: noble
- distro: fedora
release: "39"
- distro: fedora
release: rawhide
- - distro: opensuse
- release: tumbleweed
+ # TODO: Re-enable once https://lists.opensuse.org/archives/list/factory@lists.opensuse.org/thread/AU4NWTBXNA7MVAUXWR74XYCHCSZN4Z4K/
+ # is resolved or https://build.opensuse.org/request/show/1152118 is merged.
+ # - distro: opensuse
+ # release: tumbleweed
- distro: centos
release: "9"
- - distro: centos
- release: "8"
env:
SYSTEMD_LOG_LEVEL: debug
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- - uses: systemd/mkosi@070528fec478fc93af7ec057a5d2fd0045123c99
+ - uses: systemd/mkosi@ea1b00c3dba12662214b2e95dd1fe837cb13664b
+
+ - name: Free disk space
+ run: |
+ sudo rm -rf /usr/local
+ sudo rm -rf /opt/hostedtoolcache
- name: Configure
run: |
@@ -89,10 +94,6 @@ jobs:
# Build a disk image in CI as this logic is much more prone to breakage.
Format=disk
- [Content]
- Environment=CI_BUILD=1
- SLOW_TESTS=true
-
[Host]
ToolsTree=default
ToolsTreeDistribution=fedora
diff --git a/.github/workflows/requirements.txt b/.github/workflows/requirements.txt
index 0c41a98fef..167b33c19b 100644
--- a/.github/workflows/requirements.txt
+++ b/.github/workflows/requirements.txt
@@ -1,6 +1,6 @@
-meson==1.3.1 \
- --hash=sha256:6020568bdede1643d4fb41e28215be38eff5d52da28ac7d125457c59e0032ad7 \
- --hash=sha256:d5223ecca9564d735d36daaba2571abc6c032c8c3a7ffa0674e803ef0c7e0219
+meson==1.3.2 \
+ --hash=sha256:0ba4a71fbc060c44721c7b674807598c5af9ea51335073cae7a3e9a95b375c89 \
+ --hash=sha256:492eb450c8b073024276f916f5adbb3c4bb7e90e9e6ec124efda064f3d9b5baa
ninja==1.11.1.1 \
--hash=sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd \
--hash=sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a \
diff --git a/.github/workflows/unit_tests.sh b/.github/workflows/unit_tests.sh
index c1a5ede383..cf9dd19151 100755
--- a/.github/workflows/unit_tests.sh
+++ b/.github/workflows/unit_tests.sh
@@ -42,6 +42,12 @@ set -ex
MESON_ARGS=(-Dcryptolib=${CRYPTOLIB:-auto})
+# (Re)set the current oom-{score-}adj. For some reason root on GH actions is able to _decrease_
+# its oom-score even after dropping all capabilities (including CAP_SYS_RESOURCE), until the
+# score is explicitly changed after sudo. No idea what's going on, but it breaks
+# exec-oomscoreadjust-negative.service from test-execute when running unprivileged.
+choom -p $$ -n 0
+
for phase in "${PHASES[@]}"; do
case $phase in
SETUP)
@@ -53,6 +59,11 @@ for phase in "${PHASES[@]}"; do
apt-get -y build-dep systemd
apt-get -y install "${ADDITIONAL_DEPS[@]}"
pip3 install -r .github/workflows/requirements.txt --require-hashes
+
+ # Make sure the build dir is accessible even when drop privileges, otherwise the unprivileged
+ # part of test-execute gets skipped, since it can't run systemd-executor
+ chmod o+x /home/runner
+ capsh --drop=all -- -c "stat $PWD/meson.build"
;;
RUN|RUN_GCC|RUN_CLANG|RUN_CLANG_RELEASE)
if [[ "$phase" =~ ^RUN_CLANG ]]; then
diff --git a/.semaphore/semaphore-runner.sh b/.semaphore/semaphore-runner.sh
index 5219172570..06e3e725b4 100755
--- a/.semaphore/semaphore-runner.sh
+++ b/.semaphore/semaphore-runner.sh
@@ -7,7 +7,7 @@ set -o pipefail
# default to Debian testing
DISTRO="${DISTRO:-debian}"
RELEASE="${RELEASE:-bookworm}"
-BRANCH="${BRANCH:-upstream-ci}"
+BRANCH="${BRANCH:-debian/master}"
ARCH="${ARCH:-amd64}"
CONTAINER="${RELEASE}-${ARCH}"
CACHE_DIR="${SEMAPHORE_CACHE_DIR:-/tmp}"
@@ -29,6 +29,7 @@ create_container() {
# enable source repositories so that apt-get build-dep works
sudo lxc-attach -n "$CONTAINER" -- sh -ex <<EOF
sed 's/^deb/deb-src/' /etc/apt/sources.list >>/etc/apt/sources.list.d/sources.list
+echo "deb http://deb.debian.org/debian $RELEASE-backports main" >/etc/apt/sources.list.d/backports.list
# We might attach the console too soon
until systemctl --quiet --wait is-system-running; do sleep 1; done
# Manpages database trigger takes a lot of time and is not useful in a CI
@@ -44,6 +45,8 @@ apt-get -y dist-upgrade
apt-get install -y eatmydata
# The following four are needed as long as these deps are not covered by Debian's own packaging
apt-get install -y fdisk tree libfdisk-dev libp11-kit-dev libssl-dev libpwquality-dev rpm
+# autopkgtest doesn't consider backports
+apt-get install -y -t $RELEASE-backports debhelper libcurl4-openssl-dev libarchive-dev
apt-get purge --auto-remove -y unattended-upgrades
systemctl unmask systemd-networkd
systemctl enable systemd-networkd
@@ -100,8 +103,11 @@ EOF
# now build the package and run the tests
rm -rf "$ARTIFACTS_DIR"
# autopkgtest exits with 2 for "some tests skipped", accept that
- sudo "$AUTOPKGTEST_DIR/runner/autopkgtest" --env DEB_BUILD_OPTIONS=noudeb \
- --env TEST_UPSTREAM=1 ../systemd_*.dsc \
+ sudo "$AUTOPKGTEST_DIR/runner/autopkgtest" --env DEB_BUILD_OPTIONS="noudeb nostrip optimize=-lto" \
+ --env DPKG_DEB_COMPRESSOR_TYPE="none" \
+ --env DEB_BUILD_PROFILES="pkg.systemd.upstream noudeb" \
+ --env TEST_UPSTREAM=1 \
+ ../systemd_*.dsc \
-o "$ARTIFACTS_DIR" \
-- lxc -s "$CONTAINER" \
|| [ $? -eq 2 ]
diff --git a/Makefile b/Makefile
deleted file mode 100644
index eeb0dbc62f..0000000000
--- a/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-all:
- ninja -C build
-
-install:
- DESTDIR=$(DESTDIR) ninja -C build install
diff --git a/NEWS b/NEWS
index bcf42ffd8e..86b7ba7768 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,13 @@ CHANGES WITH 256 in spe:
* Support for flushing of the nscd user/group database caches will be
dropped in a future release.
+ * Support for cgroup v1 ('legacy' and 'hybrid' hierarchies) is now
+ considered obsolete and systemd by default will refuse to boot under it.
+ To forcibly reenable cgroup v1 support, SYSTEMD_CGROUP_ENABLE_LEGACY_FORCE=1
+ must be set on kernel command line. The meson option 'default-hierarchy='
+ is also deprecated, i.e. only cgroup v2 ('unified' hierarchy) can be
+ selected as build-time default.
+
* Previously, systemd-networkd did not explicitly remove any bridge VLAN
IDs assigned on bridge master and ports. Since v256, if a .network
file for an interface has at least one valid settings in [BridgeVLAN]
@@ -20,12 +27,28 @@ CHANGES WITH 256 in spe:
mounted at some path, for example /boot/efi/ (this type of setup is
obsolete but is still commonly found).
+ * The behavior of systemd-sleep and systemd-homed has been updated to
+ freeze user sessions when entering the various sleep modes or when
+ locking a homed-managed home area. This is known to cause issues with
+ the proprietary NVIDIA drivers. Packagers of the NVIDIA proprietary
+ drivers may want to add drop-in configuration files that set
+ SYSTEMD_SLEEP_FREEZE_USER_SESSION=false for systemd-suspend.service
+ and related services, and SYSTEMD_HOME_LOCK_FREEZE_SESSION=false for
+ systemd-homed.service.
+
Network Management:
* systemd-networkd's proxy support gained a new option to configure
a private VLAN variant of the proxy ARP supported by the kernel
under the name IPv4ProxyARPPrivateVLAN=.
+ * TPM 1.2 PCR measurement support has been removed from
+ systemd-stub. TPM 1.2 is obsolete and — due to the (by today's
+ standards) weak cryptographic algorithms it only supports — does not
+ actually provide the security benefits it's supposed to
+ provide. Given that the rest of systemd's codebase never supported
+ TPM 1.2 the support has now been removed from systemd-stub as well.
+
CHANGES WITH 255:
Announcements of Future Feature Removals and Incompatible Changes:
@@ -1376,7 +1399,7 @@ CHANGES WITH 254:
user is notified (graphically via Plymouth – if available – as well
as in text form on the console), and the system is turned off after a
10s delay. The feature can be disabled by passing
- systemd.battery-check=0 through the kernel command line.
+ systemd.battery_check=0 through the kernel command line.
* The 'passwdqc' library is now supported as an alternative to the
'pwquality' library and can be selected at build time.
@@ -3704,7 +3727,7 @@ CHANGES WITH 250:
interfaces. The Kind= setting in .netdev file accepts "ipoib". And
systemd.netdev files gained the [IPoIB] section.
- * systemd-networkd and systemd-udevd now support net.ifname-policy=
+ * systemd-networkd and systemd-udevd now support net.ifname_policy=
option on the kernel command-line. This is implemented through the
systemd-network-generator service that automatically generates
appropriate .link, .network, and .netdev files.
@@ -4276,7 +4299,7 @@ CHANGES WITH 249:
- Invalid characters in interface names are replaced with "_".
The new version of the net naming scheme is "v249". The previous
- scheme can be selected via the "net.naming-scheme=v247" kernel
+ scheme can be selected via the "net.naming_scheme=v247" kernel
command line parameter.
* sd-bus' sd_bus_is_ready() and sd_bus_is_open() calls now accept a
@@ -5807,7 +5830,7 @@ CHANGES WITH 247:
bridge. Since this is a naming scheme incompatibility on systems that
possess hardware like this it has been introduced as new naming
scheme "v247". The previous scheme can be selected via the
- "net.naming-scheme=v245" kernel command line parameter.
+ "net.naming_scheme=v245" kernel command line parameter.
* ConditionFirstBoot= semantics have been modified to be safe towards
abnormal system power-off during first boot. Specifically, the
@@ -6020,12 +6043,12 @@ CHANGES WITH 246:
added, which may be used to turn off automatic activation of swap
devices listed in /etc/fstab.
- * New kernel command line options systemd.condition-needs-update= and
- systemd.condition-first-boot= have been added, which override the
+ * New kernel command line options systemd.condition_needs_update= and
+ systemd.condition_first_boot= have been added, which override the
result of the ConditionNeedsUpdate= and ConditionFirstBoot=
conditions.
- * A new kernel command line option systemd.clock-usec= has been added
+ * A new kernel command line option systemd.clock_usec= has been added
that allows setting the system clock to the specified time in µs
since Jan 1st, 1970 early during boot. This is in particular useful
in order to make test cases more reliable.
@@ -6712,7 +6735,7 @@ CHANGES WITH 245:
multiple containers whose names all begin with the same prefix. Since
this changes the primary interface names pointing to containers if
truncation happens, the old scheme may still be requested by
- selecting an older naming scheme, via the net.naming-scheme= kernel
+ selecting an older naming scheme, via the net.naming_scheme= kernel
command line option.
* PrivateUsers= in service files now works in services run by the
@@ -7242,9 +7265,9 @@ CHANGES WITH 243:
Moreover, the "en" prefix was dropped from the ID_NET_NAME_ONBOARD
udev property.
- Those two changes form a new net.naming-policy-scheme= entry.
- Distributions which want to preserve naming stability may want to set
- the -Ddefault-net-naming-scheme= configuration option.
+ Those two changes form a new net.naming_scheme= entry. Distributions
+ which want to preserve naming stability may want to set the
+ -Ddefault-net-naming-scheme= configuration option.
* systemd-networkd now supports MACsec, nlmon, IPVTAP and Xfrm
interfaces natively.
@@ -8319,7 +8342,7 @@ CHANGES WITH 240:
name as argument.
* systemd-udevd's network naming logic now understands a new
- net.naming-scheme= kernel command line switch, which may be used to
+ net.naming_scheme= kernel command line switch, which may be used to
pick a specific version of the naming scheme. This helps stabilizing
interface names even as systemd/udev are updated and the naming logic
is improved.
diff --git a/README b/README
index 3b62e369fa..e41ab1ab7d 100644
--- a/README
+++ b/README
@@ -98,6 +98,8 @@ REQUIREMENTS:
CONFIG_SECCOMP_FILTER (required for seccomp support)
CONFIG_KCMP (for the kcmp() syscall, used to be under
CONFIG_CHECKPOINT_RESTORE before ~5.12)
+ CONFIG_NET_SCHED
+ CONFIG_NET_SCH_FQ_CODEL
Required for CPUShares= in resource control unit settings:
CONFIG_CGROUP_SCHED
diff --git a/TODO b/TODO
index 77da63aa05..b8a36bc37c 100644
--- a/TODO
+++ b/TODO
@@ -128,24 +128,43 @@ Deprecations and removals:
* Once baseline is 4.13, remove support for INTERFACE_OLD= checks in "udevadm
trigger"'s waiting logic, since we can then rely on uuid-tagged uevents
-* remove remaining tpm1.2 support from sd-stub
-
Features:
+* make varlink.h a public API, i.e. give all symbols an sd_ prefix, and rename
+ header file to sd-varlink.h. This of course also means we have to make json.h
+ public the same way. Convert the function param checks from assert() to
+ assert_ret(). Only export the stuff we are sure about, and keep some symbols
+ internally where things are not clear whether we want other projects to use.
+
+* add a new specifier to unit files that figures out the DDI the unit file is
+ from, tracing through overlayfs, DM, loopback block device.
+
+* importd/importctl
+ - import generator
+ - port tar handling to libarchive
+ - add varlink interface
+ - download images into .v/ dirs
+
* in os-release define a field that can be initialized at build time from
SOURCE_DATE_EPOCH (maybe even under that name?). Would then be used to
initialize the timestamp logic of ConditionNeedsUpdate=.
+* ptyfwd: look for window title ANSI sequences and insert colored dot in front
+ of it while passing it through, to indicate whether we are in privileged, VM,
+ container terminal sessions.
+
+* nspawn/vmspawn/pid1: add ability to easily insert fully booted VMs/FOSC into
+ shell pipelines, i.e. add easy to use switch that turns off console status
+ output, and generates the right credentials for systemd-run-generator so that
+ a program is invoked, and its output captured, with correct EOF handling and
+ exit code propagation
+
* new systemd-analyze "join" verb or so, for debugging services. Would be
nsenter on steroids, i.e invoke a shell or command line in an environment as
close as we can make it for the MainPID of a service. Should be built around
pidfd, so that we can reasonably robustly do this. Would only cover the
execution environment like namespaces, but not the privilege settings.
-* add a generic client to importd called importctl, then make machinectl just
- chain-exec() it. Make sure importd/importctl can be used for sysext images,
- portable images too.
-
* varlink: extend varlink IDL macros to include documentation strings
* Introduce a CGroupRef structure, inspired by PidRef. Should contain cgroup
@@ -376,7 +395,7 @@ Features:
* systemd-tpm2-setup should probably have a factory reset logic, i.e. when some
kernel command line option is set we reset the TPM (equivalent of tpm2_clear
- -c owner?).
+ -c owner? or rather echo 5 >/sys/class/tpm/tpm0/ppi/request?).
* systemd-tpm2-setup should support a mode where we refuse booting if the SRK
changed. (Must be opt-in, to not break systems which are supposed to be
@@ -1381,8 +1400,8 @@ Features:
- kmod-libs (only when called from PID 1)
- libblkid (only in RootImage= handling in PID 1, but not elsewhere)
- libpam (only when called from PID 1)
- - bzip2, xz, lz4 (always — gzip and zstd should probably stay static deps the way they are,
- since they are so basic and our defaults)
+ - bzip2 (always — gzip should probably stay static dep the way it is,
+ since it's so basic and our defaults)
* seccomp: maybe use seccomp_merge() to merge our filters per-arch if we can.
Apparently kernel performance is much better with fewer larger seccomp
@@ -1530,8 +1549,6 @@ Features:
that our log messages could contain clickable links for example for unit
files and suchlike we operate on.
-* importd: add ability download images for portabled + sysext
-
* add support for "portablectl attach http://foobar.com/waaa.raw (i.e. importd integration)
* sync dynamic uids/gids between host+portable srvice (i.e. if DynamicUser=1 is set for a service, make sure that the
diff --git a/configure b/configure
deleted file mode 100755
index 5c1722db05..0000000000
--- a/configure
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-# SPDX-License-Identifier: LGPL-2.1-or-later
-set -e
-
-cflags="CFLAGS=${CFLAGS-}"
-cxxflags="CXXFLAGS=${CXXFLAGS-}"
-args=()
-
-for arg in "$@"; do
- case "$arg" in
- CFLAGS=*)
- cflags="$arg"
- ;;
- CXXFLAGS=*)
- cxxflags="$arg"
- ;;
- *)
- args+=("$arg")
- esac
-done
-
-export "${cflags?}" "${cxxflags?}"
-set -x
-exec meson setup build "${args[@]}"
diff --git a/docs/API_FILE_SYSTEMS.md b/docs/API_FILE_SYSTEMS.md
new file mode 100644
index 0000000000..84a1900e41
--- /dev/null
+++ b/docs/API_FILE_SYSTEMS.md
@@ -0,0 +1,52 @@
+---
+title: API File Systems
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# API File Systems
+
+_So you are seeing all kinds of weird file systems in the output of mount(8) that are not listed in `/etc/fstab`, and you wonder what those are, how you can get rid of them, or at least change their mount options._
+
+The Linux kernel provides a number of different ways for userspace to communicate with it. For many facilities there are system calls, others are hidden behind Netlink interfaces, and even others are exposed via virtual file systems such as `/proc` or `/sys`. These file systems are programming interfaces, they are not actually backed by real, persistent storage. They simply use the file system interface of the kernel as interface to various unrelated mechanisms. Similarly, there are file systems that userspace uses for its own API purposes, to store shared memory segments, shared temporary files or sockets. In this article we want to discuss all these kind of _API file systems_. More specifically, here's a list of these file systems typical Linux systems currently have:
+
+* `/sys` for exposing kernel devices, drivers and other kernel information to userspace
+* `/proc` for exposing kernel settings, processes and other kernel information to userspace
+* `/dev` for exposing kernel device nodes to userspace
+* `/run` as location for userspace sockets and files
+* `/tmp` as location for volatile, temporary userspace file system objects (X)
+* `/sys/fs/cgroup` (and file systems below that) for exposing the kernel control group hierarchy
+* `/sys/kernel/security`, `/sys/kernel/debug` (X), `/sys/kernel/config` (X) for exposing special purpose kernel objects to userspace
+* `/sys/fs/selinux` for exposing SELinux security data to userspace
+* `/dev/shm` as location for userspace shared memory objects
+* `/dev/pts` for exposing kernel pseudo TTY device nodes to userspace
+* `/proc/sys/fs/binfmt_misc` for registering additional binary formats in the kernel (X)
+* `/dev/mqueue` for exposing mqueue IPC objects to userspace (X)
+* `/dev/hugepages` as a userspace API for allocating "huge" memory pages (X)
+* `/sys/fs/fuse/connections` for exposing kernel FUSE connections to userspace (X)
+* `/sys/firmware/efi/efivars` for exposing firmware variables to userspace
+
+All these _API file systems_ are mounted during very early boot-up of systemd and are generally not listed in `/etc/fstab`. Depending on the used kernel configuration some of these API file systems might not be available and others might exist instead. As these interfaces are important for kernel-to-userspace and userspace-to-userspace communication they are mounted automatically and without configuration or interference by the user. Disabling or changing their parameters might hence result in applications breaking as they can no longer access the interfaces they need.
+
+Even though the default settings of these file systems should normally be suitable for most setups, in some cases it might make sense to change the mount options, or possibly even disable some of these file systems.
+
+Even though normally none of these API file systems are listed in `/etc/fstab` they may be added there. If so, any options specified therein will be applied to that specific API file system. Hence: to alter the mount options or other parameters of these file systems, simply add them to `/etc/fstab` with the appropriate settings and you are done. Using this technique it is possible to change the source, type of a file system in addition to simply changing mount options. That is useful to turn `/tmp` to a true file system backed by a physical disk.
+
+It is possible to disable the automatic mounting of some (but not all) of these file systems, if that is required. These are marked with (X) in the list above. You may disable them simply by masking them:
+
+```sh
+systemctl mask dev-hugepages.mount
+```
+
+This has the effect that the huge memory page API FS is not mounted by default, starting with the next boot. See [Three Levels of Off](http://0pointer.de/blog/projects/three-levels-of-off.html) for more information on masking.
+
+The systemd service [systemd-remount-fs.service](http://www.freedesktop.org/software/systemd/man/systemd-remount-fs.service.html) is responsible for applying mount parameters from `/etc/fstab` to the actual mounts.
+
+## Why are you telling me all this? I just want to get rid of the tmpfs backed /tmp!
+
+You have three options:
+
+1. Disable any mounting on `/tmp` so that it resides on the same physical file system as the root directory. For that, execute `systemctl mask tmp.mount`
+2. Mount a different, physical file system to `/tmp`. For that, simply create an entry for it in `/etc/fstab` as you would do for any other file system.
+3. Keep `/tmp` but increase/decrease the size of it. For that, also just create an entry for it in `/etc/fstab` as you would do for any other `tmpfs` file system, and use the right `size=` option.
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index 33486203a6..1478ea0ef2 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -145,7 +145,7 @@ as a normal executable and executed for each of the input samples under
with sanitizers and invoked as part of the test suite (if `-Dfuzz-tests=true`
is configured). Thirdly, fuzzers are executed through fuzzing engines that try
to find new "interesting" inputs through coverage feedback and massive
-parallelization; see the links for oss-fuzz in [Code quality](CODE_QUALITY.md).
+parallelization; see the links for oss-fuzz in [Code quality](CODE_QUALITY).
For testing and debugging, fuzzers can be executed as any other program,
including under `valgrind` or `gdb`.
diff --git a/docs/AUTOPKGTEST.md b/docs/AUTOPKGTEST.md
new file mode 100644
index 0000000000..a575825d2d
--- /dev/null
+++ b/docs/AUTOPKGTEST.md
@@ -0,0 +1,92 @@
+---
+title: Autopkgtest - Defining tests for Debian packages
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Test description
+
+Full system integration/acceptance testing is done through [autopkgtests](https://salsa.debian.org/ci-team/autopkgtest/-/blob/master/doc/README.package-tests.rst). These test the actual installed binary distribution packages. They are run in QEMU or containers and thus can do intrusive and destructive things such as installing arbitrary packages, modifying arbitrary files in the system (including grub boot parameters), rebooting, or loading kernel modules.
+
+The tests for systemd are defined in the [Debian package's debian/tests](https://salsa.debian.org/systemd-team/systemd/-/tree/debian/master/debian/tests) directory. For validating a pull request, the Debian package is built using the unpatched code from that PR (via the [checkout-upstream](https://salsa.debian.org/systemd-team/systemd/-/blob/debian/master/debian/extra/checkout-upstream) script), and the tests run against these built packages. Note that some tests which check Debian specific behaviour are skipped in "test upstream" mode.
+
+# Infrastructure
+
+systemd's GitHub project has webhooks that trigger autopkgtests on Ubuntu 18.04 LTS on three architectures:
+
+* i386: 32 bit x86, little endian, QEMU (OpenStack cloud instance)
+* amd64: 64 bit x86, little endian, QEMU (OpenStack cloud instance)
+* arm64: 64 bit ARM, little endian, QEMU (OpenStack cloud instance)
+* s390x: 64 bit IBM z/Series, big endian, LXC (this architecture is not yet available in Canonical's OpenStack and thus skips some tests)
+
+Please see the [Ubuntu CI infrastructure](https://wiki.ubuntu.com/ProposedMigration/AutopkgtestInfrastructure) documentation for details about how this works.
+
+# Manually retrying/triggering tests on the infrastructure
+
+The current tests are fairly solid by now, but rarely they fail on infrastructure/network issues or race conditions. If you encounter these, please notify @iainlane in the GitHub PR for debugging/fixing those -- transient infrastructure issues are supposed to be detected automatically, and tests auto-retry on those; and flaky tests should of course be fixed properly. But sometimes it is useful to trigger tests on a different Ubuntu release too, for example to test a PR on a newer kernel or against current build/binary dependencies (cgroup changes, util-linux, gcc, etc.).
+
+This can be done using the generic [retry-github-test](https://git.launchpad.net/autopkgtest-cloud/tree/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/retry-github-test) script from [Ubuntu's autopkgtest infrastructure](https://git.launchpad.net/autopkgtest-cloud): you need the parameterized URL from the [configured webhooks](https://github.com/systemd/systemd/settings/hooks) and the shared secret (Ubuntu's CI needs to restrict access to avoid DoSing and misuse).
+
+You can use Martin Pitt's [retry-gh-systemd-test](https://piware.de/gitweb/?p=bin.git;a=blob;f=retry-gh-systemd-test) shell wrapper around retry-github-test for that. You need to adjust the path where you put retry-github-test and the file with the shared secret, then you can call it like this:
+
+```sh
+$ retry-gh-systemd-test <#PR> <architecture> [release]
+```
+
+where `release` defaults to `bionic` (aka Ubuntu 18.04 LTS). For example:
+
+```sh
+$ retry-gh-systemd-test 1234 amd64
+$ retry-gh-systemd-test 2345 s390x cosmic
+```
+
+Please make sure to not trigger unknown [releases](https://launchpad.net/ubuntu/+series) or architectures as they will cause a pending test on the PR which never gets finished.
+
+# Test the code from the PR locally
+
+As soon as a test on the infrastructure finishes, the "Details" link in the PR "checks" section will point to the `log.gz` log. You can download the individual test log, built .debs, and other artifacts that tests leave behind (some dump a complete journal or the udev database on failure) by replacing `/log.gz` with `/artifacts.tar.gz` in that URL. You can then unpack the tarball and use `sudo dpkg -iO binaries/*.deb` to install the debs from the PR into an Ubuntu VM of the same release/architecture for manually testing a PR.
+
+# Run autopkgtests locally
+
+Preparations:
+
+* Get autopkgtest:
+ ```sh
+ git clone https://salsa.debian.org/ci-team/autopkgtest.git
+ ```
+
+* Install necessary dependencies; on Debian/Ubuntu you can simply run `sudo apt install autopkgtest` (instead of the above cloning), on Fedora do `yum install qemu-kvm dpkg-perl`
+
+* Build a test image based on Ubuntu cloud images for the desired release/arch:
+ ```sh
+ autopkgtest/tools/autopkgtest-buildvm-ubuntu-cloud -r bionic -a amd64
+ ```
+
+ This will build `autopkgtest-bionic-amd64.img`. This is normally being used through the `autopkgtest` command (see below), but you can boot this normally in QEMU (using `-snapshot` is highly recommended) to interactively poke around; this provides a easy throw-away test environment.
+
+
+The most basic mode of operation is to run the tests for the current distro packages:
+
+```sh
+autopkgtest/runner/autopkgtest systemd -- qemu autopkgtest-bionic-amd64.img
+```
+
+But autopkgtest allows lots of [different modes](https://salsa.debian.org/ci-team/autopkgtest/-/blob/master/doc/README.running-tests.rst) and [options](http://manpages.ubuntu.com/autopkgtest), like running a shell on failure (`-s`), running a single test only (`--test-name`), running the tests from a local checkout of the Debian source tree (possibly with modifications to the test) instead of from the distribution source, or running QEMU with more than one CPU (check the [autopkgtest-virt-qemu manpage](http://manpages.ubuntu.com/autopkgtest-virt-qemu).
+
+A common use case is to check out the Debian packaging git for getting/modifying the tests locally:
+
+```sh
+git clone https://salsa.debian.org/systemd-team/systemd.git /tmp/systemd-debian/
+```
+
+and running these against the binaries from a PR (see above), running only the `logind` test, getting a shell on failure, showing the boot output, and running with 2 CPUs:
+
+```sh
+autopkgtest/runner/autopkgtest --test-name logind /tmp/binaries/*.deb /tmp/systemd-debian/ -s -- \
+ qemu --show-boot --cpus 2 /srv/vm/autopkgtest-bionic-amd64.img
+```
+
+# Contact
+
+For troubles with the infrastructure, please notify [iainlane](https://github.com/iainlane) in the affected PR.
diff --git a/docs/BACKPORTS.md b/docs/BACKPORTS.md
new file mode 100644
index 0000000000..6fbb57dd88
--- /dev/null
+++ b/docs/BACKPORTS.md
@@ -0,0 +1,25 @@
+---
+title: Backports
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Backports
+
+The upstream systemd git repo at [https://github.com/systemd/systemd](https://github.com/systemd/systemd) only contains the main systemd branch that progresses at a quick pace, continuously bringing both bugfixes and new features. Distributions usually prefer basing their releases on stabilized versions branched off from this, that receive the bugfixes but not the features.
+
+## Stable Branch Repository
+
+Stable branches are available from [https://github.com/systemd/systemd-stable](https://github.com/systemd/systemd-stable).
+
+Stable branches are started for certain releases of systemd and named after them, e.g. v208-stable. Stable branches are typically managed by distribution maintainers on an as needed basis. For example v208 has been chosen for stable as several distributions are shipping this version and the official/upstream cycle of v208-v209 was a long one due to kdbus work. If you are using a particular version and find yourself backporting several patches, you may consider pushing a stable branch here for that version so others can benefit. Please contact us if you are interested.
+
+The following types of commits are cherry-picked onto those branches:
+
+* bugfixes
+* documentation updates, when relevant to this version
+* hardware database additions, especially the keymap updates
+* small non-conflicting features deemed safe to add in a stable release
+
+Please try to ensure that anything backported to the stable repository is done with the `git cherry-pick -x` option such that text stating the original SHA1 is added into the commit message. This makes it easier to check where the code came from (as sometimes it is necessary to add small fixes as new code due to the upstream refactors that are deemed too invasive to backport as a stable patch.
diff --git a/docs/BOOT.md b/docs/BOOT.md
new file mode 100644
index 0000000000..574cc080cf
--- /dev/null
+++ b/docs/BOOT.md
@@ -0,0 +1,111 @@
+---
+title: systemd-boot UEFI Boot Manager
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# systemd-boot UEFI Boot Manager
+
+systemd-boot is a UEFI boot manager which executes configured EFI images. The default entry is selected by a configured pattern (glob) or an on-screen menu.
+
+systemd-boot operates on the EFI System Partition (ESP) only. Configuration file fragments, kernels, initrds, other EFI images need to reside on the ESP. Linux kernels need to be built with CONFIG\_EFI\_STUB to be able to be directly executed as an EFI image.
+
+systemd-boot reads simple and entirely generic boot loader configuration files; one file per boot loader entry to select from. All files need to reside on the ESP.
+
+Pressing the Space key (or most other keys actually work too) during bootup will show an on-screen menu with all configured loader entries to select from. Pressing Enter on the selected entry loads and starts the EFI image.
+
+If no timeout is configured, which is the default setting, and no key pressed during bootup, the default entry is executed right away.
+
+![systemd-boot menu](/assets/systemd-boot-menu.png)
+
+All configuration files are expected to be 7-bit ASCII or valid UTF8. The loader configuration file understands the following keywords:
+
+| Config |
+|---------|------------------------------------------------------------|
+| default | pattern to select the default entry in the list of entries |
+| timeout | timeout in seconds for how long to show the menu |
+
+
+The entry configuration files understand the following keywords:
+
+| Entry |
+|--------|------------------------------------------------------------|
+| title | text to show in the menu |
+| version | version string to append to the title when the title is not unique |
+| machine-id | machine identifier to append to the title when the title is not unique |
+| efi | executable EFI image |
+| options | options to pass to the EFI image / kernel command line |
+| linux | linux kernel image (systemd-boot still requires the kernel to have an EFI stub) |
+| initrd | initramfs image (systemd-boot just adds this as option initrd=) |
+
+
+Examples:
+```
+/boot/loader/loader.conf
+timeout 3
+default 6a9857a393724b7a981ebb5b8495b9ea-*
+
+/boot/loader/entries/6a9857a393724b7a981ebb5b8495b9ea-3.8.0-2.fc19.x86_64.conf
+title Fedora 19 (Rawhide)
+version 3.8.0-2.fc19.x86_64
+machine-id 6a9857a393724b7a981ebb5b8495b9ea
+linux /6a9857a393724b7a981ebb5b8495b9ea/3.8.0-2.fc19.x86_64/linux
+initrd /6a9857a393724b7a981ebb5b8495b9ea/3.8.0-2.fc19.x86_64/initrd
+options root=UUID=f8f83f73-df71-445c-87f7-31f70263b83b quiet
+
+/boot/loader/entries/custom-kernel.conf
+title My kernel
+efi /bzImage
+options root=PARTUUID=084917b7-8be2-4e86-838d-f771a9902e08
+
+/boot/loader/entries/custom-kernel-initrd.conf
+title My kernel with initrd
+linux /bzImage
+initrd /initrd.img
+options root=PARTUUID=084917b7-8be2-4e86-838d-f771a9902e08 quiet`
+```
+
+
+While the menu is shown, the following keys are active:
+
+| Keys |
+|--------|------------------------------------------------------------|
+| Up/Down | Select menu entry |
+| Enter | boot the selected entry |
+| d | select the default entry to boot (stored in a non-volatile EFI variable) |
+| t/T | adjust the timeout (stored in a non-volatile EFI variable) |
+| e | edit the option line (kernel command line) for this bootup to pass to the EFI image |
+| Q | quit |
+| v | show the systemd-boot and UEFI version |
+| P | print the current configuration to the console |
+| h | show key mapping |
+
+Hotkeys to select a specific entry in the menu, or when pressed during bootup to boot the entry right-away:
+
+
+
+| Keys |
+|--------|------------------------------------------------------------|
+| l | Linux |
+| w | Windows |
+| a | OS X |
+| s | EFI Shell |
+| 1-9 | number of entry |
+
+Some EFI variables control the loader or exported the loaders state to the started operating system. The vendor UUID `4a67b082-0a4c-41cf-b6c7-440b29bb8c4f` and the variable names are supposed to be shared across all loaders implementations which follow this scheme of configuration:
+
+| EFI Variables |
+|---------------|------------------------|-------------------------------|
+| LoaderEntryDefault | entry identifier to select as default at bootup | non-volatile |
+| LoaderConfigTimeout | timeout in seconds to show the menu | non-volatile |
+| LoaderEntryOneShot | entry identifier to select at the next and only the next bootup | non-volatile |
+| LoaderDeviceIdentifier | list of identifiers of the volume the loader was started from | volatile |
+| LoaderDevicePartUUID | partition GPT UUID of the ESP systemd-boot was executed from | volatile |
+
+
+Links:
+
+[https://github.com/systemd/systemd](https://github.com/systemd/systemd)
+
+[http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/](http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/)
diff --git a/docs/BOOT_LOADER_INTERFACE.md b/docs/BOOT_LOADER_INTERFACE.md
index f915cbacc9..a1f6b59568 100644
--- a/docs/BOOT_LOADER_INTERFACE.md
+++ b/docs/BOOT_LOADER_INTERFACE.md
@@ -78,7 +78,7 @@ variables. All EFI variables use the vendor UUID
* `1 << 1` → The boot loader honours `LoaderConfigTimeoutOneShot` when set.
* `1 << 2` → The boot loader honours `LoaderEntryDefault` when set.
* `1 << 3` → The boot loader honours `LoaderEntryOneShot` when set.
- * `1 << 4` → The boot loader supports boot counting as described in [Automatic Boot Assessment](AUTOMATIC_BOOT_ASSESSMENT.md).
+ * `1 << 4` → The boot loader supports boot counting as described in [Automatic Boot Assessment](AUTOMATIC_BOOT_ASSESSMENT).
* `1 << 5` → The boot loader supports looking for boot menu entries in the Extended Boot Loader Partition.
* `1 << 6` → The boot loader supports passing a random seed to the OS.
* `1 << 13` → The boot loader honours `menu-disabled` option when set.
diff --git a/docs/CATALOG.md b/docs/CATALOG.md
new file mode 100644
index 0000000000..bcbf5b90bc
--- /dev/null
+++ b/docs/CATALOG.md
@@ -0,0 +1,67 @@
+---
+title: Journal Message Catalogs
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Journal Message Catalogs
+
+Starting with 196 systemd includes a message catalog system which allows augmentation on display of journal log messages with short explanation texts, keyed off the MESSAGE\_ID= field of the entry. Many important log messages generated by systemd itself have message catalog entries. External packages can easily provide catalog data for their own messages.
+
+The message catalog has a number of purposes:
+
+* Provide the administrator, user or developer with further information about the issue at hand, beyond the actual message text
+* Provide links to further documentation on the topic of the specific message
+* Provide native language explanations for English language system messages
+* Provide links for support forums, hotlines or other contacts
+
+## Format
+
+Message catalog source files are simple text files that follow an RFC822 inspired format. To get an understanding of the format [here's an example file](http://cgit.freedesktop.org/systemd/systemd/plain/catalog/systemd.catalog), which includes entries for many important messages systemd itself generates. On installation of a package that includes message catalogs all installed message catalog source files get compiled into a binary index, which is then used to look up catalog data.
+
+journalctl's `-x` command line parameter may be used to augment on display journal log messages with message catalog data when browsing. `journalctl --list-catalog` may be used to print a list of all known catalog entries.
+
+To register additional catalog entries, packages may drop (text) catalog files into /usr/lib/systemd/catalog/ with a suffix of .catalog. The files are not accessed directly when needed, but need to be built into a binary index file with `journalctl --update-catalog`.
+
+Here's an example how a single catalog entry looks like in the text source format. Multiple of these may be listed one after the other per catalog source file:
+
+```
+-- fc2e22bc6ee647b6b90729ab34a250b1
+Subject: Process @COREDUMP_PID@ (@COREDUMP_COMM@) dumped core
+Defined-By: systemd
+Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
+Documentation: man:core(5)
+Documentation: http://www.freedesktop.org/wiki/Software/systemd/catalog/@MESSAGE_ID@
+
+Process @COREDUMP_PID@ (@COREDUMP_COMM@) crashed and dumped core.
+
+This usually indicates a programming error in the crashing program and
+should be reported to its vendor as a bug.
+```
+
+
+The text format of the .catalog files is as follows:
+
+* Simple, UTF-8 text files, with usual line breaks at 76 chars. URLs and suchlike where line-breaks are undesirable may use longer lines. As catalog files need to be usable on text consoles it is essential that the 76 char line break rule is otherwise followed for human readable text.
+* Lines starting with `#` are ignored, and may be used for comments.
+* The files consist of a series of entries. For each message ID (in combination with a locale) only a single entry may be defined. Every entry consists of:
+ * A separator line beginning with `-- `, followed by a hexadecimal message ID formatted as lower case ASCII string. Optionally, the message ID may be suffixed by a space and a locale identifier, such as `de` or `fr\_FR`, if i10n is required.
+ * A series of entry headers, in RFC822-style but not supporting continuation lines. Some header fields may appear more than once per entry. The following header fields are currently known (but additional fields may be added later):
+ * Subject: A short, one-line human readable description of the message
+ * Defined-By: Who defined this message. Usually a package name or suchlike
+ * Support: A URI for getting further support. This can be a web URL or a telephone number in the tel:// namespace
+ * Documentation: URIs for further user, administrator or developer documentation on the log entry. URIs should be listed in order of relevance, the most relevant documentation first.
+ * An empty line
+ * The actual catalog entry payload, as human readable prose. Multiple paragraphs may be separated by empty lines. The prose should first describe the message and when it occurs, possibly followed by recommendations how to deal with the message and (if it is an error message) correct the problem at hand. This message text should be readable by users and administrators. Information for developers should be stored externally instead, and referenced via a Documentation= header field.
+* When a catalog entry is printed on screen for a specific log entry simple variable replacements are applied. Journal field names enclosed in @ will be replaced by their values, if such a field is available in an entry. If such a field is not defined in an entry the enclosing @ will be dropped but the variable name is kept. See [systemd's own message catalog](http://cgit.freedesktop.org/systemd/systemd/plain/catalog/systemd.catalog) for a complete example for a catalog file.
+
+## Adding Message Catalog Support to Your Program
+
+Note that the message catalog is only available for messages generated with the MESSAGE\_ID= journal meta data field, as this is need to find the right entry for a message. For more information on the MESSAGE\_ID= journal entry field see [systemd.journal-fields(7)](http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html).
+
+To add message catalog entries for log messages your application generates, please follow the following guidelines:
+
+* Use the [native Journal logging APIs](http://0pointer.de/blog/projects/journal-submit.html) to generate your messages, and define message IDs for all messages you want to add catalog entries for. You may use `journalctl --new-id128` to allocate new message IDs.
+* Write a catalog entry file for your messages and ship them in your package and install them to `/usr/lib/systemd/catalog/` (if you package your software with RPM use `%_journalcatalogdir`)
+* Ensure that after installation of your application's RPM/DEB "`journalctl --update-catalog`" is executed, in order to update the binary catalog index. (if you package your software with RPM use the `%journal_catalog_update` macro to achieve that.)
diff --git a/docs/CODE_QUALITY.md b/docs/CODE_QUALITY.md
index 0f983bd299..166b307b66 100644
--- a/docs/CODE_QUALITY.md
+++ b/docs/CODE_QUALITY.md
@@ -75,7 +75,7 @@ available functionality:
15. Each PR is automatically tested with [Address Sanitizer](https://clang.llvm.org/docs/AddressSanitizer.html)
and [Undefined Behavior Sanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html).
- See [Testing systemd using sanitizers](TESTING_WITH_SANITIZERS.md)
+ See [Testing systemd using sanitizers](TESTING_WITH_SANITIZERS)
for more information.
16. Fossies provides [source code misspelling reports](https://fossies.org/features.html#codespell).
diff --git a/docs/CODING_STYLE.md b/docs/CODING_STYLE.md
index 0e76122734..6d6e549f5c 100644
--- a/docs/CODING_STYLE.md
+++ b/docs/CODING_STYLE.md
@@ -774,7 +774,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
- A corollary of the above is: never use `clone()` where a `fork()` would do
too. Also consider using `posix_spawn()` which combines `clone()` +
`execve()` into one and has nice properties since it avoids becoming a CoW
- trap by using `CLONE_VORK` and `CLONE_VM` together.
+ trap by using `CLONE_VFORK` and `CLONE_VM` together.
- While we avoid forking off threads on our own, writing thread-safe code is a
good idea where it might end up running inside of libsystemd.so or
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index e0f7c1d3ee..f599972243 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -29,13 +29,13 @@ For older versions that are still supported by your distribution please use resp
## Security vulnerability reports
-See [reporting of security vulnerabilities](SECURITY.md).
+See [reporting of security vulnerabilities](SECURITY).
## Posting Pull Requests
* Make sure to post PRs only relative to a recent tip of the `main` branch.
-* Follow our [Coding Style](CODING_STYLE.md) when contributing code. This is a requirement for all code we merge.
-* Please make sure to test your change before submitting the PR. See the [Hacking guide](HACKING.md) for details on how to do this.
+* Follow our [Coding Style](CODING_STYLE) when contributing code. This is a requirement for all code we merge.
+* Please make sure to test your change before submitting the PR. See the [Hacking guide](HACKING) for details on how to do this.
* Make sure to run the test suite locally, before posting your PR. We use a CI system, meaning we don't even look at your PR if the build and tests don't pass.
* If you need to update the code in an existing PR, force-push into the same branch, overriding old commits with new versions.
* After you have pushed a new version, add a comment explaining the latest changes. If you are a member of the systemd project on GitHub, remove the `reviewed/needs-rework`/`ci-fails/needs-rework`/`needs-rebase` labels.
diff --git a/docs/CONTROL_GROUP_INTERFACE.md b/docs/CONTROL_GROUP_INTERFACE.md
new file mode 100644
index 0000000000..11dc6a37ac
--- /dev/null
+++ b/docs/CONTROL_GROUP_INTERFACE.md
@@ -0,0 +1,240 @@
+---
+title: New Control Group Interfaces
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# The New Control Group Interfaces
+
+> _aka "I want to make use of kernel cgroups, how do I do this in the new world order?"_
+
+Starting with version 205 systemd provides a number of interfaces that may be used to create and manage labelled groups of processes for the purpose of monitoring and controlling them and their resource usage. This is built on top of the Linux kernel Control Groups ("cgroups") facility. Previously, the kernel's cgroups API was exposed directly as shared application API, following the rules of the [Pax Control Groups](http://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups/) document. However, the kernel cgroup interface has been reworked into an API that requires that each individual cgroup is managed by a single writer only. With this change the main cgroup tree becomes private property of that userspace component and is no longer a shared resource. On systemd systems PID 1 takes this role and hence needs to provide APIs for clients to take benefit of the control groups functionality of the kernel. Note that services running on systemd systems may manage their own subtrees of the cgroups tree, as long as they explicitly turn on delegation mode for them (see below).
+
+That means explicitly, that:
+
+1. The root control group may only be written to by systemd (PID 1). Services that create and manipulate control groups in the top level cgroup are in direct conflict with the kernel's requirement that each control group should have a single-writer only.
+2. Services must set Delegate=yes for the units they intend to manage subcgroups of. If they create and manipulate cgroups outside of units that have Delegate=yes set, they violate the access contract for control groups.
+
+For a more high-level background story, please have a look at this [Linux Foundation News Story](http://www.linuxfoundation.org/news-media/blogs/browse/2013/08/all-about-linux-kernel-cgroup%E2%80%99s-redesign).
+
+### Why this all again?
+
+- Objects placed in the same level of the cgroup tree frequently need to propagate properties from one to each other. For example, when using the "cpu" controller for one object then all objects on the same level need to do the same, otherwise the entire cgroup of the first object will be scheduled against the individual processes of the others, thus giving the first object a drastic malus on scheduling if it uses many processes.
+- Similar, some properties also require propagation up the tree.
+- The tree needs to be refreshed/built in scheduled steps as devices show up/go away as controllers like "blkio" or "devices" refer to devices via major/minor device node indexes, which are not fixed but determined only as a device appears.
+- The tree also needs refreshing/rebuilding as new services are installed/started/instantiated/stopped/uninstalled.
+- Many of the cgroup attributes are too low-level as API. For example, the major/minor device interface in order to be useful requires a userspace component for translating stable device paths into major/minor at the right time.
+- By unifying the cgroup logic under a single arbiter it is possible to write tools that can manage all objects the system contains, including services, virtual machines containers and whatever else applications register.
+- By unifying the cgroup logic under a single arbiter a good default that encompasses all kinds of objects may be shipped, thus making manual configuration unnecessary to take benefit of basic resource control.
+
+systemd through its "unit" concept already implements a dependency network between objects where propagation can take place and contains a powerful execution queue. Also, a major part of the objects resources need to be controlled for are already systemd objects, most prominently the services systemd manages.
+
+### Why is this not managed by a component independent of systemd?
+
+Well, as mentioned above, a dependency network between objects, usable for propagation, combined with a powerful execution engine is basically what systemd _is_. Since cgroups management requires precisely this it is an obvious choice to simply implement this in systemd itself.
+
+Implementing a similar propagation/dependency network with execution scheduler outside of systemd in an independent "cgroup" daemon would basically mean reimplementing systemd a second time. Also, accessing such an external service from PID 1 for managing other services would result in cyclic dependencies between PID 1 which would need this functionality to manage the cgroup service which would only be available however after that service finished starting up. Such cyclic dependencies can certainly be worked around, but make such a design complex.
+
+### I don't use systemd, what does this mean for me?
+
+Nothing. This page is about systemd's cgroups APIs. If you don't use systemd then the kernel cgroup rework will probably affect you eventually, but a different component will be the single writer userspace daemon managing the cgroup tree, with different APIs. Note that the APIs described here expose a lot of systemd-specific concepts and hence are unlikely to be available outside of systemd systems.
+
+### I want to write cgroup code that should work on both systemd systems and others (such as Ubuntu), what should I do?
+
+On systemd systems use the systemd APIs as described below. At this time we are not aware of any component that would take the cgroup managing role on Upstart/sysvinit systems, so we cannot help you with this. Sorry.
+
+### What's the timeframe of this? Do I need to care now?
+
+In the short-term future writing directly to the control group tree from applications should still be OK, as long as the [Pax Control Groups](http://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups/) document is followed. In the medium-term future it will still be supported to alter/read individual attributes of cgroups directly, but no longer to create/delete cgroups without using the systemd API. In the longer-term future altering/reading attributes will also be unavailable to userspace applications, unless done via systemd's APIs (either D-Bus based IPC APIs or shared library APIs for _passive_ operations).
+
+It is recommended to use the new systemd APIs described below in any case. Note that the kernel cgroup interface is currently being reworked (available when the "sane_behaviour" kernel option is used). This will change the cgroupfs interface. By using systemd's APIs this change is abstracted away and invisible to applications.
+
+## systemd's Resource Control Concepts
+
+Systemd provides three unit types that are useful for the purpose of resource control:
+
+- [_Services_](http://www.freedesktop.org/software/systemd/man/systemd.service.html) encapsulate a number of processes that are started and stopped by systemd based on configuration. Services are named in the style of `quux.service`.
+- [_Scopes_](http://www.freedesktop.org/software/systemd/man/systemd.scope.html) encapsulate a number of processes that are started and stopped by arbitrary processes via fork(), and then registered at runtime with PID1. Scopes are named in the style of `wuff.scope`.
+- [_Slices_](http://www.freedesktop.org/software/systemd/man/systemd.slice.html) may be used to group a number of services and scopes together in a hierarchial tree. Slices do not contain processes themselves, but the services and slices contained in them do. Slices are named in the style of `foobar-waldo.slice`, where the path to the location of the slice in the tree is encoded in the name with "-" as separator for the path components (`foobar-waldo.slice` is hence a subslice of `foobar.slice`). There's one special slices defined, `-.slice`, which is the root slice of all slices (`foobar.slice` is hence subslice of `-.slice`). This is similar how in regular file paths, "/" denotes the root directory.
+
+Service, scope and slice units directly map to objects in the cgroup tree. When these units are activated they each map to directly (modulo some character escaping) to cgroup paths built from the unit names. For example, a service `quux.service` in a slice `foobar-waldo.slice` is found in the cgroup `foobar.slice/foobar-waldo.slice/quux.service/`.
+
+Services, scopes and slices may be created freely by the administrator or dynamically by programs. However by default the OS defines a number of built-in services that are necessary to start-up the system. Also, there are four slices defined by default: first of all the root slice `-.slice` (as mentioned above), but also `system.slice`, `machine.slice`, `user.slice`. By default all system services are placed in the first slice, all virtual machines and containers in the second, and user sessions in the third. However, this is just a default, and the administrator my freely define new slices and assign services and scopes to them. Also note that all login sessions automatically are placed in an individual scope unit, as are VM and container processes. Finally, all users logging in will also get an implicit slice of their own where all the session scopes are placed.
+
+Here's an example how the cgroup tree could look like (as generated with `systemd-cgls(1)`, see below):
+
+```
+├─user.slice
+│ └─user-1000.slice
+│ ├─session-18.scope
+│ │ ├─703 login -- lennart
+│ │ └─773 -bash
+│ ├─session-1.scope
+│ │ ├─ 518 gdm-session-worker [pam/gdm-autologin]
+│ │ ├─ 540 gnome-session
+│ │ ├─ 552 dbus-launch --sh-syntax --exit-with-session
+│ │ ├─ 553 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
+│ │ ├─ 589 /usr/libexec/gvfsd
+│ │ ├─ 593 /usr/libexec//gvfsd-fuse -f /run/user/1000/gvfs
+│ │ ├─ 598 /usr/libexec/gnome-settings-daemon
+│ │ ├─ 617 /usr/bin/gnome-keyring-daemon --start --components=gpg
+│ │ ├─ 630 /usr/bin/pulseaudio --start
+│ │ ├─ 726 /usr/bin/gnome-shell
+│ │ ├─ 728 syndaemon -i 1.0 -t -K -R
+│ │ ├─ 736 /usr/libexec/gsd-printer
+│ │ ├─ 742 /usr/libexec/dconf-service
+│ │ ├─ 798 /usr/libexec/mission-control-5
+│ │ ├─ 802 /usr/libexec/goa-daemon
+│ │ ├─ 823 /usr/libexec/gvfsd-metadata
+│ │ ├─ 866 /usr/libexec/gvfs-udisks2-volume-monitor
+│ │ ├─ 880 /usr/libexec/gvfs-gphoto2-volume-monitor
+│ │ ├─ 886 /usr/libexec/gvfs-afc-volume-monitor
+│ │ ├─ 891 /usr/libexec/gvfs-mtp-volume-monitor
+│ │ ├─ 895 /usr/libexec/gvfs-goa-volume-monitor
+│ │ ├─ 999 /usr/libexec/telepathy-logger
+│ │ ├─ 1076 /usr/libexec/gnome-terminal-server
+│ │ ├─ 1079 gnome-pty-helper
+│ │ ├─ 1080 bash
+│ │ ├─ 1134 ssh-agent
+│ │ ├─ 1137 gedit l
+│ │ ├─ 1160 gpg-agent --daemon --write-env-file
+│ │ ├─ 1371 /usr/lib64/firefox/firefox
+│ │ ├─ 1729 systemd-cgls
+│ │ ├─ 1929 bash
+│ │ ├─ 2057 emacs src/login/org.freedesktop.login1.policy.in
+│ │ ├─ 2060 /usr/libexec/gconfd-2
+│ │ ├─29634 /usr/libexec/gvfsd-http --spawner :1.5 /org/gtk/gvfs/exec_spaw/0
+│ │ └─31416 bash
+│ └─user@1000.service
+│ ├─532 /usr/lib/systemd/systemd --user
+│ └─541 (sd-pam)
+└─system.slice
+ ├─1 /usr/lib/systemd/systemd --system --deserialize 22
+ ├─sshd.service
+ │ └─29701 /usr/sbin/sshd -D
+ ├─udisks2.service
+ │ └─743 /usr/lib/udisks2/udisksd --no-debug
+ ├─colord.service
+ │ └─727 /usr/libexec/colord
+ ├─upower.service
+ │ └─633 /usr/libexec/upowerd
+ ├─wpa_supplicant.service
+ │ └─488 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
+ ├─bluetooth.service
+ │ └─463 /usr/sbin/bluetoothd -n
+ ├─polkit.service
+ │ └─443 /usr/lib/polkit-1/polkitd --no-debug
+ ├─alsa-state.service
+ │ └─408 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
+ ├─systemd-udevd.service
+ │ └─253 /usr/lib/systemd/systemd-udevd
+ ├─systemd-journald.service
+ │ └─240 /usr/lib/systemd/systemd-journald
+ ├─rtkit-daemon.service
+ │ └─419 /usr/libexec/rtkit-daemon
+ ├─rpcbind.service
+ │ └─475 /sbin/rpcbind -w
+ ├─cups.service
+ │ └─731 /usr/sbin/cupsd -f
+ ├─avahi-daemon.service
+ │ ├─417 avahi-daemon: running [delta.local]
+ │ └─424 avahi-daemon: chroot helper
+ ├─dbus.service
+ │ ├─418 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
+ │ └─462 /usr/sbin/modem-manager
+ ├─accounts-daemon.service
+ │ └─416 /usr/libexec/accounts-daemon
+ ├─systemd-ask-password-wall.service
+ │ └─434 /usr/bin/systemd-tty-ask-password-agent --wall
+ ├─systemd-logind.service
+ │ └─415 /usr/lib/systemd/systemd-logind
+ ├─ntpd.service
+ │ └─429 /usr/sbin/ntpd -u ntp:ntp -g
+ ├─rngd.service
+ │ └─412 /sbin/rngd -f
+ ├─libvirtd.service
+ │ └─467 /usr/sbin/libvirtd
+ ├─irqbalance.service
+ │ └─411 /usr/sbin/irqbalance --foreground
+ ├─crond.service
+ │ └─421 /usr/sbin/crond -n
+ ├─NetworkManager.service
+ │ ├─ 410 /usr/sbin/NetworkManager --no-daemon
+ │ ├─1066 /sbin/dhclient -d -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-enp0s20u2.pid -lf /var/lib/NetworkManager/dhclient-35c8218b-9e45-4b1f-b79e-22334f687340-enp0s20u2.lease -cf /var/lib/NetworkManager/dhclient-enp0s20u2.conf enp0s20u2
+ │ └─1070 /sbin/dhclient -d -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-enp0s26u1u4i2.pid -lf /var/lib/NetworkManager/dhclient-f404f1ca-ccfe-4957-aead-dec19c126dea-enp0s26u1u4i2.lease -cf /var/lib/NetworkManager/dhclient-enp0s26u1u4i2.conf enp0s26u1u4i2
+ └─gdm.service
+ ├─420 /usr/sbin/gdm
+ ├─449 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Displays/_0
+ └─476 /usr/bin/Xorg :0 -background none -verbose -auth /run/gdm/auth-for-gdm-pJjwsi/database -seat seat0 -nolisten tcp vt1
+```
+
+As you can see, services and scopes contain process and are placed in slices, and slices do not contain processes of their own. Also note that the special "-.slice" is not shown as it is implicitly identified with the root of the entire tree.
+
+Resource limits may be set on services, scopes and slices the same way. All active service, scope and slice units may easily be viewed with the "systemctl" command. The hierarchy of services and scopes in the slice tree may be viewed with the "systemd-cgls" command.
+
+Service and slice units may be configured via unit files on disk, or alternatively be created dynamically at runtime via API calls to PID 1. Scope units may only be created at runtime via API calls to PID 1, but not from unit files on disk. Units that are created dynamically at runtime via API calls are called _transient_ units. Transient units exist only during runtime and are released automatically as soon as they finished/got deactivated or the system is rebooted.
+
+If a service/slice is configured via unit files on disk the resource controls may be configured with the settings documented in [systemd.resource-control(5)](http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html). While the unit are started they may be reconfigured for services/slices/scopes (with changes applying instantly) with the a command line such as:
+
+```
+# systemctl set-property httpd.service CPUShares=500 MemoryLimit=500M
+```
+
+This will make these changes persistently, so that after the next reboot they are automatically applied right when the services are first started. By passing the `--runtime` switch the changes can alternatively be made in a volatile way so that they are lost on the next reboot.
+
+Note that the number of cgroup attributes currently exposed as unit properties is limited. This will be extended later on, as their kernel interfaces are cleaned up. For example cpuset or freezer are currently not exposed at all due to the broken inheritance semantics of the kernel logic. Also, migrating units to a different slice at runtime is not supported (i.e. altering the Slice= property for running units) as the kernel currently lacks atomic cgroup subtree moves.
+
+(Note that the resource control settings are actually also available on mount, swap and socket units. This is because they may also involve processes run for them. However, normally it should not be necessary to alter resource control settings on these unit types.)
+
+## The APIs
+
+Most relevant APIs are exposed via D-Bus, however some _passive_ interfaces are available as shared library, bypassing IPC so that they are much cheaper to call.
+
+### Creating and Starting
+
+To create and start a transient (scope, service or slice) unit in the cgroup tree use the `StartTransientUnit()` method on the `Manager` object exposed by systemd's PID 1 on the bus, see the [Bus API Documentation](http://www.freedesktop.org/wiki/Software/systemd/dbus/) for details. This call takes four arguments. The first argument is the full unit name you want this unit to be known under. This unit name is the handle to the unit, and is shown in the "systemctl" output and elsewhere. This name must be unique during runtime of the unit. You should generate a descriptive name for this that is useful for the administrator to make sense of it. The second parameter is the mode, and should usually be `replace` or `fail`. The third parameter contains an array of initial properties to set for the unit. It is an array of pairs of property names as string and values as variant. Note that this is an array and not a dictionary! This is that way in order to match the properties array of the `SetProperties()` call (see below). The fourth parameter is currently not used and should be passed as empty array. This call will first create the transient unit and then immediately queue a start job for it. This call returns an object path to a `Job` object for the start job of this unit.
+
+### Properties
+
+The properties array of `StartTransientUnit()` may take many of the settings that may also be configured in unit files. Not all parameters are currently accepted though, but we plan to cover more properties with future release. Currently you may set the `Description`, `Slice` and all dependency types of units, as well as `RemainAfterExit`, `ExecStart` for service units, `TimeoutStopUSec` and `PIDs` for scope units, and `CPUAccounting`, `CPUShares`, `BlockIOAccounting`, `BlockIOWeight`, `BlockIOReadBandwidth`, `BlockIOWriteBandwidth`, `BlockIODeviceWeight`, `MemoryAccounting`, `MemoryLimit`, `DevicePolicy`, `DeviceAllow` for services/scopes/slices. These fields map directly to their counterparts in unit files and as normal D-Bus object properties. The exception here is the `PIDs` field of scope units which is used for construction of the scope only and specifies the initial PIDs to add to the scope object.
+
+To alter resource control properties at runtime use the `SetUnitProperty()` call on the `Manager` object or `SetProperty()` on the individual Unit objects. This also takes an array of properties to set, in the same format as `StartTransientUnit()` takes. Note again that this is not a dictionary, and allows properties to be set multiple times with a single invocation. THis is useful for array properties: if a property is assigned the empty array it will be reset to the empty array itself, however if it is assigned a non-empty array then this array is appended to the previous array. This mimics behaviour of array settings in unit files. Note that most settings may only be set during creation of units with `StartTransientUnit()`, and may not be altered later on. The exception here are the resource control settings, more specifically `CPUAccounting`, `CPUShares`, `BlockIOAccounting`, `BlockIOWeight`, `BlockIOReadBandwidth`, `BlockIOWriteBandwidth`, `BlockIODeviceWeight`, `MemoryAccounting`, `MemoryLimit`, `DevicePolicy`, `DeviceAllow` for services/scopes/slices. Note that the standard D-Bus `org.freedesktop.DBus.Properties.Set()` call is currently not supported by any of the unit objects to set these properties, but might eventually (note however, that it is substantially less useful as it only allows setting a single property at a time, resulting in races).
+
+The [`systemctl set-property`](http://www.freedesktop.org/software/systemd/man/systemctl.html) command internally is little more than a wrapper around `SetUnitProperty()`. The [`systemd-run`](http://www.freedesktop.org/software/systemd/man/systemd-run.html) tool is a wrapper around `StartTransientUnit()`. It may be used to either run a process as a transient service in the background, where it is invoked from PID 1, or alternatively as a scope unit in the foreground, where it is run from the `systemd-run` process itself.
+
+### Enumeration
+
+To acquire a list of currently running units, use the `ListUnits()` call on the Manager bus object. To determine the scope/service unit and slice unit a process is running in use [`sd_pid_get_unit()`](http://www.freedesktop.org/software/systemd/man/sd_pid_get_unit.html) and `sd_pid_get_slice()`. These two calls are implemented in `libsystemd-login.so`. These call bypass the system bus (which they can because they are passive and do not require privileges) and are hence very efficient to invoke.
+
+### VM and Container Managers
+
+Use these APIs to register any kind of process workload with systemd to be placed in a resource controlled cgroup. Note however that for containers and virtual machines it is better to use the [`machined`](http://www.freedesktop.org/wiki/Software/systemd/machined/) interfaces since they provide integration with "ps" and similar tools beyond what mere cgroup registration provides. Also see [Writing VM and Container Managers](http://www.freedesktop.org/wiki/Software/systemd/writing-vm-managers/) for details.
+
+### Reading Accounting Information
+
+Note that there's currently no systemd API to retrieve accounting information from cgroups. For now, if you need to retrieve this information use `/proc/&#036;PID/cgroup` to determine the cgroup path for your process in the `cpuacct` controller (or whichever controller matters to you), and then read the attributes directly from the cgroup tree.
+
+If you want to collect the exit status and other runtime parameters of your transient scope or service unit after the processes in them ended set the `RemainAfterExited` boolean property when creating it. This will has the effect that the unit will stay around even after all processes in it died, in the `SubState="exited"` state. Simply watch for state changes until this state is reached, then read the status details from the various properties you need, and finally terminate the unit via `StopUnit()` on the `Manager` object or `Stop()` on the `Unit` object itself.
+
+### Becoming a Controller
+
+Optionally, it is possible for a program that registers a scope unit (the "scope manager") for one or more of its child processes to hook into the shutdown logic of the scope unit. Normally, if this is not done, and the scope needs to be shut down (regardless if during normal operation when the user invokes `systemctl stop` -- or something equivalent -- on the scope unit, or during system shutdown), then systemd will simply send SIGTERM to its processes. After a timeout this will be followed by SIGKILL unless the scope processes exited by then. If a scope manager program wants to be involved in the shutdown logic of its scopes it may set the `Controller` property of the scope unit when creating it via `StartTransientUnit()`. It should be set to the bus name (either unique name or well-known name) of the scope manager program. If this is done then instead of SIGTERM to the scope processes systemd will send the RequestStop() bus signal to the specified name. If the name is gone by then it will automatically fallback to SIGTERM, in order to make this robust. As before in either case this will be followed by SIGKILL to the scope unit processes after a timeout.
+
+Scope units implement a special `Abandon()` method call. This method call is useful for informing the system manager that the scope unit is no longer managed by any scope manager process. Among other things it is useful for manager daemons which terminate but want to leave the scopes they started running. When a scope is abandoned its state will be set to "abandoned" which is shown in the usual systemctl output, as information to the user. Also, if a controller has been set for the scope, it will be unset. Note that there is not strictly need to ever invoke the `Abandon()` method call, however it is recommended for cases like the ones explained above.
+
+### Delegation
+
+Service and scope units know a special `Delegate` boolean property. If set, then the processes inside the scope or service may control their own control group subtree (that means: create subcgroups directly via /sys/fs/cgroup). The effect of the property is that:
+
+1. All controllers systemd knows are enabled for that scope/service, if the scope/service runs privileged code.
+2. Access to the cgroup directory of the scope/service is permitted, and files/and directories are updated to get write access for the user specified in `User=` if the scope/unit runs unprivileged. Note that in this case access to any controllers is not available.
+3. systemd will refrain from moving processes across the "delegation" boundary.
+
+Generally, the `Delegate` property is only useful for services that need to manage their own cgroup subtrees, such as container managers. After creating a unit with this property set, they should use `/proc/&#036;PID/cgroup` to figure out the cgroup subtree path they may manage (the one from the name=systemd hierarchy!). Managers should refrain from making any changes to the cgroup tree outside of the subtrees for units they created with the `Delegate` flag turned on.
+
+Note that scope units created by `machined`'s `CreateMachine()` call have this flag set.
+
+### Example
+
+Please see the [systemd-run sources](http://cgit.freedesktop.org/systemd/systemd/plain/src/run/run.c) for a relatively simple example how to create scope or service units transiently and pass properties to them.
diff --git a/docs/CONVERTING_TO_HOMED.md b/docs/CONVERTING_TO_HOMED.md
index 06fc66f195..5416a22276 100644
--- a/docs/CONVERTING_TO_HOMED.md
+++ b/docs/CONVERTING_TO_HOMED.md
@@ -16,10 +16,10 @@ it might be desirable to convert an existing, traditional user account to a
Before continuing, please read up on these basic concepts:
-* [Home Directories](HOME_DIRECTORY.md)
-* [JSON User Records](USER_RECORD.md)
-* [JSON Group Records](GROUP_RECORD.md)
-* [User/Group Record Lookup API via Varlink](USER_GROUP_API.md)
+* [Home Directories](HOME_DIRECTORY)
+* [JSON User Records](USER_RECORD)
+* [JSON Group Records](GROUP_RECORD)
+* [User/Group Record Lookup API via Varlink](USER_GROUP_API)
## Caveat
diff --git a/docs/CREDENTIALS.md b/docs/CREDENTIALS.md
index 153a42be54..ed30eacf2b 100644
--- a/docs/CREDENTIALS.md
+++ b/docs/CREDENTIALS.md
@@ -59,7 +59,7 @@ purpose. Specifically, the following features are provided:
8. Credentials are an effective way to pass parameters into services that run
with `RootImage=` or `RootDirectory=` and thus cannot read these resources
directly from the host directory tree.
- Specifically, [Portable Services](PORTABLE_SERVICES.md) may be
+ Specifically, [Portable Services](PORTABLE_SERVICES) may be
parameterized this way securely and robustly.
9. Credentials can be binary and relatively large (though currently an overall
@@ -288,7 +288,7 @@ services where they are ultimately consumed.
invokes. [`systemd-nspawn(1)`](https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html#Credentials)'s
`--set-credential=` and `--load-credential=` switches implement this, in
order to pass arbitrary credentials from host to container payload. Also see
- the [Container Interface](CONTAINER_INTERFACE.md) documentation.
+ the [Container Interface](CONTAINER_INTERFACE) documentation.
2. Quite similar, VMs can be passed credentials via SMBIOS OEM strings (example
qemu command line switch `-smbios
diff --git a/docs/DAEMON_SOCKET_ACTIVATION.md b/docs/DAEMON_SOCKET_ACTIVATION.md
new file mode 100644
index 0000000000..1a027a37c8
--- /dev/null
+++ b/docs/DAEMON_SOCKET_ACTIVATION.md
@@ -0,0 +1,122 @@
+---
+title: Socket Activation with Popular Daemons
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+## nginx
+
+nginx includes an undocumented, internal socket-passing mechanism based on the `NGINX` environmental variable. It uses this to perform reloads without having to close and reopen its sockets, but it's also useful for socket activation.
+
+**/etc/nginx/my-nginx.conf**
+
+```
+http {
+ server {
+ listen [::]:80 ipv6only=on;
+ listen 80;
+ }
+}
+```
+
+**/etc/systemd/system/my-nginx.service**
+
+```
+[Service]
+User=nginx
+Group=nginx
+Environment=NGINX=3:4;
+ExecStart=/usr/sbin/nginx -c/etc/nginx/my-nginx.conf
+PrivateNetwork=true
+```
+
+
+**/etc/systemd/system/my-nginx.socket**
+
+```
+[Socket]
+ListenStream=80
+ListenStream=0.0.0.0:80
+BindIPv6Only=ipv6-only
+After=network.target
+Requires=network.target
+
+[Install]
+WantedBy=sockets.target
+```
+
+
+## PHP-FPM
+
+Like nginx, PHP-FPM includes a socket-passing mechanism an environmental variable. In PHP-FPM's case, it's `FPM_SOCKETS`.
+
+This configuration is possible with any web server that supports FastCGI (like Apache, Lighttpd, or nginx). The web server does not need to know anything special about the socket; use a normal PHP-FPM configuration.
+
+Paths are based on a Fedora 19 system.
+
+### First, the configuration files
+
+**/etc/php-fpm.d/my-php-fpm-pool.conf**
+
+```
+[global]
+pid = /run/my-php-fpm-pool.pid ; Not really used by anything with daemonize = no, but needs to be writable.
+error_log = syslog ; Will aggregate to the service's systemd journal.
+daemonize = no ; systemd handles the forking.
+
+[www]
+listen = /var/run/my-php-fpm-pool.socket ; Must match systemd socket unit.
+user = nginx ; Ignored but required.
+group = nginx ; Ignored but required.
+pm = static
+pm.max_children = 10
+slowlog = syslog
+```
+
+
+**/etc/systemd/system/my-php-fpm-pool.service**
+
+```
+[Service]
+User=nginx
+Group=nginx
+Environment="FPM_SOCKETS=/var/run/my-php-fpm-pool.socket=3"
+ExecStart=/usr/sbin/php-fpm --fpm-config=/etc/php-fpm.d/my-php-fpm-pool.conf
+KillMode=process
+```
+
+
+**/etc/systemd/system/my-php-fpm-pool.socket**
+
+```
+[Socket]
+ListenStream=/var/run/my-php-fpm-pool.socket
+
+[Install]
+WantedBy=sockets.target
+```
+
+
+### Second, the setup commands
+
+```sh
+sudo systemctl --system daemon-reload
+sudo systemctl start my-php-fpm-pool.socket
+sudo systemctl enable my-php-fpm-pool.socket
+```
+
+
+After accessing the web server, the service should be running.
+
+```sh
+sudo systemctl status my-php-fpm-pool.service
+```
+
+
+It's possible to shut down the service and re-activate it using the web browser, too. It's necessary to stop and start the socket to reset some shutdown PHP-FPM does that otherwise breaks reactivation.
+
+```sh
+sudo systemctl stop my-php-fpm-pool.socket my-php-fpm-pool.service
+sudo systemctl start my-php-fpm-pool.socket
+```
diff --git a/docs/DEBUGGING.md b/docs/DEBUGGING.md
new file mode 100644
index 0000000000..dc1c8743b4
--- /dev/null
+++ b/docs/DEBUGGING.md
@@ -0,0 +1,211 @@
+---
+title: Diagnosing Boot Problems
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Diagnosing Boot Problems
+
+If your machine gets stuck during boot, first check if the hang happens before or after control passes to systemd.
+
+Try to boot without `rhgb` and `quiet` on the kernel command line. If you see some messages like these:
+
+* Welcome to Fedora _VERSION_ (_codename_)!"
+* Starting _name_...
+* \[ OK \] Started _name_.
+
+then systemd is running. (See an actual [screenshot](f17boot.png).)
+
+Debugging always gets easier if you can get a shell. If you do not get a login prompt, try switching to a different virtual terminal using CTRL+ALT+F\_\_. Problems with a display server startup may manifest themselves as a missing login on tty1, but other VTs working.
+
+If the boot stops without presenting you with a login on any virtual console, let it retry for _up to 5 minutes_ before declaring it definitely stuck. There is a chance that a service that has trouble starting will be killed after this timeout and the boot will continue normally. Another possibility is that a device for an important mountpoint will fail to appear and you will be presented with _emergency mode_.
+
+## If You Get No Shell
+
+If you get neither a normal login nor the emergency mode shell, you will need to do additional steps to get debugging information out of the machine.
+
+* Try CTRL+ALT+DEL to reboot.
+ * If it does not reboot, mention it in your bugreport. Meanwhile force the reboot with [SysRq](http://fedoraproject.org/wiki/QA/Sysrq) or hard reset.
+* When booting the next time, you will have to add some kernel command line arguments depending on which of the debugging strategies you choose from the following options.
+
+### Debug Logging to a Serial Console
+
+If you have a hardware serial console available or if you are debugging in a virtual machine (e.g. using virt-manager you can switch your view to a serial console in the menu View -> Text Consoles or connect from the terminal using `virsh console MACHINE`), you can ask systemd to log lots of useful debugging information to it by booting with:
+
+```sh
+systemd.log_level=debug systemd.log_target=console console=ttyS0,38400 console=tty1
+```
+
+
+The above is useful if pid 1 is failing, but if a later but critical boot service is broken (such as networking), you can configure journald to forward to the console by using:
+
+```sh
+systemd.journald.forward_to_console=1 console=ttyS0,38400 console=tty1
+```
+
+console= can be specified multiple times, systemd will output to all of them.
+
+### Booting into Rescue or Emergency Targets
+
+To boot directly into rescue target add `systemd.unit=rescue.target` or just `1` to the kernel command line. This target is useful if the problem occurs somewhere after the basic system is brought up, during the starting of "normal" services. If this is the case, you should be able to disable the bad service from here. If the rescue target will not boot either, the more minimal emergency target might.
+
+To boot directly into emergency shell add `systemd.unit=emergency.target` or `emergency` to the kernel command line. Note that in the emergency shell you will have to remount the root filesystem read-write by yourself before editing any files:
+
+```sh
+mount -o remount,rw /
+```
+
+Common issues that can be resolved in the emergency shell are bad lines in **/etc/fstab**. After fixing **/etc/fstab**, run `systemctl daemon-reload` to let systemd refresh its view of it.
+
+If not even the emergency target works, you can boot directly into a shell with `init=/bin/sh`. This may be necessary in case systemd itself or some libraries it depends on are damaged by filesystem corruption. You may need to reinstall working versions of the affected packages.
+
+If `init=/bin/sh` does not work, you must boot from another medium.
+
+### Early Debug Shell
+
+You can enable shell access to be available very early in the startup process to fall back on and diagnose systemd related boot up issues with various systemctl commands. Enable it using:
+
+```sh
+systemctl enable debug-shell.service
+```
+
+or by specifying
+
+```sh
+systemd.debug-shell=1
+```
+
+on the kernel command line.
+
+**Tip**: If you find yourself in a situation where you cannot use systemctl to communicate with a running systemd (e.g. when setting this up from a different booted system), you can avoid communication with the manager by specifying `--root=`:
+
+```sh
+systemctl --root=/ enable debug-shell.service
+```
+
+Once enabled, the next time you boot you will be able to switch to tty9 using CTRL+ALT+F9 and have a root shell there available from an early point in the booting process. You can use the shell for checking the status of services, reading logs, looking for stuck jobs with `systemctl list-jobs`, etc.
+
+**Warning:** Use this shell only for debugging! Do not forget to disable systemd-debug-shell.service after you've finished debugging your boot problems. Leaving the root shell always available would be a security risk.
+
+It is also possible to alias `kbrequest.target` to `debug-shell.service` to start the debug shell on demand. This has the same security implications, but avoids running the shell always.
+
+### verify prerequisites
+
+A (at least partly) populated `/dev` is required. Depending on your setup (e.g. on embedded systems), check that the Linux kernel config options `CONFIG_DEVTMPFS` and `CONFIG_DEVTMPFS_MOUNT` are set. Also support for cgroups and fanotify is recommended for a flawless operation, so check that the Linux kernel config options `CONFIG_CGROUPS` and `CONFIG_FANOTIFY` are set. The message "Failed to get D-Bus connection: No connection to service manager." during various `systemctl` operations is an indicator that these are missing.
+
+## If You Can Get a Shell
+
+When you have systemd running to the extent that it can provide you with a shell, please use it to extract useful information for debugging. Boot with these parameters on the kernel command line:
+
+```sh
+systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on
+```
+
+in order to increase the verbosity of systemd, to let systemd write its logs to the kernel log buffer, to increase the size of the kernel log buffer, and to prevent the kernel from discarding messages. After reaching the shell, look at the log:
+
+```sh
+journalctl -b
+```
+
+When reporting a bug, pipe that to a file and attach it to the bug report.
+
+To check for possibly stuck jobs use:
+
+```sh
+systemctl list-jobs
+```
+
+The jobs that are listed as "running" are the ones that must complete before the "waiting" ones will be allowed to start executing.
+
+
+# Diagnosing Shutdown Problems
+
+Just like with boot problems, when you encounter a hang during shutting down, make sure you wait _at least 5 minutes_ to distinguish a permanent hang from a broken service that's just timing out. Then it's worth testing whether the system reacts to CTRL+ALT+DEL in any way.
+
+If shutdown (whether it be to reboot or power-off) of your system gets stuck, first test if the kernel itself is able to reboot or power-off the machine forcedly using one of these commands:
+
+```sh
+reboot -f
+poweroff -f
+```
+
+If either one of the commands does not work, it's more likely to be a kernel, not systemd bug.
+
+## Shutdown Completes Eventually
+
+If normal reboot or poweroff work, but take a suspiciously long time, then
+
+* boot with the debug options:
+
+```sh
+systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on enforcing=0
+```
+
+* save the following script as **/usr/lib/systemd/system-shutdown/debug.sh** and make it executable:
+
+```sh
+#!/bin/sh
+mount -o remount,rw /
+dmesg > /shutdown-log.txt
+mount -o remount,ro /
+```
+
+* reboot
+
+
+Look for timeouts logged in the resulting file **shutdown-log.txt** and/or attach it to a bugreport.
+
+## Shutdown Never Finishes
+
+If normal reboot or poweroff never finish even after waiting a few minutes, the above method to create the shutdown log will not help and the log must be obtained using other methods. Two options that are useful for debugging boot problems can be used also for shutdown problems:
+
+* use a serial console
+* use a debug shell - not only is it available from early boot, it also stays active until late shutdown.
+
+
+# Status and Logs of Services
+
+When the start of a service fails, systemctl will give you a generic error message:
+
+```sh
+# systemctl start foo.service
+Job failed. See system journal and 'systemctl status' for details.
+```
+
+The service may have printed its own error message, but you do not see it, because services run by systemd are not related to your login session and their outputs are not connected to your terminal. That does not mean the output is lost though. By default the stdout, stderr of services are directed to the systemd _journal_ and the logs that services produce via `syslog(3)` go there too. systemd also stores the exit code of failed services. Let's check:
+
+```sh
+# systemctl status foo.service
+foo.service - mmm service
+ Loaded: loaded (/etc/systemd/system/foo.service; static)
+ Active: failed (Result: exit-code) since Fri, 11 May 2012 20:26:23 +0200; 4s ago
+ Process: 1329 ExecStart=/usr/local/bin/foo (code=exited, status=1/FAILURE)
+ CGroup: name=systemd:/system/foo.service
+
+May 11 20:26:23 scratch foo[1329]: Failed to parse config
+```
+
+
+In this example the service ran as a process with PID 1329 and exited with error code 1. If you run systemctl status as root or as a user from the `adm` group, you will get a few lines from the journal that the service wrote. In the example the service produced just one error message.
+
+To list the journal, use the `journalctl` command.
+
+If you have a syslog service (such as rsyslog) running, the journal will also forward the messages to it, so you'll find them in **/var/log/messages** (depending on rsyslog's configuration).
+
+
+# Reporting systemd Bugs
+
+Be prepared to include some information (logs) about your system as well. These should be complete (no snippets please), not in an archive, uncompressed.
+
+Please report bugs to your distribution's bug tracker first. If you are sure that you are encountering an upstream bug, then first check [for existing bug reports](https://github.com/systemd/systemd/issues/), and if your issue is not listed [file a new bug](https://github.com/systemd/systemd/issues/new).
+
+## Information to Attach to a Bug Report
+
+Whenever possible, the following should be mentioned and attached to your bug report:
+
+* The exact kernel command-line used. Typically from the bootloader configuration file (e.g. **/boot/grub2/grub.cfg**) or from **/proc/cmdline**
+* The journal (the output of `journalctl -b > journal.txt`)
+ * ideally after booting with `systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on`
+* The output of a systemd dump: `systemd-analyze dump > systemd-dump.txt`
+* The output of `/usr/lib/systemd/systemd --test --system --log-level=debug > systemd-test.txt 2>&1`
diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md
index 6fa82d7177..cd6d66a81f 100644
--- a/docs/ENVIRONMENT.md
+++ b/docs/ENVIRONMENT.md
@@ -129,14 +129,6 @@ All tools:
* `$SYSTEMD_VERITY_SHARING=0` — if set, sharing dm-verity devices by
using a stable `<ROOTHASH>-verity` device mapper name will be disabled.
-* `$SYSTEMD_OPENSSL_KEY_LOADER`— when using OpenSSL to load a key via an engine
- or a provider, can be used to force the usage of one or the other interface.
- Set to 'engine' to force the usage of the old engine API, and to 'provider'
- force the usage of the new provider API. If unset, the provider will be tried
- first and the engine as a fallback if that fails. Providers are the new OpenSSL
- 3 API, but there are very few if any in a production-ready state, so engines
- are still needed.
-
`systemctl`:
* `$SYSTEMCTL_FORCE_BUS=1` — if set, do not connect to PID 1's private D-Bus
@@ -252,7 +244,7 @@ All tools:
when determining stable network interface names. This may be used to revert
to naming schemes of older udev versions, in order to provide more stable
naming across updates. This environment variable takes precedence over the
- kernel command line option `net.naming-scheme=`, except if the value is
+ kernel command line option `net.naming_scheme=`, except if the value is
prefixed with `:` in which case the kernel command line option takes
precedence, if it is specified as well.
@@ -365,7 +357,8 @@ All tools:
`systemd-resolved`:
* `$SYSTEMD_RESOLVED_SYNTHESIZE_HOSTNAME` — if set to "0", `systemd-resolved`
- won't synthesize system hostname on both regular and reverse lookups.
+ won't synthesize A/AAAA/PTR RRs for the system hostname on either regular nor
+ reverse lookups.
`systemd-sysext`:
@@ -488,6 +481,12 @@ disk images with `--image=` or similar:
devices when opening them. Defaults to on, set this to "0" to disable this
feature.
+* `$SYSTEMD_ALLOW_USERSPACE_VERITY` — takes a boolean, which controls whether
+ to consider the userspace Verity public key store in `/etc/verity.d/` (and
+ related directories) to authenticate signatures on Verity hashes of disk
+ images. Defaults to true, i.e. userspace signature validation is allowed. If
+ false, authentication can be done only via the kernel's internal keyring.
+
`systemd-cryptsetup`:
* `$SYSTEMD_CRYPTSETUP_USE_TOKEN_MODULE` – takes a boolean, which controls
@@ -559,6 +558,14 @@ SYSTEMD_HOME_DEBUG_SUFFIX=foo \
`mkfs` when formatting LUKS home directories. There's one variable for each
of the supported file systems for the LUKS home directory backend.
+* `$SYSTEMD_HOME_LOCK_FREEZE_SESSION` - Takes a boolean. When false, the user's
+ session will not be frozen when the home directory is locked. Note that the kernel
+ may still freeze any task that tries to access data from the user's locked home
+ directory. This can lead to data loss, security leaks, or other undesired behavior
+ caused by parts of the session becoming unresponsive due to disk I/O while other
+ parts of the session continue running. Thus, we highly recommend that this variable
+ isn't used unless necessary. Defaults to true.
+
`kernel-install`:
* `$KERNEL_INSTALL_BYPASS` – If set to "1", execution of kernel-install is skipped
@@ -622,6 +629,24 @@ SYSTEMD_HOME_DEBUG_SUFFIX=foo \
to expose a single device only, since those identifiers better should be kept
unique.
+`systemd-pcrlock`, `systemd-pcrextend`:
+
+* `$SYSTEMD_MEASURE_LOG_USERSPACE` – the path to the `tpm2-measure.log` file
+ (containing userspace measurement data) to read. This allows overriding the
+ default of `/run/log/systemd/tpm2-measure.log`.
+
+* `$SYSTEMD_MEASURE_LOG_FIRMWARE` – the path to the `binary_bios_measurements`
+ file (containing firmware measurement data) to read. This allows overriding
+ the default of `/sys/kernel/security/tpm0/binary_bios_measurements`.
+
+`systemd-sleep`:
+
+* `$SYSTEMD_SLEEP_FREEZE_USER_SESSIONS` - Takes a boolean. When true (the default),
+ `user.slice` will be frozen during sleep. When false it will not be. We recommend
+ against using this variable, because it can lead to undesired behavior, especially
+ for systems that use home directory encryption and for
+ `systemd-suspend-then-hibernate.service`.
+
Tools using the Varlink protocol (such as `varlinkctl`) or sd-bus (such as
`busctl`):
diff --git a/docs/FAQ.md b/docs/FAQ.md
new file mode 100644
index 0000000000..483645b1e7
--- /dev/null
+++ b/docs/FAQ.md
@@ -0,0 +1,114 @@
+---
+title: Frequently Asked Questions
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Frequently Asked Questions
+
+Also check out the [Tips & Tricks](../TIPS_AND_TRICKS)!
+
+**Q: How do I change the current runlevel?**
+
+A: In systemd runlevels are exposed via "target units". You can change them like this:
+
+```sh
+# systemctl isolate runlevel5.target
+```
+
+Note however, that the concept of runlevels is a bit out of date, and it is usually nicer to use modern names for this. e.g.:
+
+```sh
+# systemctl isolate graphical.target
+```
+
+This will only change the current runlevel, and has no effect on the next boot.
+
+**Q: How do I change the default runlevel to boot into?**
+
+A: The symlink /etc/systemd/system/default.target controls where we boot into by default. Link it to the target unit of your choice. For example, like this:
+
+```sh
+# ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
+```
+
+or
+
+```sh
+# ln -sf /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
+```
+
+**Q: How do I figure out the current runlevel?**
+
+A: Note that there might be more than one target active at the same time. So the question regarding _the_ runlevel might not always make sense. Here's how you would figure out all targets that are currently active:
+
+```sh
+$ systemctl list-units --type=target
+```
+
+If you are just interested in a single number, you can use the venerable _runlevel_ command, but again, its output might be misleading.
+
+**Q: I want to change a service file, but rpm keeps overwriting it in /usr/lib/systemd/system all the time, how should I handle this?**
+
+A: The recommended way is to copy the service file from /usr/lib/systemd/system to /etc/systemd/system and edit it there. The latter directory takes precedence over the former, and rpm will never overwrite it. If you want to use the distributed service file again you can simply delete (or rename) the service file in /etc/systemd/system again.
+
+**Q: My service foo.service as distributed by my operating system vendor is only started when (a connection comes in or some hardware is plugged in). I want to have it started always on boot, too. What should I do?**
+
+A: Simply place a symlink from that service file in the multi-user.target.wants/ directory (which is where you should symlink everything you want to run in the old runlevel 3, i.e. the normal boot-up without graphical UI. It is pulled in by graphical.target too, so will be started for graphical boot-ups, too):
+
+```sh
+# ln -sf /usr/lib/systemd/system/foobar.service /etc/systemd/system/multi-user.target.wants/foobar.service
+# systemctl daemon-reload
+```
+
+**Q: I want to enable another getty, how would I do that?**
+
+A: Simply instantiate a new getty service for the port of your choice (internally, this places another symlink for instantiating another serial getty in the getty.target.wants/ directory).
+```sh
+# systemctl enable serial-getty@ttyS2.service
+# systemctl start serial-getty@ttyS2.service
+```
+
+Note that gettys on the virtual console are started on demand. You can control how many you get via the NAutoVTs= setting in [logind.conf(7)](http://www.freedesktop.org/software/systemd/man/logind.html). Also see [this blog story](http://0pointer.de/blog/projects/serial-console.html).
+
+**Q: How to I figure out which service a process belongs to?**
+
+A: You may either use ps for that:
+
+```sh
+$ alias psc='ps xawf -eo pid,user,cgroup,args'
+$ psc
+...
+```
+
+Or you can even check /proc/$PID/cgroup directly. Also see [this blog story](http://0pointer.de/blog/projects/systemd-for-admins-2.html).
+
+**Q: Why don't you use inotify to reload the unit files automatically on change?**
+
+A: Unfortunately that would be a racy operation. For an explanation why and how we tried to improve the situation, see [the bugzilla report about this](https://bugzilla.redhat.com/show_bug.cgi?id=615527).
+
+**Q: I have a native systemd service file and a SysV init script installed which share the same basename, e.g. /usr/lib/systemd/system/foobar.service vs. /etc/init.d/foobar -- which one wins?**
+
+A: If both files are available the native unit file always takes precedence and the SysV init script is ignored, regardless whether either is enabled or disabled. Note that a SysV service that is enabled but overridden by a native service does not have the effect that the native service would be enabled, too. Enabling of native and SysV services is completely independent. Or in other words: you cannot enable a native service by enabling a SysV service by the same name, and if a SysV service is enabled but the respective native service is not, this will not have the effect that the SysV script is executed.
+
+**Q: How can I use journalctl to display full (= not truncated) messages even if less is not used?**
+
+A: Use:
+
+```sh
+# journalctl --full
+```
+
+
+**Q: Whenever my service tries to acquire RT scheduling for one of its threads this is refused with EPERM even though my service is running with full privileges. This works fine on my non-systemd system!**
+
+A: By default, systemd places all systemd daemons in their own cgroup in the "cpu" hierarchy. Unfortunately, due to a kernel limitation, this has the effect of disallowing RT entirely for the service. See [My Service Can't Get Realtime!](../MY_SERVICE_CANT_GET_REATLIME) for a longer discussion and what to do about this.
+
+**Q: My service is ordered after `network.target` but at boot it is still called before the network is up. What's going on?**
+
+A: That's a long story, and that's why we have a wiki page of its own about this: [Running Services After the Network is up](../NETWORK_ONLINE)
+
+**Q: My systemd system always comes up with `/tmp` as a tiny `tmpfs`. How do I get rid of this?**
+
+A: That's also a long story, please have a look on [API File Systems](../API_FILE_SYSTEMS)
diff --git a/docs/GROUP_RECORD.md b/docs/GROUP_RECORD.md
index c9d51cef9d..f463b0a2a7 100644
--- a/docs/GROUP_RECORD.md
+++ b/docs/GROUP_RECORD.md
@@ -8,7 +8,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
# JSON Group Records
Long story short: JSON Group Records are to `struct group` what
-[JSON User Records](USER_RECORD.md) are to `struct passwd`.
+[JSON User Records](USER_RECORD) are to `struct passwd`.
Conceptually, much of what applies to JSON user records also applies to JSON
group records. They also consist of seven sections, with similar properties and
diff --git a/docs/HACKING.md b/docs/HACKING.md
index bd792092f7..1fbbed91d1 100644
--- a/docs/HACKING.md
+++ b/docs/HACKING.md
@@ -11,8 +11,8 @@ We welcome all contributions to systemd. If you notice a bug or a missing
feature, please feel invited to fix it, and submit your work as a
[GitHub Pull Request (PR)](https://github.com/systemd/systemd/pull/new).
-Please make sure to follow our [Coding Style](CODING_STYLE.md) when submitting
-patches. Also have a look at our [Contribution Guidelines](CONTRIBUTING.md).
+Please make sure to follow our [Coding Style](CODING_STYLE) when submitting
+patches. Also have a look at our [Contribution Guidelines](CONTRIBUTING).
When adding new functionality, tests should be added. For shared functionality
(in `src/basic/` and `src/shared/`) unit tests should be sufficient. The general
@@ -23,7 +23,7 @@ test executable. For features at a higher level, tests in `src/test/` are very
strongly recommended. If that is not possible, integration tests in `test/` are
encouraged.
-Please also have a look at our list of [code quality tools](CODE_QUALITY.md) we
+Please also have a look at our list of [code quality tools](CODE_QUALITY) we
have setup for systemd, to ensure our codebase stays in good shape.
Please always test your work before submitting a PR. For many of the components
@@ -32,16 +32,16 @@ run the relevant tool from the build directory.
For some components (most importantly, systemd/PID 1 itself) this is not
possible, however. In order to simplify testing for cases like this we provide
-a set of `mkosi` build files directly in the source tree.
+a set of `mkosi` config files directly in the source tree.
[mkosi](https://github.com/systemd/mkosi) is a tool for building clean OS images
from an upstream distribution in combination with a fresh build of the project
-in the local working directory. To make use of this, please install `mkosi` v19
-or newer using your distribution's package manager or from the
-[GitHub repository](https://github.com/systemd/mkosi). `mkosi` will build an
-image for the host distro by default. First, run `mkosi genkey` to generate a key
-and certificate to be used for secure boot and verity signing. After that is done,
-it is sufficient to type `mkosi` in the systemd project directory to generate a disk
-image you can boot either in `systemd-nspawn` or in a UEFI-capable VM:
+in the local working directory. To make use of this, please install the latest
+version of mkosi from the [GitHub repository](https://github.com/systemd/mkosi).
+`mkosi` will build an image for the host distro by default. First, run
+`mkosi genkey` to generate a key and certificate to be used for secure boot and
+verity signing. After that is done, it is sufficient to type `mkosi` in the
+systemd project directory to generate a disk image you can boot either in
+`systemd-nspawn` or in a UEFI-capable VM:
```sh
$ sudo mkosi boot # nspawn still needs sudo for now
@@ -148,7 +148,7 @@ distribution and can be disabled by setting `-Dmode=release`.
## Sanitizers in mkosi
-See [Testing systemd using sanitizers](TESTING_WITH_SANITIZERS.md) for more information
+See [Testing systemd using sanitizers](TESTING_WITH_SANITIZERS) for more information
on how to build with sanitizers enabled in mkosi.
## Fuzzers
@@ -211,7 +211,7 @@ done
```
If you find a bug that impacts the security of systemd, please follow the
-guidance in [CONTRIBUTING.md](CONTRIBUTING.md) on how to report a security vulnerability.
+guidance in [CONTRIBUTING.md](CONTRIBUTING) on how to report a security vulnerability.
For more details on building fuzzers and integrating with OSS-Fuzz, visit:
diff --git a/docs/HOME_DIRECTORY.md b/docs/HOME_DIRECTORY.md
index f6e061bd2b..f1b7fafed9 100644
--- a/docs/HOME_DIRECTORY.md
+++ b/docs/HOME_DIRECTORY.md
@@ -19,7 +19,7 @@ mechanism used.
Inside of the home directory a file `~/.identity` contains the JSON formatted
user record of the user. It follows the format defined in
-[`JSON User Records`](USER_RECORD.md). It is recommended to bring the
+[`JSON User Records`](USER_RECORD). It is recommended to bring the
record into 'normalized' form (i.e. all objects should contain their fields
sorted alphabetically by their key) before storing it there, though this is not
required nor enforced. Since the user record is cryptographically signed, the
diff --git a/docs/INCOMPATIBILITIES.md b/docs/INCOMPATIBILITIES.md
new file mode 100644
index 0000000000..75b60b66ef
--- /dev/null
+++ b/docs/INCOMPATIBILITIES.md
@@ -0,0 +1,33 @@
+---
+title: Compatibility with SysV
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Compatibility with SysV
+
+systemd provides a fair degree of compatibility with the behavior exposed by the SysV init system as implemented by many distributions. Compatibility is provided both for the user experience and the SysV scripting APIs. However, there are some areas where compatibility is limited due to technical reasons or design decisions of systemd and the distributions. All of the following applies to SysV init scripts handled by systemd, however a number of them matter only on specific distributions. Many of the incompatibilities are specific to distribution-specific extensions of LSB/SysV init.
+
+* If your distribution removes SysV init scripts in favor of systemd unit files typing "/etc/init.d/foobar start" to start a service will not work, since the script will not be available. Use the more correct "/sbin/service foobar start" instead, and your command will be forwarded to systemd. Note that invoking the init script directly has always been suboptimal since too much of the caller's execution context (environment block, umask, resource limits, audit trails, ...) ended up being inherited by the service, and invocation via "/sbin/service" used to clean this up at least partially. Invocation via /sbin/service works on both SysV and systemd systems. Also, LSB only standardizes invocation via "/sbin/service" anyway. (Note that some distributions ship both systemd unit files and SysV scripts for the services. For these invoking the init scripts will work as expected and the request be forwarded to systemd in any case.)
+* LSB header dependency information matters. The SysV implementations on many distributions did not use the dependency information encoded in LSB init script headers, or used them only in very limited ways. Due to that they are often incorrect or incomplete. systemd however fully interprets these headers and follows them closely at runtime (and not at installation time like some implementations).
+* Timeouts apply to all init script operations in systemd. While on SysV systems a hanging init script could freeze the system on systemd all init script operations are subject to a timeout of 5min.
+* Services are executed in completely clean execution contexts, no context of the invoking user session is inherited. Not even $HOME or similar are set. Init scripts depending on these will not work correctly.
+* Services cannot read from stdin, as this will be connected to /dev/null. That means interactive init scripts are not supported (i.e. Debian's X-Interactive in the LSB header is not supported either.) Thankfully most distributions do not support interaction in init scripts anyway. If you need interaction to ask disk or SSL passphrases please consider using the minimal password querying framework systemd supports. ([details](PASSWORD_AGENTS), [manual page](http://0pointer.de/public/systemd-man/systemd-ask-password.html))
+* Additional verbs for init scripts are not supported. If your init script traditionally supported additional verbs for your init script simply move them to an auxiliary script.
+* Additional parameters to the standard verbs (i.e. to "start", "stop" and "status") are not supported. This was an extension of SysV that never was standardized officially, and is not supported in systemd.
+* Overriding the "restart" verb is not supported. This verb is always implemented by systemd itself, and consists of a "stop" followed by a "start".
+* systemd only stops running services. On traditional SysV a K link installed for shutdown was executed when going down regardless whether the service was started before or not. systemd is more strict here and does not stop service that weren't started in the first place.
+* Note that neither S nor K links for runlevels 0 and 6 have any effect. Running services will be terminated anyway when shutting down, and no new SysV services are started at shut down.
+* If systemd doesn't know which PID is the main PID of a service, it will not be able to track its runtime, and hence a service exiting on its own will not make systemd consider it stopped. Use the Red Hat "pidfile:" syntax in the SysV script header comment block to let systemd know which PID file (and hence PID) belongs to your service. Note that systemd cannot know if a SysV service is one of the kind where the runtime is defined by a specific process or whether it is one where there is none, hence the requirement of explicit configuration of a PID file in order to make systemd track the process lifetime. (Note that the Red Hat "pidfile:" stanza may only appear once in init scripts.)
+* Runlevels are supported in a limited fashion only. SysV runlevels are mapped to systemd target units, however not all systemd target units map back to SysV runlevels. This is due to the fact that systemd targets are a lot more flexible and expressive than SysV runlevels. That means that checks for the current runlevel (with /sbin/runlevel or so) may well return "N" (i.e. unknown runlevel) during normal operation. Scripts that rely on explicit runlevel checks are incompatible with many setups. Avoid runlevel checks like these.
+* Tools like /sbin/chkconfig might return misleading information when used to list enablement status of services. First of all, the tool will only see SysV services, not native units. Secondly, it will only show runlevel-related information (which does not fully map to systemd targets). Finally, the information shown might be overridden by a native unit file.
+* By default runlevels 2,3,4 are all aliases for "multi-user.target". If a service is enabled in one of these runlevels, they'll be enabled in all of these. This is only a default however, and users can easily override the mappings, and split them up into individual runlevels if they want. However, we recommend moving on from runlevels and using the much more expressive target units of systemd.
+* Early boot runlevels as they are used by some distributions are no longer supported. i.e. "fake", distribution-specific runlevels such as "S" or "b" cannot be used with systemd.
+* On SysV systems changes to init scripts or any other files that define the boot process (such as /etc/fstab) usually had an immediate effect on everything started later. This is different on systemd-based systems where init script information and other boot-time configuration files are only reread when "systemctl daemon-reload" is issued. (Note that some commands, notably "systemctl enable"/"systemctl disable" do this implicitly however.) This is by design, and a safety feature, since it ensures that half-completed changes are not read at the wrong time.
+* Multiple entries for the same mount path in /etc/fstab are not supported. In systemd there's only a single unit definition for each mount path read at any time. Also the listing order of mounts in /etc/fstab has no effect, mounts are executed in parallel and dependencies between them generated automatically depending on path prefixes and source paths.
+* systemd's handling of the existing "nofail" mount option in /etc/fstab is stricter than it used to be on some sysvinit distributions: mount points that fail and are not listed as "nofail" will cause the boot to be stopped, for security reasons, as we we should not permit unprivileged code to run without everything listed — and not expressly exempted through "nofail" — being around. Hence, please mark all mounts where booting shall proceed regardless whether they succeeded or not with "nofail"
+* Some SysV systems support an "rc.local" script that is supposed to be called "last" during boot. In systemd, the script is supported, but the semantics are less strict, as there is simply no concept of "last service", as the boot process is event- and request-based, parallelized and compositive. In general, it's a good idea to write proper unit files with properly defined dependencies, and avoid making use of rc.local.
+* systemd assumes that the UID boundary between system and regular users is a choice the distribution makes, and not the administrator. Hence it expects this setting as compile-time option to be picked by the distribution. It will _not_ check /etc/login.defs during runtime.
+
+Note that there are some areas where systemd currently provides a certain amount of compatibility where we expect this compatibility to be removed eventually.
diff --git a/docs/INHIBITOR_LOCKS.md b/docs/INHIBITOR_LOCKS.md
new file mode 100644
index 0000000000..61efdc2029
--- /dev/null
+++ b/docs/INHIBITOR_LOCKS.md
@@ -0,0 +1,160 @@
+---
+title: Inhibitor Locks
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Inhibitor Locks
+
+systemd 183 and newer include a logic to inhibit system shutdowns and sleep states. This is implemented as part of [systemd-logind.daemon(8)](http://www.freedesktop.org/software/systemd/man/systemd-logind.service.html) There are a couple of different use cases for this:
+
+- A CD burning application wants to ensure that the system is not turned off or suspended while the burn process is in progress.
+- A package manager wants to ensure that the system is not turned off while a package upgrade is in progress.
+- An office suite wants to be notified before system suspend in order to save all data to disk, and delay the suspend logic until all data is written.
+- A web browser wants to be notified before system hibernation in order to free its cache to minimize the amount of memory that needs to be virtualized.
+- A screen lock tool wants to bring up the screen lock right before suspend, and delay the suspend until that's complete.
+
+Applications which want to make use of the inhibition logic shall take an inhibitor lock via the [logind D-Bus API](http://www.freedesktop.org/wiki/Software/systemd/logind).
+
+Seven distinct inhibitor lock types may be taken, or a combination of them:
+
+1. _sleep_ inhibits system suspend and hibernation requested by (unprivileged) **users**
+2. _shutdown_ inhibits high-level system power-off and reboot requested by (unprivileged) **users**
+3. _idle_ inhibits that the system goes into idle mode, possibly resulting in **automatic** system suspend or shutdown depending on configuration.
+
+- _handle-power-key_ inhibits the low-level (i.e. logind-internal) handling of the system power **hardware** key, allowing (possibly unprivileged) external code to handle the event instead.
+
+4. Similar, _handle-suspend-key_ inhibits the low-level handling of the system **hardware** suspend key.
+5. Similar, _handle-hibernate-key_ inhibits the low-level handling of the system **hardware** hibernate key.
+6. Similar, _handle-lid-switch_ inhibits the low-level handling of the systemd **hardware** lid switch.
+
+Two different modes of locks are supported:
+
+1. _block_ inhibits operations entirely until the lock is released. If such a lock is taken the operation will fail (but still may be overridden if the user possesses the necessary privileges).
+2. _delay_ inhibits operations only temporarily, either until the lock is released or up to a certain amount of time. The InhibitDelayMaxSec= setting in [logind.conf(5)](http://www.freedesktop.org/software/systemd/man/logind.conf.html) controls the timeout for this. This is intended to be used by applications which need a synchronous way to execute actions before system suspend but shall not be allowed to block suspend indefinitely. This mode is only available for _sleep_ and _shutdown_ locks.
+
+Inhibitor locks are taken via the Inhibit() D-Bus call on the logind Manager object:
+
+```
+$ gdbus introspect --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1
+node /org/freedesktop/login1 {
+ interface org.freedesktop.login1.Manager {
+ methods:
+ Inhibit(in s what,
+ in s who,
+ in s why,
+ in s mode,
+ out h fd);
+ ListInhibitors(out a(ssssuu) inhibitors);
+ ...
+ signals:
+ PrepareForShutdown(b active);
+ PrepareForSleep(b active);
+ ...
+ properties:
+ readonly s BlockInhibited = '';
+ readonly s DelayInhibited = '';
+ readonly t InhibitDelayMaxUSec = 5000000;
+ readonly b PreparingForShutdown = false;
+ readonly b PreparingForSleep = false;
+ ...
+ };
+ ...
+};
+```
+
+**Inhibit()** is the only API necessary to take a lock. It takes four arguments:
+
+- _What_ is a colon-separated list of lock types, i.e. `shutdown`, `sleep`, `idle`, `handle-power-key`, `handle-suspend-key`, `handle-hibernate-key`, `handle-lid-switch`. Example: "shutdown:idle"
+- _Who_ is a human-readable, descriptive string of who is taking the lock. Example: "Package Updater"
+- _Why_ is a human-readable, descriptive string of why the lock is taken. Example: "Package Update in Progress"
+- _Mode_ is one of `block` or `delay`, see above. Example: "block"
+
+Inhibit() returns a single value, a file descriptor that encapsulates the lock. As soon as the file descriptor is closed (and all its duplicates) the lock is automatically released. If the client dies while the lock is taken the kernel automatically closes the file descriptor so that the lock is automatically released. A delay lock taken this way should be released ASAP on reception of PrepareForShutdown(true) (see below), but of course only after execution of the actions the application wanted to delay the operation for in the first place.
+
+**ListInhibitors()** lists all currently active inhibitor locks. It returns an array of structs, each consisting of What, Who, Why, Mode as above, plus the PID and UID of the process that requested the lock.
+
+The **PrepareForShutdown()** and **PrepareForSleep()** signals are emitted when a system suspend or shutdown has been requested and is about to be executed, as well as after the the suspend/shutdown was completed (or failed). The signals carry a boolean argument. If _True_ the shutdown/sleep has been requested, and the preparation phase for it begins, if _False_ the operation has finished completion (or failed). If _True_, this should be used as indication for applications to quickly execute the operations they wanted to execute before suspend/shutdown and then release any delay lock taken. If _False_ the suspend/shutdown operation is over, either successfully or unsuccessfully (of course, this signal will never be sent if a shutdown request was successful). The signal with _False_ is generally delivered only after the system comes back from suspend, the signal with _True_ possibly as well, for example when no delay lock was taken in the first place, and the system suspend hence executed without any delay. The signal with _False_ is usually the signal on which applications request a new delay lock in order to be synchronously notified about the next suspend/shutdown cycle. Note that watching PrepareForShutdown(true)[?](//secure.freedesktop.org/write/www/ikiwiki.cgi?do=create&from=Software%2Fsystemd%2Finhibit&page=Software%2Fsystemd%2Finhibit%2FPrepareForSleep)/PrepareForSleep(true) without taking a delay lock is racy and should not be done, as any code that an application might want to execute on this signal might not actually finish before the suspend/shutdown cycle is executed. _Again_: if you watch PrepareForSuspend(true), then you really should have taken a delay lock first. PrepareForShutdown(false) may be subscribed to by applications which want to be notified about system resume events. Note that this will only be sent out for suspend/resume cycles done via logind, i.e. generally only for high-level user-induced suspend cycles, and not automatic, low-level kernel induced ones which might exist on certain devices with more aggressive power management.
+
+The **BlockInhibited** and **DelayInhibited** properties encode what types of locks are currently taken. These fields are a colon separated list of `shutdown`, `sleep`, `idle`, `handle-power-key`, `handle-suspend-key`, `handle-hibernate-key`, `handle-lid-switch`. The list is basically the union of the What fields of all currently active locks of the specific mode.
+
+**InhibitDelayMaxUSec** contains the delay timeout value as configured in [logind.conf(5)](http://www.freedesktop.org/software/systemd/man/logind.conf.html).
+
+The **PreparingForShutdown** and **PreparingForSleep** boolean properties are true between the two PrepareForShutdown() resp PrepareForSleep() signals that are sent out. Note that these properties do not trigger PropertyChanged signals.
+
+## Taking Blocking Locks
+
+Here's the basic scheme for applications which need blocking locks such as a package manager or CD burning application:
+
+1. Take the lock
+2. Do your work you don't want to see interrupted by system sleep or shutdown
+3. Release the lock
+
+Example pseudo code:
+
+```
+fd = Inhibit("shutdown:idle", "Package Manager", "Upgrade in progress...", "block");
+/* ...
+ do your work
+ ... */
+close(fd);
+```
+
+## Taking Delay Locks
+
+Here's the basic scheme for applications which need delay locks such as a web browser or office suite:
+
+1. As you open a document, take the delay lock
+2. As soon as you see PrepareForSleep(true), save your data, then release the lock
+3. As soon as you see PrepareForSleep(false), take the delay lock again, continue as before.
+
+Example pseudo code:
+
+```
+int fd = -1;
+
+takeLock() {
+ if (fd >= 0)
+ return;
+
+ fd = Inhibit("sleep", "Word Processor", "Save any unsaved data in time...", "delay");
+}
+
+onDocumentOpen(void) {
+ takeLock();
+}
+
+onPrepareForSleep(bool b) {
+ if (b) {
+ saveData();
+ if (fd >= 0) {
+ close(fd);
+ fd = -1;
+ }
+ } else
+ takeLock();
+
+}
+
+```
+
+## Taking Key Handling Locks
+
+By default logind will handle the power and sleep keys of the machine, as well as the lid switch in all states. This ensures that this basic system behavior is guaranteed to work in all circumstances, on text consoles as well as on all graphical environments. However, some DE might want to do their own handling of these keys, for example in order to show a pretty dialog box before executing the relevant operation, or to simply disable the action under certain conditions. For these cases the handle-power-key, handle-suspend-key, handle-hibernate-key and handle-lid-switch type inhibitor locks are available. When taken, these locks simply disable the low-level handling of the keys, they have no effect on system suspend/hibernate/poweroff executed with other mechanisms than the hardware keys (such as the user typing "systemctl suspend" in a shell). A DE intending to do its own handling of these keys should simply take the locks at login time, and release them on logout; alternatively it might make sense to take this lock only temporarily under certain circumstances (e.g. take the lid switch lock only when a second monitor is plugged in, in order to support the common setup where people close their laptops when they have the big screen connected).
+
+These locks need to be taken in the "block" mode, "delay" is not supported for them.
+
+If a DE wants to ensure the lock screen for the eventual resume is on the screen before the system enters suspend state, it should do this via a suspend delay inhibitor block (see above).
+
+## Miscellanea
+
+Taking inhibitor locks is a privileged operation. Depending on the action _org.freedesktop.login1.inhibit-block-shutdown_, _org.freedesktop.login1.inhibit-delay-shutdown_, _org.freedesktop.login1.inhibit-block-sleep_, _org.freedesktop.login1.inhibit-delay-sleep_, _org.freedesktop.login1.inhibit-block-idle_, _org.freedesktop.login1.inhibit-handle-power-key_, _org.freedesktop.login1.inhibit-handle-suspend-key_, _org.freedesktop.login1.inhibit-handle-hibernate-key_,_org.freedesktop.login1.inhibit-handle-lid-switch_. In general it should be assumed that delay locks are easier to obtain than blocking locks, simply because their impact is much more minimal. Note that the policy checks for Inhibit() are never interactive.
+
+Inhibitor locks should not be misused. For example taking idle blocking locks without a very good reason might cause mobile devices to never auto-suspend. This can be quite detrimental for the battery.
+
+If an application finds a lock denied it should not consider this much of an error and just continue its operation without the protecting lock.
+
+The tool [systemd-inhibit(1)](http://www.freedesktop.org/software/systemd/man/systemd-inhibit.html) may be used to take locks or list active locks from the command line.
+
+Note that gnome-session also provides an [inhibitor API](http://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Inhibit), which is very similar to the one of systemd. Internally, locks taken on gnome-session's interface will be forwarded to logind, hence both APIs are supported. While both offer similar functionality they do differ in some regards. For obvious reasons gnome-session can offer logout locks and screensaver avoidance locks which logind lacks. logind's API OTOH supports delay locks in addition to block locks like GNOME. Also, logind is available to system components, and centralizes locks from all users, not just those of a specific one. In general: if in doubt it is probably advisable to stick to the GNOME locks, unless there is a good reason to use the logind APIs directly. When locks are to be enumerated it is better to use the logind APIs however, since they also include locks taken by system services and other users.
diff --git a/docs/INITRD_INTERFACE.md b/docs/INITRD_INTERFACE.md
index 4e856f8917..0461ae2607 100644
--- a/docs/INITRD_INTERFACE.md
+++ b/docs/INITRD_INTERFACE.md
@@ -40,7 +40,7 @@ Arch Linux initrds.
line options, for example `--log-level=` and similar.
* Storage daemons run from the initrd should follow the guide on
- [systemd and Storage Daemons for the Root File System](ROOT_STORAGE_DAEMONS.md)
+ [systemd and Storage Daemons for the Root File System](ROOT_STORAGE_DAEMONS)
to survive properly from the boot initrd all the way to the point where
systemd jumps back into the initrd for shutdown.
@@ -67,4 +67,4 @@ systemd. Here are a few terse notes:
* The switch-root operation will result in a killing spree of all running
processes. Some processes might need to be excluded from that, see the guide
- on [systemd and Storage Daemons for the Root File System](ROOT_STORAGE_DAEMONS.md).
+ on [systemd and Storage Daemons for the Root File System](ROOT_STORAGE_DAEMONS).
diff --git a/docs/JOURNAL_EXPORT_FORMATS.md b/docs/JOURNAL_EXPORT_FORMATS.md
index 2c4078aed9..e1eb0d36d1 100644
--- a/docs/JOURNAL_EXPORT_FORMATS.md
+++ b/docs/JOURNAL_EXPORT_FORMATS.md
@@ -11,7 +11,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
_Note that this document describes the binary serialization format of journals only, as used for transfer across the network.
For interfacing with web technologies there's the Journal JSON Format, described below.
-The binary format on disk is documented as the [Journal File Format](JOURNAL_FILE_FORMAT.md)._
+The binary format on disk is documented as the [Journal File Format](JOURNAL_FILE_FORMAT)._
_Before reading on, please make sure you are aware of the [basic properties of journal entries](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html), in particular realize that they may include binary non-text data (though usually don't), and the same field might have multiple values assigned within the same entry (though usually hasn't)._
@@ -124,7 +124,7 @@ _SOURCE_REALTIME_TIMESTAMP=1423944916372858
_Note that this section describes the JSON serialization format of the journal only, as used for interfacing with web technologies.
For binary transfer of journal data across the network there's the Journal Export Format described above.
-The binary format on disk is documented as [Journal File Format](JOURNAL_FILE_FORMAT.md)._
+The binary format on disk is documented as [Journal File Format](JOURNAL_FILE_FORMAT)._
_Before reading on, please make sure you are aware of the [basic properties of journal entries](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html), in particular realize that they may include binary non-text data (though usually don't), and the same field might have multiple values assigned within the same entry (though usually hasn't)._
diff --git a/docs/JOURNAL_FILE_FORMAT.md b/docs/JOURNAL_FILE_FORMAT.md
index a3edb56c88..e0737c5933 100644
--- a/docs/JOURNAL_FILE_FORMAT.md
+++ b/docs/JOURNAL_FILE_FORMAT.md
@@ -46,7 +46,7 @@ _Or, to put this in other words: this low-level document is probably not what
you want to use as base of your project. You want our [C
API](https://www.freedesktop.org/software/systemd/man/sd-journal.html) instead!
And if you really don't want the C API, then you want the
-[Journal Export Format or Journal JSON Format](JOURNAL_EXPORT_FORMATS.md)
+[Journal Export Format or Journal JSON Format](JOURNAL_EXPORT_FORMATS)
instead! This document is primarily for your entertainment and education.
Thank you!_
diff --git a/docs/MINIMAL_BUILDS.md b/docs/MINIMAL_BUILDS.md
new file mode 100644
index 0000000000..faa4f2de07
--- /dev/null
+++ b/docs/MINIMAL_BUILDS.md
@@ -0,0 +1,18 @@
+---
+title: Minimal Builds
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Minimal Builds
+
+systemd includes a variety of components. The core components are always built (which includes systemd itself, as well as udevd and journald). Many of the other components can be disabled at compile time with configure switches.
+
+For some uses the configure switches do not provide sufficient modularity. For example, they cannot be used to build only the man pages, or to build only the tmpfiles tool, only detect-virt or only udevd. If such modularity is required that goes beyond what we support in the configure script we can suggest you two options:
+
+1. Build systemd as usual, but pick only the built files you need from the result of "make install DESTDIR=<directory>", by using the file listing functionality of your packaging software. For example: if all you want is the tmpfiles tool, then build systemd normally, and list only /usr/bin/systemd-tmpfiles in the .spec file for your RPM package. This is simple to do, allows you to pick exactly what you need, but requires a larger number of build dependencies (but not runtime dependencies).
+2. If you want to reduce the build time dependencies (though only dbus and libcap are needed as build time deps) and you know the specific component you are interested in doesn't need it, then create a dummy .pc file for that dependency (i.e. basically empty), and configure systemd with PKG_CONFIG_PATH set to the path of these dummy .pc files. Then, build only the few bits you need with "make foobar", where foobar is the file you need.
+ We are open to merging patches for the build system that make more "fringe" components of systemd optional. However, please be aware that in order to keep the complexity of our build system small and its readability high, and to make our lives easier, we will not accept patches that make the minimal core components optional, i.e. systemd itself, journald and udevd.
+
+Note that the .pc file trick mentioned above currently doesn't work for libcap, since libcap doesn't provide a .pc file. We invite you to go ahead and post a patch to libcap upstream to get this corrected. We'll happily change our build system to look for that .pc file then. (a .pc file has been sent to upstream by Bryan Kadzban. It is also available at [http://kdzbn.homelinux.net/libcap-add-pkg-config.patch](http://kdzbn.homelinux.net/libcap-add-pkg-config.patch)).
diff --git a/docs/MY_SERVICE_CANT_GET_REATLIME.md b/docs/MY_SERVICE_CANT_GET_REATLIME.md
new file mode 100644
index 0000000000..20d31fbde7
--- /dev/null
+++ b/docs/MY_SERVICE_CANT_GET_REATLIME.md
@@ -0,0 +1,28 @@
+---
+title: My Service Can't Get Realtime!
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# My Service Can't Get Realtime!
+
+_So, you have a service that requires real-time scheduling. When you run this service on your systemd system it is unable to acquire real-time scheduling, even though it is full root and has all possible privileges. And now you are wondering what is going on and what you can do about it?_
+
+## What is Going on?
+
+By default systemd places all system services into their own control groups in the "cpu" hierarchy. This has the benefit that the CPU usage of services with many worker threads or processes (think: Apache with all its gazillion CGIs and stuff) gets roughly the same amount of CPU as a service with very few worker threads (think: MySQL). Instead of evening out CPU _per process_ this will cause CPU to be evened out _per service_.
+
+Now, the "cpu" cgroup controller of the Linux kernel has one major shortcoming: if a cgroup is created it needs an explicit, absolute RT time budget assigned, or otherwise RT is not available to any process in the group, and an attempt to acquire it will fail with EPERM. systemd will not assign any RT time budgets to the "cpu" cgroups it creates, simply because there is no feasible way to do that, since the budget needs to be specified in absolute time units and comes from a fixed pool. Or in other words: we'd love to assign a budget, but there are no sane values we could use. Thus, in its default configuration RT scheduling is simply not available for any system services.
+
+## Working Around the Issue
+
+Of course, that's quite a limitation, so here's how you work around this:
+
+* One option is to simply globally turn off that systemd creates a "cpu" cgroup for each of the system services. For that, edit `/etc/systemd/system.conf` and set `DefaultControllers=` to the empty string, then reboot. (An alternative is to disable the "cpu" controller in your kernel, entirely. systemd will not attempt to make use of controllers that aren't available in the kernel.)
+* Another option is to turn this off for the specific service only. For that, edit your service file, and add `ControlGroup=cpu:/` to its `[Service]` section. This overrides the default logic for this one service only, and places all its processes back in the root cgroup of the "cpu" hierarchy, which has the full RT budget assigned.
+* A third option is to simply assign your service a realtime budget. For that use `ControlGroupAttribute=cpu.rt_runtime_us 500000` in its `[Service]` or suchlike. See [the kernel documentation](http://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt) for details. The latter two options are not available for System V services. A possible solution is to write a small wrapper service file that simply calls the SysV script's start verb in `ExecStart=` and the stop verb in `ExecStop=`. (It also needs to set `RemainAfterExit=1` and `Type=forking`!)
+
+Note that this all only applies to services. By default, user applications run in the root cgroup of the "cpu" hierarchy, which avoids these problems for normal user applications.
+
+In the long run we hope that the kernel is fixed to not require an RT budget to be assigned for any cgroup created before a process can acquire RT (i.e. a process' RT budget should be derived from the nearest ancestor cgroup which has a budget assigned, rather than unconditionally its own uninitialized budget.) Ideally, we'd also like to create a per-user cgroup by default, so that users with many processes get roughly the same amount of CPU as users with very few.
diff --git a/docs/OPTIMIZATIONS.md b/docs/OPTIMIZATIONS.md
new file mode 100644
index 0000000000..3c8ac4815a
--- /dev/null
+++ b/docs/OPTIMIZATIONS.md
@@ -0,0 +1,52 @@
+---
+title: systemd Optimizations
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# systemd Optimizations
+
+_So you are working on a Linux distribution or appliance and need very fast boot-ups?_
+
+systemd can already offer boot times of < 1s for the Core OS (userspace only, i.e. only the bits controlled by systemd) and < 2s for a complete up-to-date desktop environments on simpler (but modern, i.e. SSDs) laptops if configured properly (examples: [http://git.fenrus.org/tmp/bootchart-20120512-1036.svg](http://git.fenrus.org/tmp/bootchart-20120512-1036.svg)). In this page we want to suggest a couple of ideas how to achieve that, and if the resulting boot times do not suffice where we believe room for improvements are that we'd like to see implemented sooner or later. If you are interested in investing engineering manpower in systemd to get to even shorter boot times, this list hopefully includes a few good suggestions to start with.
+
+Of course, before optimizing you should instrument the boot to generate profiling data, so make sure you know your way around with systemd-bootchart, systemd-analyze and pytimechart! Optimizations without profiling are premature optimizations!
+
+Note that systemd's fast performance is a side effect of its design but wasn't the primary design goal. As it stands now systemd (and Fedora using it) has been optimized very little and still has a lot of room for improvements. There are still many low hanging fruits to pick!
+
+We are very interested in merging optimization work into systemd upstream. Note however that we are careful not to merge work that would drastically limit the general purpose usefulness or reliability of our code, or that would make systemd harder to maintain. So in case you work on optimizations for systemd, try to keep your stuff mainlineable. If in doubt, ask us.
+
+The distributions have adopted systemd to varying levels. While there are many compatibility scripts in the boot process on Debian for example, Fedora has much less (but still too many). For better performance consider disabling these scripts, or using a different distribution.
+
+It is our intention to optimize the upstream distributions by default (in particular Fedora) so that these optimizations won't be necessary. However, this will take some time, especially since making these changes is often not trivial when the general purpose usefulness cannot be compromised.
+
+What you can optimize (locally) without writing any code:
+
+1. Make sure not to use any fake block device storage technology such as LVM (as installed by default by various distributions, including Fedora) they result in the systemd-udev-settle.service unit to be pulled in. Settling device enumeration is slow, racy and mostly obsolete. Since LVM (still) hasn't been updated to handle Linux' event based design properly, settling device enumeration is still required for it, but it will slow down boot substantially. On Fedora, use "systemctl mask fedora-wait-storage.service fedora-storage-init-late.service fedora-storage-init.service" to get rid of all those storage technologies. Of course, don't try this if you actually installed your system with LVM. (The only fake block device storage technology that currently handles this all properly and doesn't require settling device enumerations is LUKS disk encryption.)
+2. Consider bypassing the initrd, if you use one. On Fedora, make sure to install the OS on a plain disk without encryption, and without LVM/RAID/... (encrypted /home is fine) when doing this. Then, simply edit grub.conf and remove the initrd from your configuration, and change the root= kernel command line parameter so that it uses kernel device names instead of UUIDs, i.e. "root=sda5" or what is appropriate for your system. Also specify the root FS type with "rootfstype=ext4" (or as appropriate). Note that using kernel devices names is not really that nice if you have multiple hard disks, but if you are doing this for a laptop (i.e. with a single hdd), this should be fine. Note that you shouldn't need to rebuild your kernel in order to bypass the initrd. Distribution kernels (at least Fedora's) work fine with and without initrd, and systemd supports both ways to be started.
+3. Consider disabling SELinux and auditing. We recommend leaving SELinux on, for security reasons, but truth be told you can save 100ms of your boot if you disable it. Use selinux=0 on the kernel cmdline.
+4. Consider disabling Plymouth. If userspace boots in less than 1s, a boot splash is hardly useful, hence consider passing plymouth.enable=0 on the kernel command line. Plymouth is generally quite fast, but currently still forces settling device enumerations for graphics cards, which is slow. Disabling plymouth removes this bit of the boot.
+5. Consider uninstalling syslog. The journal is used anyway on newer systemd systems, and is usually more than sufficient for desktops, and embedded, and even many servers. Just uninstall all syslog implementations and remember that "journalctl" will get you a pixel perfect copy of the classic /var/log/messages message log. To make journal logs persistent (i.e. so that they aren't lost at boot) make sure to run "mkdir -p /var/log/journal".
+6. Consider masking a couple of redundant distribution boot scripts, that artificially slow down the boot. For example, on Fedora it's a good idea to mask fedora-autoswap.service fedora-configure.service fedora-loadmodules.service fedora-readonly.service. Also remove all LVM/RAID/FCOE/iSCSI related packages which slow down the boot substantially even if no storage of the specific kind is used (and if these RPMs can't be removed because some important packages require them, at least mask the respective services).
+7. Console output is slow. So if you measure your boot times and ship your system, make sure to use "quiet" on the command line and disable systemd debug logging (if you enabled it before).
+8. Consider removing cron from your system and use systemd timer units instead. Timer units currently have no support for calendar times (i.e. cannot be used to spawn things "at 6 am every Monday", but can do "run this every 7 days"), but for the usual /etc/cron.daily/, /etc/cron.weekly/, ... should be good enough, if the time of day of the execution doesn't matter (just add four small service and timer units for supporting these dirs. Eventually we might support these out of the box, but until then, just write your own scriplets for this).
+9. If you work on an appliance, consider disabling readahead collection in the shipped devices, but leave readahead replay enabled.
+10. If you work on an appliance, make sure to build all drivers you need into the kernel, since module loading is slow. If you build a distribution at least built all the stuff 90% of all people need into your kernel, i.e. at least USB, AHCI and HDA!
+11. If it works, use libahci.ignore_sss=1 when booting.
+12. Use a modern desktop that doesn't pull in ConsoleKit anymore. For example GNOME 3.4.
+13. Get rid of a local MTA, if you are building a desktop or appliance. I.e. on Fedora remove the sendmail RPMs which are (still!) installed by default.
+14. If you build an appliance, don't forget that various components of systemd are optional and may be disabled during build time, see "./configure --help" for details. For example, get rid of the virtual console setup if you never have local console users (this is a major source of slowness, actually). In addition, if you never have local users at all, consider disabling logind. And there are more components that are frequently unnecessary on appliances.
+15. This goes without saying: the boot-up gets faster if you started less stuff at boot. So run "systemctl" and check if there's stuff you don't need and disable it, or even remove its package.
+16. Don't use debug kernels. Debug kernels are slow. Fedora exclusively uses debug kernels during the development phase of each release. If you care about boot performance, either recompile these kernels with debugging turned off or wait for the final distribution release. It's a drastic difference. That also means that if you publish boot performance data of a Fedora pre-release distribution you are doing something wrong. ;-) So much about the basics of how to get a quick boot. Now, here's an incomprehensive list of things we'd like to see improved in systemd (and elsewhere) over short or long and need a bit of hacking (sometimes more, and sometimes less):
+17. Get rid of systemd-cgroups-agent. Currently, whenever a systemd cgroup runs empty a tool "systemd-cgroups-agent" is invoked by the kernel which then notifies systemd about it. The need for this tool should really go away, which will save a number of forked processes at boot, and should make things faster (especially shutdown). This requires introduction of a new kernel interface to get notifications for cgroups running empty, for example via fanotify() on cgroupfs.
+18. Make use of EXT4_IOC_MOVE_EXT in systemd's readahead implementation. This allows reordering/defragmentation of the files needed for boot. According to the data from [http://e4rat.sourceforge.net/](http://e4rat.sourceforge.net/) this might shorten the boot time to 40%. Implementation is not trivial, but given that we already support btrfs defragmentation and example code for this exists (e4rat as linked) should be fairly straightforward.
+19. Compress readahead pack files with XZ or so. Since boot these days tends to be clearly IO bound (and not CPU bound) it might make sense to reduce the IO load for the pack file by compressing it. Since we already have a dependency on XZ we'd recommend using XZ for this.
+20. Update the readahead logic to also precache directories (in addition to files).
+21. Improve a couple of algorithms in the unit dependency graph calculation logic, as well as unit file loading. For example, right now when loading units we match them up with a subset of the other loaded units in order to add automatic dependencies between them where appropriate. Usually the set of units matched up is small, but the complexity is currently O(n^2), and this could be optimized. Since unit file loading and calculations in the dependency graphs is the only major, synchronous, computation-intensive bit of PID 1, and is executed before any services are started this should bring relevant improvements, especially on systems with big dependency graphs.
+22. Add socket activation to X. Due to the special socket allocation semantics of X this is useful only for display :0. This should allow parallelization of X startup with its clients.
+23. The usual housekeeping: get rid of shell-based services (i.e. SysV init scripts), replace them with unit files. Don't make use of Type=forking and ordering dependencies if possible, use socket activation with Type=simple instead. This allows drastically better parallelized start-up for your services. Also, if you cannot use socket activation, at least consider patching your services to support Type=notify in place of Type=forking. Consider making seldom used services activated on-demand (for example, printer services), and start frequently used services already at boot instead of delaying them until they are used.
+24. Consider making use of systemd for the session as well, the way Tizen is doing this. This still needs some love in systemd upstream to be a smooth ride, but we definitely would like to go this way sooner or later, even for the normal desktops.
+25. Add an option for service units to temporarily bump the CPU and IO priority of the startup code of important services. Note however, that we assume that this will not bring much and hence recommend looking into this only very late. Since boot-up tends to be IO bound, solutions such as readahead are probably more interesting than prioritizing service startup IO. Also, this would probably always require a certain amount of manual configuration since determining automatically which services are important is hard (if not impossible), because we cannot track properly which services other services wait for.
+26. Same as the previous item, but temporarily lower the CPU/IO priority of the startups part of unimportant leaf services. This is probably more useful than 11 as it is easier to determine which processes don't matter.
+27. Add a kernel sockopt for AF_UNIX to increase the maximum datagram queue length for SOCK_DGRAM sockets. This would allow us to queue substantially more logging datagrams in the syslog and journal sockets, and thus move the point where syslog/journal clients have to block before their message writes finish much later in the boot process. The current kernel default is rather low with 10. (As a temporary hack it is possible to increase /proc/sys/net/unix/max_dgram_qlen globally, but this has implications beyond systemd, and should probably be avoided.) The kernel patch to make this work is most likely trivial. In general, this should allow us to improve the level of parallelization between clients and servers for AF_UNIX sockets of type SOCK_DGRAM or SOCK_SEQPACKET. Again: the list above contains things we'd like to see in systemd anyway. We didn't do much profiling for these features, but we have enough indication to assume that these bits will bring some improvements. But yeah, if you work on this, keep your profiling tools ready at all times.
diff --git a/docs/PORTABILITY_AND_STABILITY.md b/docs/PORTABILITY_AND_STABILITY.md
index 2854857d2b..abdc3dc658 100644
--- a/docs/PORTABILITY_AND_STABILITY.md
+++ b/docs/PORTABILITY_AND_STABILITY.md
@@ -83,9 +83,9 @@ And now, here's the list of (hopefully) all APIs that we have introduced with sy
| [hostnamed](https://www.freedesktop.org/software/systemd/man/org.freedesktop.hostname1.html) | D-Bus | yes | yes | GNOME | yes | [Ubuntu](https://launchpad.net/ubuntu/+source/ubuntu-system-service), [Gentoo](http://www.gentoo.org/proj/en/desktop/gnome/openrc-settingsd.xml), [BSD](http://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=summary) | partially |
| [localed](https://www.freedesktop.org/software/systemd/man/org.freedesktop.locale1.html) | D-Bus | yes | yes | GNOME | yes | [Ubuntu](https://launchpad.net/ubuntu/+source/ubuntu-system-service), [Gentoo](http://www.gentoo.org/proj/en/desktop/gnome/openrc-settingsd.xml), [BSD](http://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=summary) | partially |
| [timedated](https://www.freedesktop.org/software/systemd/man/org.freedesktop.timedate1.html) | D-Bus | yes | yes | GNOME | yes | [Gentoo](http://www.gentoo.org/proj/en/desktop/gnome/openrc-settingsd.xml), [BSD](http://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=summary) | partially |
-| [initrd interface](INITRD_INTERFACE.md) | Environment, flag files | yes | yes | mkosi, dracut, ArchLinux | yes | ArchLinux | no |
-| [Container interface](CONTAINER_INTERFACE.md) | Environment, Mounts | yes | yes | libvirt/LXC | yes | - | no |
-| [Boot Loader interface](BOOT_LOADER_INTERFACE.md) | EFI variables | yes | yes | gummiboot | yes | - | no |
+| [initrd interface](INITRD_INTERFACE) | Environment, flag files | yes | yes | mkosi, dracut, ArchLinux | yes | ArchLinux | no |
+| [Container interface](CONTAINER_INTERFACE) | Environment, Mounts | yes | yes | libvirt/LXC | yes | - | no |
+| [Boot Loader interface](BOOT_LOADER_INTERFACE) | EFI variables | yes | yes | gummiboot | yes | - | no |
| [Service bus API](https://www.freedesktop.org/software/systemd/man/org.freedesktop.systemd1.html) | D-Bus | yes | yes | system-config-services | no | - | no |
| [logind](https://www.freedesktop.org/software/systemd/man/org.freedesktop.login1.html) | D-Bus | yes | yes | GNOME | no | - | no |
| [sd-bus.h API](https://www.freedesktop.org/software/systemd/man/sd-bus.html) | C Library | yes | yes | - | maybe | - | maybe |
@@ -102,15 +102,15 @@ And now, here's the list of (hopefully) all APIs that we have introduced with sy
| [$XDG_RUNTIME_DIR](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) | Environment | yes | yes | glib, GNOME | yes | - | no |
| [$LISTEN_FDS $LISTEN_PID FD Passing](https://www.freedesktop.org/software/systemd/man/sd_listen_fds.html) | Environment | yes | yes | numerous (via sd-daemon.h) | yes | - | no |
| [$NOTIFY_SOCKET Daemon Notifications](https://www.freedesktop.org/software/systemd/man/sd_notify.html) | Environment | yes | yes | a few, including udev | yes | - | no |
-| [argv&#91;0&#93;&#91;0&#93;='@' Logic](ROOT_STORAGE_DAEMONS.md) | `/proc` marking | yes | yes | mdadm | yes | - | no |
+| [argv&#91;0&#93;&#91;0&#93;='@' Logic](ROOT_STORAGE_DAEMONS) | `/proc` marking | yes | yes | mdadm | yes | - | no |
| [Unit file format](https://www.freedesktop.org/software/systemd/man/systemd.unit.html) | File format | yes | yes | numerous | no | - | no |
| [Network](https://www.freedesktop.org/software/systemd/man/systemd.network.html) & [Netdev file format](https://www.freedesktop.org/software/systemd/man/systemd.netdev.html) | File format | yes | yes | no | no | - | no |
| [Link file format](https://www.freedesktop.org/software/systemd/man/systemd.link.html) | File format | yes | yes | no | no | - | no |
-| [Journal File Format](JOURNAL_FILE_FORMAT.md) | File format | yes | yes | - | maybe | - | no |
+| [Journal File Format](JOURNAL_FILE_FORMAT) | File format | yes | yes | - | maybe | - | no |
| [Journal Export Format](JOURNAL_EXPORT_FORMATS.md#journal-export-format) | File format | yes | yes | - | yes | - | no |
| [Journal JSON Format](JOURNAL_EXPORT_FORMATS.md#journal-json-format) | File format | yes | yes | - | yes | - | no |
| [Cooperation in cgroup tree](https://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups) | Treaty | yes | yes | libvirt | yes | libvirt | no |
-| [Password Agents](PASSWORD_AGENTS.md) | Socket+Files | yes | yes | - | yes | - | no |
+| [Password Agents](PASSWORD_AGENTS) | Socket+Files | yes | yes | - | yes | - | no |
| [udev multi-seat properties](https://www.freedesktop.org/software/systemd/man/sd-login.html) | udev Property | yes | yes | X11, gdm | no | - | no |
| udev session switch ACL properties | udev Property | no | no | - | no | - | no |
| [CLI of systemctl,...](https://www.freedesktop.org/software/systemd/man/systemctl.html) | CLI | yes | yes | numerous | no | - | no |
diff --git a/docs/PORTABLE_SERVICES.md b/docs/PORTABLE_SERVICES.md
index 6f5ff112d2..5055d77c54 100644
--- a/docs/PORTABLE_SERVICES.md
+++ b/docs/PORTABLE_SERVICES.md
@@ -70,8 +70,8 @@ under Docker), but as normal processes. A corollary of that is that they aren't
supposed to manage anything in their own environment (such as the network) as
the execution environment is mostly shared with the rest of the system.
-The primary focus use-case of "portable services" is to extend the host system
-with encapsulated extensions, but provide almost full integration with the rest
+The primary focus of "portable services" is to extend the host system
+with encapsulated extensions that provide almost full integration with the rest
of the system, though possibly restricted by security knobs. This focus
includes system extensions otherwise sometimes called "super-privileged
containers".
diff --git a/docs/PRESET.md b/docs/PRESET.md
new file mode 100644
index 0000000000..a2ae323961
--- /dev/null
+++ b/docs/PRESET.md
@@ -0,0 +1,44 @@
+---
+title: Presets
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Presets
+
+## Why?
+
+Different **distributions** have different policies on which services shall be enabled by default when the package they are shipped in is installed. On Fedora all services stay off by default, so that installing a package will not cause a service to be enabled (with some exceptions). On Debian all services are immediately enabled by default, so that installing a package will cause its service(s) to be enabled right-away.
+
+Different **spins** (flavours, remixes, whatever you might want to call them) of a distribution also have different policies on what services to enable, and what services to leave off. For example, the Fedora default will enable gdm as display manager by default, while the Fedora KDE spin will enable kdm instead.
+
+Different **sites** might also have different policies what to turn on by default and what to turn off. For example, one administrator would prefer to enforce the policy of "ssh should be always on, but everything else off", while another one might say "snmp always on, and for everything else use the distribution policy defaults".
+
+## The Logic
+
+Traditionally, policy about what services shall be enabled and what services shall not have been decided globally by the distributions, and were enforced in each package individually. This made it cumbersome to implement different policies per spin or per site, or to create software packages that do the right thing on more than one distribution. The enablement _mechanism_ was also encoding the enablement _policy_.
+
+systemd 32 and newer support package "preset" policies. These encode which units shall be enabled by default when they are installed, and which units shall not be enabled.
+
+Preset files may be written for specific distributions, for specific spins or for specific sites, in order to enforce different policies as needed. Preset policies are stored in .preset files in /usr/lib/systemd/system-preset/. If no policy exists the default implied policy of "enable everything" is enforced, i.e. in Debian style.
+
+The policy encoded in preset files is applied to a unit by invoking "systemctl preset ". It is recommended to use this command in all package post installation scriptlets. "systemctl preset " is identical to "systemctl enable " resp. "systemctl disable " depending on the policy.
+
+Preset files allow clean separation of enablement mechanism (inside the package scriptlets, by invoking "systemctl preset"), and enablement policy (centralized in the preset files).
+
+## Documentation
+
+Documentation for the preset policy file format is available here: [http://www.freedesktop.org/software/systemd/man/systemd.preset.html](http://www.freedesktop.org/software/systemd/man/systemd.preset.html)
+
+Documentation for "systemctl preset" you find here: [http://www.freedesktop.org/software/systemd/man/systemctl.html](http://www.freedesktop.org/software/systemd/man/systemctl.html)
+
+Documentation for the recommended package scriptlets you find here: [http://www.freedesktop.org/software/systemd/man/daemon.html](http://www.freedesktop.org/software/systemd/man/daemon.html)
+
+## How To
+
+For the preset logic to be useful, distributions need to implement a couple of steps:
+
+- The default distribution policy needs to be encoded in a preset file /usr/lib/systemd/system-preset/99-default.preset or suchlike, unless the implied policy of "enable everything" is the right choice. For a Fedora-like policy of "enable nothing" it is sufficient to include the single line "disable" into that file. The default preset file should be installed as part of one the core packages of the distribution.
+- All packages need to be updated to use "systemctl preset" in the post install scriptlets.
+- (Optionally) spins/remixes/flavours should define their own preset file, either overriding or extending the default distribution preset policy. Also see the fedora feature page: [https://fedoraproject.org/wiki/Features/PackagePresets](https://fedoraproject.org/wiki/Features/PackagePresets)
diff --git a/docs/RANDOM_SEEDS.md b/docs/RANDOM_SEEDS.md
index 8c9b7eee56..b2712ca741 100644
--- a/docs/RANDOM_SEEDS.md
+++ b/docs/RANDOM_SEEDS.md
@@ -384,7 +384,7 @@ This primarily leaves two kind of systems in the cold:
for an introduction why. That said, any boot loader can re-implement the
logic described above, and can pass a random seed that systemd as PID 1
will then upload into the kernel's entropy pool. For details see the
- [Boot Loader Interface](BOOT_LOADER_INTERFACE.md) documentation.
+ [Boot Loader Interface](BOOT_LOADER_INTERFACE) documentation.
11. *Why not pass the boot loader random seed via kernel command line instead
of as EFI variable?*
diff --git a/docs/RELEASE.md b/docs/RELEASE.md
index b712ba6b07..75919b4310 100644
--- a/docs/RELEASE.md
+++ b/docs/RELEASE.md
@@ -15,7 +15,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
6. [RC1] Update library numbers in `meson.build`
7. Update version number in `meson.version` (e.g. from `v256~devel` to `v256~rc1` or from `v256~rc3` to `v256`)
8. Check dbus docs with `ninja -C build update-dbus-docs`
-9. Update translation strings (`cd build`, `meson compile systemd-pot`, `meson compile systemd-update-po`) - drop the header comments from `systemd.pot` + re-add SPDX before committing. If the only change in a file is the 'POT-Creation-Date' field, then ignore that file.
+9. Update translation strings (`ninja -C build systemd-pot`, `ninja -C build systemd-update-po`) - drop the header comments from `systemd.pot` + re-add SPDX before committing. If the only change in a file is the 'POT-Creation-Date' field, then ignore that file.
10. Tag the release: `version=vXXX~rcY && git tag -s "${version}" -m "systemd ${version}"`. Note that this uses a tilde (\~) instead of a hyphen (-) because tildes sort lower in version comparisons according to the [version format specification](https://uapi-group.org/specifications/specs/version_format_specification/), and we want `v255~rc1` to sort lower than `v255`.
11. Do `ninja -C build`
12. Make sure that the version string and package string match: `build/systemctl --version`
diff --git a/docs/ROOT_STORAGE_DAEMONS.md b/docs/ROOT_STORAGE_DAEMONS.md
index 1ffebd6498..69812c9055 100644
--- a/docs/ROOT_STORAGE_DAEMONS.md
+++ b/docs/ROOT_STORAGE_DAEMONS.md
@@ -106,7 +106,7 @@ to find a different solution to your problem._
The recommended way to distinguish between run-from-initrd and run-from-rootfs
for a daemon is to check for `/etc/initrd-release` (which exists on all modern
-initrd implementations, see the [initrd Interface](INITRD_INTERFACE.md) for
+initrd implementations, see the [initrd Interface](INITRD_INTERFACE) for
details) which when exists results in `argv[0][0]` being set to `@`, and
otherwise doesn't. Something like this:
@@ -191,4 +191,4 @@ few additional notes for supporting these setups:
program consult this blog story: [Socket
Activation](https://0pointer.de/blog/projects/socket-activation.html)
-* Consider having a look at the [initrd Interface of systemd](INITRD_INTERFACE.md).
+* Consider having a look at the [initrd Interface of systemd](INITRD_INTERFACE).
diff --git a/docs/SEPARATE_USR_IS_BROKEN.md b/docs/SEPARATE_USR_IS_BROKEN.md
new file mode 100644
index 0000000000..8e9390eff4
--- /dev/null
+++ b/docs/SEPARATE_USR_IS_BROKEN.md
@@ -0,0 +1,40 @@
+---
+title: Booting Without /usr is Broken
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Booting Without /usr is Broken
+
+You probably discovered this page because your shiny new systemd system referred you here during boot time, when it warned you that booting without /usr pre-mounted wasn't supported anymore. And now you wonder what this all is about. Here's an attempt of an explanation:
+
+One thing in advance: systemd itself is actually mostly fine with /usr on a separate file system that is not pre-mounted at boot time. However, the common basic set of OS components of modern Linux machines is not, and has not been in quite some time. And it is unlikely that this is going to be fixed any time soon, or even ever.
+
+Most of the failures you will experience with /usr split off and not pre-mounted in the initramfs are graceful failures: they won't become directly visible, however certain features become unavailable due to these failures. Quite a number of programs these days hook themselves into the early boot process at various stages. A popular way to do this is for example via udev rules. The binaries called from these rules are sometimes located on /usr/bin, or link against libraries in /usr/lib, or use data files from /usr/share. If these rules fail udev will proceed with the next one, however later on applications will then not properly detect these udev devices or features of these devices. Here's a short, very in-comprehensive list of software we are aware of that currently are not able to provide the full set of functionality when /usr is split off and not pre-mounted at boot: udev-pci-db/udev-usb-db and all rules depending on this (using the PCI/USB database in /usr/share), PulseAudio, NetworkManager, ModemManager, udisks, libatasmart, usb\_modeswitch, gnome-color-manager, usbmuxd, ALSA, D-Bus, CUPS, Plymouth, LVM, hplip, multipath, Argyll, VMWare, the locale logic of most programs and a lot of other stuff.
+
+You don't believe us? Well, here's a command line that reveals a few obvious cases of udev rules that will silently fail to work if /usr is split off and not pre-mounted: `egrep 'usb-db|pci-db|FROM_DATABASE|/usr' /*/udev/rules.d/*` -- and you find a lot more if you actually look for it. On my fresh Fedora 15 install that's 23 obvious cases.
+
+## The Status Quo
+
+Due to this, many upstream developers have decided to consider the problem of a separate /usr that is not mounted during early boot an outdated question, and started to close bugs regarding these issues as WONTFIX. We certainly cannot blame them, as the benefit of supporting this is questionable and brings a lot of additional work with it.
+
+And let's clarify a few things:
+
+1. **It isn't systemd's fault.** systemd mostly works fine with /usr on a separate file system that is not pre-mounted at boot.
+2. **systemd is merely the messenger.** Don't shoot the messenger.
+3. **There's no news in all of this.** The message you saw is just a statement of fact, describing the status quo. Things have been this way since a while.
+4. **The message is merely a warning.** You can choose to ignore it.
+5. **Don't blame us**, don't abuse us, it's not our fault. We have been working on the Linux userspace since quite some time, and simply have enough of the constant bug reports regarding these issues, since they are actually very hard to track down because the failures are mostly graceful. Hence we placed this warning into the early boot process of every systemd Linux system with a split off and not pre-mounted /usr, so that people understand what is going on.
+
+## Going Forward
+
+/usr on its own filesystem is useful in some custom setups. But instead of expecting the traditional Unix way to (sometimes mindlessly) distributing tools between /usr and /, and require more and more tools to move to /, we now just expect /usr to be pre-mounted from inside the initramfs, to be available before 'init' starts. The duty of the minimal boot system that consisted of /bin, /sbin and /lib on traditional Unix, has been taken over by the initramfs of modern Linux. An initramfs that supports mounting /usr on top of / before it starts 'init', makes all existing setups work properly.
+
+There is no way to reliably bring up a modern system with an empty /usr. There are two alternatives to fix it: move /usr back to the rootfs or use an initramfs which can hide the split-off from the system.
+
+On the Fedora distribution we have succeeded to clean up the situation and the confusion the current split between / and /usr has created. We have moved all tools that over time have been moved to / back to /usr (where they belong), and the root file system only contains compatibility symlinks for /bin and /sbin into /usr. All binaries of the system are exclusively located within the /usr hierarchy.
+
+In this new definition of /usr, the directory can be mounted read-only by default, while the rootfs may be either read-write or read-only (for stateless systems) and contains only the empty mount point directories, compat-symlinks to /usr and the host-specific data like /etc, /root, /srv. In comparison to today's setups, the rootfs will be very small. The host-specific data will be properly separated from the installed operating system. The new /usr could also easily be shared read-only across several systems. Such a setup would be more efficient, can provide additional security, is more flexible to use, provides saner options for custom setups, and is much simpler to setup and maintain.
+
+For more information on this please continue to [The Case for the /usr Merge](../THE_CASE_FOR_THE_USR_MERGE).
diff --git a/docs/SYSLOG.md b/docs/SYSLOG.md
new file mode 100644
index 0000000000..35c6225edb
--- /dev/null
+++ b/docs/SYSLOG.md
@@ -0,0 +1,50 @@
+---
+title: Writing syslog Daemons Which Cooperate Nicely With systemd
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Writing syslog Daemons Which Cooperate Nicely With systemd
+
+Here are a few notes on things to keep in mind when you work on a classic BSD syslog daemon for Linux, to ensure that your syslog daemon works nicely together with systemd. If your syslog implementation does not follow these rules, then it will not be compatible with systemd v38 and newer.
+
+A few notes in advance: systemd centralizes all log streams in the Journal daemon. Messages coming in via /dev/log, via the native protocol, via STDOUT/STDERR of all services and via the kernel are received in the journal daemon. The journal daemon then stores them to disk or in RAM (depending on the configuration of the Storage= option in journald.conf), and optionally forwards them to the console, the kernel log buffer, or to a classic BSD syslog daemon -- and that's where you come in.
+
+Note that it is now the journal that listens on /dev/log, no longer the BSD syslog daemon directly. If your logging daemon wants to get access to all logging data then it should listen on /run/systemd/journal/syslog instead via the syslog.socket unit file that is shipped along with systemd. On a systemd system it is no longer OK to listen on /dev/log directly, and your daemon may not bind to the /run/systemd/journal/syslog socket on its own. If you do that then you will lose logging from STDOUT/STDERR of services (as well as other stuff).
+
+Your BSD compatible logging service should alias `syslog.service` to itself (i.e. symlink) when it is _enabled_. That way [syslog.socket](http://cgit.freedesktop.org/systemd/systemd/plain/units/syslog.socket) will activate your service when things are logged. Of course, only one implementation of BSD syslog can own that symlink, and hence only one implementation can be enabled at a time, but that's intended as there can only be one process listening on that socket. (see below for details how to manage this symlink.) Note that this means that syslog.socket as shipped with systemd is _shared_ among all implementations, and the implementation that is in control is configured with where syslog.service points to.
+
+Note that journald tries hard to forward to your BSD syslog daemon as much as it can. That means you will get more than you traditionally got on /dev/log, such as stuff all daemons log on STDOUT/STDERR and the messages that are logged natively to systemd. Also, we will send stuff like the original SCM_CREDENTIALS along if possible.
+
+(BTW, journald is smart enough not to forward the kernel messages it gets to you, you should read that on your own, directly from /proc/kmsg, as you always did. It's also smart enough never to forward kernel messages back to the kernel, but that probably shouldn't concern you too much...)
+
+And here are the recommendations:
+
+- First of all, make sure your syslog daemon installs a native service unit file (SysV scripts are not sufficient!) and is socket activatable. Newer systemd versions (v35+) do not support non-socket-activated syslog daemons anymore and we do no longer recommend people to order their units after syslog.target. That means that unless your syslog implementation is socket activatable many services will not be able to log to your syslog implementation and early boot messages are lost entirely to your implementation. Note that your service should install only one unit file, and nothing else. Do not install socket unit files.
+- Make sure that in your unit file you set StandardOutput=null in the [Service] block. This makes sure that regardless what the global default for StandardOutput= is the output of your syslog implementation goes to /dev/null. This matters since the default StandardOutput= value for all units can be set to syslog and this should not create a feedback loop with your implementation where the messages your syslog implementation writes out are fed back to it. In other words: you need to explicitly opt out of the default standard output redirection we do for other services. (Also note that you do not need to set StandardError= explicitly, since that inherits the setting of StandardOutput= by default)
+- /proc/kmsg is your property, flush it to disk as soon as you start up.
+- Name your service unit after your daemon (e.g. rsyslog.service or syslog-ng.service) and make sure to include Alias=syslog.service in your [Install] section in the unit file. This is ensures that the symlink syslog.service is created if your service is enabled and that it points to your service. Also add WantedBy=multi-user.target so that your service gets started at boot, and add Requires=syslog.socket in [Unit] so that you pull in the socket unit.
+
+Here are a few other recommendations, that are not directly related to systemd:
+
+- Make sure to read the priority prefixes of the kmsg log messages the same way like from normal userspace syslog messages. When systemd writes to kmsg it will prefix all messages with valid priorities which include standard syslog facility values. OTOH for kernel messages the facility is always 0. If you need to know whether a message originated in the kernel rely on the facility value, not just on the fact that you read the message from /proc/kmsg! A number of userspace applications write messages to kmsg (systemd, udev, dracut, others), and they'll nowadays all set correct facility values.
+- When you read a message from the socket use SCM_CREDENTIALS to get information about the client generating it, and possibly patch the message with this data in order to make it impossible for clients to fake identities.
+
+The unit file you install for your service should look something like this:
+
+```
+[Unit]
+Description=System Logging Service
+Requires=syslog.socket
+
+[Service]
+ExecStart=/usr/sbin/syslog-ng -n
+StandardOutput=null
+
+[Install]
+Alias=syslog.service
+WantedBy=multi-user.target
+```
+
+And remember: don't ship any socket unit for /dev/log or /run/systemd/journal/syslog (or even make your daemon bind directly to these sockets)! That's already shipped along with systemd for you.
diff --git a/docs/SYSTEMD_FILE_HIERARCHY_REQUIREMENTS.md b/docs/SYSTEMD_FILE_HIERARCHY_REQUIREMENTS.md
new file mode 100644
index 0000000000..574df93e00
--- /dev/null
+++ b/docs/SYSTEMD_FILE_HIERARCHY_REQUIREMENTS.md
@@ -0,0 +1,20 @@
+---
+title: systemd File Hierarchy Requirements
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# systemd File Hierarchy Requirements
+
+There are various attempts to standardize the file system hierarchy of Linux systems. In systemd we leave much of the file system layout open to the operating system, but here's what systemd strictly requires:
+
+- /, /usr, /etc must be mounted when the host systemd is first invoked. This may be achieved either by using the kernel's built-in root disk mounting (in which case /, /usr and /etc need to be on the same file system), or via an initrd, which could mount the three directories from different sources.
+- /bin, /sbin, /lib (and /lib64 if applicable) should reside on /, or be symlinks to the /usr file system (recommended). All of them must be available before the host systemd is first executed.
+- /var does not have to be mounted when the host systemd is first invoked, however, it must be configured so that it is mounted writable before local-fs.target is reached (for example, by simply listing it in /etc/fstab).
+- /tmp is recommended to be a tmpfs (default), but doesn't have to. If configured, it must be mounted before local-fs.target is reached (for example, by listing it in /etc/fstab).
+- /dev must exist as an empty mount point and will automatically be mounted by systemd with a devtmpfs. Non-devtmpfs boots are not supported.
+- /proc and /sys must exist as empty mount points and will automatically be mounted by systemd with procfs and sysfs.
+- /run must exist as an empty mount point and will automatically be mounted by systemd with a tmpfs.
+
+The other directories usually found in the root directory (such as /home, /boot, /opt) are irrelevant to systemd. If they are defined they may be mounted from any source and at any time, though it is a good idea to mount them also before local-fs.target is reached.
diff --git a/docs/THE_CASE_FOR_THE_USR_MERGE.md b/docs/THE_CASE_FOR_THE_USR_MERGE.md
new file mode 100644
index 0000000000..2cdb6db210
--- /dev/null
+++ b/docs/THE_CASE_FOR_THE_USR_MERGE.md
@@ -0,0 +1,115 @@
+---
+title: The Case for the /usr Merge
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# The Case for the /usr Merge
+
+**Why the /usr Merge Makes Sense for Compatibility Reasons**
+
+_This is based on the [Fedora feature](https://fedoraproject.org/wiki/Features/UsrMove) for the same topic, put together by Harald Hoyer and Kay Sievers. This feature has been implemented successfully in Fedora 17._
+
+Note that this page discusses a topic that is actually independent of systemd. systemd supports both systems with split and with merged /usr, and the /usr merge also makes sense for systemd-less systems. That said we want to encourage distributions adopting systemd to also adopt the /usr merge.
+
+### What's Being Discussed Here?
+
+Fedora (and other distributions) have finished work on getting rid of the separation of /bin and /usr/bin, as well as /sbin and /usr/sbin, /lib and /usr/lib, and /lib64 and /usr/lib64. All files from the directories in / will be merged into their respective counterparts in /usr, and symlinks for the old directories will be created instead:
+
+```
+/bin → /usr/bin
+/sbin → /usr/sbin
+/lib → /usr/lib
+/lib64 → /usr/lib64
+```
+
+You are wondering why merging /bin, /sbin, /lib, /lib64 into their respective counterparts in /usr makes sense, and why distributions are pushing for it? You are wondering whether your own distribution should adopt the same change? Here are a few answers to these questions, with an emphasis on a compatibility point of view:
+
+### Compatibility: The Gist of It
+
+- Improved compatibility with other Unixes/Linuxes in _behavior_: After the /usr merge all binaries become available in both /bin and /usr/bin, resp. both /sbin and /usr/sbin (simply because /bin becomes a symlink to /usr/bin, resp. /sbin to /usr/sbin). That means scripts/programs written for other Unixes or other Linuxes and ported to your distribution will no longer need fixing for the file system paths of the binaries called, which is otherwise a major source of frustration. /usr/bin and /bin (resp. /usr/sbin and /sbin) become entirely equivalent.
+- Improved compatibility with other Unixes (in particular Solaris) in _appearance_: The primary commercial Unix implementation is nowadays Oracle Solaris. Solaris has already completed the same /usr merge in Solaris 11. By making the same change in Linux we minimize the difference towards the primary Unix implementation, thus easing portability from Solaris.
+- Improved compatibility with GNU build systems: The biggest part of Linux software is built with GNU autoconf/automake (i.e. GNU autotools), which are unaware of the Linux-specific /usr split. Maintaining the /usr split requires non-trivial project-specific handling in the upstream build system, and in your distribution's packages. With the /usr merge, this work becomes unnecessary and porting packages to Linux becomes simpler.
+- Improved compatibility with current upstream development: In order to minimize the delta from your Linux distribution to upstream development the /usr merge is key.
+
+### Compatibility: The Longer Version
+
+A unified filesystem layout (as it results from the /usr merge) is more compatible with UNIX than Linux’ traditional split of /bin vs. /usr/bin. Unixes differ in where individual tools are installed, their locations in many cases are not defined at all and differ in the various Linux distributions. The /usr merge removes this difference in its entirety, and provides full compatibility with the locations of tools of any Unix via the symlink from /bin to /usr/bin.
+
+#### Example
+
+- /usr/bin/foo may be called by other tools either via /usr/bin/foo or /bin/foo, both paths become fully equivalent through the /usr merge. The operating system ends up executing exactly the same file, simply because the symlink /bin just redirects the invocation to /usr/bin.
+
+The historical justification for a /bin, /sbin and /lib separate from /usr no longer applies today. ([More on the historical justification for the split](http://lists.busybox.net/pipermail/busybox/2010-December/074114.html), by Rob Landley) They were split off to have selected tools on a faster hard disk (which was small, because it was more expensive) and to contain all the tools necessary to mount the slower /usr partition. Today, a separate /usr partition already must be mounted by the initramfs during early boot, thus making the justification for a split-off moot. In addition a lot of tools in /bin and /sbin in the status quo already lost the ability to run without a pre-mounted /usr. There is no valid reason anymore to have the operating system spread over multiple hierarchies, it lost its purpose.
+
+Solaris implemented the core part of the /usr merge 15 years ago already, and completed it with the introduction of Solaris 11. Solaris has /bin and /sbin only as symlinks in the root file system, the same way as you will have after the /usr merge: [Transitioning From Oracle Solaris 10 to Oracle Solaris 11 - User Environment Feature Changes](http://docs.oracle.com/cd/E23824_01/html/E24456/userenv-1.html).
+
+Not implementing the /usr merge in your distribution will isolate it from upstream development. It will make porting of packages needlessly difficult, because packagers need to split up installed files into multiple directories and hard code different locations for tools; both will cause unnecessary incompatibilities. Several Linux distributions are agreeing with the benefits of the /usr merge and are already in the process to implement the /usr merge. This means that upstream projects will adapt quickly to the change, those making portability to your distribution harder.
+
+### Beyond Compatibility
+
+One major benefit of the /usr merge is the reduction of complexity of our system: the new file system hierarchy becomes much simpler, and the separation between (read-only, potentially even immutable) vendor-supplied OS resources and users resources becomes much cleaner. As a result of the reduced complexity of the hierarchy, packaging becomes much simpler too, since the problems of handling the split in the .spec files go away.
+
+The merged directory /usr, containing almost the entire vendor-supplied operating system resources, offers us a number of new features regarding OS snapshotting and options for enterprise environments for network sharing or running multiple guests on one host. Static vendor-supplied OS resources are monopolized at a single location, that can be made read-only easily, either for the whole system or individually for each service. Most of this is much harder to accomplish, or even impossible, with the current arbitrary split of tools across multiple directories.
+
+_With all vendor-supplied OS resources in a single directory /usr they may be shared atomically, snapshots of them become atomic, and the file system may be made read-only as a single unit._
+
+#### Example: /usr Network Share
+
+- With the merged /usr directory we can offer a read-only export of the vendor supplied OS to the network, which will contain almost the entire operating system resources. The client hosts will then only need a minimal host-specific root filesystem with symlinks pointing into the shared /usr filesystem. From a maintenance perspective this is the first time where sharing the operating system over the network starts to make sense. Without the merged /usr directory (like in traditional Linux) we can only share parts of the OS at a time, but not the core components of it that are located in the root file system. The host-specific root filesystem hence traditionally needs to be much larger, cannot be shared among client hosts and needs to be updated individually and often. Vendor-supplied OS resources traditionally ended up "leaking" into the host-specific root file system.
+
+#### Example: Multiple Guest Operating Systems on the Same Host
+
+- With the merged /usr directory, we can offer to share /usr read-only with multiple guest operating systems, which will shrink down the guest file system to a couple of MB. The ratio of the per-guest host-only part vs. the shared operating system becomes nearly optimal.
+ In the long run the maintenance burden resulting of the split-up tools in your distribution, and hard-coded deviating installation locations to distribute binaries and other packaged files into multiple hierarchies will very likely cause more trouble than the /usr merge itself will cause.
+
+## Myths and Facts
+
+**Myth #1**: Fedora is the first OS to implement the /usr merge
+
+**Fact**: Oracle Solaris has implemented the /usr merge in parts 15 years ago, and completed it in Solaris 11. Fedora is following suit here, it is not the pioneer.
+
+**Myth #2**: Fedora is the only Linux distribution to implement the /usr merge
+
+**Fact**: Multiple other Linux distributions have been working in a similar direction.
+
+**Myth #3**: The /usr merge decreases compatibility with other Unixes/Linuxes
+
+**Fact**: By providing all binary tools in /usr/bin as well as in /bin (resp. /usr/sbin + /sbin) compatibility with hard coded binary paths in scripts is increased. When a distro A installs a tool “foo” in /usr/bin, and distro B installs it in /bin, then we’ll provide it in both, thus creating compatibility with both A and B.
+
+**Myth #4**: The /usr merge’s only purpose is to look pretty, and has no other benefits
+
+**Fact**: The /usr merge makes sharing the vendor-supplied OS resources between a host and networked clients as well as a host and local light-weight containers easier and atomic. Snapshotting the OS becomes a viable option. The /usr merge also allows making the entire vendor-supplied OS resources read-only for increased security and robustness.
+
+**Myth #5**: Adopting the /usr merge in your distribution means additional work for your distribution's package maintainers
+
+**Fact**: When the merge is implemented in other distributions and upstream, not adopting the /usr merge in your distribution means more work, adopting it is cheap.
+
+**Myth #6**: A split /usr is Unix “standard”, and a merged /usr would be Linux-specific
+
+**Fact**: On SysV Unix /bin traditionally has been a symlink to /usr/bin. A non-symlinked version of that directory is specific to non-SysV Unix and Linux.
+
+**Myth #7**: After the /usr merge one can no longer mount /usr read-only, as it is common usage in many areas.
+
+**Fact**: Au contraire! One of the reasons we are actually doing this is to make a read-only /usr more thorough: the entire vendor-supplied OS resources can be made read-only, i.e. all of what traditionally was stored in /bin, /sbin, /lib on top of what is already in /usr.
+
+**Myth #8**: The /usr merge will break my old installation which has /usr on a separate partition.
+
+**Fact**: This is perfectly well supported, and one of the reasons we are actually doing this is to make placing /usr of a separate partition more thorough. What changes is simply that you need to boot with an initrd that mounts /usr before jumping into the root file system. Most distributions rely on initrds anyway, so effectively little changes.
+
+**Myth #9**: The /usr split is useful to have a minimal rescue system on the root file system, and the rest of the OS on /usr.
+
+**Fact**: On Fedora the root directory contains ~450MB already. This hasn't been minimal since a long time, and due to today's complex storage and networking technologies it's unrealistic to ever reduce this again. In fact, since the introduction of initrds to Linux the initrd took over the role as minimal rescue system that requires only a working boot loader to be started, but not a full file system.
+
+**Myth #10**: The status quo of a split /usr with mounting it without initrd is perfectly well supported right now and works.
+
+**Fact**: A split /usr without involvement of an initrd mounting it before jumping into the root file system [hasn't worked correctly since a long time](http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken).
+
+**Myth #11**: Instead of merging / into /usr it would make a lot more sense to merge /usr into /.
+
+**Fact**: This would make the separation between vendor-supplied OS resources and machine-specific even worse, thus making OS snapshots and network/container sharing of it much harder and non-atomic, and clutter the root file system with a multitude of new directories.
+
+---
+
+If this page didn't answer your questions you may continue reading [on the Fedora feature page](https://fedoraproject.org/wiki/Features/UsrMove) and this [mail from Lennart](http://thread.gmane.org/gmane.linux.redhat.fedora.devel/155511/focus=155792).
diff --git a/docs/TIPS_AND_TRICKS.md b/docs/TIPS_AND_TRICKS.md
new file mode 100644
index 0000000000..f181f122a8
--- /dev/null
+++ b/docs/TIPS_AND_TRICKS.md
@@ -0,0 +1,185 @@
+---
+title: Tips And Tricks
+category: Manuals and Documentation for Users and Administrators
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Tips & Tricks
+
+Also check out the [Frequently Asked Questions](http://www.freedesktop.org/wiki/Software/systemd/FrequentlyAskedQuestions)!
+
+## Listing running services
+
+```sh
+$ systemctl
+UNIT LOAD ACTIVE SUB JOB DESCRIPTION
+accounts-daemon.service loaded active running Accounts Service
+atd.service loaded active running Job spooling tools
+avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
+bluetooth.service loaded active running Bluetooth Manager
+colord-sane.service loaded active running Daemon for monitoring attached scanners and registering them with colord
+colord.service loaded active running Manage, Install and Generate Color Profiles
+crond.service loaded active running Command Scheduler
+cups.service loaded active running CUPS Printing Service
+dbus.service loaded active running D-Bus System Message Bus
+...
+```
+
+## Showing runtime status
+
+```sh
+$ systemctl status udisks2.service
+udisks2.service - Storage Daemon
+ Loaded: loaded (/usr/lib/systemd/system/udisks2.service; static)
+ Active: active (running) since Wed, 27 Jun 2012 20:49:25 +0200; 1 day and 1h ago
+ Main PID: 615 (udisksd)
+ CGroup: name=systemd:/system/udisks2.service
+ └ 615 /usr/lib/udisks2/udisksd --no-debug
+
+Jun 27 20:49:25 epsilon udisksd[615]: udisks daemon version 1.94.0 starting
+Jun 27 20:49:25 epsilon udisksd[615]: Acquired the name org.freedesktop.UDisks2 on the system message bus
+```
+
+## cgroup tree
+
+```sh
+$ systemd-cgls
+└ system
+├ 1 /usr/lib/systemd/systemd --system --deserialize 18
+├ ntpd.service
+│ └ 8471 /usr/sbin/ntpd -u ntp:ntp -g
+├ upower.service
+│ └ 798 /usr/libexec/upowerd
+├ wpa_supplicant.service
+│ └ 751 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
+├ nfs-idmap.service
+│ └ 731 /usr/sbin/rpc.idmapd
+├ nfs-rquotad.service
+│ └ 753 /usr/sbin/rpc.rquotad
+├ nfs-mountd.service
+│ └ 732 /usr/sbin/rpc.mountd
+├ nfs-lock.service
+│ └ 704 /sbin/rpc.statd
+├ rpcbind.service
+│ └ 680 /sbin/rpcbind -w
+├ postfix.service
+│ ├ 859 /usr/libexec/postfix/master
+│ ├ 877 qmgr -l -t fifo -u
+│ └ 32271 pickup -l -t fifo -u
+├ colord-sane.service
+│ └ 647 /usr/libexec/colord-sane
+├ udisks2.service
+│ └ 615 /usr/lib/udisks2/udisksd --no-debug
+├ colord.service
+│ └ 607 /usr/libexec/colord
+├ prefdm.service
+│ ├ 567 /usr/sbin/gdm-binary -nodaemon
+│ ├ 602 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1
+│ ├ 612 /usr/bin/Xorg :0 -br -verbose -auth /var/run/gdm/auth-for-gdm-O00GPA/database -seat seat0 -nolisten tcp
+│ └ 905 gdm-session-worker [pam/gdm-password]
+├ systemd-ask-password-wall.service
+│ └ 645 /usr/bin/systemd-tty-ask-password-agent --wall
+├ atd.service
+│ └ 544 /usr/sbin/atd -f
+├ ksmtuned.service
+│ ├ 548 /bin/bash /usr/sbin/ksmtuned
+│ └ 1092 sleep 60
+├ dbus.service
+│ ├ 586 /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
+│ ├ 601 /usr/libexec/polkit-1/polkitd --no-debug
+│ └ 657 /usr/sbin/modem-manager
+├ cups.service
+│ └ 508 /usr/sbin/cupsd -f
+├ avahi-daemon.service
+│ ├ 506 avahi-daemon: running [epsilon.local]
+│ └ 516 avahi-daemon: chroot helper
+├ system-setup-keyboard.service
+│ └ 504 /usr/bin/system-setup-keyboard
+├ accounts-daemon.service
+│ └ 502 /usr/libexec/accounts-daemon
+├ systemd-logind.service
+│ └ 498 /usr/lib/systemd/systemd-logind
+├ crond.service
+│ └ 486 /usr/sbin/crond -n
+├ NetworkManager.service
+│ ├ 484 /usr/sbin/NetworkManager --no-daemon
+│ └ 8437 /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-wlan0.pid -lf /var/lib/dhclient/dhclient-903b6f6aa7a1-46c8-82a9-7f637dfbb3e4-wlan0.lease -cf /var/run/nm-d...
+├ libvirtd.service
+│ ├ 480 /usr/sbin/libvirtd
+│ └ 571 /sbin/dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --listenaddress 192.168.122.1 --dhcp-range 192.168.122.2,1...
+├ bluetooth.service
+│ └ 479 /usr/sbin/bluetoothd -n
+├ systemd-udev.service
+│ └ 287 /usr/lib/systemd/systemd-udevd
+└ systemd-journald.service
+└ 280 /usr/lib/systemd/systemd-journald
+```
+
+### ps with cgroups
+
+```sh
+$ alias psc='ps xawf -eo pid,user,cgroup,args'
+$ psc
+ PID USER CGROUP COMMAND
+...
+ 1 root name=systemd:/systemd-1 /bin/systemd systemd.log_target=kmsg systemd.log_level=debug selinux=0
+ 415 root name=systemd:/systemd-1/sysinit.service /sbin/udevd -d
+ 928 root name=systemd:/systemd-1/atd.service /usr/sbin/atd -f
+ 930 root name=systemd:/systemd-1/ntpd.service /usr/sbin/ntpd -n
+ 932 root name=systemd:/systemd-1/crond.service /usr/sbin/crond -n
+ 935 root name=systemd:/systemd-1/auditd.service /sbin/auditd -n
+ 943 root name=systemd:/systemd-1/auditd.service \_ /sbin/audispd
+ 964 root name=systemd:/systemd-1/auditd.service \_ /usr/sbin/sedispatch
+ 937 root name=systemd:/systemd-1/acpid.service /usr/sbin/acpid -f
+ 941 rpc name=systemd:/systemd-1/rpcbind.service /sbin/rpcbind -f
+ 944 root name=systemd:/systemd-1/rsyslog.service /sbin/rsyslogd -n -c 4
+ 947 root name=systemd:/systemd-1/systemd-logger.service /lib/systemd/systemd-logger
+ 950 root name=systemd:/systemd-1/cups.service /usr/sbin/cupsd -f
+ 955 dbus name=systemd:/systemd-1/messagebus.service /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
+ 969 root name=systemd:/systemd-1/getty@.service/tty6 /sbin/mingetty tty6
+ 970 root name=systemd:/systemd-1/getty@.service/tty5 /sbin/mingetty tty5
+ 971 root name=systemd:/systemd-1/getty@.service/tty1 /sbin/mingetty tty1
+ 973 root name=systemd:/systemd-1/getty@.service/tty4 /sbin/mingetty tty4
+ 974 root name=systemd:/user/lennart/2 login -- lennart
+ 1824 lennart name=systemd:/user/lennart/2 \_ -bash
+ 975 root name=systemd:/systemd-1/getty@.service/tty3 /sbin/mingetty tty3
+ 988 root name=systemd:/systemd-1/polkitd.service /usr/libexec/polkit-1/polkitd
+ 994 rtkit name=systemd:/systemd-1/rtkit-daemon.service /usr/libexec/rtkit-daemon
+...
+```
+
+## Changing the Default Boot Target
+
+```sh
+$ ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
+```
+
+This line makes the multi user target (i.e. full system, but no graphical UI) the default target to boot into. This is kinda equivalent to setting runlevel 3 as the default runlevel on Fedora/sysvinit systems.
+
+```sh
+$ ln -sf /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
+```
+
+This line makes the graphical target (i.e. full system, including graphical UI) the default target to boot into. Kinda equivalent to runlevel 5 on fedora/sysvinit systems. This is how things are shipped by default.
+
+## What other units does a unit depend on?
+
+For example, if you want to figure out which services a target like multi-user.target pulls in, use something like this:
+
+```sh
+$ systemctl show -p "Wants" multi-user.target
+Wants=rc-local.service avahi-daemon.service rpcbind.service NetworkManager.service acpid.service dbus.service atd.service crond.service auditd.service ntpd.service udisks.service bluetooth.service cups.service wpa_supplicant.service getty.target modem-manager.service portreserve.service abrtd.service yum-updatesd.service upowerd.service test-first.service pcscd.service rsyslog.service haldaemon.service remote-fs.target plymouth-quit.service systemd-update-utmp-runlevel.service sendmail.service lvm2-monitor.service cpuspeed.service udev-post.service mdmonitor.service iscsid.service livesys.service livesys-late.service irqbalance.service iscsi.service netfs.service
+```
+
+Instead of "Wants" you might also try "WantedBy", "Requires", "RequiredBy", "Conflicts", "ConflictedBy", "Before", "After" for the respective types of dependencies and their inverse.
+
+## What would get started if I booted into a specific target?
+
+If you want systemd to calculate the "initial" transaction it would execute on boot, try something like this:
+
+```sh
+$ systemd --test --system --unit=foobar.target
+```
+
+for a boot target foobar.target. Note that this is mostly a debugging tool that actually does a lot more than just calculate the initial transaction, so don't build scripts based on this.
diff --git a/docs/USERDB_AND_DESKTOPS.md b/docs/USERDB_AND_DESKTOPS.md
index 9006eeb5ec..3a3da1317a 100644
--- a/docs/USERDB_AND_DESKTOPS.md
+++ b/docs/USERDB_AND_DESKTOPS.md
@@ -21,10 +21,10 @@ are recommended. A few areas where that applies are discussed below.
Before reading on, please read up on the basic concepts, specifically:
-* [Home Directories](HOME_DIRECTORY.md)
-* [JSON User Records](USER_RECORD.md)
-* [JSON Group Records](GROUP_RECORD.md)
-* [User/Group Record Lookup API via Varlink](USER_GROUP_API.md)
+* [Home Directories](HOME_DIRECTORY)
+* [JSON User Records](USER_RECORD)
+* [JSON Group Records](GROUP_RECORD)
+* [User/Group Record Lookup API via Varlink](USER_GROUP_API)
## Support for Suspending Home Directory Access during System Suspend
@@ -147,7 +147,7 @@ solution only.
In case you wonder, there's no automatic mechanism for converting existing
users registered in `/etc/passwd` or LDAP to users managed by
`systemd-homed`. There's documentation for doing this manually though, see
-[Converting Existing Users to systemd-homed managed Users](CONVERTING_TO_HOMED.md).
+[Converting Existing Users to systemd-homed managed Users](CONVERTING_TO_HOMED).
## Future Additions
diff --git a/docs/USER_GROUP_API.md b/docs/USER_GROUP_API.md
index 45e3c9da27..567b8178f2 100644
--- a/docs/USER_GROUP_API.md
+++ b/docs/USER_GROUP_API.md
@@ -7,8 +7,8 @@ SPDX-License-Identifier: LGPL-2.1-or-later
# User/Group Record Lookup API via Varlink
-JSON User/Group Records (as described in the [JSON User Records](USER_RECORD.md)
-and [JSON Group Records](GROUP_RECORD.md) documents) that are defined on the
+JSON User/Group Records (as described in the [JSON User Records](USER_RECORD)
+and [JSON Group Records](GROUP_RECORD) documents) that are defined on the
local system may be queried with a [Varlink](https://varlink.org/) API. This
API takes both the role of what
[`getpwnam(3)`](https://man7.org/linux/man-pages/man3/getpwnam.3.html) and
diff --git a/docs/USER_RECORD.md b/docs/USER_RECORD.md
index f28106797e..78b29f078a 100644
--- a/docs/USER_RECORD.md
+++ b/docs/USER_RECORD.md
@@ -15,7 +15,7 @@ pairs, encoded as JSON. Specifically:
1. [`systemd-homed.service`](https://www.freedesktop.org/software/systemd/man/systemd-homed.service.html)
manages `human` user home directories and embeds these JSON records
directly in the home directory images
- (see [Home Directories](HOME_DIRECTORY.md) for details).
+ (see [Home Directories](HOME_DIRECTORY) for details).
2. [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
processes these JSON records for users that log in, and applies various
@@ -72,15 +72,15 @@ the following extensions are envisioned:
4. Default parameters for backup applications and similar
Similar to JSON User Records there are also
-[JSON Group Records](GROUP_RECORD.md) that encapsulate UNIX groups.
+[JSON Group Records](GROUP_RECORD) that encapsulate UNIX groups.
JSON User Records are not suitable for storing all identity information about
the user, such as binary data or large unstructured blobs of text. These parts
-of a user's identity should be stored in the [Blob Directories](USER_RECORD_BLOB_DIRS.md).
+of a user's identity should be stored in the [Blob Directories](USER_RECORD_BLOB_DIRS).
JSON User Records may be transferred or written to disk in various protocols
and formats. To inquire about such records defined on the local system use the
-[User/Group Lookup API via Varlink](USER_GROUP_API.md). User/group records may
+[User/Group Lookup API via Varlink](USER_GROUP_API). User/group records may
also be dropped in number of drop-in directories as files. See
[`nss-systemd(8)`](https://www.freedesktop.org/software/systemd/man/nss-systemd.html)
for details.
@@ -218,7 +218,7 @@ object. The following fields are currently defined:
UNIX user name. This field is the only mandatory field, all others are
optional. Corresponds with the `pw_name` field of `struct passwd` and the
`sp_namp` field of `struct spwd` (i.e. the shadow user record stored in
-`/etc/shadow`). See [User/Group Name Syntax](USER_NAMES.md) for
+`/etc/shadow`). See [User/Group Name Syntax](USER_NAMES) for
the (relaxed) rules the various systemd components enforce on user/group names.
`realm` → The "realm" a user is defined in. This concept allows distinguishing
@@ -235,10 +235,10 @@ user record with a realm set is never compatible (for the purpose of updates,
see above) with a user record without one set, even if the `userName` field matches.
`blobDirectory` → The absolute path to a world-readable copy of the user's blob
-directory. See [Blob Directories](USER_RECORD_BLOB_DIRS.md) for more details.
+directory. See [Blob Directories](USER_RECORD_BLOB_DIRS) for more details.
`blobManifest` → An object, which maps valid blob directory filenames (see
-[Blob Directories](USER_RECORD_BLOB_DIRS.md) for requirements) to SHA256 hashes
+[Blob Directories](USER_RECORD_BLOB_DIRS) for requirements) to SHA256 hashes
formatted as hex strings. This exists for the purpose of including the contents
of the blob directory in the record's signature. Managers that support blob
directories and utilize signed user records (like `systemd-homed`) should use
@@ -568,6 +568,15 @@ it is bypassed.
auto-login. Systems are supposed to automatically log in a user marked this way
during boot, if there's exactly one user on it defined this way.
+`preferredSessionType` → A string that indicates the user's preferred session type
+(i.e. `x11`, `wayland`, or other values valid for `$XDG_SESSION_TYPE`). This should
+be used by the display manager to pre-select the correct environment to log into.
+
+`preferredSessionLauncher` → A string that indicates the user's preferred session launcher
+desktop entry file (i.e. `gnome`, `gnome-classic`, `plasma`, `kodi`, or others that appear
+in `/usr/share/xsessions/` or `/usr/share/wayland-sessions/`). This should be used by the
+display manager to pre-select the correct environment to launch when the user logs in.
+
`stopDelayUSec` → An unsigned 64-bit integer, indicating the time in µs the
per-user service manager is kept around after the user fully logged out. This
value is honored by
@@ -780,8 +789,8 @@ that may be used in this section are identical to the equally named ones in the
`luksPbkdfType`, `luksPbkdfForceIterations`, `luksPbkdfTimeCostUSec`, `luksPbkdfMemoryCost`,
`luksPbkdfParallelThreads`, `luksSectorSize`, `autoResizeMode`, `rebalanceWeight`,
`rateLimitIntervalUSec`, `rateLimitBurst`, `enforcePasswordPolicy`,
-`autoLogin`, `stopDelayUSec`, `killProcesses`, `passwordChangeMinUSec`,
-`passwordChangeMaxUSec`, `passwordChangeWarnUSec`,
+`autoLogin`, `preferredSessionType`, `preferredSessionLauncher`, `stopDelayUSec`, `killProcesses`,
+`passwordChangeMinUSec`, `passwordChangeMaxUSec`, `passwordChangeWarnUSec`,
`passwordChangeInactiveUSec`, `passwordChangeNow`, `pkcs11TokenUri`,
`fido2HmacCredential`.
diff --git a/docs/USER_RECORD_BLOB_DIRS.md b/docs/USER_RECORD_BLOB_DIRS.md
index 8f5dd7914b..fd030e7966 100644
--- a/docs/USER_RECORD_BLOB_DIRS.md
+++ b/docs/USER_RECORD_BLOB_DIRS.md
@@ -8,7 +8,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
# User Record Blob Directories
The blob directories are for storing binary or unstructured data that would
-otherwise be stored in [JSON User Records](USER_RECORD.md). For instance,
+otherwise be stored in [JSON User Records](USER_RECORD). For instance,
this includes image files such as the user's avatar picture. This data,
like most of the user record, will be made publicly available to the
system.
diff --git a/docs/VIRTUALIZED_TESTING.md b/docs/VIRTUALIZED_TESTING.md
new file mode 100644
index 0000000000..94a56064aa
--- /dev/null
+++ b/docs/VIRTUALIZED_TESTING.md
@@ -0,0 +1,78 @@
+---
+title: Testing systemd during Development in Virtualization
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Testing systemd during Development in Virtualization
+
+For quickly testing systemd during development it us useful to boot it up in a container and in a QEMU VM.
+
+## Testing in a VM
+
+Here's a nice hack if you regularly build and test-boot systemd, are gutsy enough to install it into your host, but too afraid or too lazy to continuously reboot your host.
+
+Create a shell script like this:
+
+```
+#!/bin/sh
+
+sudo sync
+sudo /bin/sh -c 'echo 3 > /proc/sys/vm/drop_caches'
+sudo umount /
+sudo modprobe kvm-intel
+
+exec sudo qemu-kvm -smp 2 -m 512 -snapshot /dev/sda
+```
+
+This will boot your local host system as a throw-away VM guest. It will take your main harddisk, boot from it in the VM, allow changes to it, but these changes are all just buffered in memory and never hit the real disk. Any changes made in this VM will be lost when the VM terminates. I have called this script "q", and hence for test booting my own system all I do is type the following command in my systemd source tree and I can see if it worked.
+
+```
+$ make -j10 && sudo make install && q
+
+```
+
+The first three lines are necessary to ensure that the kernel's disk caches are all synced to disk before qemu takes the snapshot of it. Yes, invoking "umount /" will sync your file system to disk as a side effect, even though it will actually fail. When the machine boots up the file system will still be marked dirty (and hence you will get an fsck, usually), but it will work fine nonetheless in virtually all cases.
+
+Of course, if the host's hard disk changes while the VM is running this will be visible to the VM, and might confuse it. If you use this little hack you should keep changes on the host at a minimum, hence. Yeah this all is a hack, but a really useful and neat one.
+
+YMMV if you use LVM or btrfs.
+
+## Testing in a Container
+
+Test-booting systemd in a container has the benefit of being much easier to debug/instrument from the outside.
+
+**Important**: As preparation it is essential to turn off auditing entirely on your system. Auditing is broken with containers, and will trigger all kinds of error in containers if not turned off. Use `audit=0` on the host's kernel command line to turn it off.
+
+Then, as the first step I install Fedora into a container tree:
+
+```
+$ sudo yum -y --releasever=20 --installroot=$HOME/fedora-tree --disablerepo='*' --enablerepo=fedora install systemd passwd yum fedora-release vim-minimal
+
+```
+
+You can do something similar with debootstrap on a Debian system. Now, we need to set a root password in order to be able to log in:
+
+```
+$ sudo systemd-nspawn -D ~/fedora-tree/
+# passwd
+...
+# ^D
+```
+
+As the next step we can already boot the container:
+
+```
+$ sudo systemd-nspawn -bD ~/fedora-tree/ 3
+
+```
+
+To test systemd in the container I then run this from my source tree on the host:
+
+```
+$ make -j10 && sudo DESTDIR=$HOME/fedora-tree make install && sudo systemd-nspawn -bD ~/fedora-tree/ 3
+
+```
+
+And that's already it.
diff --git a/docs/WRITING_DESKTOP_ENVIRONMENTS.md b/docs/WRITING_DESKTOP_ENVIRONMENTS.md
new file mode 100644
index 0000000000..b50c857051
--- /dev/null
+++ b/docs/WRITING_DESKTOP_ENVIRONMENTS.md
@@ -0,0 +1,30 @@
+---
+title: Writing Desktop Environments
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Writing Desktop Environments
+
+_Or: how to hook up your favorite desktop environment with logind_
+
+systemd's logind service obsoletes ConsoleKit which was previously widely used on Linux distributions. This provides a number of new features, but also requires updating of the Desktop Environment running on it, in a few ways.
+
+This document should be read together with [Writing Display Managers](http://www.freedesktop.org/wiki/Software/systemd/writing-display-managers) which focuses on the porting work necessary for display managers.
+
+If required it is possible to implement ConsoleKit and systemd-logind support in the same desktop environment code, detecting at runtime which interface is needed. The [sd_booted()](http://www.freedesktop.org/software/systemd/man/sd_booted.html) call may be used to determine at runtime whether systemd is used.
+
+To a certain level ConsoleKit and systemd-logind may be used side-by-side, but a number of features are not available if ConsoleKit is used.
+
+Please have a look at the [Bus API of logind](http://www.freedesktop.org/wiki/Software/systemd/logind) and the C API as documented in [sd-login(7)](http://www.freedesktop.org/software/systemd/man/sd-login.html). (Also see below)
+
+Here are the suggested changes:
+
+- Your session manager should listen to "Lock" and "Unlock" messages that are emitted from the session object logind exposes for your DE session, on the system bus. If "Lock" is received the screen lock should be activated, if "Unlock" is received it should be deactivated. This can easily be tested with "loginctl lock-sessions". See the [Bus API of logind](http://www.freedesktop.org/wiki/Software/systemd/logind) for further details.
+- Whenever the session gets idle the DE should invoke the SetIdleHint(True) call on the respective session object on the session bus. This is necessary for the system to implement auto-suspend when all sessions are idle. If the session gets used again it should call SetIdleHint(False). A session should be considered idle if it didn't receive user input (mouse movements, keyboard) in a while. See the [Bus API of logind](http://www.freedesktop.org/wiki/Software/systemd/logind) for further details.
+- To reboot/power-off/suspend/hibernate the machine from the DE use logind's bus calls Reboot(), PowerOff(), Suspend(), Hibernate(), HybridSleep(). For further details see [Bus API of logind](http://www.freedesktop.org/wiki/Software/systemd/logind).
+- If your session manager handles the special power, suspend, hibernate hardware keys or the laptop lid switch on its own it is welcome to do so, but needs to disable logind's built-in handling of these events. Take one or more of the _handle-power-key_, _handle-suspend-key_, _handle-hibernate-key_, _handle-lid-switch_ inhibitor locks for that. See [Inhibitor Locks](http://www.freedesktop.org/wiki/Software/systemd/inhibit) for further details on this.
+- Before rebooting/powering-off/suspending/hibernating and when the operation is triggered by the user by clicking on some UI elements (or suchlike) it is recommended to show the list of currently active inhibitors for the operation, and ask the user to acknowledge the operation. Note that PK often allows the user to execute the operation ignoring the inhibitors. Use logind's ListInhibitors() call to get a list of these inhibitors. See [Inhibitor Locks](http://www.freedesktop.org/wiki/Software/systemd/inhibit) for further details on this.
+- If your DE contains a process viewer of some kind ("system monitor") it's a good idea to show session, service and seat information for each process. Use sd_pid_get_session(), sd_pid_get_unit(), sd_session_get_seat() to determine these. For details see [sd-login(7)](http://www.freedesktop.org/software/systemd/man/sd-login.html).
+ And that's all! Thank you!
diff --git a/docs/WRITING_DISPLAY_MANAGERS.md b/docs/WRITING_DISPLAY_MANAGERS.md
new file mode 100644
index 0000000000..efdbccc751
--- /dev/null
+++ b/docs/WRITING_DISPLAY_MANAGERS.md
@@ -0,0 +1,39 @@
+---
+title: Writing Display Managers
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Writing Display Managers
+
+_Or: How to hook up your favorite X11 display manager with systemd_
+
+systemd's logind service obsoletes ConsoleKit which was previously widely used on Linux distributions. For X11 display managers the switch to logind requires a minimal amount of porting, however brings a couple of new features: true automatic multi-seat support, proper tracking of session processes, (optional) automatic killing of user processes on logout, a synchronous low-level C API and much simplification.
+
+This document should be read together with [Writing Desktop Environments](http://www.freedesktop.org/wiki/Software/systemd/writing-desktop-environments) which focuses on the porting work necessary for desktop environments.
+
+If required it is possible to implement ConsoleKit and systemd-logind support in the same display manager, detecting at runtime which interface is needed. The [sd_booted()](http://www.freedesktop.org/software/systemd/man/sd_booted.html) call may be used to determine at runtime whether systemd is used.
+
+To a certain level ConsoleKit and systemd-logind may be used side-by-side, but a number of features are not available if ConsoleKit is used, for example automatic multi-seat support.
+
+Please have a look at the [Bus API of logind](http://www.freedesktop.org/wiki/Software/systemd/logind) and the C API as documented in [sd-login(7)](http://www.freedesktop.org/software/systemd/man/sd-login.html). (Also see below)
+
+Minimal porting (without multi-seat) requires the following:
+
+1. Remove/disable all code responsible for registering your service with ConsoleKit.
+2. Make sure to register your greeter session via the PAM session stack, and make sure the PAM session modules include pam_systemd. Also, make sure to set the session class to "greeter." This may be done by setting the environment variable XDG_SESSION_CLASS to "greeter" with pam_misc_setenv() or setting the "class=greeter" option in the pam_systemd module, in order to allow applications to filter out greeter sessions from normal login sessions.
+3. Make sure to register your logged in session via the PAM session stack as well, also including pam_systemd in it.
+4. Optionally, use pam_misc_setenv() to set the environment variables XDG_SEAT and XDG_VTNR. The former should contain "seat0", the latter the VT number your session runs on. pam_systemd can determine these values automatically but it's nice to pass these variables anyway.
+ In summary: porting a display manager from ConsoleKit to systemd primarily means removing code, not necessarily adding any new code. Here, a cheers to simplicity!
+
+Complete porting (with multi-seat) requires the following (Before you continue, make sure to read up on [Multi-Seat on Linux](http://www.freedesktop.org/wiki/Software/systemd/multiseat) first.):
+
+1. Subscribe to seats showing up and going away, via the systemd-logind D-Bus interface's SeatAdded and SeatRemoved signals. Take possession of each seat by spawning your greeter on it. However, do so exclusively for seats where the boolean CanGraphical property is true. Note that there are seats that cannot do graphical, and there are seats that are text-only first, and gain graphical support later on. Most prominently this is actually seat0 which comes up in text mode, and where the graphics driver is then loaded and probed during boot. This means display managers must watch PropertyChanged events on all seats, to see if they gain (or lose) the CanGraphical field.
+2. Use ListSeats() on the D-Bus interface to acquire a list of already available seats and also take possession of them.
+3. For each seat you spawn a greeter/user session on use the XDG_SEAT and XDG_VTNR PAM environment variables to inform pam_systemd about the seat name, resp. VT number you start them on. Note that only the special seat "seat0" actually knows kernel VTs, so you shouldn't pass the VT number on any but the main seat, since it doesn't make any sense there.
+4. Pass the seat name to the X server you start via the -seat parameter.
+5. At this time X interprets the -seat parameter natively only for input devices, not for graphics devices. To work around this limitation we provide a tiny wrapper /lib/systemd/systemd-multi-seat-x which emulates the enumeration for graphics devices too. This wrapper will eventually go away, as soon as X learns udev-based graphics device enumeration natively, instead of the current PCI based one. Hence it is a good idea to fall back to the real X when this wrapper is not found. You may use this wrapper exactly like the real X server, and internally it will just exec() it after putting together a minimal multi-seat configuration.
+ And that's already it.
+
+While most information about seats, sessions and users is available on systemd-logind's D-Bus interface, this is not the only API. The synchronous [sd-login(7)](http://www.freedesktop.org/software/systemd/man/sd-login.html) C interface is often easier to use and much faster too. In fact it is possible to implement the scheme above entirely without D-Bus relying only on this API. Note however, that this C API is purely passive, and if you want to execute an actually state changing operation you need to use the bus interface (for example, to switch sessions, or to kill sessions and suchlike). Also have a look at the [logind Bus API](http://www.freedesktop.org/wiki/Software/systemd/logind).
diff --git a/docs/WRITING_NETWORK_CONFIGURATION_MANAGERS.md b/docs/WRITING_NETWORK_CONFIGURATION_MANAGERS.md
new file mode 100644
index 0000000000..3a02c3a1cb
--- /dev/null
+++ b/docs/WRITING_NETWORK_CONFIGURATION_MANAGERS.md
@@ -0,0 +1,64 @@
+---
+title: Writing Network Configuration Managers
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Writing Network Configuration Managers
+
+_Or: How to hook up your favourite network configuration manager's DNS logic with `systemd-resolved`_
+
+_(This is a longer explanation how to use some parts of `systemd-resolved` bus API. If you are just looking for an API reference, consult the [bus API documentation](https://wiki.freedesktop.org/www/Software/systemd/resolved/) instead.)_
+
+Since systemd 229 `systemd-resolved` offers a powerful bus API that may be used by network configuration managers (e.g. NetworkManager, connman, …, but also lower level DHCP, VPN or PPP daemons managing specific interfaces) to pass DNS server and DNSSEC configuration directly to `systemd-resolved`. Note that `systemd-resolved` also reads the DNS configuration data in `/etc/resolv.conf`, for compatibility. However, by passing the DNS configuration directly to `systemd-resolved` via the bus a couple of benefits are available:
+
+1. `systemd-resolved` maintains DNS configuration per-interface, instead of simply system-wide, and is capable of sending DNS requests to servers on multiple different network interfaces simultaneously, returning the first positive response (or if all fail, the last negative one). This allows effective "merging" of DNS views on different interfaces, which makes private DNS zones on multi-homed hosts a lot nicer to use. For example, if you are connected to a LAN and a VPN, and both have private DNS zones, then you will be able to resolve both, as long as they don't clash in names. By using the bus API to configure DNS settings, the per-interface configuration is opened up.
+2. Per-link configuration of DNSSEC is available. This is particularly interesting for network configuration managers that implement captive portal detection: as long as a verified connection to the Internet is not found DNSSEC should be turned off (as some captive portal systems alter the DNS in order to redirect clients to their internal pages).
+3. Per-link configuration of LLMNR and MulticastDNS is available.
+4. In contrast to changes to `/etc/resolv.conf` all changes made via the bus take effect immediately for all future lookups.
+5. Statistical data about executed DNS transactions is available, as well as information about whether DNSSEC is supported on the chosen DNS server.
+
+Note that `systemd-networkd` is already hooked up with `systemd-resolved`, exposing this functionality in full.
+
+## Suggested Mode of Operation
+
+Whenever a network configuration manager sets up an interface for operation, it should pass the DNS configuration information for the interface to `systemd-resolved`. It's recommended to do that after the Linux network interface index ("ifindex") has been allocated, but before the interface has been upped (i.e. `IFF_UP` turned on). That way, `systemd-resolved` will be able to use the configuration the moment the network interface is available. (Note that `systemd-resolved` watches the kernel interfaces come and go, and will make use of them as soon as they are suitable to be used, which among other factors requires `IFF_UP` to be set). That said it is OK to change DNS configuration dynamically any time: simply pass the new data to resolved, and it is happy to use it.
+
+In order to pass the DNS configuration information to resolved, use the following methods of the `org.freedesktop.resolve1.Manager` interface of the `/org/freedesktop/resolve1` object, on the `org.freedesktop.resolve1` service:
+
+1. To set the DNS server IP addresses for a network interface, use `SetLinkDNS()`
+2. To set DNS search and routing domains for a network interface, use `SetLinkDomains()`
+3. To configure the DNSSEC mode for a network interface, use `SetLinkDNSSEC()`
+4. To configure DNSSEC Negative Trust Anchors (NTAs, i.e. domains for which not to do DNSSEC validation), use `SetLinkDNSSECNegativeTrustAnchors()`
+5. To configure the LLMNR and MulticastDNS mode, use `SetLinkLLMNR()` and `SetLinkMulticastDNS()`
+
+For details about these calls see the [full resolved bus API documentation](https://wiki.freedesktop.org/www/Software/systemd/resolved/).
+
+The calls should be pretty obvious to use: they simply take an interface index and the parameters to set. IP addresses are encoded as an address family specifier (an integer, that takes the usual `AF_INET` and `AF_INET6` constants), followed by a 4 or 16 byte array with the address in network byte order.
+
+`systemd-resolved` distinguishes between "search" and "routing" domains. Routing domains are used to route DNS requests of specific domains to particular interfaces. i.e. requests for a hostname `foo.bar.com` will be routed to any interface that has `bar.com` as routing domain. The same routing domain may be defined on multiple interfaces, in which case the request is routed to all of them in parallel. Resolver requests for hostnames that do not end in any defined routing domain of any interface will be routed to all suitable interfaces. Search domains work like routing domain, but are also used to qualify single-label domain names. They hence are identical to the traditional search domain logic on UNIX. The `SetLinkDomains()` call may used to define both search and routing domains.
+
+The most basic support of `systemd-resolved` in a network configuration manager would be to simply invoke `SetLinkDNS()` and `SetLinkDomains()` for the specific interface index with the data traditionally written to `/etc/resolv.conf`. More advanced integration could mean the network configuration manager also makes the DNSSEC mode, the DNSSEC NTAs and the LLMNR/MulticastDNS modes available for configuration.
+
+It is strongly recommended for network configuration managers that implement captive portal detection to turn off DNSSEC validation during the detection phase, so that captive portals that modify DNS do not result in all DNSSEC look-ups to fail.
+
+If a network configuration manager wants to reset specific settings to the defaults (such as the DNSSEC, LLMNR or MulticastDNS mode), it may simply call the function with an empty argument. To reset all per-link changes it made it may call `RevertLink()`.
+
+To read back the various settings made, use `GetLink()` to get a `org.freedesktop.resolve1.Link` object for a specific network interface. It exposes the current settings in its bus properties. See the [full bus API documentation](https://wiki.freedesktop.org/www/Software/systemd/resolved/) for details on this.
+
+In order to translate a network interface name to an interface index, use the usual glibc `if_nametoindex()` call.
+
+If the network configuration UI shall expose information about whether the selected DNS server supports DNSSEC, check the `DNSSECSupported` on the link object.
+
+Note that it is fully OK if multiple different daemons push DNS configuration data into `systemd-resolved` as long as they do this only for the network interfaces they own and manage.
+
+## Handling of `/etc/resolv.conf`
+
+`systemd-resolved` receives DNS configuration from a number of sources, via the bus, as well as directly from `systemd-networkd` or user configuration. It uses this data to write a file that is compatible with the traditional Linux `/etc/resolv.conf` file. This file is stored in `/run/systemd/resolve/resolv.conf`. It is recommended to symlink `/etc/resolv.conf` to this file, in order to provide compatibility with programs reading the file directly and not going via the NSS and thus `systemd-resolved`.
+
+For network configuration managers it is recommended to rely on this resolved-provided mechanism to update `resolv.conf`. Specifically, the network configuration manager should stop modifying `/etc/resolv.conf` directly if it notices it being a symlink to `/run/systemd/resolve/resolv.conf`.
+
+If a system configuration manager desires to be compatible both with systems that use `systemd-resolved` and those which do not, it is recommended to first push any discovered DNS configuration into `systemd-resolved`, and deal gracefully with `systemd-resolved` not being available on the bus. If `/etc/resolv.conf` is a not a symlink to `/run/systemd/resolve/resolv.conf` the manager may then proceed and also update `/etc/resolv.conf`. With this mode of operation optimal compatibility is provided, as `systemd-resolved` is used for `/etc/resolv.conf` management when this is configured, but transparent compatibility with non-`systemd-resolved` systems is maintained. Note that `systemd-resolved` is part of systemd, and hence likely to be pretty universally available on Linux systems soon.
+
+By allowing `systemd-resolved` to manage `/etc/resolv.conf` ownership issues regarding different programs overwriting each other's DNS configuration are effectively removed.
diff --git a/docs/WRITING_RESOLVER_CLIENTS.md b/docs/WRITING_RESOLVER_CLIENTS.md
new file mode 100644
index 0000000000..88a873a06e
--- /dev/null
+++ b/docs/WRITING_RESOLVER_CLIENTS.md
@@ -0,0 +1,290 @@
+---
+title: Writing Resolver Clients
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+# Writing Resolver Clients
+
+_Or: How to look up hostnames and arbitrary DNS Resource Records via \_systemd-resolved_'s bus APIs\_
+
+_(This is a longer explanation how to use some parts of \_systemd-resolved_ bus API. If you are just looking for an API reference, consult the [bus API documentation](https://wiki.freedesktop.org/www/Software/systemd/resolved/) instead.)\_
+
+_systemd-resolved_ provides a set of APIs on the bus for resolving DNS resource records. These are:
+
+1. _ResolveHostname()_ for resolving hostnames to acquire their IP addresses
+2. _ResolveAddress()_ for the reverse operation: acquire the hostname for an IP address
+3. _ResolveService()_ for resolving a DNS-SD or SRV service
+4. _ResolveRecord()_ for resolving arbitrary resource records.
+
+Below you'll find examples for two of these calls, to show how to use them. Note that glibc offers similar (and more portable) calls in _getaddrinfo()_, _getnameinfo()_ and _res_query()_. Of these _getaddrinfo()_ and _getnameinfo()_ are directed to the calls above via the _nss-resolve_ NSS module, but _req_query()_ is not. There are a number of reasons why it might be preferable to invoke _systemd-resolved_'s bus calls rather than the glibc APIs:
+
+1. Bus APIs are naturally asynchronous, which the glibc APIs generally are not.
+2. The bus calls above pass back substantially more information about the resolved data, including where and how the data was found (i.e. which protocol was used: DNS, LLMNR, MulticastDNS, and on which network interface), and most importantly, whether the data could be authenticated via DNSSEC. This in particular makes these APIs useful for retrieving certificate data from the DNS, in order to implement DANE, SSHFP, OPENGPGKEY and IPSECKEY clients.
+3. _ResolveService()_ knows no counterpart in glibc, and has the benefit of being a single call that collects all data necessary to connect to a DNS-SD or pure SRV service in one step.
+4. _ResolveRecord()_ in contrast to _res_query()_ supports LLMNR and MulticastDNS as protocols on top of DNS, and makes use of _systemd-resolved_'s local DNS record cache. The processing of the request is done in the sandboxed _systemd-resolved_ process rather than in the local process, and all packets are pre-validated. Because this relies on _systemd-resolved_ the per-interface DNS zone handling is supported.
+
+Of course, by using _systemd-resolved_ you lose some portability, but this could be handled via an automatic fallback to the glibc counterparts.
+
+Note that the various resolver calls provided by _systemd-resolved_ will consult _/etc/hosts_ and synthesize resource records for these entries in order to ensure that this file is honoured fully.
+
+The examples below use the _sd-bus_ D-Bus client implementation, which is part of _libsystemd_. Any other D-Bus library, including the original _libdbus_ or _GDBus_ may be used too.
+
+## Resolving a Hostname
+
+To resolve a hostname use the _ResolveHostname()_ call. For details on the function parameters see the [bus API documentation](https://wiki.freedesktop.org/www/Software/systemd/resolved/).
+
+This example specifies _AF_UNSPEC_ as address family for the requested address. This means both an _AF_INET_ (A) and an _AF_INET6_ (AAAA) record is looked for, depending on whether the local system has configured IPv4 and/or IPv6 connectivity. It is generally recommended to request _AF_UNSPEC_ addresses for best compatibility with both protocols, in particular on dual-stack systems.
+
+The example specifies a network interface index of "0", i.e. does not specify any at all, so that the request may be done on any. Note that the interface index is primarily relevant for LLMNR and MulticastDNS lookups, which distinguish different scopes for each network interface index.
+
+This examples makes no use of either the input flags parameter, nor the output flags parameter. See the _ResolveRecord()_ example below for information how to make use of the _SD_RESOLVED_AUTHENTICATED_ bit in the returned flags parameter.
+
+```
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <systemd/sd-bus.h>
+
+int main(int argc, char*argv[]) {
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = NULL;
+ const char *canonical;
+ sd_bus *bus = NULL;
+ uint64_t flags;
+ int r;
+
+ r = sd_bus_open_system(&bus);
+ if (r < 0) {
+ fprintf(stderr, "Failed to open system bus: %s\n", strerror(-r));
+ goto finish;
+ }
+
+ r = sd_bus_call_method(bus,
+ "org.freedesktop.resolve1",
+ "/org/freedesktop/resolve1",
+ "org.freedesktop.resolve1.Manager",
+ "ResolveHostname",
+ &error,
+ &reply,
+ "isit",
+ 0, /* Network interface index where to look (0 means any) */
+ argc >= 2 ? argv[1] : "www.github.com", /* Hostname */
+ AF_UNSPEC, /* Which address family to look for */
+ UINT64_C(0)); /* Input flags parameter */
+ if (r < 0) {
+ fprintf(stderr, "Failed to resolve hostnme: %s\n", error.message);
+ sd_bus_error_free(&error);
+ goto finish;
+ }
+
+ r = sd_bus_message_enter_container(reply, 'a', "(iiay)");
+ if (r < 0)
+ goto parse_failure;
+
+ for (;;) {
+ char buf[INET6_ADDRSTRLEN];
+ int ifindex, family;
+ const void *data;
+ size_t length;
+
+ r = sd_bus_message_enter_container(reply, 'r', "iiay");
+ if (r < 0)
+ goto parse_failure;
+ if (r == 0) /* Reached end of array */
+ break;
+ r = sd_bus_message_read(reply, "ii", &ifindex, &family);
+ if (r < 0)
+ goto parse_failure;
+ r = sd_bus_message_read_array(reply, 'y', &data, &length);
+ if (r < 0)
+ goto parse_failure;
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ goto parse_failure;
+
+ printf("Found IP address %s on interface %i.\n", inet_ntop(family, data, buf, sizeof(buf)), ifindex);
+ }
+
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ goto parse_failure;
+ r = sd_bus_message_read(reply, "st", &canonical, &flags);
+ if (r < 0)
+ goto parse_failure;
+
+ printf("Canonical name is %s\n", canonical);
+ goto finish;
+
+parse_failure:
+ fprintf(stderr, "Parse failure: %s\n", strerror(-r));
+
+finish:
+ sd_bus_message_unref(reply);
+ sd_bus_flush_close_unref(bus);
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+```
+
+Compile this with a command line like the following (under the assumption you save the sources above as `addrtest.c`):
+
+```
+gcc addrtest.c -o addrtest -Wall `pkg-config --cflags --libs libsystemd`
+```
+
+## Resolving an Arbitrary DNS Resource Record
+
+Use `ResolveRecord()` in order to resolve arbitrary resource records. The call will return the binary RRset data. This calls is useful to acquire resource records for which no high-level calls such as ResolveHostname(), ResolveAddress() and ResolveService() exist. In particular RRs such as MX, SSHFP, TLSA, CERT, OPENPGPKEY or IPSECKEY may be requested via this API.
+
+This example also shows how to determine whether the acquired data has been authenticated via DNSSEC (or another means) by checking the `SD_RESOLVED_AUTHENTICATED` bit in the
+returned `flags` parameter.
+
+This example contains a simple MX record parser. Note that the data comes pre-validated from `systemd-resolved`, hence we allow the example to parse the record slightly sloppily, to keep the example brief. For details on the MX RR binary format, see [RFC 1035](https://www.rfc-editor.org/rfc/rfc1035.txt).
+
+For details on the function parameters see the [bus API documentation](https://wiki.freedesktop.org/www/Software/systemd/resolved/).
+
+```
+#include <assert.h>
+#include <endian.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <systemd/sd-bus.h>
+
+#define DNS_CLASS_IN 1U
+#define DNS_TYPE_MX 15U
+
+#define SD_RESOLVED_AUTHENTICATED (UINT64_C(1) << 9)
+
+static const uint8_t* print_name(const uint8_t* p) {
+ bool dot = false;
+ for (;;) {
+ if (*p == 0)
+ return p + 1;
+ if (dot)
+ putchar('.');
+ else
+ dot = true;
+ printf("%.*s", (int) *p, (const char*) p + 1);
+ p += *p + 1;
+ }
+}
+
+static void process_mx(const void *rr, size_t sz) {
+ uint16_t class, type, rdlength, preference;
+ const uint8_t *p = rr;
+ uint32_t ttl;
+
+ fputs("Found MX: ", stdout);
+ p = print_name(p);
+
+ memcpy(&type, p, sizeof(uint16_t));
+ p += sizeof(uint16_t);
+ memcpy(&class, p, sizeof(uint16_t));
+ p += sizeof(uint16_t);
+ memcpy(&ttl, p, sizeof(uint32_t));
+ p += sizeof(uint32_t);
+ memcpy(&rdlength, p, sizeof(uint16_t));
+ p += sizeof(uint16_t);
+ memcpy(&preference, p, sizeof(uint16_t));
+ p += sizeof(uint16_t);
+
+ assert(be16toh(type) == DNS_TYPE_MX);
+ assert(be16toh(class) == DNS_CLASS_IN);
+ printf(" preference=%u ", be16toh(preference));
+
+ p = print_name(p);
+ putchar('\n');
+
+ assert(p == (const uint8_t*) rr + sz);
+}
+
+int main(int argc, char*argv[]) {
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = NULL;
+ sd_bus *bus = NULL;
+ uint64_t flags;
+ int r;
+
+ r = sd_bus_open_system(&bus);
+ if (r < 0) {
+ fprintf(stderr, "Failed to open system bus: %s\n", strerror(-r));
+ goto finish;
+ }
+
+ r = sd_bus_call_method(bus,
+ "org.freedesktop.resolve1",
+ "/org/freedesktop/resolve1",
+ "org.freedesktop.resolve1.Manager",
+ "ResolveRecord",
+ &error,
+ &reply,
+ "isqqt",
+ 0, /* Network interface index where to look (0 means any) */
+ argc >= 2 ? argv[1] : "gmail.com", /* Domain name */
+ DNS_CLASS_IN, /* DNS RR class */
+ DNS_TYPE_MX, /* DNS RR type */
+ UINT64_C(0)); /* Input flags parameter */
+ if (r < 0) {
+ fprintf(stderr, "Failed to resolve record: %s\n", error.message);
+ sd_bus_error_free(&error);
+ goto finish;
+ }
+
+ r = sd_bus_message_enter_container(reply, 'a', "(iqqay)");
+ if (r < 0)
+ goto parse_failure;
+
+ for (;;) {
+ uint16_t class, type;
+ const void *data;
+ size_t length;
+ int ifindex;
+
+ r = sd_bus_message_enter_container(reply, 'r', "iqqay");
+ if (r < 0)
+ goto parse_failure;
+ if (r == 0) /* Reached end of array */
+ break;
+ r = sd_bus_message_read(reply, "iqq", &ifindex, &class, &type);
+ if (r < 0)
+ goto parse_failure;
+ r = sd_bus_message_read_array(reply, 'y', &data, &length);
+ if (r < 0)
+ goto parse_failure;
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ goto parse_failure;
+
+ process_mx(data, length);
+ }
+
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ goto parse_failure;
+ r = sd_bus_message_read(reply, "t", &flags);
+ if (r < 0)
+ goto parse_failure;
+
+ printf("Response is authenticated: %s\n", flags & SD_RESOLVED_AUTHENTICATED ? "yes" : "no");
+ goto finish;
+
+parse_failure:
+ fprintf(stderr, "Parse failure: %s\n", strerror(-r));
+
+finish:
+ sd_bus_message_unref(reply);
+ sd_bus_flush_close_unref(bus);
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+```
+
+Compile this with a command line like the following (under the assumption you save the sources above as `rrtest.c`):
+
+```
+gcc rrtest.c -o rrtest -Wall `pkg-config --cflags --libs libsystemd`
+```
diff --git a/docs/WRITING_VM_AND_CONTAINER_MANAGERS.md b/docs/WRITING_VM_AND_CONTAINER_MANAGERS.md
new file mode 100644
index 0000000000..4d1b649df3
--- /dev/null
+++ b/docs/WRITING_VM_AND_CONTAINER_MANAGERS.md
@@ -0,0 +1,29 @@
+---
+title: Writing VM and Container Managers
+category: Documentation for Developers
+layout: default
+SPDX-License-Identifier: LGPL-2.1-or-later
+---
+
+
+# Writing VM and Container Managers
+
+_Or: How to hook up your favorite VM or container manager with systemd_
+
+Nomenclature: a _Virtual Machine_ shall refer to a system running on virtualized hardware consisting of a full OS with its own kernel. A _Container_ shall refer to a system running on the same shared kernel of the host, but running a mostly complete OS with its own init system. Both kinds of virtualized systems shall collectively be called "machines".
+
+systemd provides a number of integration points with virtual machine and container managers, such as libvirt, LXC or systemd-nspawn. On one hand there are integration points of the VM/container manager towards the host OS it is running on, and on the other there integration points for container managers towards the guest OS it is managing.
+
+Note that this document does not cover lightweight containers for the purpose of application sandboxes, i.e. containers that do _not_ run a init system of their own.
+
+## Host OS Integration
+
+All virtual machines and containers should be registered with the [machined](http://www.freedesktop.org/wiki/Software/systemd/machined) mini service that is part of systemd. This provides integration into the core OS at various points. For example, tools like ps, cgls, gnome-system-manager use this registration information to show machine information for running processes, as each of the VM's/container's processes can reliably attributed to a registered machine. The various systemd tools (like systemctl, journalctl, loginctl, systemd-run, ...) all support a -M switch that operates on machines registered with machined. "machinectl" may be used to execute operations on any such machine. When a machine is registered via machined its processes will automatically be placed in a systemd scope unit (that is located in the machines.slice slice) and thus appear in "systemctl" and similar commands. The scope unit name is based on the machine meta information passed to machined at registration.
+
+For more details on the APIs provided by machine consult [the bus API interface documentation](http://www.freedesktop.org/wiki/Software/systemd/machined).
+
+## Guest OS Integration
+
+As container virtualization is much less comprehensive, and the guest is less isolated from the host, there are a number of interfaces defined how the container manager can set up the environment for systemd running inside a container. These Interfaces are documented in [Container Interface of systemd](http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface).
+
+VM virtualization is more comprehensive and fewer integration APIs are available. In fact there's only one: a VM manager may initialize the SMBIOS DMI field "Product UUUID" to a UUID uniquely identifying this virtual machine instance. This is read in the guest via /sys/class/dmi/id/product_uuid, and used as configuration source for /etc/machine-id if in the guest, if that file is not initialized yet. Note that this is currently only supported for kvm hosts, but may be extended to other managers as well.
diff --git a/docs/_data/extra_pages.json b/docs/_data/extra_pages.json
index 94a52b7455..d24e301329 100644
--- a/docs/_data/extra_pages.json
+++ b/docs/_data/extra_pages.json
@@ -1,11 +1,517 @@
[
- { "category": "Project", "title": "mkosi Project - Build Bespoke OS Images", "url": "https://mkosi.systemd.io/" },
- { "category": "Project", "title": "Brand", "url": "https://brand.systemd.io/" },
- { "category": "Project", "title": "Releases", "url": "https://github.com/systemd/systemd/releases" },
- { "category": "Project", "title": "GitHub Project Page", "url": "https://github.com/systemd/systemd" },
- { "category": "Project", "title": "Issues", "url": "https://github.com/systemd/systemd/issues" },
- { "category": "Project", "title": "Pull Requests", "url": "https://github.com/systemd/systemd/pulls" },
- { "category": "Project", "title": "Mailing List", "url": "https://lists.freedesktop.org/mailman/listinfo/systemd-devel" },
- { "category": "Manual Pages", "title": "Index", "url": "https://www.freedesktop.org/software/systemd/man/" },
- { "category": "Manual Pages", "title": "Directives", "url": "https://www.freedesktop.org/software/systemd/man/systemd.directives.html" }
+ {
+ "category": "Project",
+ "title": "mkosi Project - Build Bespoke OS Images",
+ "url": "https://mkosi.systemd.io/"
+ },
+ {
+ "category": "Project",
+ "title": "Brand",
+ "url": "https://brand.systemd.io/"
+ },
+ {
+ "category": "Project",
+ "title": "Mailing List",
+ "url": "https://lists.freedesktop.org/mailman/listinfo/systemd-devel"
+ },
+ {
+ "category": "Project",
+ "title": "Mastodon",
+ "url": "https://mastodon.social/@pid_eins"
+ },
+ {
+ "category": "Project",
+ "title": "Releases",
+ "url": "https://github.com/systemd/systemd/releases"
+ },
+ {
+ "category": "Project",
+ "title": "GitHub Project Page",
+ "url": "https://github.com/systemd/systemd"
+ },
+ {
+ "category": "Project",
+ "title": "Issues",
+ "url": "https://github.com/systemd/systemd/issues"
+ },
+ {
+ "category": "Project",
+ "title": "Pull Requests",
+ "url": "https://github.com/systemd/systemd/pulls"
+ },
+ {
+ "category": "Manual Pages",
+ "title": "Index",
+ "url": "https://www.freedesktop.org/software/systemd/man/"
+ },
+ {
+ "category": "Manual Pages",
+ "title": "Directives",
+ "url": "https://www.freedesktop.org/software/systemd/man/systemd.directives.html"
+ },
+ {
+ "category": "Publications",
+ "title": "Article in The H",
+ "url": "http://www.h-online.com/open/features/Control-Centre-The-systemd-Linux-init-system-1565543.html"
+ },
+ {
+ "category": "Publications",
+ "title": "Article in The H, Part 2",
+ "url": "http://www.h-online.com/open/features/Booting-up-Tools-and-tips-for-systemd-1570630.html"
+ },
+ {
+ "category": "Publications",
+ "title": "Bê-á-bá do systemd #1 (Brazilian Portuguese)",
+ "url": "https://community.ibm.com/community/user/legacy"
+ },
+ {
+ "category": "Publications",
+ "title": "Bê-á-bá do systemd #2 (Brazilian Portuguese)",
+ "url": "https://community.ibm.com/community/user/legacy"
+ },
+ {
+ "category": "Publications",
+ "title": "Bê-á-bá do systemd #3 (Brazilian Portuguese)",
+ "url": "https://community.ibm.com/community/user/legacy"
+ },
+ {
+ "category": "Publications",
+ "title": "Bê-á-bá do systemd #4 (Brazilian Portuguese)",
+ "url": "https://community.ibm.com/community/user/legacy"
+ },
+ {
+ "category": "Publications",
+ "title": "Bê-á-bá do systemd #5 (Brazilian Portuguese)",
+ "url": "https://community.ibm.com/community/user/legacy"
+ },
+ {
+ "category": "Publications",
+ "title": "Bê-á-bá do systemd #6 (Brazilian Portuguese)",
+ "url": "https://community.ibm.com/community/user/legacy"
+ },
+ {
+ "category": "Publications",
+ "title": "Évolutions techniques de systemd (French)",
+ "url": "https://linuxfr.org/news/evolutions-techniques-de-systemd"
+ },
+ {
+ "category": "Publications",
+ "title": "RHEL7 docs",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/chap-managing_services_with_systemd"
+ },
+ {
+ "category": "Publications",
+ "title": "SUSE White Paper on systemd",
+ "url": "https://www.suse.com/media/white-paper/systemd_in_suse_linux_enterprise_12_white_paper.pdf"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about kdbus at linux.conf.au 2014",
+ "url": "https://mirror.linux.org.au/pub/linux.conf.au/2014/Friday/104-D-Bus_in_the_kernel_-_Lennart_Poettering.mp4"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at the Red Hat Summit 2013",
+ "url": "https://access.redhat.com/videos/403833"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about the journal at Devconf 2013",
+ "url": "https://www.youtube.com/watch?v=i4CACB7paLc"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about recent developments at Devconf 2013",
+ "url": "https://www.youtube.com/watch?v=_rrpjYD373A"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at FOSDEM 2013",
+ "url": "https://ftp.fau.de/fosdem/2013/maintracks/Janson/systemd,_Two_Years_Later.webm"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at FOSDEM 2013 (Slides)",
+ "url": "https://0pointer.de/public/systemd-fosdem2013.pdf"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at FOSS.in 2012",
+ "url": "https://www.youtube.com/watch?v=_2aa34Uzr3c"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at OSEC Barcamp 2012",
+ "url": "https://www.youtube.com/watch?v=9UnEV9SPuw8"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at FOSDEM 2011",
+ "url": "https://www.youtube.com/watch?v=TyMLi8QF6sw"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at linux.conf.au 2011",
+ "url": "http://linuxconfau.blip.tv/file/4696791/"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at linux.conf.au 2011 (Slides)",
+ "url": "https://0pointer.de/public/systemd-lca2011.pdf"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Interview about systemd at golem.de (German)",
+ "url": "https://video.golem.de/oss/4823/interview-mit-lennart-poettering-entwickler-systemd.html"
+ },
+ {
+ "category": "Videos for Users and Administrators",
+ "title": "Presentation about systemd at OSworld 2014 (systemd cheat-sheet) (Polish)",
+ "url": "https://www.youtube.com/watch?v=tU3HJVUPMyw"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#01: Verifying Bootup",
+ "url": "https://0pointer.de/blog/projects/systemd-for-admins-1.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#02: Which Service Owns Which Processes?",
+ "url": "https://0pointer.de/blog/projects/systemd-for-admins-2.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#03: How Do I Convert A SysV Init Script Into A systemd Service File?",
+ "url": "https://0pointer.de/blog/projects/systemd-for-admins-3.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#04: Killing Services",
+ "url": "https://0pointer.de/blog/projects/systemd-for-admins-4.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#05: The Three Levels of \"Off\"",
+ "url": "https://0pointer.de/blog/projects/three-levels-of-off"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#06: Changing Roots",
+ "url": "https://0pointer.de/blog/projects/changing-roots.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#07: The Blame Game",
+ "url": "https://0pointer.de/blog/projects/blame-game.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#08: The New Configuration Files",
+ "url": "https://0pointer.de/blog/projects/the-new-configuration-files"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#09: On /etc/sysconfig and /etc/default",
+ "url": "https://0pointer.de/blog/projects/on-etc-sysinit.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#10: Instantiated Services",
+ "url": "https://0pointer.de/blog/projects/instances.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#11: Converting inetd Services",
+ "url": "https://0pointer.de/blog/projects/inetd.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#12: Securing Your Services",
+ "url": "https://0pointer.de/blog/projects/security.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#13: Log and Service Status",
+ "url": "https://0pointer.de/blog/projects/systemctl-journal.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#14: The Self-Explanatory Boot",
+ "url": "https://0pointer.de/blog/projects/self-documented-boot.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#15: Watchdogs",
+ "url": "https://0pointer.de/blog/projects/watchdog.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#16: Gettys on Serial Consoles (and Elsewhere)",
+ "url": "https://0pointer.de/blog/projects/serial-console.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#17: Using the Journal",
+ "url": "https://0pointer.de/blog/projects/journalctl.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#18: Managing Resources",
+ "url": "https://0pointer.de/blog/projects/resources.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#19: Detecting Virtualization",
+ "url": "https://0pointer.de/blog/projects/detect-virt.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#20: Socket Activated Internet Services and OS Containers",
+ "url": "https://0pointer.de/blog/projects/socket-activated-containers.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "#21: Container Integration",
+ "url": "https://0pointer.net/blog/systemd-for-administrators-part-xxi.html"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "A Russian translation",
+ "url": "https://wiki.opennet.ru/Systemd_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "A more complete Russian translation (PDF)",
+ "url": "http://www2.kangran.su/~nnz/pub/s4a/s4a_latest.pdf"
+ },
+ {
+ "category": "The systemd for Administrators Blog Series",
+ "title": "A Vietnamese translation",
+ "url": "https://archlinuxvn.org/doc/systemd/#lp"
+ },
+ {
+ "category": "The systemd for Developers Series",
+ "title": "#1: Socket Activation",
+ "url": "https://0pointer.de/blog/projects/socket-activation.html"
+ },
+ {
+ "category": "The systemd for Developers Series",
+ "title": "#2: Socket Activation (Part 2)",
+ "url": "https://0pointer.de/blog/projects/socket-activation2.html"
+ },
+ {
+ "category": "The systemd for Developers Series",
+ "title": "#3: Logging to the Journal",
+ "url": "https://0pointer.de/blog/projects/journal-submit.html"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Go Bindings for the Journal API, socket activation and DBUS",
+ "url": "https://github.com/coreos/go-systemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "PHP Bindings for the Journal APIs",
+ "url": "https://github.com/systemd/php-systemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Lua Bindinds for systemd APIs",
+ "url": "https://github.com/daurnimator/lua-systemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Node.JS bindings for the Journal APIs",
+ "url": "https://www.fourkitchens.com/blog/2012/09/25/nodejs-extension-systemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Node.JS support for systemd Socket Activation",
+ "url": "https://www.npmjs.com/package/systemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Node.JS wrapper for sd_notify",
+ "url": "https://www.npmjs.com/package/sd-notify"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Node.JS wrapper for sd_notify (repo)",
+ "url": "https://github.com/systemd/node-sd-notify"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Experimental Qt bindings",
+ "url": "https://github.com/ilpianista/libsystemd-qt"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Haskell socket activation",
+ "url": "https://hackage.haskell.org/package/socket-activation"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Haskell Journal API",
+ "url": "https://hackage.haskell.org/package/libsystemd-journal"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Ruby bindings for the Journal APIs",
+ "url": "https://github.com/ledbettj/systemd-journal"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Ruby bindings for the systemd D-Bus APIs",
+ "url": "https://github.com/nathwill/ruby-dbus-systemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Erlang bindings for the Journal APIs",
+ "url": "https://github.com/systemd/ejournald"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Erlang journald backend for Lager",
+ "url": "https://github.com/travelping/lager_journald_backend"
+ },
+ {
+ "category": "Related Packages",
+ "title": "Perl bindings for the Journal APIs",
+ "url": "https://metacpan.org/release/LKUNDRAK/Log-Journald-0.10"
+ },
+ {
+ "category": "Related Packages",
+ "title": "GLib bindings",
+ "url": "https://github.com/tcbrindle/systemd-glib"
+ },
+ {
+ "category": "Related Packages",
+ "title": "python-systemd",
+ "url": "https://www.freedesktop.org/software/systemd/python-systemd/index.html"
+ },
+ {
+ "category": "Related Packages",
+ "title": "pystemd",
+ "url": "https://github.com/systemd/pystemd"
+ },
+ {
+ "category": "Related Packages",
+ "title": "C++ bindings for sd-bus",
+ "url": "https://github.com/Kistler-Group/sdbus-cpp/"
+ },
+ {
+ "category": "Documentation for Developers - external links",
+ "title": "On /etc/os-release",
+ "url": "http://0pointer.de/blog/projects/os-release.html"
+ },
+ {
+ "category": "Documentation for Developers - external links",
+ "title": "Control Groups vs. Control Groups",
+ "url": "http://0pointer.de/blog/projects/cgroups-vs-cgroups.html"
+ },
+ {
+ "category": "Documentation for Developers - external links",
+ "title": "The 30 Biggest Myths about systemd",
+ "url": "http://0pointer.de/blog/projects/the-biggest-myths.html"
+ },
+ {
+ "category": "Documentation for Developers - external links",
+ "title": "Introduction to systemd in French",
+ "url": "http://lea-linux.org/documentations/Systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Fedora packages",
+ "url": "https://packages.fedoraproject.org/pkgs/systemd/systemd/"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Fedora sources",
+ "url": "https://src.fedoraproject.org/rpms/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Fedora bugtracker",
+ "url": "https://bugzilla.redhat.com/buglist.cgi?list_id=565273&classification=Fedora&query_format=advanced&bug_status=NEW&bug_status=ASSIGNED&bug_status=MODIFIED&bug_status=ON_DEV&bug_status=ON_QA&bug_status=VERIFIED&bug_status=RELEASE_PENDING&bug_status=POST&component=systemd&product=Fedora"
+ },
+ {
+ "category": "The various distributions",
+ "title": "openSUSE packages",
+ "url": "https://build.opensuse.org/package/show/Base:System/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "openSUSE instructions",
+ "url": "http://en.opensuse.org/SDB:Systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "openSUSE bugtracker",
+ "url": "https://bugzilla.novell.com/buglist.cgi?short_desc=systemd&field0-0-0=product&type0-0-1=substring&field0-0-1=component&classification=openSUSE&value0-0-2=systemd&query_based_on=systemd&query_format=advanced&type0-0-3=substring&field0-0-3=status_whiteboard&value0-0-3=systemd&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=NEEDINFO&bug_status=REOPENED&short_desc_type=allwordssubstr&field0-0-2=short_desc&value0-0-1=systemd&type0-0-0=substring&value0-0-0=systemd&type0-0-2=substring&known_name=systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Arch Linux packages",
+ "url": "https://www.archlinux.org/packages/core/x86_64/systemd/"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Arch Linux wiki",
+ "url": "https://wiki.archlinux.org/index.php/Systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Arch Linux bugtracker",
+ "url": "https://gitlab.archlinux.org/archlinux/packaging/packages/systemd/-/issues"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Debian packages",
+ "url": "http://packages.debian.org/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Debian wiki",
+ "url": "http://wiki.debian.org/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Debian bugtracker",
+ "url": "http://bugs.debian.org/cgi-bin/pkgreport.cgi?ordering=normal;archive=0;src=systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Ubuntu packages",
+ "url": "https://launchpad.net/ubuntu/+source/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Ubuntu wiki",
+ "url": "https://wiki.ubuntu.com/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Mageia packages",
+ "url": "http://svnweb.mageia.org/packages/cauldron/systemd/current/"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Mageia bugtracker",
+ "url": "https://bugs.mageia.org/buglist.cgi?field0-0-0=cf_rpmpkg&query_format=advanced&bug_status=NEW&bug_status=UNCONFIRMED&bug_status=ASSIGNED&bug_status=REOPENED&type0-0-0=substring&value0-0-0=systemd&component=RPM%20Packages&product=Mageia"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Gentoo packages",
+ "url": "http://packages.gentoo.org/package/sys-apps/systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Gentoo wiki",
+ "url": "http://wiki.gentoo.org/wiki/Systemd"
+ },
+ {
+ "category": "The various distributions",
+ "title": "Gentoo bugtracker",
+ "url": "https://bugs.gentoo.org/buglist.cgi?quicksearch=systemd"
+ }
]
diff --git a/docs/assets/systemd-boot-menu.png b/docs/assets/systemd-boot-menu.png
new file mode 100644
index 0000000000..25f3bed0e0
--- /dev/null
+++ b/docs/assets/systemd-boot-menu.png
Binary files differ
diff --git a/hwdb.d/60-keyboard.hwdb b/hwdb.d/60-keyboard.hwdb
index acb23bfbf7..8a0693cf0d 100644
--- a/hwdb.d/60-keyboard.hwdb
+++ b/hwdb.d/60-keyboard.hwdb
@@ -915,6 +915,14 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnINVENTEC:pnSYMPHONY*6.0/7.0:*
KEYBOARD_KEY_f4=prog1
###########################################################
+# Kvadra
+###########################################################
+
+# LE14U/LE15U
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnKVADRA*:pn*LE1*U*:*
+ KEYBOARD_KEY_76=f21 # Fn+F1 Toggle touchpad, sends meta+ctrl+toggle
+
+###########################################################
# Lenovo
###########################################################
diff --git a/hwdb.d/60-sensor.hwdb b/hwdb.d/60-sensor.hwdb
index bbdb217440..ce800da5e4 100644
--- a/hwdb.d/60-sensor.hwdb
+++ b/hwdb.d/60-sensor.hwdb
@@ -311,7 +311,7 @@ sensor:modalias:acpi:BOSC0200*:dmi:*:svnHampoo*:pnC3W6_AP108_4GB:*
# Chuwi Ubook X (CWI535)
sensor:modalias:acpi:MXC6655*:dmi*:svnCHUWIInnovationAndTechnology*:pnUBookX:*
- ACCEL_MOUNT_MATRIX=0, 0, -1; 1, 0, 0; 0, 1, 0
+ ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, -1
#########################################
# Connect
diff --git a/hwdb.d/70-av-production.hwdb b/hwdb.d/70-av-production.hwdb
index 9890d726e5..a701d1c1ea 100644
--- a/hwdb.d/70-av-production.hwdb
+++ b/hwdb.d/70-av-production.hwdb
@@ -56,6 +56,10 @@ usb:v0FD9p006D*
usb:v0FD9p0080*
ID_AV_PRODUCTION_CONTROLLER=1
+# Stream Deck Plus
+usb:v0FD9p0084*
+ ID_AV_PRODUCTION_CONTROLLER=1
+
# Stream Deck Pedal
usb:v0FD9p0086*
ID_AV_PRODUCTION_CONTROLLER=1
diff --git a/hwdb.d/70-sound-card.hwdb b/hwdb.d/70-sound-card.hwdb
index dd5ef05583..a7ea8c64ee 100644
--- a/hwdb.d/70-sound-card.hwdb
+++ b/hwdb.d/70-sound-card.hwdb
@@ -16,6 +16,16 @@ usb:v1B1Cp0A51*
SOUND_FORM_FACTOR=headset
###########################################################
+# Microsoft
+###########################################################
+# Xbox Wireless Dongle
+usb:v045Ep02E6*
+usb:v045Ep02FE*
+usb:v045Ep02F9*
+usb:v045Ep091E*
+ SOUND_FORM_FACTOR=headset
+
+###########################################################
# Steelseries
###########################################################
# Arctis Headsets
diff --git a/man/daemon.xml b/man/daemon.xml
index e26be0d2ef..dc51041138 100644
--- a/man/daemon.xml
+++ b/man/daemon.xml
@@ -75,7 +75,7 @@
create an independent session.</para></listitem>
<listitem><para>In the child, call <function>fork()</function> again, to ensure that the daemon can
- never re-acquire a terminal again. (This relevant if the program — and all its dependencies — does
+ never re-acquire a terminal again. (This is relevant if the program — and all its dependencies — does
not carefully specify `O_NOCTTY` on each and every single `open()` call that might potentially open a
TTY device node.)</para></listitem>
diff --git a/man/homectl.xml b/man/homectl.xml
index 521d341248..1a0535cd4a 100644
--- a/man/homectl.xml
+++ b/man/homectl.xml
@@ -963,6 +963,28 @@
<xi:include href="version-info.xml" xpointer="v245"/></listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><option>--session-launcher=</option><replaceable>LAUNCHER</replaceable></term>
+
+ <listitem><para>Takes a string argument. Configures the user's preferred session launcher
+ .desktop entry file (i.e. <literal>gnome</literal>, <literal>plasma</literal>, or other names that
+ appear in <filename>/usr/share/xesssions/</filename> or <filename>/usr/share/wayland-sessions</filename>).
+ This is read by the display manager to pick the default session that is launched when the user logs in.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--session-type=</option><replaceable>TYPE</replaceable></term>
+
+ <listitem><para>Takes a string argument. Configures the user's preferred session type
+ (i.e. <literal>x11</literal>, <literal>wayland</literal>, and other values accepted by
+ <varname>$XDG_SESSION_TYPE</varname>). This is read by the display manage to pick the
+ default session type the user is logged into.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
</variablelist>
</refsect1>
diff --git a/man/importctl.xml b/man/importctl.xml
new file mode 100644
index 0000000000..25c49fc5dc
--- /dev/null
+++ b/man/importctl.xml
@@ -0,0 +1,442 @@
+<?xml version='1.0'?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
+<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
+
+<refentry id="importctl" conditional='ENABLE_MACHINED'
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+
+ <refentryinfo>
+ <title>importctl</title>
+ <productname>systemd</productname>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle>importctl</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>importctl</refname>
+ <refpurpose>Download, import or export disk images</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>importctl</command>
+ <arg choice="opt" rep="repeat">OPTIONS</arg>
+ <arg choice="req">COMMAND</arg>
+ <arg choice="opt" rep="repeat">NAME</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para><command>importctl</command> may be used to download, import export disk images via
+ <citerefentry><refentrytitle>systemd-importd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+
+ <para><command>importctl</command> operates both on block-level disk images (such as DDIs) as well as
+ file-system-level images (tarballs). It supports disk images are one of the four following
+ classes:</para>
+
+ <itemizedlist>
+ <listitem><para>VM images or full OS container images, that may be run via
+ <citerefentry><refentrytitle>systemd-vmspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry> or
+ <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>, and
+ managed via
+ <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para></listitem>
+
+ <listitem><para>Portable service images, that may be attached an managed via
+ <citerefentry><refentrytitle>portablectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para></listitem>
+
+ <listitem><para>System extension (sysext) images, that may be activated via
+ <citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para></listitem>
+
+ <listitem><para>Configuration extension (confext) images, that may be activated via
+ <citerefentry><refentrytitle>systemd-confext</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para></listitem>
+ </itemizedlist>
+
+ <para>When images are downloaded or imported they are placed in the following directories, depending on
+ the <option>--class=</option> parameter:</para>
+
+ <table>
+ <title>Classes and Directories</title>
+ <tgroup cols='2'>
+ <colspec colname='class' />
+ <colspec colname='directory' />
+ <thead>
+ <row>
+ <entry>Class</entry>
+ <entry>Directory</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>machine</literal></entry>
+ <entry><filename>/var/lib/machines/</filename></entry>
+ </row>
+ <row>
+ <entry><literal>portable</literal></entry>
+ <entry><filename>/var/lib/portables/</filename></entry>
+ </row>
+ <row>
+ <entry><literal>sysext</literal></entry>
+ <entry><filename>/var/lib/extensions/</filename></entry>
+ </row>
+ <row>
+ <entry><literal>confext</literal></entry>
+ <entry><filename>/var/lib/confexts/</filename></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </refsect1>
+
+ <refsect1>
+ <title>Commands</title>
+
+ <para>The following commands are understood:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><command>pull-tar</command> <replaceable>URL</replaceable> [<replaceable>NAME</replaceable>]</term>
+
+ <listitem><para>Downloads a <filename>.tar</filename> image from the specified URL, and makes it
+ available under the specified local name in the image directory for the selected
+ <option>--class=</option>. The URL must be of type <literal>http://</literal> or
+ <literal>https://</literal>, and must refer to a <filename>.tar</filename>,
+ <filename>.tar.gz</filename>, <filename>.tar.xz</filename> or <filename>.tar.bz2</filename> archive
+ file. If the local image name is omitted, it is automatically derived from the last component of the
+ URL, with its suffix removed.</para>
+
+ <para>The image is verified before it is made available, unless <option>--verify=no</option> is
+ specified. Verification is done either via an inline signed file with the name of the image and the
+ suffix <filename>.sha256</filename> or via separate <filename>SHA256SUMS</filename> and
+ <filename>SHA256SUMS.gpg</filename> files. The signature files need to be made available on the same
+ web server, under the same URL as the <filename>.tar</filename> file. With
+ <option>--verify=checksum</option>, only the SHA256 checksum for the file is verified, based on the
+ <filename>.sha256</filename> suffixed file or the <filename>SHA256SUMS</filename> file. With
+ <option>--verify=signature</option>, the sha checksum file is first verified with the inline
+ signature in the <filename>.sha256</filename> file or the detached GPG signature file
+ <filename>SHA256SUMS.gpg</filename>. The public key for this verification step needs to be available
+ in <filename>/usr/lib/systemd/import-pubring.gpg</filename> or
+ <filename>/etc/systemd/import-pubring.gpg</filename>.</para>
+
+ <para>If <option>-keep-download=yes</option> is specified the image will be downloaded and stored in
+ a read-only subvolume/directory in the image directory that is named after the specified URL and its
+ HTTP etag. A writable snapshot is then taken from this subvolume, and named after the specified local
+ name. This behavior ensures that creating multiple instances of the same URL is efficient, as
+ multiple downloads are not necessary. In order to create only the read-only image, and avoid creating
+ its writable snapshot, specify <literal>-</literal> as local name.</para>
+
+ <para>Note that pressing C-c during execution of this command will not abort the download. Use
+ <command>cancel-transfer</command>, described below.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>pull-raw</command> <replaceable>URL</replaceable> [<replaceable>NAME</replaceable>]</term>
+
+ <listitem><para>Downloads a <filename>.raw</filename> disk image from the specified URL, and makes it
+ available under the specified local name in the image directory for the selected
+ <option>--class=</option>. The URL must be of type <literal>http://</literal> or
+ <literal>https://</literal>. The image must either be a <filename>.qcow2</filename> or raw disk
+ image, optionally compressed as <filename>.gz</filename>, <filename>.xz</filename>, or
+ <filename>.bz2</filename>. If the local name is omitted, it is automatically derived from the last
+ component of the URL, with its suffix removed.</para>
+
+ <para>Image verification is identical for raw and tar images (see above).</para>
+
+ <para>If the downloaded image is in <filename>.qcow2</filename> format it is converted into a raw
+ image file before it is made available.</para>
+
+ <para>If <option>-keep-download=yes</option> is specified the image will be downloaded and stored in
+ a read-only file in the image directory that is named after the specified URL and its HTTP etag. A
+ writable copy is then made from this file, and named after the specified local name. This behavior
+ ensures that creating multiple instances of the same URL is efficient, as multiple downloads are not
+ necessary. In order to create only the read-only image, and avoid creating its writable copy,
+ specify <literal>-</literal> as local name.</para>
+
+ <para>Note that pressing C-c during execution of this command will not abort the download. Use
+ <command>cancel-transfer</command>, described below.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>import-tar</command> <replaceable>FILE</replaceable> [<replaceable>NAME</replaceable>]</term>
+ <term><command>import-raw</command> <replaceable>FILE</replaceable> [<replaceable>NAME</replaceable>]</term>
+
+ <listitem><para>Imports a TAR or RAW image, and places it under the specified name in the image
+ directory for the image class selected via <option>--class=</option>. When
+ <command>import-tar</command> is used, the file specified as the first argument should be a tar
+ archive, possibly compressed with xz, gzip or bzip2. It will then be unpacked into its own
+ subvolume/directory. When <command>import-raw</command> is used, the file should be a qcow2 or raw
+ disk image, possibly compressed with xz, gzip or bzip2. If the second argument (the resulting image
+ name) is not specified, it is automatically derived from the file name. If the filename is passed as
+ <literal>-</literal>, the image is read from standard input, in which case the second argument is
+ mandatory.</para>
+
+ <para>No cryptographic validation is done when importing the images.</para>
+
+ <para>Much like image downloads, ongoing imports may be listed with <command>list</command>
+ and aborted with <command>cancel-transfer</command>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>import-fs</command> <replaceable>DIRECTORY</replaceable> [<replaceable>NAME</replaceable>]</term>
+
+ <listitem><para>Imports an image stored in a local directory into the image directory for the image
+ class selected via <option>--class=</option> and operates similarly to <command>import-tar</command>
+ or <command>import-raw</command>, but the first argument is the source directory. If supported, this
+ command will create a btrfs snapshot or subvolume for the new image.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>export-tar</command> <replaceable>NAME</replaceable> [<replaceable>FILE</replaceable>]</term>
+ <term><command>export-raw</command> <replaceable>NAME</replaceable> [<replaceable>FILE</replaceable>]</term>
+
+ <listitem><para>Exports a TAR or RAW image and stores it in the specified file. The first parameter
+ should be an image name. The second parameter should be a file path the TAR or RAW
+ image is written to. If the path ends in <literal>.gz</literal>, the file is compressed with gzip, if
+ it ends in <literal>.xz</literal>, with xz, and if it ends in <literal>.bz2</literal>, with bzip2. If
+ the path ends in neither, the file is left uncompressed. If the second argument is missing, the image
+ is written to standard output. The compression may also be explicitly selected with the
+ <option>--format=</option> switch. This is in particular useful if the second parameter is left
+ unspecified.</para>
+
+ <para>Much like image downloads and imports, ongoing exports may be listed with
+ <command>list</command> and aborted with <command>cancel-transfer</command>.</para>
+
+ <para>Note that, currently, only directory and subvolume images may be exported as TAR images, and
+ only raw disk images as RAW images.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>list-transfer</command></term>
+
+ <listitem><para>Shows a list of image downloads, imports and exports that are currently in
+ progress.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>cancel-transfer</command> <replaceable>ID</replaceable>…</term>
+
+ <listitem><para>Aborts a download, import or export of the image with the specified ID. To list
+ ongoing transfers and their IDs, use <command>list</command>. </para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>list-images</command></term>
+
+ <listitem><para>Shows a list of already downloaded/imported images.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Options</title>
+
+ <para>The following options are understood:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>--read-only</option></term>
+
+ <listitem>
+ <para>When used with <command>pull-raw</command>, <command>pull-tar</command>,
+ <command>import-raw</command>, <command>import-tar</command> or <command>import-fs</command> a
+ read-only image is created.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--verify=</option></term>
+
+ <listitem><para>When downloading an image, specify whether the image shall be verified before it is
+ made available. Takes one of <literal>no</literal>, <literal>checksum</literal> and
+ <literal>signature</literal>. If <literal>no</literal>, no verification is done. If
+ <literal>checksum</literal> is specified, the download is checked for integrity after the transfer is
+ complete, but no signatures are verified. If <literal>signature</literal> is specified, the checksum
+ is verified and the image's signature is checked against a local keyring of trustable vendors. It is
+ strongly recommended to set this option to <literal>signature</literal> if the server and protocol
+ support this. Defaults to <literal>signature</literal>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--force</option></term>
+
+ <listitem><para>When downloading an image, and a local copy by the specified local name already
+ exists, delete it first and replace it by the newly downloaded image.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--format=</option></term>
+
+ <listitem><para>When used with the <option>export-tar</option> or <option>export-raw</option>
+ commands, specifies the compression format to use for the resulting file. Takes one of
+ <literal>uncompressed</literal>, <literal>xz</literal>, <literal>gzip</literal>,
+ <literal>bzip2</literal>. By default, the format is determined automatically from the output image
+ file name passed.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-q</option></term>
+ <term><option>--quiet</option></term>
+
+ <listitem><para>Suppresses additional informational output while running.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <xi:include href="user-system-options.xml" xpointer="host" />
+
+ <varlistentry>
+ <term><option>-M</option></term>
+ <term><option>--machine=</option></term>
+
+ <listitem><para>Connect to
+ <citerefentry><refentrytitle>systemd-import.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ running in a local container, to perform the specified operation within the container.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--class=</option></term>
+ <term><option>-m</option></term>
+ <term><option>-P</option></term>
+ <term><option>-S</option></term>
+ <term><option>-C</option></term>
+
+ <listitem><para>Selects the image class for the downloaded images. This primarily selects the
+ directory to download into. The <option>--class=</option> switch takes <literal>machine</literal>,
+ <literal>portable</literal>, <literal>sysext</literal> or <literal>confext</literal> as argument. The
+ short options <option>-m</option>, <option>-P</option>, <option>-S</option>, <option>-C</option> are
+ shortcuts for <option>--class=machine</option>, <option>--class=portable</option>,
+ <option>--class=sysext</option>, <option>--class=confext</option>.</para>
+
+ <para>Note that <option>--keep-download=</option> defaults to true for
+ <option>--class=machine</option> and false otherwise, see below.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--keep-download=</option></term>
+ <term><option>-N</option></term>
+
+ <listitem><para>Takes a boolean argument. When specified with <command>pull-raw</command> or
+ <command>pull-tar</command>, selects whether to download directly into the specified local image
+ name, or whether to download into a read-only copy first of which to make a writable copy after the
+ download is completed. Defaults to true for <option>--class=machine</option>, false otherwise.</para>
+
+ <para>The <option>-N</option> switch is a shortcut for <option>--keep-download=no</option>.</para>
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <xi:include href="standard-options.xml" xpointer="json" />
+ <xi:include href="standard-options.xml" xpointer="j" />
+ <xi:include href="standard-options.xml" xpointer="no-pager" />
+ <xi:include href="standard-options.xml" xpointer="no-legend" />
+ <xi:include href="standard-options.xml" xpointer="no-ask-password" />
+ <xi:include href="standard-options.xml" xpointer="help" />
+ <xi:include href="standard-options.xml" xpointer="version" />
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+ <example id="example-import-tar">
+ <title>Download an Ubuntu TAR image and open a shell in it</title>
+
+ <programlisting># importctl pull-tar -mN https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64-root.tar.xz
+# systemd-nspawn -M jammy-server-cloudimg-amd64-root</programlisting>
+
+ <para>This downloads and verifies the specified <filename>.tar</filename> image, and then uses
+ <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry> to
+ open a shell in it.</para>
+ </example>
+
+ <example id="example-import-raw">
+ <title>Download an Ubuntu RAW image, set a root password in it, start
+ it as a service</title>
+
+ <programlisting># importctl pull-raw -mN \
+ https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64-disk-kvm.img \
+ jammy
+# systemd-firstboot --image=/var/lib/machines/jammy.raw --prompt-root-password --force
+# machinectl start jammy
+# machinectl login jammy</programlisting>
+
+ <para>This downloads the specified <filename>.raw</filename> image and makes it available under the
+ local name <literal>jammy</literal>. Then, a root password is set with
+ <citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>. Afterwards
+ the machine is started as system service. With the last command a login prompt into the container is
+ requested.</para>
+ </example>
+
+ <example id="example-export-tar">
+ <title>Exports a container image as tar file</title>
+
+ <programlisting># importctl export-tar -m fedora myfedora.tar.xz</programlisting>
+
+ <para>Exports the container <literal>fedora</literal> as an xz-compressed tar file
+ <filename>myfedora.tar.xz</filename> into the current directory.</para>
+ </example>
+ </refsect1>
+
+ <refsect1>
+ <title>Exit status</title>
+
+ <para>On success, 0 is returned, a non-zero failure code
+ otherwise.</para>
+ </refsect1>
+
+ <xi:include href="common-variables.xml" />
+
+ <refsect1>
+ <title>See Also</title>
+ <para><simplelist type="inline">
+ <member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>systemd-importd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>systemd-vmspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>portablectl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>systemd-confext</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
+ <member><citerefentry project='die-net'><refentrytitle>tar</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry project='die-net'><refentrytitle>xz</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry project='die-net'><refentrytitle>gzip</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry project='die-net'><refentrytitle>bzip2</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ </simplelist></para>
+ </refsect1>
+
+</refentry>
diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml
index d4b005f876..72003d86f2 100644
--- a/man/kernel-command-line.xml
+++ b/man/kernel-command-line.xml
@@ -317,7 +317,7 @@
<term><varname>udev.blockdev_read_only</varname></term>
<term><varname>rd.udev.blockdev_read_only</varname></term>
<term><varname>net.ifnames=</varname></term>
- <term><varname>net.naming-scheme=</varname></term>
+ <term><varname>net.naming_scheme=</varname></term>
<listitem>
<para>Parameters understood by the device event managing
@@ -609,7 +609,7 @@
<citerefentry><refentrytitle>systemd-homed-firstboot.service</refentrytitle><manvolnum>1</manvolnum></citerefentry>
will not query the user for basic system settings, even if the system boots up for the first time and
the relevant settings are not initialized yet. Not to be confused with
- <varname>systemd.condition-first-boot=</varname> (see below), which overrides the result of the
+ <varname>systemd.condition_first_boot=</varname> (see below), which overrides the result of the
<varname>ConditionFirstBoot=</varname> unit file condition, and thus controls more than just
<filename>systemd-firstboot.service</filename> behaviour.</para>
@@ -617,7 +617,7 @@
</varlistentry>
<varlistentry>
- <term><varname>systemd.condition-needs-update=</varname></term>
+ <term><varname>systemd.condition_needs_update=</varname></term>
<listitem><para>Takes a boolean argument. If specified, overrides the result of
<varname>ConditionNeedsUpdate=</varname> unit condition checks. See
@@ -628,7 +628,7 @@
</varlistentry>
<varlistentry>
- <term><varname>systemd.condition-first-boot=</varname></term>
+ <term><varname>systemd.condition_first_boot=</varname></term>
<listitem><para>Takes a boolean argument. If specified, overrides the result of
<varname>ConditionFirstBoot=</varname> unit condition checks. See
@@ -641,7 +641,7 @@
</varlistentry>
<varlistentry>
- <term><varname>systemd.clock-usec=</varname></term>
+ <term><varname>systemd.clock_usec=</varname></term>
<listitem><para>Takes a decimal, numeric timestamp in μs since January 1st 1970, 00:00am, to set the
system clock to. The system time is set to the specified timestamp early during boot. It is not
@@ -651,7 +651,7 @@
</varlistentry>
<varlistentry>
- <term><varname>systemd.random-seed=</varname></term>
+ <term><varname>systemd.random_seed=</varname></term>
<listitem><para>Takes a base64 encoded random seed value to credit with full entropy to the kernel's
random pool during early service manager initialization. This option is useful in testing
@@ -677,6 +677,17 @@
</varlistentry>
<varlistentry>
+ <term><varname>systemd.allow_userspace_verity=</varname></term>
+
+ <listitem><para>Takes a boolean argument. Controls whether disk images that are Verity protected may
+ be authenticated in userspace signature checks via <filename>/etc/verity.d/</filename> (and related
+ directories) public key drop-ins, or whether in-kernel signature checking only. Defaults to
+ on.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>systemd.hostname=</varname></term>
<listitem><para>Accepts a hostname to set during early boot. If specified takes precedence over what
@@ -701,6 +712,37 @@
<xi:include href="version-info.xml" xpointer="v254"/></listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><varname>systemd.battery_check=</varname></term>
+
+ <listitem><para>Accepts a boolean argument. If false the boot-time battery charge check implemented
+ by
+ <citerefentry><refentrytitle>systemd-battery-check.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ is disabled.</para>
+
+ <xi:include href="version-info.xml" xpointer="v254"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>ifname=</varname></term>
+ <term><varname>net.ifname_policy=</varname></term>
+
+ <listitem><para>Controls interface naming policies, implemented by
+ <citerefentry><refentrytitle>systemd-network-generator.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v245"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>systemd.tpm2_wait=</varname></term>
+
+ <listitem><para>Controls whether to wait for a TPM2 device at boot, implemented by
+ <citerefentry><refentrytitle>systemd-tpm2-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
</variablelist>
</refsect1>
diff --git a/man/machinectl.xml b/man/machinectl.xml
index 0fe6150bae..3964dc0580 100644
--- a/man/machinectl.xml
+++ b/man/machinectl.xml
@@ -80,6 +80,9 @@
<listitem><para>The file system tree of the host OS itself.</para></listitem>
</itemizedlist>
+ <para>Images may be downloaded, imported and exported via the
+ <citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+ tool.</para>
</refsect1>
<refsect1>
@@ -87,8 +90,9 @@
<para>The following commands are understood:</para>
- <refsect2><title>Machine Commands</title><variablelist>
+ <refsect2><title>Machine Commands</title>
+ <variablelist>
<varlistentry>
<term><command>list</command></term>
@@ -279,7 +283,7 @@
trigger a reboot by sending SIGINT to the container's init
process, which is roughly equivalent to pressing Ctrl+Alt+Del
on a non-containerized system, and is compatible with
- containers running any system manager. Use <command>restart</command> as alias
+ containers running any system manager. Use <command>restart</command> as alias
for <command>reboot</command>.</para>
<xi:include href="version-info.xml" xpointer="v209"/></listitem>
@@ -361,8 +365,9 @@
</varlistentry>
</variablelist></refsect2>
- <refsect2><title>Image Commands</title><variablelist>
+ <refsect2><title>Image Commands</title>
+ <variablelist>
<varlistentry>
<term><command>list-images</command></term>
@@ -515,7 +520,7 @@
<para>When combined with the <option>--all</option> switch removes all images, not just hidden ones. This
command effectively empties <filename>/var/lib/machines/</filename>.</para>
- <para>Note that commands such as <command>machinectl pull-tar</command> or <command>machinectl
+ <para>Note that commands such as <command>importctl pull-tar</command> or <command>importctl
pull-raw</command> usually create hidden, read-only, unmodified machine images from the downloaded image first,
before cloning a writable working copy of it, in order to avoid duplicate downloads in case of images that are
reused multiple times. Use <command>machinectl clean</command> to remove old, hidden images created this
@@ -525,197 +530,6 @@
</varlistentry>
</variablelist></refsect2>
-
- <refsect2><title>Image Transfer Commands</title><variablelist>
-
- <varlistentry>
- <term><command>pull-tar</command> <replaceable>URL</replaceable> [<replaceable>NAME</replaceable>]</term>
-
- <listitem><para>Downloads a <filename>.tar</filename>
- container image from the specified URL, and makes it available
- under the specified local machine name. The URL must be of
- type <literal>http://</literal> or
- <literal>https://</literal>, and must refer to a
- <filename>.tar</filename>, <filename>.tar.gz</filename>,
- <filename>.tar.xz</filename> or <filename>.tar.bz2</filename>
- archive file. If the local machine name is omitted, it
- is automatically derived from the last component of the URL,
- with its suffix removed.</para>
-
- <para>The image is verified before it is made available, unless
- <option>--verify=no</option> is specified.
- Verification is done either via an inline signed file with the name
- of the image and the suffix <filename>.sha256</filename> or via
- separate <filename>SHA256SUMS</filename> and
- <filename>SHA256SUMS.gpg</filename> files.
- The signature files need to be made available on the same web
- server, under the same URL as the <filename>.tar</filename> file.
- With <option>--verify=checksum</option>, only the SHA256 checksum
- for the file is verified, based on the <filename>.sha256</filename>
- suffixed file or the <filename>SHA256SUMS</filename> file.
- With <option>--verify=signature</option>, the sha checksum file is
- first verified with the inline signature in the
- <filename>.sha256</filename> file or the detached GPG signature file
- <filename>SHA256SUMS.gpg</filename>.
- The public key for this verification step needs to be available in
- <filename>/usr/lib/systemd/import-pubring.gpg</filename> or
- <filename>/etc/systemd/import-pubring.gpg</filename>.</para>
-
- <para>The container image will be downloaded and stored in a
- read-only subvolume in
- <filename>/var/lib/machines/</filename> that is named after
- the specified URL and its HTTP etag. A writable snapshot is
- then taken from this subvolume, and named after the specified
- local name. This behavior ensures that creating multiple
- container instances of the same URL is efficient, as multiple
- downloads are not necessary. In order to create only the
- read-only image, and avoid creating its writable snapshot,
- specify <literal>-</literal> as local machine name.</para>
-
- <para>Note that the read-only subvolume is prefixed with
- <filename>.tar-</filename>, and is thus not shown by
- <command>list-images</command>, unless <option>--all</option>
- is passed.</para>
-
- <para>Note that pressing C-c during execution of this command
- will not abort the download. Use
- <command>cancel-transfer</command>, described
- below.</para>
-
- <xi:include href="version-info.xml" xpointer="v219"/></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>pull-raw</command> <replaceable>URL</replaceable> [<replaceable>NAME</replaceable>]</term>
-
- <listitem><para>Downloads a <filename>.raw</filename>
- container or VM disk image from the specified URL, and makes
- it available under the specified local machine name. The URL
- must be of type <literal>http://</literal> or
- <literal>https://</literal>. The container image must either
- be a <filename>.qcow2</filename> or raw disk image, optionally
- compressed as <filename>.gz</filename>,
- <filename>.xz</filename>, or <filename>.bz2</filename>. If the
- local machine name is omitted, it is automatically
- derived from the last component of the URL, with its suffix
- removed.</para>
-
- <para>Image verification is identical for raw and tar images
- (see above).</para>
-
- <para>If the downloaded image is in
- <filename>.qcow2</filename> format it is converted into a raw
- image file before it is made available.</para>
-
- <para>Downloaded images of this type will be placed as
- read-only <filename>.raw</filename> file in
- <filename>/var/lib/machines/</filename>. A local, writable
- (reflinked) copy is then made under the specified local
- machine name. To omit creation of the local, writable copy
- pass <literal>-</literal> as local machine name.</para>
-
- <para>Similarly to the behavior of <command>pull-tar</command>, the read-only image is prefixed with
- <filename>.raw-</filename>, and thus not shown by <command>list-images</command>, unless
- <option>--all</option> is passed.</para>
-
- <para>Note that pressing C-c during execution of this command
- will not abort the download. Use
- <command>cancel-transfer</command>, described
- below.</para>
-
- <xi:include href="version-info.xml" xpointer="v219"/></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>import-tar</command> <replaceable>FILE</replaceable> [<replaceable>NAME</replaceable>]</term>
- <term><command>import-raw</command> <replaceable>FILE</replaceable> [<replaceable>NAME</replaceable>]</term>
- <listitem><para>Imports a TAR or RAW container or VM image,
- and places it under the specified name in
- <filename>/var/lib/machines/</filename>. When
- <command>import-tar</command> is used, the file specified as
- the first argument should be a tar archive, possibly compressed
- with xz, gzip or bzip2. It will then be unpacked into its own
- subvolume in <filename>/var/lib/machines/</filename>. When
- <command>import-raw</command> is used, the file should be a
- qcow2 or raw disk image, possibly compressed with xz, gzip or
- bzip2. If the second argument (the resulting image name) is
- not specified, it is automatically derived from the file
- name. If the filename is passed as <literal>-</literal>, the
- image is read from standard input, in which case the second
- argument is mandatory.</para>
-
- <para>Optionally, the <option>--read-only</option> switch may be used to create a read-only container or VM
- image. No cryptographic validation is done when importing the images.</para>
-
- <para>Much like image downloads, ongoing imports may be listed
- with <command>list-transfers</command> and aborted with
- <command>cancel-transfer</command>.</para>
-
- <xi:include href="version-info.xml" xpointer="v220"/></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>import-fs</command> <replaceable>DIRECTORY</replaceable> [<replaceable>NAME</replaceable>]</term>
-
- <listitem><para>Imports a container image stored in a local directory into
- <filename>/var/lib/machines/</filename>, operates similarly to <command>import-tar</command> or
- <command>import-raw</command>, but the first argument is the source directory. If supported, this
- command will create a btrfs snapshot or subvolume for the new image.</para>
-
- <xi:include href="version-info.xml" xpointer="v240"/></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>export-tar</command> <replaceable>NAME</replaceable> [<replaceable>FILE</replaceable>]</term>
- <term><command>export-raw</command> <replaceable>NAME</replaceable> [<replaceable>FILE</replaceable>]</term>
- <listitem><para>Exports a TAR or RAW container or VM image and
- stores it in the specified file. The first parameter should be
- a VM or container image name. The second parameter should be a
- file path the TAR or RAW image is written to. If the path ends
- in <literal>.gz</literal>, the file is compressed with gzip, if
- it ends in <literal>.xz</literal>, with xz, and if it ends in
- <literal>.bz2</literal>, with bzip2. If the path ends in
- neither, the file is left uncompressed. If the second argument
- is missing, the image is written to standard output. The
- compression may also be explicitly selected with the
- <option>--format=</option> switch. This is in particular
- useful if the second parameter is left unspecified.</para>
-
- <para>Much like image downloads and imports, ongoing exports
- may be listed with <command>list-transfers</command> and
- aborted with
- <command>cancel-transfer</command>.</para>
-
- <para>Note that, currently, only directory and subvolume images
- may be exported as TAR images, and only raw disk images as RAW
- images.</para>
-
- <xi:include href="version-info.xml" xpointer="v220"/></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>list-transfers</command></term>
-
- <listitem><para>Shows a list of container or VM image
- downloads, imports and exports that are currently in
- progress.</para>
-
- <xi:include href="version-info.xml" xpointer="v219"/></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>cancel-transfer</command> <replaceable>ID</replaceable>…</term>
-
- <listitem><para>Aborts a download, import or export of the
- container or VM image with the specified ID. To list ongoing
- transfers and their IDs, use
- <command>list-transfers</command>. </para>
-
- <xi:include href="version-info.xml" xpointer="v219"/></listitem>
- </varlistentry>
-
- </variablelist></refsect2>
-
</refsect1>
<refsect1>
@@ -739,6 +553,17 @@
<xi:include href="version-info.xml" xpointer="v206"/></listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--value</option></term>
+
+ <listitem><para>When printing properties with <command>show</command>, only print the value,
+ and skip the property name and <literal>=</literal>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v230"/></listitem>
+ </varlistentry>
+
+ <xi:include href="timedatectl.xml" xpointer="option-P"/>
+
<varlistentry>
<term><option>-a</option></term>
<term><option>--all</option></term>
@@ -756,15 +581,6 @@
<xi:include href="version-info.xml" xpointer="v206"/></listitem>
</varlistentry>
- <varlistentry>
- <term><option>--value</option></term>
-
- <listitem><para>When printing properties with <command>show</command>, only print the value,
- and skip the property name and <literal>=</literal>.</para>
-
- <xi:include href="version-info.xml" xpointer="v230"/></listitem>
- </varlistentry>
-
<varlistentry>
<term><option>-l</option></term>
<term><option>--full</option></term>
@@ -834,8 +650,7 @@
<listitem><para>When used with <command>bind</command>, creates a read-only bind mount.</para>
- <para>When used with <command>clone</command>, <command>import-raw</command> or <command>import-tar</command> a
- read-only container or VM image is created.</para>
+ <para>When used with <command>clone</command> a read-only container or VM image is created.</para>
<xi:include href="version-info.xml" xpointer="v219"/></listitem>
</varlistentry>
@@ -867,24 +682,26 @@
</varlistentry>
<varlistentry>
- <term><option>--verify=</option></term>
-
- <listitem><para>When downloading a container or VM image,
- specify whether the image shall be verified before it is made
- available. Takes one of <literal>no</literal>,
- <literal>checksum</literal> and <literal>signature</literal>.
- If <literal>no</literal>, no verification is done. If
- <literal>checksum</literal> is specified, the download is
- checked for integrity after the transfer is complete, but no
- signatures are verified. If <literal>signature</literal> is
- specified, the checksum is verified and the image's signature
- is checked against a local keyring of trustable vendors. It is
- strongly recommended to set this option to
- <literal>signature</literal> if the server and protocol
- support this. Defaults to
- <literal>signature</literal>.</para>
+ <term><option>--runner=</option><option>nspawn</option>|<option>vmspawn</option></term>
- <xi:include href="version-info.xml" xpointer="v219"/></listitem>
+ <listitem><para>When operating on machines choose whether to use
+ <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+ or
+ <citerefentry><refentrytitle>systemd-vmspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+ By default
+ <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+ is used.
+ </para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-V</option></term>
+
+ <listitem><para><option>-V</option> is a shorthand for <option>--runner=vmspawn</option>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
</varlistentry>
<varlistentry>
@@ -903,29 +720,12 @@
<varlistentry>
<term><option>--force</option></term>
- <listitem><para>When downloading a container or VM image, and
- a local copy by the specified local machine name already
- exists, delete it first and replace it by the newly downloaded
- image.</para>
+ <listitem><para>Replace target file when copying files.</para>
<xi:include href="version-info.xml" xpointer="v219"/></listitem>
</varlistentry>
<varlistentry>
- <term><option>--format=</option></term>
-
- <listitem><para>When used with the <option>export-tar</option>
- or <option>export-raw</option> commands, specifies the
- compression format to use for the resulting file. Takes one of
- <literal>uncompressed</literal>, <literal>xz</literal>,
- <literal>gzip</literal>, <literal>bzip2</literal>. By default,
- the format is determined automatically from the image file
- name passed.</para>
-
- <xi:include href="version-info.xml" xpointer="v220"/></listitem>
- </varlistentry>
-
- <varlistentry>
<term><option>--max-addresses=</option></term>
<listitem><para>When used with the <option>list-machines</option> command, limits the number of IP
@@ -1046,58 +846,8 @@
<refsect1>
<title>Examples</title>
- <example>
- <title>Download a Ubuntu image and open a shell in it</title>
-
- <programlisting># machinectl pull-tar https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-root.tar.gz
-# systemd-nspawn -M trusty-server-cloudimg-amd64-root</programlisting>
-
- <para>This downloads and verifies the specified
- <filename>.tar</filename> image, and then uses
- <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>
- to open a shell in it.</para>
- </example>
-
- <example>
- <title>Download a Fedora image, set a root password in it, start
- it as a service</title>
-
- <programlisting># machinectl pull-raw --verify=no \
- https://download.fedoraproject.org/pub/fedora/linux/releases/&fedora_latest_version;/Cloud/x86_64/images/Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86_64.raw.xz \
- Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86-64
-# systemd-nspawn -M Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86-64
-# passwd
-# exit
-# machinectl start Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86-64
-# machinectl login Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86-64</programlisting>
-
- <para>This downloads the specified <filename>.raw</filename>
- image with verification disabled. Then, a shell is opened in it
- and a root password is set. Afterwards the shell is left, and
- the machine started as system service. With the last command a
- login prompt into the container is requested.</para>
- </example>
-
- <example>
- <title>Exports a container image as tar file</title>
-
- <programlisting># machinectl export-tar fedora myfedora.tar.xz</programlisting>
-
- <para>Exports the container <literal>fedora</literal> as an
- xz-compressed tar file <filename>myfedora.tar.xz</filename> into the
- current directory.</para>
- </example>
-
- <example>
- <title>Create a new shell session</title>
-
- <programlisting># machinectl shell --uid=lennart</programlisting>
-
- <para>This creates a new shell session on the local host for
- the user ID <literal>lennart</literal>, in a <citerefentry
- project='die-net'><refentrytitle>su</refentrytitle><manvolnum>1</manvolnum></citerefentry>-like
- fashion.</para>
- </example>
+
+ <xi:include href="importctl.xml" xpointer="example-import-raw" />
</refsect1>
@@ -1117,6 +867,7 @@
<member><citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry project='die-net'><refentrytitle>tar</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry project='die-net'><refentrytitle>xz</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry project='die-net'><refentrytitle>gzip</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
diff --git a/man/meson.build b/man/meson.build
index 403098a814..488ff70220 100644
--- a/man/meson.build
+++ b/man/meson.build
@@ -59,7 +59,15 @@ foreach tuple : manpages
mandirn = get_option('mandir') / ('man' + section)
- if condition == '' or conf.get(condition) == 1
+ have = true
+ foreach word : condition.split()
+ if conf.get(word) != 1
+ have = false
+ break
+ endif
+ endforeach
+
+ if have
file = files(tuple[0] + '.xml')
source_xml_files += file
if tuple[0].startswith('org.freedesktop.')
diff --git a/man/networkctl.xml b/man/networkctl.xml
index 79a9fc1345..e85718269a 100644
--- a/man/networkctl.xml
+++ b/man/networkctl.xml
@@ -302,15 +302,15 @@
details.</para>
<para>Produces output similar to:
- <programlisting>LINK CHASSIS ID SYSTEM NAME CAPS PORT ID PORT DESCRIPTION
-enp0s25 00:e0:4c:00:00:00 GS1900 ..b........ 2 Port #2
+ <programlisting>LINK SYSTEM-NAME SYSTEM-DESCRIPTION CHASSIS-ID PORT-ID PORT-DESCRIPTION CAPS
+enp0s25 GS1900 - 00:e0:4c:00:00:00 2 Port #2 ..b........
Capability Flags:
o - Other; p - Repeater; b - Bridge; w - WLAN Access Point; r - Router;
t - Telephone; d - DOCSIS cable device; a - Station; c - Customer VLAN;
s - Service VLAN, m - Two-port MAC Relay (TPMR)
-1 neighbors listed.</programlisting></para>
+1 neighbor(s) listed.</programlisting></para>
<xi:include href="version-info.xml" xpointer="v219"/>
</listitem>
diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml
index b5b825b8b8..f7b3b4711c 100644
--- a/man/networkd.conf.xml
+++ b/man/networkd.conf.xml
@@ -119,6 +119,34 @@
</varlistentry>
<varlistentry>
+ <term><varname>IPv4Forwarding=</varname></term>
+ <listitem>
+ <para>Configures IPv4 packet forwarding for the system. Takes a boolean value. This controls the
+ <filename>net.ipv4.conf.default.forwarding</filename> and
+ <filename>net.ipv4.conf.all.forwarding</filename>sysctl options. See
+ <ulink url="https://docs.kernel.org/networking/ip-sysctl.html">IP Sysctl</ulink>
+ for more details about the sysctl options. Defaults to unset and the sysctl options will not be
+ changed.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>IPv6Forwarding=</varname></term>
+ <listitem>
+ <para>Configures IPv6 packet forwarding for the system. Takes a boolean value. This controls the
+ <filename>net.ipv6.conf.default.forwarding</filename> and
+ <filename>net.ipv6.conf.all.forwarding</filename> sysctl options. See
+ <ulink url="https://docs.kernel.org/networking/ip-sysctl.html">IP Sysctl</ulink>
+ for more details about the sysctl options. Defaults to unset and the sysctl options will not be
+ changed.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>IPv6PrivacyExtensions=</varname></term>
<listitem>
<para>Specifies the default value for per-network <varname>IPv6PrivacyExtensions=</varname>.
diff --git a/man/org.freedesktop.import1.xml b/man/org.freedesktop.import1.xml
index e230a69f4c..2486eea4b3 100644
--- a/man/org.freedesktop.import1.xml
+++ b/man/org.freedesktop.import1.xml
@@ -25,11 +25,11 @@
<para>
<citerefentry><refentrytitle>systemd-importd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
- is a system service which may be used to import, export and download additional system images. These
- images can be used by tools such as
- <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>
- to run local containers. The service is used as the backend for <command>machinectl pull-raw</command>,
- <command>machinectl pull-tar</command> and related commands. This page describes the D-Bus interface.
+ is a system service which may be used to import, export and download disk images. These images can be
+ used by tools such as
+ <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry> to run
+ local containers. The service is used as the backend for <command>importctl pull-raw</command>,
+ <command>importctl pull-tar</command> and related commands. This page describes the D-Bus interface.
</para>
<para>Note that
@@ -56,42 +56,94 @@ node /org/freedesktop/import1 {
in b read_only,
out u transfer_id,
out o transfer_path);
+ ImportTarEx(in h fd,
+ in s local_name,
+ in s class,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
ImportRaw(in h fd,
in s local_name,
in b force,
in b read_only,
out u transfer_id,
out o transfer_path);
+ ImportRawEx(in h fd,
+ in s local_name,
+ in s class,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
ImportFileSystem(in h fd,
in s local_name,
in b force,
in b read_only,
out u transfer_id,
out o transfer_path);
+ ImportFileSystemEx(in h fd,
+ in s local_name,
+ in s class,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
ExportTar(in s local_name,
in h fd,
in s format,
out u transfer_id,
out o transfer_path);
+ ExportTarEx(in s local_name,
+ in s class,
+ in h fd,
+ in s format,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
ExportRaw(in s local_name,
in h fd,
in s format,
out u transfer_id,
out o transfer_path);
+ ExportRawEx(in s local_name,
+ in s class,
+ in h fd,
+ in s format,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
PullTar(in s url,
in s local_name,
in s verify_mode,
in b force,
out u transfer_id,
out o transfer_path);
+ PullTarEx(in s url,
+ in s local_name,
+ in s class,
+ in s verify_mode,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
PullRaw(in s url,
in s local_name,
in s verify_mode,
in b force,
out u transfer_id,
out o transfer_path);
+ PullRawEx(in s url,
+ in s local_name,
+ in s class,
+ in s verify_mode,
+ in t flags,
+ out u transfer_id,
+ out o transfer_path);
ListTransfers(out a(usssdo) transfers);
+ ListTransfersEx(in s class,
+ in t flags,
+ out a(ussssdo) transfers);
CancelTransfer(in u transfer_id);
+ ListImages(in s class,
+ in t flags,
+ out a(ssssbtttttt) images);
signals:
TransferNew(u transfer_id,
o transfer_path);
@@ -105,8 +157,6 @@ node /org/freedesktop/import1 {
};
</programlisting>
- <!--method ImportFileSystem is not documented!-->
-
<!--Autogenerated cross-references for systemd.directives, do not edit-->
<variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.import1.Manager"/>
@@ -115,22 +165,40 @@ node /org/freedesktop/import1 {
<variablelist class="dbus-method" generated="True" extra-ref="ImportTar()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ImportTarEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="ImportRaw()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ImportRawEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="ImportFileSystem()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ImportFileSystemEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="ExportTar()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ExportTarEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="ExportRaw()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ExportRawEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="PullTar()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="PullTarEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="PullRaw()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="PullRawEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="ListTransfers()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ListTransfersEx()"/>
+
<variablelist class="dbus-method" generated="True" extra-ref="CancelTransfer()"/>
+ <variablelist class="dbus-method" generated="True" extra-ref="ListImages()"/>
+
<variablelist class="dbus-signal" generated="True" extra-ref="TransferNew()"/>
<variablelist class="dbus-signal" generated="True" extra-ref="TransferRemoved()"/>
@@ -140,81 +208,114 @@ node /org/freedesktop/import1 {
<refsect2>
<title>Methods</title>
- <para><function>ImportTar()</function> and <function>ImportRaw()</function> import a system image and
- place it into <filename>/var/lib/machines/</filename>. The first argument should be a file descriptor
- (opened for reading) referring to the tar or raw file to import. It should reference a file on disk,
- a pipe or a socket. When <function>ImportTar()</function> is used the file descriptor should
- refer to a tar file, optionally compressed with
- <citerefentry project="die-net"><refentrytitle>gzip</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
- <citerefentry project="die-net"><refentrytitle>bzip2</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
- or
+ <para><function>ImportTar()</function>/<function>ImportTarEx()</function> and
+ <function>ImportRaw()</function>/<function>ImportRawEx()</function> import a disk image and place it
+ into the image directory. The first argument should be a file descriptor (opened for reading) referring
+ to the tar or raw file to import. It should reference a file on disk, a pipe or a socket. When
+ <function>ImportTar()</function>/<function>ImportTarEx()</function> is used the file descriptor should
+ refer to a tar file, optionally compressed with <citerefentry project="die-net"><refentrytitle>gzip</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+ <citerefentry project="die-net"><refentrytitle>bzip2</refentrytitle><manvolnum>1</manvolnum></citerefentry>, or
<citerefentry project="die-net"><refentrytitle>xz</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
<command>systemd-importd</command> will detect the used compression scheme (if any) automatically. When
- <function>ImportRaw()</function> is used the file descriptor should refer to a raw or qcow2 disk image
- containing an MBR or GPT disk label, also optionally compressed with gzip, bzip2 or xz. In either case,
- if the file is specified as a file descriptor on disk, progress information is generated for the import
- operation (as in that case we know the total size on disk). If a socket or pipe is specified, progress information is not
- available. The file descriptor argument is followed by a local name for the image. This should be a
- name suitable as a hostname and will be used to name the imported image below
- <filename>/var/lib/machines/</filename>. A tar import is placed as a directory tree or a
- <citerefentry project="url"><refentrytitle url="https://btrfs.readthedocs.io/en/latest/btrfs.html">btrfs</refentrytitle><manvolnum>8</manvolnum></citerefentry>
- subvolume below <filename>/var/lib/machines/</filename> under the specified name with no suffix
- appended. A raw import is placed as a file in <filename>/var/lib/machines/</filename> with the
- <filename>.raw</filename> suffix appended. If the <option>force</option> argument is true, any
- pre-existing image with the same name is removed before starting the operation. Otherwise, the
- operation fails if an image with the same name already exists. Finally, the
- <option>read_only</option> argument controls
- whether to create a writable or read-only image. Both methods return immediately after starting the import,
- with the import transfer ongoing. They return a pair of transfer identifier and object path, which may
- be used to retrieve progress information about the transfer or to cancel it. The transfer identifier is a
- simple numeric identifier, the object path references an
+ <function>ImportRaw()</function>/<function>ImportRawEx()</function> is used the file descriptor should
+ refer to a raw or qcow2 disk image containing an MBR or GPT disk label, also optionally compressed with
+ gzip, bzip2 or xz. In either case, if the file is specified as a file descriptor on disk, progress
+ information is generated for the import operation (as in that case we know the total size on disk). If
+ a socket or pipe is specified, progress information is not available. The file descriptor argument is
+ followed by a local name for the image. This should be a name suitable as a hostname and will be used
+ to name the imported image below <filename>/var/lib/machines/</filename>. A tar import is placed as a
+ directory tree or a <citerefentry project="url"><refentrytitle url="https://btrfs.readthedocs.io/en/latest/btrfs.html">btrfs</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ subvolume below the image directory under the specified name with no suffix appended. A raw import is
+ placed as a file in the image directory with the <filename>.raw</filename> suffix appended. In case of
+ <function>ImportTar()</function>/<function>ImportRaw()</function>, if the <option>force</option>
+ argument is true, any pre-existing image with the same name is removed before starting the
+ operation. Otherwise, the operation fails if an image with the same name already exists. The
+ <option>read_only</option> argument controls whether to create a writable or read-only image. In case
+ of <function>ImportTarEx()</function>/<function>ImportRawEx()</function> these boolean flags are
+ provided via a 64bit flags parameter instead, with bit 0 mapping to the <option>force</option>
+ parameter, and bit 1 mapping to <option>read_only</option>. The <option>class</option> parameter
+ specifies the image class, and takes one of <literal>machine</literal>, <literal>portable</literal>,
+ <literal>sysext</literal>, <literal>confext</literal>. All four methods return immediately after
+ starting the import, with the import transfer ongoing. They return a pair of transfer identifier and
+ object path, which may be used to retrieve progress information about the transfer or to cancel it. The
+ transfer identifier is a simple numeric identifier, the object path references an
<interfacename>org.freedesktop.import1.Transfer</interfacename> object, see below. Listen for a
<function>TransferRemoved()</function> signal for the transfer ID in order to detect when a transfer is
complete. The returned transfer object is useful to determine the current progress or log output of the
ongoing import operation.</para>
- <para><function>ExportTar()</function> and <function>ExportRaw()</function> implement the reverse
- operation, and may be used to export a system image in order to place it in a tar or raw image. They
- take the machine name to export as their first parameter, followed by a file descriptor (opened for writing)
- where the tar or raw file will be written. It may either reference a file on disk or a pipe/socket. The
- third argument specifies in which compression format to write the image. It takes one of
+ <para><function>ExportTar()</function>/<function>ExportTarEx()</function> and
+ <function>ExportRaw()</function>/<function>ExportRaw()</function> implement the reverse operation, and
+ may be used to export a system image in order to place it in a tar or raw image. They take the machine
+ name to export as their first parameter, followed by a file descriptor (opened for writing) where the
+ tar or raw file will be written. It may either reference a file on disk or a pipe/socket. The third
+ argument specifies in which compression format to write the image. It takes one of
<literal>uncompressed</literal>, <literal>xz</literal>, <literal>bzip2</literal> or
<literal>gzip</literal>, depending on which compression scheme is required. The image written to the
- specified file descriptor will be a tar file in case of <function>ExportTar()</function> or a raw disk
- image in case of <function>ExportRaw()</function>. Note that currently raw disk images may not be
- exported as tar files, and vice versa. This restriction might be lifted eventually. The method
- returns a transfer identifier and object path for cancelling or tracking the export operation, similarly
- to <function>ImportTar()</function> or <function>ImportRaw()</function> as described above.</para>
-
- <para><function>PullTar()</function> and <function>PullRaw()</function> may be used to download, verify
- and import a system image from a URL. They take a URL argument which should point to a tar or
- raw file on the <literal>http://</literal> or <literal>https://</literal> protocols, possibly
- compressed with xz, bzip2 or gzip. The second argument is a local name for the image. It should be
- suitable as a hostname, similarly to the matching argument of the <function>ImportTar()</function> and
- <function>ImportRaw()</function> methods above. The third argument indicates the verification mode for
- the image. It may be one of <literal>no</literal>, <literal>checksum</literal>,
- <literal>signature</literal>. <literal>no</literal> turns off any kind of verification of the image;
- <literal>checksum</literal> looks for a <filename>SHA256SUM</filename> file next to the downloaded
- image and verifies any SHA256 hash value in that file against the image; <literal>signature</literal>
- does the same but also tries to authenticate the <filename>SHA256SUM</filename> file via
- <citerefentry project="man-pages"><refentrytitle>gpg</refentrytitle><manvolnum>8</manvolnum></citerefentry>
- first. The last argument indicates whether to replace a possibly pre-existing image with the same local
- name (if <literal>true</literal>), or whether to fail (if <literal>false</literal>). Like the import
- and export calls above, these calls return a pair of transfer identifier and object path for the ongoing
+ specified file descriptor will be a tar file in case of
+ <function>ExportTar()</function>/<function>ExportTarEx()</function> or a raw disk image in case of
+ <function>ExportRaw()</function>/<function>ExportRawEx()</function>. Note that currently raw disk
+ images may not be exported as tar files, and vice versa. This restriction might be lifted
+ eventually. The method returns a transfer identifier and object path for cancelling or tracking the
+ export operation, similarly to <function>ImportTar()</function>/<function>ImportTarEx()</function> or
+ <function>ImportRaw()</function>/<function>ImportRawEx()</function> as described
+ above. <function>ExportTarEx()</function>/<function>ExportRawEx()</function> expect the image class as
+ additional parameter, as well as a 64bit flags parameter that currently must be specified as
+ zero.</para>
+
+ <para><function>PullTar()</function>/<function>PullTarEx()</function> and
+ <function>PullRaw()</function>/<function>PullRawEx()</function> may be used to download, verify and
+ import a system image from a URL. They take a URL argument which should point to a tar or raw file on
+ the <literal>http://</literal> or <literal>https://</literal> protocols, possibly compressed with xz,
+ bzip2 or gzip. The second argument is a local name for the image. It should be suitable as a hostname,
+ similarly to the matching argument of the
+ <function>ImportTar()</function>/<function>ImportTarEx()</function> and
+ <function>ImportRaw()</function>/<function>ImportRawEx()</function> methods above. The third argument
+ indicates the verification mode for the image. It may be one of <literal>no</literal>,
+ <literal>checksum</literal>, <literal>signature</literal>. <literal>no</literal> turns off any kind of
+ verification of the image; <literal>checksum</literal> looks for a <filename>SHA256SUM</filename> file
+ next to the downloaded image and verifies any SHA256 hash value in that file against the image;
+ <literal>signature</literal> does the same but also tries to authenticate the
+ <filename>SHA256SUM</filename> file via <citerefentry project="man-pages"><refentrytitle>gpg</refentrytitle><manvolnum>8</manvolnum></citerefentry> first. In
+ case of <function>PullTar()</function>/<function>PullRaw()</function> the last argument indicates
+ whether to replace a possibly pre-existing image with the same local name (if <literal>true</literal>),
+ or whether to fail (if <literal>false</literal>). In case of
+ <function>PullTarEx()</function>/<function>PullRawEx()</function> the last argument is a 64bit flags
+ parameter, where bit 0 controls the <literal>force</literal> flag, bit 1 is a
+ <literal>read_only</literal> flag that controls whether the created image shall be marked read-only,
+ and bit 2 is a <literal>keep_download</literal> flag that indicates whether a pristine, read-only copy
+ of the downloaded image shell be kept, in addition for the local copy of the image. The
+ <function>…_Ex()</function> variants also expect an image class string (as above). Like the import and
+ export calls above, these calls return a pair of transfer identifier and object path for the ongoing
download.</para>
- <para><function>ListTransfers()</function> returns a list of ongoing import, export or download
- operations as created with the six calls described above. It returns an array of structures which
- consist of the numeric transfer identifier, a string indicating the operation (one of
- <literal>import-tar</literal>, <literal>import-raw</literal>, <literal>export-tar</literal>,
- <literal>export-raw</literal>, <literal>pull-tar</literal> or <literal>pull-raw</literal>), a string
- describing the remote file (in case of download operations this is the source URL, in case of
- import/export operations this is a short string describing the file descriptor passed in), a string
- with the local machine image name, a progress value between 0.0 (for 0%) and 1.0 (for 100%), as well as
- the transfer object path.</para>
+ <para><function>ImportFileSystem()</function>/<function>ImportFileSystemEx()</function> are similar to
+ <function>ImportTar()</function>/<function>ImportTarEx()</function> but import a directory tree. The
+ first argument must refer to a directory file descriptor for the source hierarchy to import.</para>
+
+ <para><function>ListTransfers()</function>/<function>ListTransfersEx()</function> return a list of
+ ongoing import, export or download operations as created with the six calls described above. They
+ return an array of structures which consist of the numeric transfer identifier, a string indicating the
+ operation (one of <literal>import-tar</literal>, <literal>import-raw</literal>,
+ <literal>export-tar</literal>, <literal>export-raw</literal>, <literal>pull-tar</literal> or
+ <literal>pull-raw</literal>), a string describing the remote file (in case of download operations this
+ is the source URL, in case of import/export operations this is a short string describing the file
+ descriptor passed in), a string with the local machine image name, the image class (only in case of
+ <function>ListTransfersEx()</function>; one of <literal>machine</literal>, <literal>portable</literal>,
+ <literal>sysext</literal>, <literal>confext</literal>), a progress value between 0.0 (for 0%) and 1.0
+ (for 100%), as well as the transfer object path.</para>
<para><function>CancelTransfer()</function> may be used to cancel an ongoing import, export or download
operation. Simply specify the transfer identifier to cancel the ongoing operation.</para>
+
+ <para><function>ListImages()</function> returns a list of currently installed images. It takes a image
+ class string and a flags parameter. The image class is either the empty string or specifies one of the
+ four image classes, by which it will then filter. The flags parameter must be zero at this time. It
+ returns an array of items, each describing one image. The item fields are in order: the image class,
+ the local image name, the image type, the image path, the read-only flag, the creation and modification
+ times (in microseconds since the UNIX epoch), as well as the current disk usage in bytes (both overall,
+ and exclusive), as well as any size limit in bytes set on the image (both overall and
+ exclusive).</para>
</refsect2>
<refsect2>
@@ -242,6 +343,7 @@ node /org/freedesktop/import1/transfer/_1 {
signals:
LogMessage(u priority,
s line);
+ ProgressUpdate(d progress);
properties:
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly u Id = ...;
@@ -262,8 +364,6 @@ node /org/freedesktop/import1/transfer/_1 {
};
</programlisting>
- <!--signal LogMessage is not documented!-->
-
<!--Autogenerated cross-references for systemd.directives, do not edit-->
<variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.import1.Transfer"/>
@@ -274,6 +374,8 @@ node /org/freedesktop/import1/transfer/_1 {
<variablelist class="dbus-signal" generated="True" extra-ref="LogMessage()"/>
+ <variablelist class="dbus-signal" generated="True" extra-ref="ProgressUpdate()"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="Id"/>
<variablelist class="dbus-property" generated="True" extra-ref="Local"/>
@@ -315,6 +417,17 @@ node /org/freedesktop/import1/transfer/_1 {
between 0.0 and 1.0. To show a progress bar on screen we recommend to query this value in regular
intervals, for example every 500 ms or so.</para>
</refsect2>
+
+ <refsect2>
+ <title>Signals</title>
+
+ <para>The <function>LogMessage()</function> signal is emitted for log messages generated by a transfer. It
+ carries a pair of syslog log level integer and log string.</para>
+
+ <para>The <function>ProgressUpdate()</function> signal is emitted in regular intervals when new
+ download progress information is available for a transfer. It carries a double precision floating
+ pointer number between 0.0 and 1.0 indicating the transfer progress.</para>
+ </refsect2>
</refsect1>
<refsect1>
@@ -340,4 +453,20 @@ node /org/freedesktop/import1/transfer/_1 {
</refsect1>
<xi:include href="org.freedesktop.locale1.xml" xpointer="versioning"/>
+ <refsect1>
+ <title>History</title>
+ <refsect2>
+ <title>The Manager Object</title>
+ <para><function>ImportTarEx()</function>, <function>ImportRawEx()</function>,
+ <function>ImportFileSystemEx()</function>, <function>ExportTarEx()</function>,
+ <function>ExportRawEx()</function>, <function>PullTarEx()</function>, <function>PullRawEx()</function>,
+ <function>ListTransfersEx()</function>, <function>ListImages()</function> were added in version
+ 256.</para>
+ </refsect2>
+ <refsect2>
+ <title>Transfer Objects</title>
+ <para><function>ProgressUpdate()</function> was added in version 256.</para>
+ </refsect2>
+ </refsect1>
+
</refentry>
diff --git a/man/org.freedesktop.resolve1.xml b/man/org.freedesktop.resolve1.xml
index aa24d35123..c70e5c1cb3 100644
--- a/man/org.freedesktop.resolve1.xml
+++ b/man/org.freedesktop.resolve1.xml
@@ -440,35 +440,36 @@ node /org/freedesktop/resolve1 {
and recommended. However, the following flags are defined to alter the look-up:</para>
<programlisting>/* Input+Output: Protocol/scope */
-#define SD_RESOLVED_DNS (UINT64_C(1) &lt;&lt; 0)
-#define SD_RESOLVED_LLMNR_IPV4 (UINT64_C(1) &lt;&lt; 1)
-#define SD_RESOLVED_LLMNR_IPV6 (UINT64_C(1) &lt;&lt; 2)
-#define SD_RESOLVED_MDNS_IPV4 (UINT64_C(1) &lt;&lt; 3)
-#define SD_RESOLVED_MDNS_IPV6 (UINT64_C(1) &lt;&lt; 4)
+#define SD_RESOLVED_DNS (UINT64_C(1) &lt;&lt; 0)
+#define SD_RESOLVED_LLMNR_IPV4 (UINT64_C(1) &lt;&lt; 1)
+#define SD_RESOLVED_LLMNR_IPV6 (UINT64_C(1) &lt;&lt; 2)
+#define SD_RESOLVED_MDNS_IPV4 (UINT64_C(1) &lt;&lt; 3)
+#define SD_RESOLVED_MDNS_IPV6 (UINT64_C(1) &lt;&lt; 4)
/* Input: Restrictions */
-#define SD_RESOLVED_NO_CNAME (UINT64_C(1) &lt;&lt; 5)
-#define SD_RESOLVED_NO_TXT (UINT64_C(1) &lt;&lt; 6)
-#define SD_RESOLVED_NO_ADDRESS (UINT64_C(1) &lt;&lt; 7)
-#define SD_RESOLVED_NO_SEARCH (UINT64_C(1) &lt;&lt; 8)
-#define SD_RESOLVED_NO_VALIDATE (UINT64_C(1) &lt;&lt; 10)
-#define SD_RESOLVED_NO_SYNTHESIZE (UINT64_C(1) &lt;&lt; 11)
-#define SD_RESOLVED_NO_CACHE (UINT64_C(1) &lt;&lt; 12)
-#define SD_RESOLVED_NO_ZONE (UINT64_C(1) &lt;&lt; 13)
-#define SD_RESOLVED_NO_TRUST_ANCHOR (UINT64_C(1) &lt;&lt; 14)
-#define SD_RESOLVED_NO_NETWORK (UINT64_C(1) &lt;&lt; 15)
-#define SD_RESOLVED_NO_STALE (UINT64_C(1) &lt;&lt; 24)
+#define SD_RESOLVED_NO_CNAME (UINT64_C(1) &lt;&lt; 5)
+#define SD_RESOLVED_NO_TXT (UINT64_C(1) &lt;&lt; 6)
+#define SD_RESOLVED_NO_ADDRESS (UINT64_C(1) &lt;&lt; 7)
+#define SD_RESOLVED_NO_SEARCH (UINT64_C(1) &lt;&lt; 8)
+#define SD_RESOLVED_NO_VALIDATE (UINT64_C(1) &lt;&lt; 10)
+#define SD_RESOLVED_NO_SYNTHESIZE (UINT64_C(1) &lt;&lt; 11)
+#define SD_RESOLVED_NO_CACHE (UINT64_C(1) &lt;&lt; 12)
+#define SD_RESOLVED_NO_ZONE (UINT64_C(1) &lt;&lt; 13)
+#define SD_RESOLVED_NO_TRUST_ANCHOR (UINT64_C(1) &lt;&lt; 14)
+#define SD_RESOLVED_NO_NETWORK (UINT64_C(1) &lt;&lt; 15)
+#define SD_RESOLVED_NO_STALE (UINT64_C(1) &lt;&lt; 24)
+#define SD_RESOLVED_RELAX_SINGLE_LABEL (UINT64_C(1) &lt;&lt; 25)
/* Output: Security */
-#define SD_RESOLVED_AUTHENTICATED (UINT64_C(1) &lt;&lt; 9)
-#define SD_RESOLVED_CONFIDENTIAL (UINT64_C(1) &lt;&lt; 18)
+#define SD_RESOLVED_AUTHENTICATED (UINT64_C(1) &lt;&lt; 9)
+#define SD_RESOLVED_CONFIDENTIAL (UINT64_C(1) &lt;&lt; 18)
/* Output: Origin */
-#define SD_RESOLVED_SYNTHETIC (UINT64_C(1) &lt;&lt; 19)
-#define SD_RESOLVED_FROM_CACHE (UINT64_C(1) &lt;&lt; 20)
-#define SD_RESOLVED_FROM_ZONE (UINT64_C(1) &lt;&lt; 21)
-#define SD_RESOLVED_FROM_TRUST_ANCHOR (UINT64_C(1) &lt;&lt; 22)
-#define SD_RESOLVED_FROM_NETWORK (UINT64_C(1) &lt;&lt; 23)
+#define SD_RESOLVED_SYNTHETIC (UINT64_C(1) &lt;&lt; 19)
+#define SD_RESOLVED_FROM_CACHE (UINT64_C(1) &lt;&lt; 20)
+#define SD_RESOLVED_FROM_ZONE (UINT64_C(1) &lt;&lt; 21)
+#define SD_RESOLVED_FROM_TRUST_ANCHOR (UINT64_C(1) &lt;&lt; 22)
+#define SD_RESOLVED_FROM_NETWORK (UINT64_C(1) &lt;&lt; 23)
</programlisting>
<para>On input, the first five flags control the protocols to use for the look-up. They refer to
diff --git a/man/portablectl.xml b/man/portablectl.xml
index d241893d4d..5223131368 100644
--- a/man/portablectl.xml
+++ b/man/portablectl.xml
@@ -45,12 +45,12 @@
within the file system context of the image.</para>
<para>Portable service images are an efficient way to bundle multiple related services and other units together,
- and transfer them as a whole between systems. When these images are attached the local system the contained units
+ and transfer them as a whole between systems. When these images are attached to the local system, the contained units
may run in most ways like regular system-provided units, either with full privileges or inside strict sandboxing,
depending on the selected configuration. For more details, see
<ulink url="https://systemd.io/PORTABLE_SERVICES">Portable Services Documentation</ulink>.</para>
- <para>Specifically portable service images may be of the following kind:</para>
+ <para>Portable service images may be of the following kinds:</para>
<itemizedlist>
<listitem><para>Directory trees containing an OS, including the top-level directories <filename>/usr/</filename>,
@@ -511,6 +511,7 @@
<member><citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>org.freedesktop.portable1</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd-portabled.service</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
</simplelist></para>
</refsect1>
diff --git a/man/resolvectl.xml b/man/resolvectl.xml
index dada3f51d7..afa4ca77eb 100644
--- a/man/resolvectl.xml
+++ b/man/resolvectl.xml
@@ -480,6 +480,21 @@
<xi:include href="version-info.xml" xpointer="v254"/></listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--relax-single-label=</option><replaceable>BOOL</replaceable></term>
+
+ <listitem><para>Takes a boolean parameter; used in conjunction with <command>query</command>. If
+ true, rules regarding routing of single-label names are relaxed. Defaults to false. By default,
+ lookups of single label names are assumed to refer to local hosts to be resolved via local resolution
+ such as LLMNR or via search domain qualification and are not routed to upstream servers as is. If
+ this option is enabled these rules are disabled and the queries are routed upstream anyway. Also see
+ the <varname>ResolveUnicastSingleLabel=</varname> option in
+ <citerefentry><refentrytitle>resolved.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+ which provides a system-wide option that controls this behaviour.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
<xi:include href="standard-options.xml" xpointer="json" />
<xi:include href="standard-options.xml" xpointer="j" />
<xi:include href="standard-options.xml" xpointer="no-pager" />
diff --git a/man/resolved.conf.xml b/man/resolved.conf.xml
index 084256cf05..95b35537d6 100644
--- a/man/resolved.conf.xml
+++ b/man/resolved.conf.xml
@@ -172,9 +172,7 @@
downgrade to non-DNSSEC mode by synthesizing a DNS response that suggests DNSSEC was not
supported.</para>
- <para>If set to false, DNS lookups are not DNSSEC validated. In this mode, or when set to
- <literal>allow-downgrade</literal> and the downgrade has happened, the resolver becomes
- security-unaware and all forwarded queries have DNSSEC OK (DO) bit unset.</para>
+ <para>If set to false, DNS lookups are not DNSSEC validated.</para>
<para>Note that DNSSEC validation requires retrieval of additional DNS data, and thus results in a
small DNS lookup time penalty.</para>
diff --git a/man/rules/meson.build b/man/rules/meson.build
index 15de3fa576..de8fbcca68 100644
--- a/man/rules/meson.build
+++ b/man/rules/meson.build
@@ -23,6 +23,7 @@ manpages = [
['hostname', '5', [], ''],
['hostnamectl', '1', [], 'ENABLE_HOSTNAMED'],
['hwdb', '7', [], 'ENABLE_HWDB'],
+ ['importctl', '1', [], 'ENABLE_MACHINED'],
['integritytab', '5', [], 'HAVE_LIBCRYPTSETUP'],
['iocost.conf', '5', [], ''],
['journal-remote.conf', '5', ['journal-remote.conf.d'], 'HAVE_MICROHTTPD'],
@@ -899,14 +900,14 @@ manpages = [
['systemd-bless-boot.service',
'8',
['systemd-bless-boot'],
- 'ENABLE_BOOTLOADER'],
+ 'ENABLE_BOOTLOADER HAVE_BLKID'],
['systemd-boot-check-no-failures.service',
'8',
['systemd-boot-check-no-failures'],
''],
['systemd-boot-random-seed.service', '8', [], 'ENABLE_BOOTLOADER'],
['systemd-boot', '7', ['sd-boot'], 'ENABLE_BOOTLOADER'],
- ['systemd-bsod.service', '8', ['systemd-bsod'], 'HAVE_QRENCODE'],
+ ['systemd-bsod.service', '8', ['systemd-bsod'], 'HAVE_QRENCODE ENABLE_INITRD'],
['systemd-cat', '1', [], ''],
['systemd-cgls', '1', [], ''],
['systemd-cgtop', '1', [], ''],
@@ -961,15 +962,15 @@ manpages = [
['systemd-journal-gatewayd.service',
'8',
['systemd-journal-gatewayd', 'systemd-journal-gatewayd.socket'],
- 'HAVE_MICROHTTPD'],
+ 'ENABLE_REMOTE HAVE_MICROHTTPD'],
['systemd-journal-remote.service',
'8',
['systemd-journal-remote', 'systemd-journal-remote.socket'],
- 'HAVE_MICROHTTPD'],
+ 'ENABLE_REMOTE HAVE_MICROHTTPD'],
['systemd-journal-upload.service',
'8',
['systemd-journal-upload'],
- 'HAVE_MICROHTTPD'],
+ 'ENABLE_REMOTE HAVE_LIBCURL'],
['systemd-journald.service',
'8',
['systemd-journald',
@@ -1015,7 +1016,7 @@ manpages = [
'systemd-pcrlock-make-policy.service',
'systemd-pcrlock-secureboot-authority.service',
'systemd-pcrlock-secureboot-policy.service'],
- 'HAVE_TPM2'],
+ 'ENABLE_BOOTLOADER HAVE_OPENSSL HAVE_TPM2'],
['systemd-pcrphase.service',
'8',
['systemd-pcrextend',
@@ -1024,7 +1025,7 @@ manpages = [
'systemd-pcrmachine.service',
'systemd-pcrphase-initrd.service',
'systemd-pcrphase-sysinit.service'],
- 'ENABLE_BOOTLOADER'],
+ 'ENABLE_BOOTLOADER HAVE_OPENSSL HAVE_TPM2'],
['systemd-portabled.service', '8', ['systemd-portabled'], 'ENABLE_PORTABLED'],
['systemd-poweroff.service',
'8',
diff --git a/man/sd_bus_service_reconnect.c b/man/sd_bus_service_reconnect.c
index 0b75086ef1..c0818689f2 100644
--- a/man/sd_bus_service_reconnect.c
+++ b/man/sd_bus_service_reconnect.c
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: MIT-0 */
-/* Implements a D-Bus service that automatically reconnects when the system bus is restarted.
+/* A D-Bus service that automatically reconnects when the system bus is
+ * restarted.
*
* Compile with 'cc sd_bus_service_reconnect.c $(pkg-config --libs --cflags libsystemd)'
*
@@ -10,18 +11,18 @@
<?xml version="1.0"?> <!--*-nxml-*-->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
- <policy user="root">
- <allow own="org.freedesktop.ReconnectExample"/>
- <allow send_destination="org.freedesktop.ReconnectExample"/>
- <allow receive_sender="org.freedesktop.ReconnectExample"/>
- </policy>
-
- <policy context="default">
- <allow send_destination="org.freedesktop.ReconnectExample"/>
- <allow receive_sender="org.freedesktop.ReconnectExample"/>
- </policy>
+ <policy user="root">
+ <allow own="org.freedesktop.ReconnectExample"/>
+ <allow send_destination="org.freedesktop.ReconnectExample"/>
+ <allow receive_sender="org.freedesktop.ReconnectExample"/>
+ </policy>
+
+ <policy context="default">
+ <allow send_destination="org.freedesktop.ReconnectExample"/>
+ <allow receive_sender="org.freedesktop.ReconnectExample"/>
+ </policy>
</busconfig>
*
@@ -31,7 +32,7 @@
* /org/freedesktop/ReconnectExample \
* org.freedesktop.ReconnectExample \
* Example
- * s "example"
+ * s "example"
*/
#include <errno.h>
@@ -93,7 +94,8 @@ static int on_disconnect(sd_bus_message *message, void *userdata, sd_bus_error *
return 0;
}
-/* Ensure the event loop exits with a clear error if acquiring the well-known service name fails */
+/* Ensure the event loop exits with a clear error if acquiring the well-known
+ * service name fails */
static int request_name_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
if (!sd_bus_message_is_method_error(m, NULL))
return 1;
@@ -111,8 +113,8 @@ static int request_name_callback(sd_bus_message *m, void *userdata, sd_bus_error
}
static int setup(object *o) {
- /* If we are reconnecting, then the bus object needs to be closed, detached from
- * the event loop and recreated.
+ /* If we are reconnecting, then the bus object needs to be closed, detached
+ * from the event loop and recreated.
* https://www.freedesktop.org/software/systemd/man/sd_bus_detach_event.html
* https://www.freedesktop.org/software/systemd/man/sd_bus_close_unref.html
*/
@@ -121,9 +123,10 @@ static int setup(object *o) {
*o->bus = sd_bus_close_unref(*o->bus);
}
- /* Set up a new bus object for the system bus, configure it to wait for D-Bus to be available
- * instead of failing if it is not, and start it. All the following operations are asynchronous
- * and will not block waiting for D-Bus to be available.
+ /* Set up a new bus object for the system bus, configure it to wait for D-Bus
+ * to be available instead of failing if it is not, and start it. All the
+ * following operations are asynchronous and will not block waiting for D-Bus
+ * to be available.
* https://www.freedesktop.org/software/systemd/man/sd_bus_new.html
* https://www.freedesktop.org/software/systemd/man/sd_bus_set_address.html
* https://www.freedesktop.org/software/systemd/man/sd_bus_set_bus_client.html
@@ -150,10 +153,10 @@ static int setup(object *o) {
"org.freedesktop.ReconnectExample",
vtable,
o));
- /* By default the service is only assigned an ephemeral name. Also add a well-known
- * one, so that clients know whom to call. This needs to be asynchronous, as
- * D-Bus might not be yet available. The callback will check whether the error is
- * expected or not, in case it fails.
+ /* By default the service is only assigned an ephemeral name. Also add a
+ * well-known one, so that clients know whom to call. This needs to be
+ * asynchronous, as D-Bus might not be yet available. The callback will check
+ * whether the error is expected or not, in case it fails.
* https://www.freedesktop.org/software/systemd/man/sd_bus_request_name.html
*/
check(sd_bus_request_name_async(*o->bus,
@@ -162,9 +165,9 @@ static int setup(object *o) {
0,
request_name_callback,
o));
- /* When D-Bus is disconnected this callback will be invoked, which will
- * set up the connection again. This needs to be asynchronous, as D-Bus might not
- * yet be available.
+ /* When D-Bus is disconnected this callback will be invoked, which will set up
+ * the connection again. This needs to be asynchronous, as D-Bus might not yet
+ * be available.
* https://www.freedesktop.org/software/systemd/man/sd_bus_match_signal_async.html
*/
check(sd_bus_match_signal_async(*o->bus,
@@ -176,7 +179,8 @@ static int setup(object *o) {
on_disconnect,
NULL,
o));
- /* Attach the bus object to the event loop so that calls and signals are processed.
+ /* Attach the bus object to the event loop so that calls and signals are
+ * processed.
* https://www.freedesktop.org/software/systemd/man/sd_bus_attach_event.html
*/
check(sd_bus_attach_event(*o->bus, *o->event, 0));
@@ -186,8 +190,7 @@ static int setup(object *o) {
int main(int argc, char **argv) {
/* The bus should be relinquished before the program terminates. The cleanup
- * attribute allows us to do it nicely and cleanly whenever we exit the
- * block.
+ * attribute allows us to do it nicely and cleanly whenever we exit the block.
*/
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
@@ -202,8 +205,8 @@ int main(int argc, char **argv) {
*/
check(sd_event_default(&event));
- /* By default the event loop will terminate when all sources have disappeared, so
- * we have to keep it 'occupied'. Register signal handling to do so.
+ /* By default the event loop will terminate when all sources have disappeared,
+ * so we have to keep it 'occupied'. Register signal handling to do so.
* https://www.freedesktop.org/software/systemd/man/sd_event_add_signal.html
*/
check(sd_event_add_signal(event, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL));
diff --git a/man/sd_event_exit.xml b/man/sd_event_exit.xml
index ccbd045509..aa3bc29e98 100644
--- a/man/sd_event_exit.xml
+++ b/man/sd_event_exit.xml
@@ -65,9 +65,11 @@
the exit code stored in the event loop object is updated, but
otherwise no further operation is executed.</para>
- <para><function>sd_event_get_exit_code()</function> may be used to
- query the exit code passed into
- <function>sd_event_exit()</function> earlier.</para>
+ <para><function>sd_event_get_exit_code()</function> may be used to query the exit code passed to an
+ earlier call of <function>sd_event_exit()</function>. The return parameter <parameter>code</parameter>
+ may be set to <constant>NULL</constant>, in order to simply check if <function>sd_event_exit()</function>
+ has been called before (as <function>sd_event_get_exit_code()</function> fails with
+ <constant>-ENODATA</constant> if that's not the case, see below).</para>
<para>While the full positive and negative integer ranges may be used
for the exit code, care should be taken not pick exit codes that
@@ -122,7 +124,8 @@
<varlistentry>
<term><constant>-ENODATA</constant></term>
- <listitem><para>The event loop has not been requested to exit yet.</para></listitem>
+ <listitem><para>Returned by <function>sd_event_get_exit_code()</function> in case the event loop has not
+ been requested to exit yet.</para></listitem>
</varlistentry>
</variablelist>
diff --git a/man/sd_notify.xml b/man/sd_notify.xml
index 287945a46a..a56d039468 100644
--- a/man/sd_notify.xml
+++ b/man/sd_notify.xml
@@ -420,8 +420,8 @@
<term>FDPOLL=0</term>
<listitem><para>When used in combination with <varname>FDSTORE=1</varname>, disables polling of the
- stored file descriptors regardless of whether or not they are pollable. As this option disables
- automatic cleanup of the stored file descriptors on EPOLLERR and EPOLLHUP, care must be taken to
+ submitted file descriptors regardless of whether or not they are pollable. As this option disables
+ automatic cleanup of the submitted file descriptors on EPOLLERR and EPOLLHUP, care must be taken to
ensure proper manual cleanup. Use of this option is not generally recommended except for when
automatic cleanup has unwanted behavior such as prematurely discarding file descriptors from the
store.</para>
diff --git a/man/standard-options.xml b/man/standard-options.xml
index 87058ad657..aaafa98bb7 100644
--- a/man/standard-options.xml
+++ b/man/standard-options.xml
@@ -135,4 +135,13 @@
</listitem>
</varlistentry>
+ <varlistentry id='option-P'>
+ <term><option>-P</option></term>
+
+ <listitem>
+ <para>Equivalent to <option>--value</option> <option>--property=</option>, i.e. shows the value of the
+ property without the property name or <literal>=</literal>. Note that using <option>-P</option> once
+ will also affect all properties listed with <option>-p</option>/<option>--property=</option>.</para>
+ </listitem>
+ </varlistentry>
</variablelist>
diff --git a/man/systemctl.xml b/man/systemctl.xml
index 98844783b0..a8c12b2f35 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -1944,11 +1944,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>-P</option></term>
<listitem>
- <para>Equivalent to <option>--value</option> <option>--property=</option>, i.e. shows the
- value of the property without the property name or <literal>=</literal>. Note that using
- <option>-P</option> once will also affect all properties listed with
- <option>-p</option>/<option>--property=</option>.</para>
-
+ <xi:include href="standard-options.xml" xpointer="xpointer(//varlistentry[@id='option-P']/listitem/para)" />
<xi:include href="version-info.xml" xpointer="v246"/>
</listitem>
</varlistentry>
diff --git a/man/systemd-battery-check.service.xml b/man/systemd-battery-check.service.xml
index 698e9d7c3f..a5f564b888 100644
--- a/man/systemd-battery-check.service.xml
+++ b/man/systemd-battery-check.service.xml
@@ -66,7 +66,7 @@
<variablelist class='kernel-commandline-options'>
<varlistentry>
- <term><varname>systemd.battery-check=<replaceable>BOOL</replaceable></varname></term>
+ <term><varname>systemd.battery_check=<replaceable>BOOL</replaceable></varname></term>
<listitem>
<para>Takes a boolean. If specified with false, <command>systemd-battery-check</command> command
diff --git a/man/systemd-bless-boot.service.xml b/man/systemd-bless-boot.service.xml
index 069b33c281..043ee71254 100644
--- a/man/systemd-bless-boot.service.xml
+++ b/man/systemd-bless-boot.service.xml
@@ -3,7 +3,7 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-bless-boot.service" conditional='ENABLE_BOOTLOADER'
+<refentry id="systemd-bless-boot.service" conditional='ENABLE_BOOTLOADER HAVE_BLKID'
xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
diff --git a/man/systemd-bsod.service.xml b/man/systemd-bsod.service.xml
index 9b0a9f4e48..1266784485 100644
--- a/man/systemd-bsod.service.xml
+++ b/man/systemd-bsod.service.xml
@@ -3,7 +3,8 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-bsod.service" conditional='HAVE_QRENCODE' xmlns:xi="http://www.w3.org/2001/XInclude">
+<refentry id="systemd-bsod.service" conditional='HAVE_QRENCODE ENABLE_INITRD'
+ xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
<title>systemd-bsod</title>
@@ -55,6 +56,17 @@
<xi:include href="version-info.xml" xpointer="v255"/></listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><option>--tty=</option><replaceable></replaceable></term>
+
+ <listitem><para>Specify the TTY to output to. By default <command>systemd-bsod</command> will
+ automatically find a free VT to display the message on. If this option is specified a TTY may be
+ selected explicitly. Use <option>--tty=/dev/tty</option> to direct output to the terminal the command
+ is invoked on.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
</variablelist>
</refsect1>
diff --git a/man/systemd-debug-generator.xml b/man/systemd-debug-generator.xml
index 2f27f0fe4e..5d1d5b7e60 100644
--- a/man/systemd-debug-generator.xml
+++ b/man/systemd-debug-generator.xml
@@ -63,7 +63,7 @@
<option>systemd.default_debug_tty=</option> option can be used which also takes a tty with or without the
<filename>/dev/</filename> prefix. Note that the shell may also be turned on persistently by enabling it
with <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
- <command>enable</command> command. <option>rd.systemd.debug_shell=</option> is honored only by initial
+ <command>enable</command> command. <option>rd.systemd.debug_shell</option> is honored only by initial
RAM disk (initrd) while <option>systemd.debug_shell</option> is honored only in the main system.</para>
<para><filename>systemd-debug-generator</filename> implements
diff --git a/man/systemd-importd.service.xml b/man/systemd-importd.service.xml
index 7e617cfc67..dfeaff4fd7 100644
--- a/man/systemd-importd.service.xml
+++ b/man/systemd-importd.service.xml
@@ -29,12 +29,12 @@
<refsect1>
<title>Description</title>
- <para><command>systemd-importd</command> is a system service that allows importing, exporting and downloading of
- system images suitable for running as VM or containers. It is a companion service for
- <citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>, and provides the implementation for
- <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
+ <para><command>systemd-importd</command> is a system service that allows importing, exporting and
+ downloading of disk images. It provides the implementation for
+ <citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
<command>pull-raw</command>, <command>pull-tar</command>, <command>import-raw</command>,
- <command>import-tar</command>, <command>import-fs</command>, <command>export-raw</command>, and <command>export-tar</command> commands.</para>
+ <command>import-tar</command>, <command>import-fs</command>, <command>export-raw</command>, and
+ <command>export-tar</command> commands.</para>
<para>See
<citerefentry><refentrytitle>org.freedesktop.import1</refentrytitle><manvolnum>5</manvolnum></citerefentry>
@@ -47,7 +47,7 @@
<title>See Also</title>
<para><simplelist type="inline">
<member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
- <member><citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
</simplelist></para>
diff --git a/man/systemd-journal-gatewayd.service.xml b/man/systemd-journal-gatewayd.service.xml
index 106d8a0fa3..38adfe6b4e 100644
--- a/man/systemd-journal-gatewayd.service.xml
+++ b/man/systemd-journal-gatewayd.service.xml
@@ -3,7 +3,7 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-journal-gatewayd.service" conditional='HAVE_MICROHTTPD'
+<refentry id="systemd-journal-gatewayd.service" conditional='ENABLE_REMOTE HAVE_MICROHTTPD'
xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
diff --git a/man/systemd-journal-remote.service.xml b/man/systemd-journal-remote.service.xml
index a8e8396718..a49ca126b5 100644
--- a/man/systemd-journal-remote.service.xml
+++ b/man/systemd-journal-remote.service.xml
@@ -6,7 +6,7 @@
]>
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-journal-remote" conditional='HAVE_MICROHTTPD'
+<refentry id="systemd-journal-remote" conditional='ENABLE_REMOTE HAVE_MICROHTTPD'
xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
diff --git a/man/systemd-journal-upload.service.xml b/man/systemd-journal-upload.service.xml
index b8ee645402..5bc843cd74 100644
--- a/man/systemd-journal-upload.service.xml
+++ b/man/systemd-journal-upload.service.xml
@@ -6,7 +6,7 @@
]>
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-journal-upload" conditional='HAVE_MICROHTTPD'
+<refentry id="systemd-journal-upload" conditional='ENABLE_REMOTE HAVE_LIBCURL'
xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
diff --git a/man/systemd-measure.xml b/man/systemd-measure.xml
index 6cbeac1e38..4edfa747ea 100644
--- a/man/systemd-measure.xml
+++ b/man/systemd-measure.xml
@@ -158,6 +158,7 @@
<varlistentry>
<term><option>--private-key=<replaceable>PATH</replaceable></option></term>
<term><option>--public-key=<replaceable>PATH</replaceable></option></term>
+ <term><option>--certificate=<replaceable>PATH</replaceable></option></term>
<listitem><para>These switches take paths to a pair of PEM encoded RSA key files, for use with
the <command>sign</command> command.</para>
@@ -172,10 +173,27 @@
<para>If the <option>--public-key=</option> is not specified but <option>--private-key=</option> is
specified the public key is automatically derived from the private key.</para>
+ <para><option>--certificate=</option> can be used to specify an X.509 certificate as an alternative
+ to <option>--public-key=</option> since v256.</para>
+
<xi:include href="version-info.xml" xpointer="v252"/></listitem>
</varlistentry>
<varlistentry>
+ <term><option>--private-key=<replaceable>PATH/URI</replaceable></option></term>
+ <term><option>--private-key-source=<replaceable>TYPE[:NAME]</replaceable></option></term>
+ <term><option>--certificate=<replaceable>PATH</replaceable></option></term>
+
+ <listitem><para>As an alternative to <option>--public-key=</option> for the
+ <command>sign</command> command, these switches can be used to sign with an hardware token. The
+ private key option can take a path or a URI that will be passed to the OpenSSL engine or
+ provider, as specified by <option>--private-key-source=</option> as a type:name tuple, such as
+ engine:pkcs11. The specified OpenSSL signing engine or provider will be used to sign.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>--tpm2-device=</option><replaceable>PATH</replaceable></term>
<listitem><para>Controls which TPM2 device to use. Expects a device node path referring to the TPM2
diff --git a/man/systemd-network-generator.service.xml b/man/systemd-network-generator.service.xml
index 1d498cbf1d..59d608028a 100644
--- a/man/systemd-network-generator.service.xml
+++ b/man/systemd-network-generator.service.xml
@@ -76,7 +76,7 @@
<varlistentry>
<term><varname>ifname=</varname></term>
- <term><varname>net.ifname-policy=</varname></term>
+ <term><varname>net.ifname_policy=</varname></term>
<listitem>
<para>Translated into
<citerefentry><refentrytitle>systemd.link</refentrytitle><manvolnum>5</manvolnum></citerefentry>
diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml
index 29edbba4cc..8f7e6d103d 100644
--- a/man/systemd-nspawn.xml
+++ b/man/systemd-nspawn.xml
@@ -1800,19 +1800,7 @@ After=sys-subsystem-net-devices-ens1.device</programlisting>
<refsect1>
<title>Examples</title>
- <example>
- <title>Download a
- <ulink url="https://getfedora.org">Fedora</ulink> image and start a shell in it</title>
-
- <programlisting># machinectl pull-raw --verify=no \
- https://download.fedoraproject.org/pub/fedora/linux/releases/&fedora_latest_version;/Cloud/x86_64/images/Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86_64.raw.xz \
- Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86-64
-# systemd-nspawn -M Fedora-Cloud-Base-&fedora_latest_version;-&fedora_cloud_release;.x86-64</programlisting>
-
- <para>This downloads an image using
- <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
- and opens a shell in it.</para>
- </example>
+ <xi:include href="importctl.xml" xpointer="example-import-tar" />
<example>
<title>Build and boot a minimal Fedora distribution in a container</title>
@@ -1921,6 +1909,7 @@ After=sys-subsystem-net-devices-ens1.device</programlisting>
<member><citerefentry project='mankier'><refentrytitle>zypper</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd.slice</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry project='url'><refentrytitle url='https://btrfs.readthedocs.io/en/latest/btrfs.html'>btrfs</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
</simplelist></para>
</refsect1>
diff --git a/man/systemd-pcrlock.xml b/man/systemd-pcrlock.xml
index 48a23dbf64..58907f728c 100644
--- a/man/systemd-pcrlock.xml
+++ b/man/systemd-pcrlock.xml
@@ -3,7 +3,8 @@
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-pcrlock" xmlns:xi="http://www.w3.org/2001/XInclude" conditional='HAVE_TPM2'>
+<refentry id="systemd-pcrlock" conditional='ENABLE_BOOTLOADER HAVE_OPENSSL HAVE_TPM2'
+ xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
<title>systemd-pcrlock</title>
diff --git a/man/systemd-pcrphase.service.xml b/man/systemd-pcrphase.service.xml
index 03de354876..e4ee094127 100644
--- a/man/systemd-pcrphase.service.xml
+++ b/man/systemd-pcrphase.service.xml
@@ -3,7 +3,7 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
-<refentry id="systemd-pcrphase.service" conditional='ENABLE_BOOTLOADER'
+<refentry id="systemd-pcrphase.service" conditional='ENABLE_BOOTLOADER HAVE_OPENSSL HAVE_TPM2'
xmlns:xi="http://www.w3.org/2001/XInclude">
<refentryinfo>
diff --git a/man/systemd-repart.xml b/man/systemd-repart.xml
index 7dfcfc90b3..7e2730a33a 100644
--- a/man/systemd-repart.xml
+++ b/man/systemd-repart.xml
@@ -355,11 +355,13 @@
</varlistentry>
<varlistentry>
- <term><option>--private-key-uri=</option></term>
+ <term><option>--private-key-source=</option></term>
- <listitem><para>Takes a URI-like string referring to a private key, that will be passed to OpenSSL's
- "engine" or "provider" logic. Configures the signing key to use when creating verity signature
- partitions with the <varname>Verity=signature</varname> setting in partition files.</para>
+ <listitem><para>Takes one of <literal>file</literal>, <literal>engine</literal> or
+ <literal>provider</literal>. In the latter two cases, it is followed by the name of a provider or
+ engine, separated by colon, that will be passed to OpenSSL's "engine" or "provider" logic.
+ Configures the signing mechanism to use when creating verity signature partitions with the
+ <varname>Verity=signature</varname> setting in partition files.</para>
<xi:include href="version-info.xml" xpointer="v256"/></listitem>
</varlistentry>
@@ -662,7 +664,7 @@ VERSION_ID=38
IMAGE_ID=my-foo
IMAGE_VERSION=7
EOF
-systemd-repart --make-ddi=sysext --private-key-uri="pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=0123456789abcdef;token=Some%20Cert" --certificate=cert.crt -s tree/ /var/lib/extensions/my-foo.sysext.raw
+systemd-repart --make-ddi=sysext --private-key-source=engine:pkcs11 --private-key="pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=0123456789abcdef;token=Some%20Cert" --certificate=cert.crt -s tree/ /var/lib/extensions/my-foo.sysext.raw
systemd-sysext refresh</programlisting>
<para>The DDI generated that way may be applied to the system with
diff --git a/man/systemd-resolved.service.xml b/man/systemd-resolved.service.xml
index 813e5f398c..8520a97e42 100644
--- a/man/systemd-resolved.service.xml
+++ b/man/systemd-resolved.service.xml
@@ -36,7 +36,7 @@
via three interfaces:</para>
<itemizedlist>
- <listitem><para>The native, fully-featured API <command>systemd-resolved</command> exposes on the bus,
+ <listitem><para>The native, fully-featured API <command>systemd-resolved</command> exposes via D-Bus,
see
<citerefentry><refentrytitle>org.freedesktop.resolve1</refentrytitle><manvolnum>5</manvolnum></citerefentry>
and
@@ -45,6 +45,11 @@
featured (for example, properly returns DNSSEC validation status and interface scope for addresses as
necessary for supporting link-local networking).</para></listitem>
+ <listitem><para>The native API <command>systemd-resolved</command> exposes via Varlink on the
+ <filename>/run/systemd/resolve/io.systemd.Resolve</filename> AF_UNIX socket. This provides similar
+ functionality as the D-Bus interface, but is available during the entire runtime, without requiring a
+ running D-Bus system bus broker service.</para></listitem>
+
<listitem><para>The glibc
<citerefentry project='man-pages'><refentrytitle>getaddrinfo</refentrytitle><manvolnum>3</manvolnum></citerefentry>
API as defined by <ulink url="https://tools.ietf.org/html/rfc3493">RFC3493</ulink> and its related
diff --git a/man/systemd-ssh-generator.xml b/man/systemd-ssh-generator.xml
index 2f4f2a6f0e..98efc74fc8 100644
--- a/man/systemd-ssh-generator.xml
+++ b/man/systemd-ssh-generator.xml
@@ -63,6 +63,11 @@
<citerefentry><refentrytitle>systemd-ssh-proxy</refentrytitle><manvolnum>1</manvolnum></citerefentry> for
details on how to connect to these sockets via the <command>ssh</command> client.</para>
+ <para>The <varname>ssh.authorized_keys.root</varname> credential can be used to allow specific public keys
+ to log in over SSH. See
+ <citerefentry><refentrytitle>systemd.systemd-credentials</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+ for more information.</para>
+
<para>The generator will use a packaged <filename>sshd@.service</filename> service template file if one
exists, and otherwise generate a suitable service template file.</para>
diff --git a/man/systemd-suspend.service.xml b/man/systemd-suspend.service.xml
index d8ea8f5f81..9fbca6193f 100644
--- a/man/systemd-suspend.service.xml
+++ b/man/systemd-suspend.service.xml
@@ -66,7 +66,9 @@
same executables are run, but the first argument is now
<literal>post</literal>. All executables in this directory are
executed in parallel, and execution of the action is not continued
- until all executables have finished.</para>
+ until all executables have finished. Note that <filename>user.slice</filename> will
+ be frozen while the executables are running, so they should not attempt to
+ communicate with any user services expecting a reply.</para>
<para>Note that scripts or binaries dropped in
<filename>/usr/lib/systemd/system-sleep/</filename> are intended
@@ -90,6 +92,11 @@
<filename>sleep.conf.d</filename> file. See
<citerefentry><refentrytitle>systemd-sleep.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
</para>
+
+ <para>Note that by default these services freeze <filename>user.slice</filename> while they run. This prevents
+ the execution of any process in any of the user sessions while the system is entering into and resuming from
+ sleep. Thus, this prevents the hooks in <filename>/usr/lib/systemd/system-sleep/</filename>, or any other process
+ for that matter, from communicating with any user session process during sleep.</para>
</refsect1>
<refsect1>
diff --git a/man/systemd-sysext.xml b/man/systemd-sysext.xml
index d32804409b..8e5a6a6aa1 100644
--- a/man/systemd-sysext.xml
+++ b/man/systemd-sysext.xml
@@ -69,8 +69,10 @@
<filename>/var/</filename> included in a system extension image will <emphasis>not</emphasis> appear in
the respective hierarchies after activation.</para>
- <para>System extension images are strictly read-only, and the host <filename>/usr/</filename> and
- <filename>/opt/</filename> hierarchies become read-only too while they are activated.</para>
+ <para>System extension images are strictly read-only by default. On mutable host file systems,
+ <filename>/usr/</filename> and <filename>/opt/</filename> hierarchies become read-only while extensions
+ are merged, unless mutability is enabled. Mutability may be enabled via the <option>--mutable=</option>
+ option; see "Mutability" below for more information.</para>
<para>System extensions are supposed to be purely additive, i.e. they are supposed to include only files
that do not exist in the underlying basic OS image. However, the underlying mechanism (overlayfs) also
@@ -158,6 +160,11 @@
same as sysext images. The merged hierarchy will be mounted with <literal>nosuid</literal> and
(if not disabled via <option>--noexec=false</option>) <literal>noexec</literal>.</para>
+ <para>Just like sysexts, confexts are strictly read-only by default. Merging confexts on mutable host
+ file systems will result in <filename>/etc/</filename> becoming read-only. As with sysexts, mutability
+ can be enabled via the <option>--mutable=</option> option. Refer to "Mutability" below for more
+ information.</para>
+
<para>Confexts are looked for in the directories <filename>/run/confexts/</filename>,
<filename>/var/lib/confexts/</filename>, <filename>/usr/lib/confexts/</filename> and
<filename>/usr/local/lib/confexts/</filename>. The first listed directory is not suitable for
@@ -206,6 +213,55 @@
system reboot. This will help reduce servicing times when there is a need for changing the OS configuration.</para></refsect1>
<refsect1>
+ <title>Mutability</title>
+ <para>By default, merging system extensions on mutable host file systems will render <filename>/usr/</filename>
+ and <filename>/opt/</filename> hierarchies read-only. Merging configuration extensions will have the same
+ effect on <filename>/etc/</filename>. Mutable mode allows writes to these locations when extensions are
+ merged.</para>
+
+ <para>The following modes are supported:
+ <orderedlist>
+ <listitem><para><option>disabled</option>: Force immutable mode even if write routing
+ directories exist below <filename>/var/lib/extensions.mutable/</filename>.
+ This is the default.</para></listitem>
+ <listitem><para><option>auto</option>: Automatic mode. Mutability is disabled by default
+ and only enabled if a corresponding write routing directory exists below
+ <filename>/var/lib/extensions.mutable/</filename>.</para></listitem>
+ <listitem><para><option>enabled</option>: Force mutable mode and automatically create write routing
+ directories below <filename>/var/lib/extensions.mutable/</filename> when required.</para></listitem>
+ <listitem><para><option>import</option>: Force immutable mode like <option>disabled</option> above, but
+ merge the contents of directories below <filename>/var/lib/extensions.mutable/</filename> into the host
+ file system.</para></listitem>
+ </orderedlist>
+ See "Options" below on specifying modes using the <option>--mutable=</option> command line option.</para>
+
+ <para>Mutable mode routes writes to subdirectories in <filename>/var/lib/extensions.mutable/</filename>.
+ <simplelist type="horiz">
+ <member>Writes to <filename>/usr/</filename> are directed to <filename>/var/lib/extensions.mutable/usr/</filename></member>,
+ <member>writes to <filename>/opt/</filename> are directed to <filename>/var/lib/extensions.mutable/opt/</filename>, and</member>
+ <member>writes to <filename>/etc/</filename> land in <filename>/var/lib/extensions.mutable/etc/</filename>.</member>
+ </simplelist></para>
+
+ <para>If <filename>usr/</filename>, <filename>opt/</filename>, or <filename>etc/</filename>
+ in <filename>/var/lib/extensions.mutable/</filename> are symlinks, then writes are directed to the
+ symlinks' targets.
+ Consequently, to retain mutability of a host file system, create symlinks
+ <simplelist type="horiz">
+ <member><filename>/var/lib/extensions.mutable/etc/</filename> → <filename>/etc/</filename></member>
+ <member><filename>/var/lib/extensions.mutable/usr/</filename> → <filename>/usr/</filename></member>
+ <member><filename>/var/lib/extensions.mutable/opt/</filename> → <filename>/opt/</filename></member>
+ </simplelist>
+ to route writes back to the original base directory hierarchy.</para>
+
+ <para> Alternatively, a temporary file system may be mounted to
+ <filename>/var/lib/extensions.mutable/</filename>, or symlinks in
+ <filename>/var/lib/extensions.mutable/</filename> may point to sub-directories on a temporary
+ file system (e.g. below <filename>/tmp/</filename>) to only allow ephemeral changes.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </refsect1>
+
+ <refsect1>
<title>Commands</title>
<para>The following commands are understood by both the sysext and confext concepts:</para>
@@ -314,6 +370,45 @@
</varlistentry>
<varlistentry>
+ <term><option>--mutable=</option><replaceable>BOOL</replaceable>|<replaceable>auto</replaceable>|<replaceable>import</replaceable></term>
+ <listitem><para>Set mutable mode.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>no</option></term>
+ <listitem><para>force immutable mode even with write routing directories present.
+ This is the default.</para>
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>auto</option></term>
+ <listitem><para>enable mutable mode individually for <filename>/usr/</filename>,
+ <filename>/opt/</filename>, and <filename>/etc/</filename> if write routing sub-directories
+ or symlinks are present in <filename>/var/lib/extensions.mutable/</filename>; disable otherwise.
+ See "Mutability" above for more information on write routing.</para>
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>yes</option></term>
+ <listitem><para>force mutable mode. Write routing directories will be created in
+ <filename>/var/lib/extensions.mutable/</filename> if not present.</para>
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>import</option></term>
+ <listitem><para>immutable mode, but with contents of write routing directories in
+ <filename>/var/lib/extensions.mutable/</filename> also merged into the host file system.</para>
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+ </variablelist>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>--noexec=</option><replaceable>BOOL</replaceable></term>
<listitem><para>When merging configuration extensions into <filename>/etc/</filename> the
@@ -354,6 +449,7 @@
<member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>systemd-stub</refentrytitle><manvolnum>7</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
</simplelist></para>
</refsect1>
diff --git a/man/systemd-timedated.service.xml b/man/systemd-timedated.service.xml
index 29741f5ca7..eb4fc18096 100644
--- a/man/systemd-timedated.service.xml
+++ b/man/systemd-timedated.service.xml
@@ -63,7 +63,7 @@
<refsect1>
<title>List of network time synchronization services</title>
- <para><command>systemd-timesyncd</command> will look for files with a <literal>.list</literal> extension
+ <para><command>systemd-timedated</command> will look for files with a <literal>.list</literal> extension
in <filename>ntp-units.d/</filename> directories. Each file is parsed as a list of unit names, one per
line. Empty lines and lines with comments (<literal>#</literal>) are ignored. Files are read from
<filename>/usr/lib/systemd/ntp-units.d/</filename> and the corresponding directories under
@@ -82,7 +82,7 @@ systemd-timesyncd.service
</example>
<para>If the environment variable <varname>$SYSTEMD_TIMEDATED_NTP_SERVICES</varname> is set,
- <command>systemd-timesyncd</command> will parse the contents of that variable as a colon-separated list
+ <command>systemd-timedated</command> will parse the contents of that variable as a colon-separated list
of unit names. When set, this variable overrides the file-based list described above.</para>
<example>
diff --git a/man/systemd-udevd.service.xml b/man/systemd-udevd.service.xml
index b63ee4bb77..c781765e1c 100644
--- a/man/systemd-udevd.service.xml
+++ b/man/systemd-udevd.service.xml
@@ -236,7 +236,7 @@
</listitem>
</varlistentry>
<varlistentry>
- <term><varname>net.naming-scheme=</varname></term>
+ <term><varname>net.naming_scheme=</varname></term>
<listitem>
<para>Network interfaces are renamed to give them predictable names when possible (unless
<varname>net.ifnames=0</varname> is specified, see above). With this kernel command line option it
@@ -255,7 +255,7 @@
</listitem>
</varlistentry>
<varlistentry>
- <term><varname>net.ifname-policy=<replaceable>policy1</replaceable>[,<replaceable>policy2</replaceable>,…][,<replaceable>MAC</replaceable>]</varname></term>
+ <term><varname>net.ifname_policy=<replaceable>policy1</replaceable>[,<replaceable>policy2</replaceable>,…][,<replaceable>MAC</replaceable>]</varname></term>
<listitem>
<para>Specifies naming policies applied when renaming network interfaces. Takes a list of
policies and an optional MAC address separated with comma. Each policy value must be one of
@@ -273,8 +273,8 @@
enabled.</para>
<para>Example:
- <programlisting>net.ifname-policy=keep,kernel,path,slot,onboard,01:23:45:67:89:ab
-net.ifname-policy=keep,kernel,path,slot,onboard,mac</programlisting>
+ <programlisting>net.ifname_policy=keep,kernel,path,slot,onboard,01:23:45:67:89:ab
+net.ifname_policy=keep,kernel,path,slot,onboard,mac</programlisting>
This is mostly equivalent to creating the following .link files:
<programlisting># 91-name-policy-with-mac.link
[Match]
diff --git a/man/systemd-update-done.service.xml b/man/systemd-update-done.service.xml
index 46bb2f41c8..6b863ecff3 100644
--- a/man/systemd-update-done.service.xml
+++ b/man/systemd-update-done.service.xml
@@ -58,7 +58,7 @@
<citerefentry project='man-pages'><refentrytitle>touch</refentrytitle><manvolnum>1</manvolnum></citerefentry>
on it.</para>
- <para>Note that if the <varname>systemd.condition-needs-update=</varname> kernel command line option is
+ <para>Note that if the <varname>systemd.condition_needs_update=</varname> kernel command line option is
used it overrides the <varname>ConditionNeedsUpdate=</varname> unit condition checks. In that case
<filename>systemd-update-done.service</filename> will not reset the condition state until a follow-up
reboot where the kernel switch is not specified anymore.</para>
diff --git a/man/systemd-vmspawn.xml b/man/systemd-vmspawn.xml
index 90485b7e1b..ef4d3ca2b6 100644
--- a/man/systemd-vmspawn.xml
+++ b/man/systemd-vmspawn.xml
@@ -42,7 +42,8 @@
file descriptors must be passed with the names <literal>kvm</literal> and <literal>vhost-vsock</literal>
respectively.</para>
- <para>Note: on Ubuntu/Debian derivatives systemd-vmspawn requires the user to be in the <literal>kvm</literal> group to use the VSock options.</para>
+ <para>Note: on Ubuntu/Debian derivatives systemd-vmspawn requires the user to be in the
+ <literal>kvm</literal> group to use the VSOCK options.</para>
</refsect1>
<refsect1>
@@ -103,7 +104,7 @@
<variablelist>
<varlistentry>
- <term><option>--qemu-smp=</option><replaceable>SMP</replaceable></term>
+ <term><option>--cpus=</option><replaceable>CPUS</replaceable></term>
<listitem><para>Configures the number of CPUs to start the virtual machine with.
Defaults to 1.</para>
@@ -113,7 +114,7 @@
</varlistentry>
<varlistentry>
- <term><option>--qemu-mem=</option><replaceable>MEM</replaceable></term>
+ <term><option>--ram=</option><replaceable>BYTES</replaceable></term>
<listitem><para>Configures the amount of memory to start the virtual machine with.
Defaults to 2G.</para>
@@ -123,7 +124,7 @@
</varlistentry>
<varlistentry>
- <term><option>--qemu-kvm=</option><replaceable>BOOL</replaceable></term>
+ <term><option>--kvm=</option><replaceable>BOOL</replaceable></term>
<listitem><para>Configures whether to use KVM. If the option is not specified KVM support will be
detected automatically. If true, KVM is always used, and if false, KVM is never used.</para>
@@ -132,13 +133,13 @@
</varlistentry>
<varlistentry>
- <term><option>--qemu-vsock=</option><replaceable>BOOL</replaceable></term>
+ <term><option>--vsock=</option><replaceable>BOOL</replaceable></term>
<listitem>
- <para>Configure whether to use VSock networking.</para>
+ <para>Configure whether to use VSOCK networking.</para>
- <para>If the option is not specified VSock support will be detected automatically.
- If yes is specified VSocks are always used, and vice versa if no is set VSocks are never used.</para>
+ <para>If the option is not specified VSOCK support will be detected automatically. If yes is
+ specified VSOCK is always used, and vice versa if no is set VSOCK are never used.</para>
<xi:include href="version-info.xml" xpointer="v255"/>
</listitem>
</varlistentry>
@@ -162,7 +163,7 @@
<term><option>--tpm=</option><replaceable>BOOL</replaceable></term>
<listitem>
- <para>Configure whether to use qemu with a virtual TPM or not.</para>
+ <para>Configure whether to use VM with a virtual TPM or not.</para>
<para>If the option is not specified vmspawn will detect the presence of <citerefentry project='man-pages'>
<refentrytitle>swtpm</refentrytitle><manvolnum>8</manvolnum></citerefentry> and use it if available.
@@ -205,14 +206,6 @@
</varlistentry>
<varlistentry>
- <term><option>--qemu-gui</option></term>
-
- <listitem><para>Start QEMU in graphical mode.</para>
-
- <xi:include href="version-info.xml" xpointer="v255"/></listitem>
- </varlistentry>
-
- <varlistentry>
<term><option>-n</option></term>
<term><option>--network-tap</option></term>
@@ -234,7 +227,7 @@
<varlistentry>
<term><option>--network-user-mode</option></term>
- <listitem><para>Use user mode networking with QEMU.</para>
+ <listitem><para>Use user mode networking.</para>
<xi:include href="version-info.xml" xpointer="v255"/></listitem>
</varlistentry>
@@ -281,6 +274,41 @@
<xi:include href="version-info.xml" xpointer="v255"/>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><option>--uuid=</option></term>
+
+ <listitem><para>Set the specified UUID for the virtual machine. The
+ init system will initialize
+ <filename>/etc/machine-id</filename> from this if this file is
+ not set yet. Note that this option takes effect only if
+ <filename>/etc/machine-id</filename> in the virtual machine is
+ unpopulated.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect2>
+
+ <refsect2>
+ <title>Property Options</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>--register=</option></term>
+
+ <listitem><para>Controls whether the virtual machine is registered with
+ <citerefentry><refentrytitle>systemd-machined</refentrytitle><manvolnum>8</manvolnum></citerefentry>. Takes a
+ boolean argument, which defaults to <literal>yes</literal> when running as root, and <literal>no</literal> when
+ running as a regular user. This ensures that the virtual machine is accessible via
+ <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para>
+
+ <para>Note: root privileges are required to use this option as registering with
+ <citerefentry><refentrytitle>systemd-machined</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ requires privileged D-Bus method calls.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
</variablelist>
</refsect2>
@@ -328,6 +356,15 @@
<xi:include href="version-info.xml" xpointer="v256"/></listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><option>--extra-drive=</option><replaceable>PATH</replaceable></term>
+
+ <listitem><para>Takes a disk image or block device on the host and supplies it to the virtual machine as another drive.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
</variablelist>
</refsect2>
@@ -352,6 +389,42 @@
</refsect2>
<refsect2>
+ <title>Input/Output Options</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>--console=</option><replaceable>MODE</replaceable></term>
+
+ <listitem><para>Configures how to set up the console of the VM. Takes one of
+ <literal>interactive</literal>, <literal>read-only</literal>, <literal>native</literal>,
+ <literal>gui</literal>. Defaults to <literal>interactive</literal>. <literal>interactive</literal>
+ provides an interactive terminal interface to the VM. <literal>read-only</literal> is similar, but
+ is strictly read-only, i.e. does not accept any input from the user. <literal>native</literal> also
+ provides a TTY-based interface, but uses qemu native implementation (which means the qemu monitor
+ is available). <literal>gui</literal> shows the qemu graphical UI.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--background=<replaceable>COLOR</replaceable></option></term>
+
+ <listitem><para>Change the terminal background color to the specified ANSI color as long as the VM
+ runs. The color specified should be an ANSI X3.64 SGR background color, i.e. strings such as
+ <literal>40</literal>, <literal>41</literal>, …, <literal>47</literal>, <literal>48;2;…</literal>,
+ <literal>48;5;…</literal>. See <ulink
+ url="https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters">ANSI
+ Escape Code (Wikipedia)</ulink> for details. Assign an empty string to disable any coloring. This
+ only has an effect in <option>--console=interactive</option> and
+ <option>--console=read-only</option> modes.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect2>
+
+ <refsect2>
<title>Credentials</title>
<variablelist>
@@ -412,6 +485,8 @@ $ systemd-vmspawn --image=image.raw
<para><simplelist type="inline">
<member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
<member><citerefentry><refentrytitle>mkosi</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+ <member><citerefentry><refentrytitle>importctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
</simplelist></para>
</refsect1>
</refentry>
diff --git a/man/systemd.link.xml b/man/systemd.link.xml
index 3e98e4ddba..7c0a84dff8 100644
--- a/man/systemd.link.xml
+++ b/man/systemd.link.xml
@@ -968,6 +968,21 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><varname>ReceivePacketSteeringCPUMask=</varname></term>
+ <listitem>
+ <para>Configures Receive Packet Steering (RPS) list of CPUs to which RPS may forward traffic.
+ Takes a list of CPU indices or ranges separated by either whitespace or commas. Alternatively,
+ takes the special value <literal>all</literal> in which will include all available CPUs in the mask.
+ CPU ranges are specified by the lower and upper CPU indices separated by a dash (e.g. <literal>2-6</literal>).
+ This option may be specified more than once, in which case the specified CPU affinity masks are merged.
+ If an empty string is assigned, the mask is reset, all assignments prior to this will have no effect.
+ Defaults to unset and RPS CPU list is unchanged. To disable RPS when it was previously enabled, use the
+ special value <literal>disable</literal>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><varname>ReceiveVLANCTAGHardwareAcceleration=</varname></term>
<listitem>
<para>Takes a boolean. If set to true, receive VLAN CTAG hardware acceleration is enabled.
diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml
index 09df42aea2..2fec1055b7 100644
--- a/man/systemd.net-naming-scheme.xml
+++ b/man/systemd.net-naming-scheme.xml
@@ -38,7 +38,7 @@
implemented version, but it is also possible to set one of the older versions to preserve
compatibility. This may be useful for example for distributions, which may introduce new versions of
systemd in stable releases without changing the naming scheme. The naming scheme may also be overridden
- using the <varname>net.naming-scheme=</varname> kernel command line switch, see
+ using the <varname>net.naming_scheme=</varname> kernel command line switch, see
<citerefentry><refentrytitle>systemd-udevd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
Available naming schemes are described below.</para>
@@ -326,7 +326,7 @@
<title>History</title>
<para>The following "naming schemes" have been defined (which may be chosen at system boot-up time via
- the <varname>net.naming-scheme=</varname> kernel command line switch, see above):</para>
+ the <varname>net.naming_scheme=</varname> kernel command line switch, see above):</para>
<variablelist>
<varlistentry>
diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml
index 08da75f06f..4e9afc3674 100644
--- a/man/systemd.netdev.xml
+++ b/man/systemd.netdev.xml
@@ -571,6 +571,19 @@
<xi:include href="version-info.xml" xpointer="v248"/>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><varname>BroadcastQueueThreshold=</varname></term>
+ <listitem>
+ <para>Controls the threshold for broadcast queueing of the macvlan device. Takes the special value
+ <literal>no</literal>, or an integer in the range 0…2147483647. When <literal>no</literal> is
+ specified, the broadcast queueing is disabled altogether. When an integer is specified, a multicast
+ address will be queued as broadcast if the number of devices using it is greater than the given
+ value. Defaults to unset, and the kernel default will be used.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
@@ -2170,6 +2183,19 @@
</varlistentry>
<varlistentry>
+ <term><varname>PeerNotifyDelaySec=</varname></term>
+ <listitem>
+ <para>Specifies the number of seconds the delay between each peer notification
+ (gratuitous ARP and unsolicited IPv6 Neighbor Advertisement) when they are issued
+ after a failover event. This delay should be a multiple of the MII link monitor
+ interval (miimon). The valid range is 0...300s. The default value is 0,
+ which means to match the value of the <varname>MIIMonitorSec=</varname>.</para>
+
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>UpDelaySec=</varname></term>
<listitem>
<para>Specifies the delay before a link is enabled after a
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index adff23d1fe..9be90e17c5 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -803,26 +803,43 @@ Table=1234</programlisting></para>
</varlistentry>
<varlistentry>
- <term><varname>IPForward=</varname></term>
- <listitem>
- <para>Configures IP packet forwarding for the system. If enabled, incoming packets on any
- network interface will be forwarded to any other interfaces according to the routing table.
- Takes a boolean, or the values <literal>ipv4</literal> or <literal>ipv6</literal>, which only
- enable IP packet forwarding for the specified address family. This controls the
- <filename>net.ipv4.ip_forward</filename> and <filename>net.ipv6.conf.all.forwarding</filename>
- sysctl options of the network interface (see
+ <term><varname>IPv4Forwarding=</varname></term>
+ <listitem>
+ <para>Configures IPv4 packet forwarding for the interface. Takes a boolean value. This controls the
+ <filename>net.ipv4.conf.<replaceable>INTERFACE</replaceable>.forwarding</filename> sysctl option of
+ the network interface. See
<ulink url="https://docs.kernel.org/networking/ip-sysctl.html">IP Sysctl</ulink>
- for details about sysctl options). Defaults to <literal>no</literal>.</para>
+ for more details about the sysctl option. Defaults to true if <varname>IPMasquerade=</varname> is
+ enabled for IPv4, otherwise the value specified to the same setting in
+ <citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+ will be used. If none of them are specified, the sysctl option will not be changed.</para>
+
+ <para>To control the global setting, use the same setting in
+ <citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+ </para>
- <para>Note: this setting controls a global kernel option, and does so one way only: if a
- network that has this setting enabled is set up the global setting is turned on. However,
- it is never turned off again, even after all networks with this setting enabled are shut
- down again.</para>
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
- <para>To allow IP packet forwarding only between specific network interfaces use a firewall.
+ <varlistentry>
+ <term><varname>IPv6Forwarding=</varname></term>
+ <listitem>
+ <para>Configures IPv6 packet forwarding for the interface. Takes a boolean value. This controls the
+ <filename>net.ipv6.conf.<replaceable>INTERFACE</replaceable>.forwarding</filename> sysctl option of
+ the network interface. See
+ <ulink url="https://docs.kernel.org/networking/ip-sysctl.html">IP Sysctl</ulink>
+ for more details about the sysctl option. Defaults to true if <varname>IPMasquerade=</varname> is
+ enabled for IPv6 or <varname>IPv6SendRA=</varname> is enabled, otherwise the value specified to the
+ same setting in
+ <citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+ will be used. If none of them are specified, the sysctl option will not be changed.</para>
+
+ <para>To control the global setting, use the same setting in
+ <citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
</para>
- <xi:include href="version-info.xml" xpointer="v219"/>
+ <xi:include href="version-info.xml" xpointer="v256"/>
</listitem>
</varlistentry>
@@ -832,9 +849,7 @@ Table=1234</programlisting></para>
<para>Configures IP masquerading for the network interface. If enabled, packets forwarded
from the network interface will be appear as coming from the local host. Takes one of
<literal>ipv4</literal>, <literal>ipv6</literal>, <literal>both</literal>, or
- <literal>no</literal>. Defaults to <literal>no</literal>. If enabled, this automatically sets
- <varname>IPForward=</varname> to one of <literal>ipv4</literal>, <literal>ipv6</literal> or
- <literal>yes</literal>.</para>
+ <literal>no</literal>. Defaults to <literal>no</literal>.</para>
<para>Note. Any positive boolean values such as <literal>yes</literal> or
<literal>true</literal> are now deprecated. Please use one of the values in the above.</para>
@@ -3380,16 +3395,6 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
</varlistentry>
<varlistentry>
- <term><varname>UseICMP6RateLimit=</varname></term>
- <listitem>
- <para>Takes a boolean. When true, the ICMP6 rate limit received in the Router Advertisement will be set to ICMP6
- rate limit based on the advertisement. Defaults to true.</para>
-
- <xi:include href="version-info.xml" xpointer="v255"/>
- </listitem>
- </varlistentry>
-
- <varlistentry>
<term><varname>UseGateway=</varname></term>
<listitem>
<para>When true (the default), the router address will be configured as the default gateway.
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 46184f5b7e..7c11598a94 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -1624,7 +1624,7 @@
to make sure they run before the stamp file's modification time gets reset indicating a completed
update.</para>
- <para>If the <varname>systemd.condition-needs-update=</varname> option is specified on the kernel
+ <para>If the <varname>systemd.condition_needs_update=</varname> option is specified on the kernel
command line (taking a boolean), it will override the result of this condition check, taking
precedence over any file modification time checks. If the kernel command line option is used,
<filename>systemd-update-done.service</filename> will not have immediate effect on any following
@@ -1673,7 +1673,7 @@
<varname>Wants=</varname>. This ensures that in a case of an aborted first boot, these units will
be re-run during the next system startup.</para>
- <para>If the <varname>systemd.condition-first-boot=</varname> option is specified on the kernel
+ <para>If the <varname>systemd.condition_first_boot=</varname> option is specified on the kernel
command line (taking a boolean), it will override the result of this condition check, taking
precedence over <filename>/etc/machine-id</filename> existence checks.</para>
diff --git a/man/timedatectl.xml b/man/timedatectl.xml
index 5e6a242fc1..ece8833295 100644
--- a/man/timedatectl.xml
+++ b/man/timedatectl.xml
@@ -273,6 +273,15 @@
<xi:include href="version-info.xml" xpointer="v239"/></listitem>
</varlistentry>
+ <varlistentry id='option-P'>
+ <term><option>-P</option></term>
+
+ <listitem>
+ <xi:include href="standard-options.xml" xpointer="xpointer(//varlistentry[@id='option-P']/listitem/para)" />
+ <xi:include href="version-info.xml" xpointer="v256"/>
+ </listitem>
+ </varlistentry>
+
<xi:include href="user-system-options.xml" xpointer="host" />
<xi:include href="user-system-options.xml" xpointer="machine" />
diff --git a/man/ukify.xml b/man/ukify.xml
index 659c6ed0a3..dc7910fcd2 100644
--- a/man/ukify.xml
+++ b/man/ukify.xml
@@ -99,7 +99,10 @@
the n-th boot phase path set will be signed by the n-th key. This can be used to build different trust
policies for different phases of the boot. In the config file, <varname>PCRPrivateKey=</varname>,
<varname>PCRPublicKey=</varname>, and <varname>Phases=</varname> are grouped into separate sections,
- describing separate boot phases.</para>
+ describing separate boot phases. If <varname>SigningEngine=</varname>/<option>--signing-engine=</option>
+ is specified, then the private keys arguments will be passed verbatim to OpenSSL as URIs, and the public
+ key arguments will be loaded as X.509 certificates, so that signing can be performed with an OpenSSL
+ engine.</para>
<para>If a SecureBoot signing key is provided via the
<varname>SecureBootPrivateKey=</varname>/<option>--secureboot-private-key=</option> option, the resulting
diff --git a/meson.build b/meson.build
index bf9b8c7e74..7ac331fb36 100644
--- a/meson.build
+++ b/meson.build
@@ -232,6 +232,7 @@ conf.set_quoted('ENVIRONMENT_DIR', environmentdir)
conf.set_quoted('INCLUDE_DIR', includedir)
conf.set_quoted('LIBDIR', libdir)
conf.set_quoted('LIBEXECDIR', libexecdir)
+conf.set_quoted('KERNEL_INSTALL_DIR', kernelinstalldir)
conf.set_quoted('MODPROBE_DIR', modprobedir)
conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
@@ -761,17 +762,6 @@ if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0
endif
conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
-default_hierarchy = get_option('default-hierarchy')
-conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
- description : 'default cgroup hierarchy as string')
-if default_hierarchy == 'legacy'
- conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
-elif default_hierarchy == 'hybrid'
- conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
-else
- conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
-endif
-
extra_net_naming_schemes = []
extra_net_naming_map = []
foreach scheme: get_option('extra-net-naming-schemes').split(',')
@@ -1381,16 +1371,19 @@ conf.set10('HAVE_BZIP2', libbzip2.found())
libxz = dependency('liblzma',
required : get_option('xz'))
conf.set10('HAVE_XZ', libxz.found())
+libxz_cflags = libxz.partial_dependency(includes: true, compile_args: true)
liblz4 = dependency('liblz4',
version : '>= 1.3.0',
required : get_option('lz4'))
conf.set10('HAVE_LZ4', liblz4.found())
+liblz4_cflags = liblz4.partial_dependency(includes: true, compile_args: true)
libzstd = dependency('libzstd',
version : '>= 1.4.0',
required : get_option('zstd'))
conf.set10('HAVE_ZSTD', libzstd.found())
+libzstd_cflags = libzstd.partial_dependency(includes: true, compile_args: true)
conf.set10('HAVE_COMPRESSION', libxz.found() or liblz4.found() or libzstd.found())
@@ -1853,13 +1846,27 @@ xml_helper_py = find_program('tools/xml_helper.py')
#####################################################################
version_tag = get_option('version-tag')
-version_h = vcs_tag(
- input : 'src/version/version.h.in',
- output : 'version.h',
- command: [project_source_root / 'tools/meson-vcs-tag.sh',
- project_source_root,
- version_tag,
- ])
+if version_tag == ''
+ version_tag = meson.project_version()
+endif
+
+conf.set_quoted('VERSION_TAG', version_tag)
+
+vcs_tag = get_option('vcs-tag')
+if vcs_tag and fs.is_dir(project_source_root / '.git')
+ version_h = vcs_tag(
+ input : 'src/version/version.h.in',
+ output : 'version.h',
+ fallback : '',
+ command : ['sh', '-c', 'echo "-g$(git -C . describe --abbrev=7 --match="" --always --dirty=^)"'],
+ )
+else
+ version_h = configure_file(
+ input : 'src/version/version.h.in',
+ output : 'version.h',
+ configuration : configuration_data({'VCS_TAG' : ''}),
+ )
+endif
shared_lib_tag = get_option('shared-lib-tag')
if shared_lib_tag == ''
@@ -1880,7 +1887,7 @@ config_h = configure_file(
userspace_c_args += ['-include', 'config.h']
-jinja2_cmdline = [meson_render_jinja2, config_h, version_h]
+jinja2_cmdline = [meson_render_jinja2, config_h]
userspace = declare_dependency(
compile_args : userspace_c_args,
@@ -1947,8 +1954,7 @@ libsystemd = shared_library(
link_args : ['-shared',
'-Wl,--version-script=' + libsystemd_sym_path],
link_with : [libbasic,
- libbasic_gcrypt,
- libbasic_compress],
+ libbasic_gcrypt],
link_whole : [libsystemd_static],
dependencies : [librt,
threads,
@@ -1965,7 +1971,6 @@ install_libsystemd_static = static_library(
libsystemd_sources,
basic_sources,
basic_gcrypt_sources,
- basic_compress_sources,
fundamental_sources,
include_directories : libsystemd_includes,
build_by_default : static_libsystemd != 'false',
@@ -1977,12 +1982,12 @@ install_libsystemd_static = static_library(
libcap,
libdl,
libgcrypt,
- liblz4,
+ liblz4_cflags,
libmount,
libopenssl,
librt,
- libxz,
- libzstd,
+ libxz_cflags,
+ libzstd_cflags,
threads,
userspace],
c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
@@ -2754,9 +2759,8 @@ summary({
'default LLMNR mode' : default_llmnr,
'default DNS servers' : dns_servers.split(' '),
'default NTP servers' : ntp_servers.split(' '),
- 'default cgroup hierarchy' : default_hierarchy,
- 'default net.naming-scheme value' : default_net_naming_scheme,
- 'default KillUserProcesses value' : kill_user_processes,
+ 'default net.naming_scheme= value': default_net_naming_scheme,
+ 'default KillUserProcesses= value': kill_user_processes,
'default locale' : default_locale,
'default nspawn locale' : nspawn_locale,
'default status unit format' : status_unit_format_default,
diff --git a/meson_options.txt b/meson_options.txt
index b51af01721..3a3ab6e7c1 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -2,9 +2,11 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
option('version-tag', type : 'string',
- description : 'override the git version string')
+ description : 'set the extended version string (defaults to project version)')
option('shared-lib-tag', type : 'string',
description : 'override the private shared library version tag (defaults to project version)')
+option('vcs-tag', type : 'boolean', value : true,
+ description : 'append current git commit to version output when git information is available')
option('mode', type : 'combo', choices : ['developer', 'release'],
description : 'autoenable features suitable for systemd development/release builds')
@@ -67,7 +69,7 @@ option('loadkeys-path', type : 'string', description : 'path to loadkeys')
option('setfont-path', type : 'string', description : 'path to setfont')
option('nologin-path', type : 'string', description : 'path to nologin')
-option('debug-shell', type : 'string', value : '/usr/bin/sh',
+option('debug-shell', type : 'string', value : '/bin/sh',
description : 'path to debug shell binary')
option('debug-tty', type : 'string', value : '/dev/tty9',
description : 'specify the tty device for debug shell')
@@ -225,12 +227,12 @@ option('configfiledir', type : 'string', value : '',
option('fallback-hostname', type : 'string', value : 'localhost',
description : 'the hostname used if none configured')
option('default-hierarchy', type : 'combo',
- choices : ['legacy', 'hybrid', 'unified'], value : 'unified',
- description : 'default cgroup hierarchy')
+ choices : ['legacy', 'hybrid', 'unified'], deprecated : true,
+ description : '''This option is deprecated and will be removed in a future release''')
option('extra-net-naming-schemes', type : 'string',
- description : 'comma-separated list of extra net.naming-scheme= definitions')
+ description : 'comma-separated list of extra net.naming_scheme= definitions')
option('default-net-naming-scheme', type : 'string', value : 'latest',
- description : 'default net.naming-scheme= value')
+ description : 'default net.naming_scheme= value')
option('status-unit-format-default', type : 'combo',
choices : ['auto', 'description', 'name', 'combined'],
description : 'use unit name or description in messages by default')
@@ -238,7 +240,7 @@ option('time-epoch', type : 'integer', value : 0,
description : 'time epoch for time clients')
option('clock-valid-range-usec-max', type : 'integer', value : 473364000000000, # 15 years
description : 'maximum value in microseconds for the difference between RTC and epoch, exceeding which is considered an RTC error ["0" disables]')
-option('default-user-shell', type : 'string', value : '/usr/bin/bash',
+option('default-user-shell', type : 'string', value : '/bin/bash',
description : 'default interactive shell')
option('system-alloc-uid-min', type : 'integer', value : 0,
diff --git a/mkosi.conf b/mkosi.conf
index 9ec4faf122..d611635ce7 100644
--- a/mkosi.conf
+++ b/mkosi.conf
@@ -2,21 +2,24 @@
[Config]
Images=system
+MinimumVersion=21
[Output]
@OutputDirectory=mkosi.output
-BuildDirectory=mkosi.builddir
-CacheDirectory=mkosi.cache
+@BuildDirectory=mkosi.builddir
+@CacheDirectory=mkosi.cache
[Content]
# Prevent ASAN warnings when building the image and ship the real ASAN options prefixed with MKOSI_.
Environment=ASAN_OPTIONS=verify_asan_link_order=false
MKOSI_ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1:disable_coredump=0:use_madv_dontdump=1
MKOSI_UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1
+@SELinuxRelabel=no
[Host]
@Incremental=yes
-@QemuMem=2G
+# TODO: Drop to 2G again once the next Noble kernel update ships and we can use linux-image-virtual.
+@QemuMem=4G
@RuntimeSize=8G
ToolsTreePackages=virtiofsd
KernelCommandLineExtra=systemd.crash_shell
diff --git a/mkosi.conf.d/05-qemu-mem.conf b/mkosi.conf.d/05-qemu-mem.conf
deleted file mode 100644
index 3a6f24a7b0..0000000000
--- a/mkosi.conf.d/05-qemu-mem.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-# Arch and CentOS 8 Stream initrds are rather big so we need to give QEMU more memory so the kernel can load
-# them without OOMing.
-
-[Match]
-Distribution=|arch
-Distribution=|centos
-
-[Host]
-@QemuMem=3G
diff --git a/mkosi.conf.d/10-opensuse.conf b/mkosi.conf.d/10-opensuse.conf
index 832c0d15fb..f976fc8043 100644
--- a/mkosi.conf.d/10-opensuse.conf
+++ b/mkosi.conf.d/10-opensuse.conf
@@ -5,3 +5,4 @@ Distribution=opensuse
[Distribution]
@Release=tumbleweed
+PackageManagerTrees=mkosi.conf.d/macros.db_backend:/etc/rpm/macros.db_backend
diff --git a/mkosi.conf.d/10-ubuntu.conf b/mkosi.conf.d/10-ubuntu.conf
index b0ebbadd48..da2d318295 100644
--- a/mkosi.conf.d/10-ubuntu.conf
+++ b/mkosi.conf.d/10-ubuntu.conf
@@ -4,5 +4,5 @@
Distribution=ubuntu
[Distribution]
-@Release=jammy
+@Release=noble
Repositories=universe
diff --git a/mkosi.conf.d/macros.db_backend b/mkosi.conf.d/macros.db_backend
new file mode 100644
index 0000000000..4a58f06458
--- /dev/null
+++ b/mkosi.conf.d/macros.db_backend
@@ -0,0 +1 @@
+%_db_backend ndb
diff --git a/mkosi.images/base/mkosi.build.chroot b/mkosi.images/base/mkosi.build.chroot
deleted file mode 100755
index ce3c8e2577..0000000000
--- a/mkosi.images/base/mkosi.build.chroot
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/bin/bash
-# SPDX-License-Identifier: LGPL-2.1-or-later
-set -e
-
-# This is a build script for OS image generation using mkosi (https://github.com/systemd/mkosi).
-# Simply invoke "mkosi" in the project directory to build an OS image.
-
-# We don't want to install our build of systemd in the base image, but use it as an extra tree for the
-# initrd and system images, so override DESTDIR to store it in the output directory so we can reference it as
-# an extra tree in the initrd and system image builds.
-DESTDIR="$OUTPUTDIR/systemd"
-
-# If mkosi.builddir/ exists mkosi will set $BUILDDIR to it, let's then use it
-# as out-of-tree build dir. Otherwise, let's make up our own builddir.
-[ -z "$BUILDDIR" ] && BUILDDIR="$PWD"/build
-
-# Let's make sure we're using stuff from the build directory first if available there.
-PATH="$BUILDDIR:$PATH"
-export PATH
-
-# The bpftool script shipped by Ubuntu tries to find the actual program to run via querying `uname -r` and
-# using the current kernel version. This obviously doesn't work in containers. As a workaround, we override
-# the ubuntu script with a symlink to the first bpftool program we can find.
-for bpftool in /usr/lib/linux-tools/*/bpftool; do
- [ -x "$bpftool" ] || continue
- ln -sf "$bpftool" "$BUILDDIR"/bpftool
- break
-done
-
-# CentOS Stream 8 includes bpftool 4.18.0 which is lower than what we need. However, they've backported the
-# specific feature we need ("gen skeleton") to this version, so we replace bpftool with a script that reports
-# version 5.6.0 to satisfy meson which makes bpf work on CentOS Stream 8 as well.
-. /usr/lib/os-release
-if [ "$ID" = "centos" ] && [ "$VERSION" = "8" ]; then
- cat >"$BUILDDIR"/bpftool <<EOF
-#!/bin/sh
-if [ "\$1" = --version ]; then
- echo 5.6.0
-else
- exec /usr/sbin/bpftool \$@
-fi
-EOF
- chmod +x "$BUILDDIR"/bpftool
-fi
-
-if [ ! -f "$BUILDDIR"/build.ninja ]; then
- CONFIGURE_OPTS=(
- -D sysvinit-path="$([[ -d /etc/rc.d/init.d ]] && echo /etc/rc.d/init.d || echo /etc/init.d)"
- -D man=disabled
- -D translations=false
- -D version-tag="${VERSION_TAG}"
- -D mode=developer
- -D b_sanitize="${SANITIZERS:-none}"
- -D install-tests=true
- -D tests=unsafe
- -D slow-tests="${SLOW_TESTS:-false}"
- -D create-log-dirs=false
- -D pamconfdir=/usr/lib/pam.d/
- -D utmp=true
- -D hibernate=true
- -D ldconfig=true
- -D resolve=true
- -D efi=true
- -D tpm=true
- -D environment-d=true
- -D binfmt=true
- -D coredump=true
- -D pstore=true
- -D oomd=true
- -D logind=true
- -D hostnamed=true
- -D localed=true
- -D machined=true
- -D portabled=true
- -D sysext=true
- -D userdb=true
- -D networkd=true
- -D timedated=true
- -D timesyncd=true
- -D nss-myhostname=true
- -D nss-systemd=true
- -D firstboot=true
- -D randomseed=true
- -D backlight=true
- -D vconsole=true
- -D quotacheck=true
- -D sysusers=true
- -D tmpfiles=true
- -D hwdb=true
- -D rfkill=true
- -D xdg-autostart=true
- -D translations=true
- -D idn=true
- -D cryptolib=openssl
- -D kernel-install=true
- -D analyze=true
- -D ukify="$([[ "$ID" = "centos" ]] && [[ "$VERSION" = "8" ]] && echo disabled || echo enabled)"
- -D selinux="$([[ "$ID" =~ centos|fedora|opensuse ]] && echo enabled || echo disabled)"
- -D apparmor="$([[ "$ID" =~ ubuntu|debian ]] && echo enabled || echo disabled)"
- -D smack=true
- -D ima=true
- -D first-boot-full-preset=true
- -D initrd=true
- -D fexecve=true
- -D default-keymap="$([[ "$ID" =~ debian|ubuntu ]] && echo "" || echo "us")"
- -D xenctrl="$([[ "$ID" =~ debian|ubuntu|fedora|opensuse ]] && echo enabled || echo disabled)"
- -D libiptc="$([[ "$ID" =~ debian|ubuntu ]] && echo enabled || echo disabled)"
- -D libcryptsetup-plugins="$([[ "$ID" = "centos" ]] && [[ "$VERSION" = "8" ]] && echo disabled || echo enabled)"
- )
-
- # On debian-like systems the library directory is not /usr/lib64 but /usr/lib/<arch-triplet>/.
- # It is important to use the right one especially for cryptsetup plugins, otherwise they will be
- # installed in the wrong directory and not be found by cryptsetup. Assume native build.
- if grep -q -e "ID=debian" -e "ID_LIKE=debian" /usr/lib/os-release && command -v dpkg 2>/dev/null; then
- CONFIGURE_OPTS+=(
- -D libdir="/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
- -D pamlibdir="/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/security"
- )
- fi
-
- # Set various uids and gids for which Fedora has "soft static" allocations.
- # Without this, we would get warning about mismatched sysusers.d entries
- # between the files that we and Fedora's setup package install.
- if grep -q '^ID=fedora' /usr/lib/os-release; then
- CONFIGURE_OPTS+=(
- -D adm-gid=4
- -D audio-gid=63
- -D cdrom-gid=11
- -D dialout-gid=18
- -D disk-gid=6
- -D input-gid=104
- -D kmem-gid=9
- -D kvm-gid=36
- -D lp-gid=7
- -D render-gid=105
- -D sgx-gid=106
- -D tape-gid=33
- -D tty-gid=5
- -D users-gid=100
- -D utmp-gid=22
- -D video-gid=39
- -D wheel-gid=10
- -D systemd-journal-gid=190
- -D systemd-network-uid=192
- -D systemd-resolve-uid=193
- )
- fi
-
- if grep -q '^ID="opensuse' /usr/lib/os-release; then
- CONFIGURE_OPTS+=(
- -Dbpf-compiler=gcc
- )
- fi
-
- ( set -x; meson setup "$BUILDDIR" "$SRCDIR" --auto-features=enabled "${CONFIGURE_OPTS[@]}" )
-fi
-
-( set -x; ninja -C "$BUILDDIR" "$@" )
-if [ "$WITH_TESTS" = 1 ]; then
- if [ -n "$SANITIZERS" ]; then
- export ASAN_OPTIONS="$MKOSI_ASAN_OPTIONS"
- export UBSAN_OPTIONS="$MKOSI_UBSAN_OPTIONS"
- TIMEOUT_MULTIPLIER=3
- else
- TIMEOUT_MULTIPLIER=1
- fi
-
- ( set -x; meson test -C "$BUILDDIR" --print-errorlogs --timeout-multiplier=$TIMEOUT_MULTIPLIER )
-fi
-
-( set -x; meson install -C "$BUILDDIR" --quiet --no-rebuild --only-changed )
-
-# Ensure that side-loaded PE addons are loaded if signed, and ignored if not
-if [ -d "${DESTDIR}/boot/loader" ]; then
- addons_dir="${DESTDIR}/boot/loader/addons"
-elif [ -d "${DESTDIR}/efi/loader" ]; then
- addons_dir="${DESTDIR}/efi/loader/addons"
-fi
-if [ -n "${addons_dir}" ]; then
- mkdir -p "${addons_dir}"
- ukify --secureboot-private-key mkosi.secure-boot.key --secureboot-certificate mkosi.secure-boot.crt --cmdline this_should_be_here -o "${addons_dir}/good.addon.efi"
- ukify --cmdline this_should_not_be_here -o "${addons_dir}/bad.addon.efi"
-fi
diff --git a/mkosi.images/base/mkosi.conf b/mkosi.images/base/mkosi.conf
index be8586ce3b..fcefc3ead2 100644
--- a/mkosi.images/base/mkosi.conf
+++ b/mkosi.images/base/mkosi.conf
@@ -4,33 +4,51 @@
Format=directory
[Content]
-Bootable=no
+Autologin=yes
+# Make sure we build the default initrd as part of the base image as it will have access to the systemd and
+# udev rpms which are built by the build scripts that are part of the base image.
+Bootable=yes
+# we want to build the UKI as part of the system image so make sure none are built here.
+Bootloader=none
CleanPackageMetadata=no
Packages=
-Packages=
- kmod
- less
- util-linux
-
-BuildPackages=
acl
- binutils
- clang
+ bash-completion
+ coreutils
diffutils
- gawk
+ dnsmasq
+ dosfstools
+ e2fsprogs
+ findutils
+ gcc # Sanitizer libraries
gdb
- gettext
git
- gperf
grep
- lld
- llvm
- make
- meson
- pkgconf
+ gzip
+ jq
+ kbd
+ kexec-tools
+ kmod
+ less
+ mtools
+ nano
+ nftables
+ openssl
+ python3
+ qrencode
rsync
sed
+ socat
strace
+ systemd
tar
+ tmux
+ tree
+ udev
+ util-linux
+ valgrind
+ wireguard-tools
+ xfsprogs
+ zsh
zstd
diff --git a/mkosi.images/base/mkosi.conf.d/10-arch.conf b/mkosi.images/base/mkosi.conf.d/10-arch.conf
deleted file mode 100644
index 385c73979f..0000000000
--- a/mkosi.images/base/mkosi.conf.d/10-arch.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=arch
-
-[Content]
-Packages=
- cryptsetup
- dbus
- gnutls
- libarchive
- libbpf
- libfido2
- libmicrohttpd
- libnftnl
- libpwquality
- libseccomp
- libxkbcommon
- openssl
- qrencode
- tpm2-tss
-
-BuildPackages=
- bpf
- docbook-xsl
- glib2
- libxslt
- linux-api-headers
- python
- python-jinja
- python-lxml
- python-pefile
- python-pyelftools
diff --git a/mkosi.images/base/mkosi.conf.d/10-arch/initrd/mkosi.postinst b/mkosi.images/base/mkosi.conf.d/10-arch/initrd/mkosi.postinst
new file mode 100755
index 0000000000..ad4fe6e9a1
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-arch/initrd/mkosi.postinst
@@ -0,0 +1,5 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+mkosi-install systemd systemd-sysvcompat
diff --git a/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.build.chroot b/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.build.chroot
new file mode 100755
index 0000000000..7fe05aa3a4
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.build.chroot
@@ -0,0 +1,53 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -ex
+
+if [ ! -f "pkg/$DISTRIBUTION/PKGBUILD" ]; then
+ echo "PKGBUILD not found at pkg/$DISTRIBUTION/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
+ exit 1
+fi
+
+# We can't configure the source or build directory so we use bind mounts instead to make sure they are in the
+# expected locations.
+mount --mkdir --bind "$SRCDIR" "pkg/$DISTRIBUTION/systemd-stable/"
+mount --mkdir --bind "$BUILDDIR" "pkg/$DISTRIBUTION/build/"
+# Because we run with --noextract we are responsible for making sure the source files appear in src/.
+mount --mkdir --rbind "$PWD/pkg/$DISTRIBUTION" "pkg/$DISTRIBUTION/src/"
+
+# shellcheck source=/dev/null
+. /etc/makepkg.conf
+
+# Override the default options. Use -Og because -O0 doesn't work with FORTIFY_SOURCE. We specifically disable
+# "strip", "zipman" and "lto" as they slow down builds significantly. OPTIONS= cannot be overridden on the
+# makepkg command line so we append to /etc/makepkg.conf instead. The rootfs is overlayed with a writable
+# tmpfs during the build script so these changes don't end up in the image itself.
+tee --append /etc/makepkg.conf >/dev/null <<EOF
+CFLAGS="$CFLAGS -Og"
+OPTIONS=(!strip docs !libtool !staticlibs emptydirs !zipman purge debug !lto)
+EOF
+
+# Linting the PKGBUILD takes multiple seconds every build so avoid that by nuking all the linting functions.
+rm /usr/share/makepkg/lint_pkgbuild/*
+
+if [ -d .git/ ] && [ -z "$(git status --porcelain)" ]; then
+ TS="$(git show --no-patch --format=%ct HEAD)"
+else
+ TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"
+fi
+
+# We get around makepkg's root check by setting EUID to something else.
+# shellcheck disable=SC2046
+env --chdir="pkg/$DISTRIBUTION" \
+ EUID=123 \
+ makepkg \
+ --noextract \
+ $( ((WITH_TESTS)) || echo --nocheck) \
+ --force \
+ UPSTREAM=1 \
+ QUIET=1 \
+ BUILDDIR="$PWD/pkg/$DISTRIBUTION" \
+ PKGDEST="$PACKAGEDIR" \
+ PKGEXT=".pkg.tar" \
+ PKGVER="$(cat meson.version)" \
+ PKGREL="$(date "+%Y%m%d%H%M%S" --date "@$TS")" \
+ MESON_EXTRA_CONFIGURE_OPTIONS="-D mode=developer -D b_sanitize=${SANITIZERS:-none}"
diff --git a/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.conf b/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.conf
new file mode 100644
index 0000000000..58a57d0283
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.conf
@@ -0,0 +1,48 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+Distribution=arch
+
+[Config]
+InitrdInclude=initrd/
+
+# TODO: Switch to https://gitlab.archlinux.org/archlinux/packaging/packages/systemd once
+# https://gitlab.archlinux.org/archlinux/packaging/packages/systemd/-/merge_requests/8 is merged.
+[Content]
+Environment=
+ PKG_URL="https://gitlab.archlinux.org/daandemeyer/systemd"
+ PKG_BRANCH="strip"
+ SYSTEMD_PACKAGES="systemd systemd-ukify systemd-sysvcompat systemd-resolvconf"
+
+Packages=
+ bpf
+ btrfs-progs
+ compsize
+ cryptsetup
+ dbus
+ dhcp
+ f2fs-tools
+ gnutls
+ iproute
+ linux
+ man-db
+ openbsd-netcat
+ openssh
+ openssl
+ pacman
+ polkit
+ qrencode
+ quota-tools
+ sbsigntools
+ shadow
+ tpm2-tss
+ vim
+
+InitrdPackages=
+ btrfs-progs
+ tpm2-tools
+
+BuildPackages=
+ fakeroot
+ pkgconf
+ debugedit
diff --git a/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.prepare b/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.prepare
new file mode 100755
index 0000000000..d6e2d4eb3d
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-arch/mkosi.prepare
@@ -0,0 +1,24 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+if [ ! -f "pkg/$DISTRIBUTION/PKGBUILD" ]; then
+ echo "PKGBUILD not found at pkg/$DISTRIBUTION/PKGBUILD, run mkosi once with -ff to make sure the PKGBUILD is cloned" >&2
+ exit 1
+fi
+
+if [ "$1" = "final" ]; then
+ # We get depends and optdepends from .SRCINFO as getting them from the PKGBUILD is rather complex.
+ sed --expression 's/^[ \t]*//' "pkg/$DISTRIBUTION/.SRCINFO" |
+ grep --regexp '^depends =' --regexp '^optdepends =' |
+ sed --expression 's/^depends = //' --expression 's/^optdepends = //' --expression 's/:.*//' |
+ xargs --delimiter '\n' mkosi-install
+else
+ # We get makedepends from the PKGBUILD as .SRCINFO can't encode conditional dependencies depending on
+ # whether some environment variable is set or not.
+ # shellcheck source=/dev/null
+ UPSTREAM=1 . "pkg/$DISTRIBUTION/PKGBUILD"
+
+ # shellcheck disable=SC2154
+ mkosi-install "${makedepends[@]}"
+fi
diff --git a/mkosi.images/base/mkosi.conf.d/10-centos-fedora.conf b/mkosi.images/base/mkosi.conf.d/10-centos-fedora.conf
deleted file mode 100644
index d7a135a5c0..0000000000
--- a/mkosi.images/base/mkosi.conf.d/10-centos-fedora.conf
+++ /dev/null
@@ -1,78 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=|centos
-Distribution=|fedora
-
-[Content]
-Packages=
- audit-libs
- cryptsetup-libs
- gnutls
- libarchive
- libasan
- libbpf
- libfido2
- libgcrypt
- libmicrohttpd
- libnftnl
- libubsan
- libxcrypt
- libxkbcommon
- openssl-libs
- qrencode-libs
- tpm2-tss
- util-linux
-
-BuildPackages=
- pkgconf
- bpftool
- docbook-xsl
- findutils
- libgcrypt-devel # CentOS Stream 8 libgcrypt-devel doesn't ship a pkg-config file.
- libxslt
- pam-devel
- pkgconfig(audit)
- pkgconfig(blkid)
- pkgconfig(bzip2)
- pkgconfig(dbus-1)
- pkgconfig(fdisk)
- pkgconfig(glib-2.0)
- pkgconfig(gnutls)
- pkgconfig(libacl)
- pkgconfig(libarchive)
- pkgconfig(libbpf)
- pkgconfig(libcap)
- pkgconfig(libcryptsetup)
- pkgconfig(libcurl)
- pkgconfig(libdw)
- pkgconfig(libfido2)
- pkgconfig(libidn2)
- pkgconfig(libkmod)
- pkgconfig(liblz4)
- pkgconfig(libmicrohttpd)
- pkgconfig(libnftnl)
- pkgconfig(libpcre2-8)
- pkgconfig(libqrencode)
- pkgconfig(libseccomp)
- pkgconfig(libselinux)
- pkgconfig(libzstd)
- pkgconfig(mount)
- pkgconfig(numa)
- pkgconfig(openssl)
- pkgconfig(openssl)
- pkgconfig(p11-kit-1)
- pkgconfig(pwquality)
- pkgconfig(tss2-esys)
- pkgconfig(tss2-mu)
- pkgconfig(tss2-rc)
- pkgconfig(tss2-tcti-device)
- pkgconfig(valgrind)
- pkgconfig(xkbcommon)
- python3
- python3dist(jinja2)
- python3dist(lxml)
- python3dist(pefile)
- python3dist(pyelftools)
- python3dist(pytest)
- rpm
diff --git a/mkosi.images/base/mkosi.conf.d/10-centos-fedora/initrd/mkosi.postinst b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/initrd/mkosi.postinst
new file mode 100755
index 0000000000..0b7a4cb6b7
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/initrd/mkosi.postinst
@@ -0,0 +1,5 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+mkosi-install systemd systemd-udev
diff --git a/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.build.chroot b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.build.chroot
new file mode 100755
index 0000000000..cf3be64538
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.build.chroot
@@ -0,0 +1,47 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -ex
+
+if [ ! -f "pkg/$DISTRIBUTION/systemd.spec" ]; then
+ echo "spec not found at pkg/$DISTRIBUTION/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
+ exit 1
+fi
+
+if [ -d .git/ ] && [ -z "$(git status --porcelain)" ]; then
+ TS="$(git show --no-patch --format=%ct HEAD)"
+else
+ TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"
+fi
+
+# TODO: Replace meson_build and meson_install overrides with "--undefine __meson_verbose" once
+# https://github.com/mesonbuild/meson/pull/12835 is available.
+# shellcheck disable=SC2046
+rpmbuild \
+ -bb \
+ --build-in-place \
+ --with upstream \
+ $( ((WITH_TESTS)) || echo --nocheck) \
+ --define "_topdir /var/tmp" \
+ --define "_sourcedir pkg/$DISTRIBUTION" \
+ --define "_rpmdir $PACKAGEDIR" \
+ ${BUILDDIR:+--define} \
+ ${BUILDDIR:+"_vpath_builddir $BUILDDIR"} \
+ --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
+ --define "_binary_payload w.ufdio" \
+ --define "debug_package %{nil}" \
+ --define "version_override $(cat meson.version)" \
+ --define "release_override $(date "+%Y%m%d%H%M%S" --date "@$TS")" \
+ --define "_distro_extra_cflags -Og" \
+ --define "meson_build %{shrink:%{__meson} compile -C %{_vpath_builddir} -j %{_smp_build_ncpus} %{nil}}" \
+ --define "meson_install %{shrink:DESTDIR=%{buildroot} %{__meson} install -C %{_vpath_builddir} --no-rebuild --quiet %{nil}}" \
+ --define "meson_extra_configure_options -D mode=developer -D b_sanitize=${SANITIZERS:-none}" \
+ --define "__brp_strip %{nil}" \
+ --define "__brp_compress %{nil}" \
+ --define "__brp_mangle_shebangs %{nil}" \
+ --define "__brp_strip_comment_note %{nil}" \
+ --define "__brp_strip_static_archive %{nil}" \
+ --define "__brp_check_rpaths %{nil}" \
+ --define "__elf_exclude_path ^/usr/lib/systemd/tests/unit-tests/.*$" \
+ --define "__script_requires %{nil}" \
+ --undefine _lto_cflags \
+ "pkg/$DISTRIBUTION/systemd.spec"
diff --git a/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.conf b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.conf
new file mode 100644
index 0000000000..4c80b0a36f
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.conf
@@ -0,0 +1,54 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+Distribution=|centos
+Distribution=|fedora
+
+[Config]
+InitrdInclude=initrd/
+
+[Content]
+Environment=
+ SYSTEMD_PACKAGES="systemd
+ systemd-udev
+ systemd-container
+ systemd-repart
+ systemd-resolved
+ systemd-networkd
+ systemd-boot
+ systemd-tests
+ systemd-ukify
+ systemd-pam
+ systemd-oomd-defaults
+ systemd-journal-remote
+ systemd-networkd-defaults"
+Packages=
+ bpftool
+ cryptsetup
+ dhcp-server
+ dnf
+ gnutls
+ integritysetup
+ iproute
+ iproute-tc
+ kernel-core
+ libasan
+ libcap-ng-utils
+ libubsan
+ netcat
+ openssh-clients
+ openssh-server
+ p11-kit
+ pam
+ passwd
+ polkit
+ procps-ng
+ quota
+ rpm
+ rpm-build
+ rpmautospec
+ util-linux
+ vim-common
+
+InitrdPackages=
+ tpm2-tools
diff --git a/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.prepare b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.prepare
new file mode 100755
index 0000000000..c07251a7e1
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-centos-fedora/mkosi.prepare
@@ -0,0 +1,66 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -ex
+
+if [ ! -f "pkg/$DISTRIBUTION/systemd.spec" ]; then
+ echo "spec not found at pkg/$DISTRIBUTION/systemd.spec, run mkosi with -ff to make sure the spec is cloned" >&2
+ exit 1
+fi
+
+if [ "$1" = "final" ]; then
+ DEPS="--requires"
+else
+ DEPS="--buildrequires"
+fi
+
+mkosi-chroot \
+ rpmspec \
+ --with upstream \
+ --query \
+ "$DEPS" \
+ --define "_topdir /var/tmp" \
+ --define "_sourcedir pkg/$DISTRIBUTION" \
+ "pkg/$DISTRIBUTION/systemd.spec" |
+ grep --invert-match --regexp systemd --regexp /bin/sh --regexp "rpmlib(" --regexp udev |
+ sort --unique |
+ tee /tmp/buildrequires |
+ xargs --delimiter '\n' mkosi-install
+
+if [ "$1" = "final" ]; then
+ exit 0
+fi
+
+# rpmbuild -br tries to build a source package which means all source files have to exist which isn't the
+# case when using --build-in-place so we get rid of the source file that doesn't exist to make it happy.
+# TODO: Use -bd instead of -br and get rid of this once we don't need to build on CentOS Stream 9 anymore.
+sed '/Source0/d' --in-place "pkg/$DISTRIBUTION/systemd.spec"
+
+until mkosi-chroot \
+ rpmbuild \
+ -br \
+ --build-in-place \
+ --with upstream \
+ --define "_topdir /var/tmp" \
+ --define "_sourcedir pkg/$DISTRIBUTION" \
+ --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
+ "pkg/$DISTRIBUTION/systemd.spec"
+do
+ EXIT_STATUS=$?
+ if [ $EXIT_STATUS -ne 11 ]; then
+ exit $EXIT_STATUS
+ fi
+
+ mkosi-chroot \
+ rpm \
+ --query \
+ --package \
+ --requires \
+ /var/tmp/SRPMS/systemd-*.buildreqs.nosrc.rpm |
+ grep --invert-match '^rpmlib(' |
+ sort --unique >/tmp/dynamic-buildrequires
+
+ sort /tmp/buildrequires /tmp/dynamic-buildrequires |
+ uniq --unique |
+ tee --append /tmp/buildrequires |
+ xargs --delimiter '\n' mkosi-install
+done
diff --git a/mkosi.images/base/mkosi.conf.d/10-centos/mkosi.conf b/mkosi.images/base/mkosi.conf.d/10-centos/mkosi.conf
new file mode 100644
index 0000000000..dd08467aaf
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-centos/mkosi.conf
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+Distribution=centos
+
+[Content]
+Environment=
+ PKG_URL="https://git.centos.org/rpms/systemd"
+ PKG_BRANCH="c9s-sig-hyperscale"
+
+Packages=
+ kernel-modules # For squashfs support
+ rpmautospec-rpm-macros
diff --git a/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu.conf b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu.conf
deleted file mode 100644
index 1d28be30f8..0000000000
--- a/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu.conf
+++ /dev/null
@@ -1,77 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=|debian
-Distribution=|ubuntu
-
-[Content]
-Packages=
- ^libtss2-esys-[0-9\.]+-0$
- dmsetup
- libapparmor1
- libarchive13
- libfdisk1
- libfido2-1
- libglib2.0-0
- libgnutls30
- libidn2-0
- liblz4-1
- libmicrohttpd12
- libnftnl11
- libp11-kit0
- libpam0g
- libpwquality1
- libqrencode4
- libssl3
- libip4tc2
- ^libtss2-mu[0-9\.-]+$
- libtss2-rc0
- libtss2-tcti-device0
- tzdata
-
-BuildPackages=
- docbook-xsl
- dpkg-dev
- g++
- libacl1-dev
- libapparmor-dev
- libarchive-dev
- libaudit-dev
- libblkid-dev
- libbpf-dev
- libbz2-dev
- libcap-dev
- libcryptsetup-dev
- libcurl4-openssl-dev
- libdbus-1-dev
- libdw-dev
- libfdisk-dev
- libfido2-dev
- libgcrypt20-dev
- libglib2.0-dev
- libgnutls28-dev
- libidn2-dev
- libiptc-dev
- libkmod-dev
- liblz4-dev
- libmicrohttpd-dev
- libmount-dev
- libnftnl-dev
- libp11-kit-dev
- libpam0g-dev
- libpwquality-dev
- libqrencode-dev
- libseccomp-dev
- libsmartcols-dev
- libssl-dev
- libtss2-dev
- libxen-dev
- libxkbcommon-dev
- libzstd-dev
- python3
- python3-jinja2
- python3-lxml
- python3-pefile
- python3-pyelftools
- python3-pytest
- xsltproc
diff --git a/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/initrd/mkosi.postinst b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/initrd/mkosi.postinst
new file mode 100755
index 0000000000..640cdb1e32
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/initrd/mkosi.postinst
@@ -0,0 +1,5 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+mkosi-install systemd udev
diff --git a/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.build.chroot b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.build.chroot
new file mode 100755
index 0000000000..d1ec8c1894
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.build.chroot
@@ -0,0 +1,89 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+if [ ! -d "pkg/$DISTRIBUTION/debian" ]; then
+ echo "deb rules not found at pkg/$DISTRIBUTION/debian, run mkosi once with -ff to make sure the rules are cloned" >&2
+ exit 1
+fi
+
+# We transplant the debian/ folder from the deb package sources into the upstream sources.
+mount --mkdir --bind "$SRCDIR/pkg/$DISTRIBUTION/debian" "$SRCDIR"/debian
+
+# We hide the patches/ directory by mounting an empty directory on top so they don't get applied.
+TMP=$(mktemp -d)
+mount --bind "$TMP" "$SRCDIR"/debian/patches
+
+# While the build directory can be specified through DH_OPTIONS, the default one is hardcoded everywhere so
+# we have to use that. Because it is architecture dependent, we query it using dpkg-architecture first.
+DEB_HOST_GNU_TYPE="$(dpkg-architecture --query DEB_HOST_GNU_TYPE)"
+mount --mkdir --bind "$BUILDDIR" "$SRCDIR/obj-$DEB_HOST_GNU_TYPE"
+
+if [ -d .git/ ] && [ -z "$(git status --porcelain)" ]; then
+ TS="$(git show --no-patch --format=%ct HEAD)"
+else
+ TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"
+fi
+
+# Add a new changelog entry to update the version. We use a fixed date since a dynamic one causes a full
+# rebuild every time.
+cat >debian/changelog.new <<EOF
+systemd ($(cat meson.version).$(date "+%Y%m%d%H%M%S" --date "@$TS")) UNRELEASED; urgency=low
+
+ * Automatic build from mkosi
+
+ -- systemd test <systemd-devel@lists.freedesktop.org> $(date --rfc-email --date "@$TS")
+
+EOF
+cat debian/changelog >>debian/changelog.new
+mv debian/changelog.new debian/changelog
+
+build() {
+ DEB_BUILD_OPTIONS="$( ((WITH_TESTS)) || echo nocheck) $( ((WITH_DOCS)) || echo nodoc) nostrip terse optimize=-lto" \
+ DEB_BUILD_PROFILES="$( ((WITH_TESTS)) || echo nocheck) $( ((WITH_DOCS)) || echo nodoc) pkg.systemd.upstream" \
+ DEB_CFLAGS_APPEND="-Og" \
+ DPKG_FORCE="unsafe-io" \
+ DPKG_DEB_COMPRESSOR_TYPE="none" \
+ DH_MISSING="--fail-missing" \
+ CONFFLAGS_UPSTREAM="-D mode=developer -D b_sanitize=${SANITIZERS:-none}" \
+ dpkg-buildpackage \
+ --no-pre-clean \
+ --unsigned-changes \
+ --build=binary
+}
+
+if ! build; then
+ # debhelper installs files for each package to debian/<package> so we figure out which files were
+ # packaged by querying all the package names from debian/control and running find on each of the
+ # corresponding package directory in debian/.
+ grep "Package:" debian/control |
+ sed "s/Package: //" |
+ xargs -d '\n' -I {} sh -c "[ -d debian/{} ] && (cd debian/{} && find . ! -type d ! -path "*dh-exec*" -printf '%P\n')" |
+ # Remove compression suffix from compressed manpages as the manpages in debian/tmp will be uncompressed.
+ sed --regexp-extended 's/([0-9])\.gz$/\1/' |
+ sort --unique >/tmp/packaged-files
+
+ # We figure out the installed files by running find on debian/tmp/ which contains the files installed
+ # by meson install.
+ (cd debian/tmp/ && find . ! -type d ! -path "*dh-exec*" -printf '%P\n') >/tmp/installed-files
+
+ if [ -f debian/not-installed ]; then
+ grep --invert-match "^#" debian/not-installed >>/tmp/installed-files
+ fi
+
+ sort --unique --output /tmp/installed-files /tmp/installed-files
+
+ # We get all the installed files that were not packaged by finding entries in the installed file that are
+ # not in the packaged file.
+ comm -23 /tmp/installed-files /tmp/packaged-files > /tmp/unpackaged-files
+ # If there are no unpackaged files something else went wrong.
+ if [ ! -s /tmp/unpackaged-files ]; then
+ exit 1
+ fi
+
+ # Otherwise, we append the unpackaged files to the filelist for the systemd package and retry the build.
+ cat /tmp/unpackaged-files >>debian/systemd.install
+ build
+fi
+
+mv ../*.deb "$PACKAGEDIR"
diff --git a/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.conf b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.conf
new file mode 100644
index 0000000000..c2a9c399e1
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.conf
@@ -0,0 +1,61 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+Distribution=|debian
+Distribution=|ubuntu
+
+[Config]
+InitrdInclude=initrd/
+
+[Content]
+Environment=
+ PKG_URL="https://salsa.debian.org/systemd-team/systemd"
+ PKG_BRANCH="debian/master"
+ SYSTEMD_PACKAGES="systemd
+ systemd-userdbd
+ systemd-oomd
+ systemd-sysv
+ systemd-tests
+ systemd-timesyncd
+ systemd-resolved
+ systemd-homed
+ systemd-coredump
+ systemd-journal-remote
+ systemd-container
+ systemd-boot
+ systemd-ukify
+ udev"
+
+Packages=
+ ^libtss2-esys-[0-9.]+-0$
+ ^libtss2-mu-[0-9.]+-0$
+ apt
+ btrfs-progs
+ cryptsetup-bin
+ dbus-broker
+ default-dbus-session-bus
+ dmsetup
+ f2fs-tools
+ fdisk
+ iproute2
+ isc-dhcp-server
+ libcap-ng-utils
+ libtss2-rc0
+ libtss2-tcti-device0
+ netcat-openbsd
+ openssh-client
+ openssh-server
+ passwd
+ policykit-1
+ procps
+ quota
+ sbsigntool
+ tzdata
+ xxd
+
+InitrdPackages=
+ btrfs-progs
+ tpm2-tools
+
+BuildPackages=
+ dpkg-dev
diff --git a/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.prepare b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.prepare
new file mode 100755
index 0000000000..32c60feb7e
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-debian-ubuntu/mkosi.prepare
@@ -0,0 +1,15 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+if [ "$1" = "final" ]; then
+ exit 0
+fi
+
+if [ ! -d "pkg/$DISTRIBUTION/debian" ]; then
+ echo "deb rules not found at pkg/$DISTRIBUTION/debian, run mkosi once with -ff to make sure the rules are cloned" >&2
+ exit 1
+fi
+
+cd "pkg/$DISTRIBUTION"
+DEB_BUILD_PROFILES="pkg.systemd.upstream" apt-get build-dep .
diff --git a/mkosi.images/base/mkosi.conf.d/10-debian.conf b/mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf
index 020b02b61c..c6b6155dda 100644
--- a/mkosi.images/base/mkosi.conf.d/10-debian.conf
+++ b/mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf
@@ -2,10 +2,3 @@
[Match]
Distribution=debian
-
-[Content]
-Packages=
- libbpf1
-
-BuildPackages=
- bpftool
diff --git a/mkosi.images/system/mkosi.conf.d/10-debian-amd64.conf b/mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf.d/amd64.conf
index d3c89f3a8c..615de52499 100644
--- a/mkosi.images/system/mkosi.conf.d/10-debian-amd64.conf
+++ b/mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf.d/amd64.conf
@@ -1,10 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
-Distribution=debian
Architecture=x86-64
[Content]
Packages=
- bpftool
linux-image-cloud-amd64
diff --git a/mkosi.images/system/mkosi.conf.d/10-debian-arm64.conf b/mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf.d/arm64.conf
index 76a6898111..af923fa442 100644
--- a/mkosi.images/system/mkosi.conf.d/10-debian-arm64.conf
+++ b/mkosi.images/base/mkosi.conf.d/10-debian/mkosi.conf.d/arm64.conf
@@ -1,10 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
-Distribution=debian
Architecture=arm64
[Content]
Packages=
- bpftool
linux-image-cloud-arm64
diff --git a/mkosi.images/base/mkosi.conf.d/10-fedora.conf b/mkosi.images/base/mkosi.conf.d/10-fedora.conf
deleted file mode 100644
index a8fbce47fb..0000000000
--- a/mkosi.images/base/mkosi.conf.d/10-fedora.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=fedora
-
-[Content]
-BuildPackages=
- python3dist(pytest-flakes)
- pkgconfig(xencontrol)
diff --git a/mkosi.images/system/mkosi.conf.d/10-fedora.conf b/mkosi.images/base/mkosi.conf.d/10-fedora/mkosi.conf
index 5863f03b19..cea31ed697 100644
--- a/mkosi.images/system/mkosi.conf.d/10-fedora.conf
+++ b/mkosi.images/base/mkosi.conf.d/10-fedora/mkosi.conf
@@ -4,8 +4,16 @@
Distribution=fedora
[Content]
+Environment=
+ PKG_URL="https://src.fedoraproject.org/rpms/systemd"
+ PKG_BRANCH="rawhide"
+
Packages=
btrfs-progs
compsize
f2fs-tools
glibc-langpack-en
+ sbsigntools
+
+InitrdPackages=
+ btrfs-progs
diff --git a/mkosi.images/base/mkosi.conf.d/10-opensuse.conf b/mkosi.images/base/mkosi.conf.d/10-opensuse.conf
deleted file mode 100644
index 941a50a6d1..0000000000
--- a/mkosi.images/base/mkosi.conf.d/10-opensuse.conf
+++ /dev/null
@@ -1,95 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=opensuse
-
-[Content]
-# We install gawk, gzip, grep, xz, sed, rsync and docbook-xsl-stylesheets here explicitly so that the busybox
-# versions don't get installed instead.
-Packages=
- device-mapper
- distribution-release
- docbook-xsl-stylesheets
- gawk
- grep
- gzip
- libbpf1
- libarchive13
- libcrypt1
- libcryptsetup12
- libdw1
- libelf1
- libfido2
- libgcrypt20
- libglib-2_0-0
- libkmod2
- libmount1
- libnftnl11
- libopenssl3
- libp11-kit0
- libqrencode4
- libseccomp2
- libtss2-esys0
- libtss2-mu0
- libtss2-rc0
- libtss2-tcti-device0
- libxkbcommon0
- libzstd1
- pam
- rsync
- sed
- shadow
- tpm2-0-tss
- xz
-
-BuildPackages=
- audit-devel
- bpftool
- cross-bpf-gcc13
- dbus-1-devel
- fdupes
- gcc-c++
- glib2-devel
- glibc-locale
- intltool
- libacl-devel
- libapparmor-devel
- libarchive-devel
- libblkid-devel
- libbpf-devel
- libbz2-devel
- libcap-devel
- libcryptsetup-devel
- libcurl-devel
- libdw-devel
- libelf-devel
- libfdisk-devel
- libfido2-devel
- libgcrypt-devel
- libgnutls-devel
- libkmod-devel
- liblz4-devel
- libmicrohttpd-devel
- libmount-devel
- libnftnl-devel
- libpwquality-devel
- libseccomp-devel
- libselinux-devel
- libxkbcommon-devel
- libxslt-tools
- libzstd-devel
- openssl-devel
- pam-devel
- pciutils-devel
- python3
- python3-Jinja2
- python3-lxml
- python3-pefile
- python3-pyelftools
- python3-pytest
- python3-pytest-flakes
- qrencode-devel
- shadow
- timezone
- tpm2-0-tss-devel
- xen-devel
diff --git a/mkosi.images/initrd/mkosi.postinst b/mkosi.images/base/mkosi.conf.d/10-opensuse/initrd/mkosi.postinst
index de610dfeb6..6a60ce83e5 100755
--- a/mkosi.images/initrd/mkosi.postinst
+++ b/mkosi.images/base/mkosi.conf.d/10-opensuse/initrd/mkosi.postinst
@@ -5,3 +5,5 @@ set -e
# OpenSUSE insists on blacklisting erofs by default because its supposedly a legacy filesystem.
# See https://github.com/openSUSE/suse-module-tools/pull/71
rm -f "$BUILDROOT/usr/lib/modprobe.d/60-blacklist_fs-erofs.conf"
+
+mkosi-install systemd udev
diff --git a/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.build.chroot b/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.build.chroot
new file mode 100755
index 0000000000..e1abe0b135
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.build.chroot
@@ -0,0 +1,63 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -ex
+
+if [ ! -f "pkg/$DISTRIBUTION/systemd.spec" ]; then
+ echo "spec not found at pkg/$DISTRIBUTION/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
+ exit 1
+fi
+
+if [ -d .git/ ] && [ -z "$(git status --porcelain)" ]; then
+ TS="$(git show --no-patch --format=%ct HEAD)"
+else
+ TS="${SOURCE_DATE_EPOCH:-$(date +%s)}"
+fi
+
+# The openSUSE filelists hardcode the manpage compression extension. This causes rpmbuild errors since we
+# disable manpage compression as the files cannot be found. Fix the issue by removing the compression
+# extension.
+find "pkg/$DISTRIBUTION" -name "files.*" -exec sed --in-place 's/\.gz$//' {} \;
+
+build() {
+ # TODO: Replace meson_build and meson_install overrides with "--undefine __meson_verbose" once
+ # https://github.com/mesonbuild/meson/pull/12835 is available.
+ # shellcheck disable=SC2046
+ rpmbuild \
+ -bb \
+ --build-in-place \
+ --with upstream \
+ $( ((WITH_TESTS)) || echo --nocheck) \
+ --define "_topdir /var/tmp" \
+ --define "_sourcedir pkg/$DISTRIBUTION" \
+ --define "_rpmdir $PACKAGEDIR" \
+ ${BUILDDIR:+--define} \
+ ${BUILDDIR:+"_vpath_builddir $BUILDDIR"} \
+ --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
+ --define "_binary_payload w.ufdio" \
+ --define "debug_package %{nil}" \
+ --define "vendor openSUSE" \
+ --define "version_override $(cat meson.version)" \
+ --define "release_override $(date "+%Y%m%d%H%M%S" --date "@$TS")" \
+ --define "__check_files sh -c '$(rpm --eval %__check_files) | tee /tmp/unpackaged-files'" \
+ --define "meson_build %{shrink:%{__meson} compile -C %{_vpath_builddir} -j %{_smp_build_ncpus} %{nil}}" \
+ --define "meson_install %{shrink:DESTDIR=%{buildroot} %{__meson} install -C %{_vpath_builddir} --no-rebuild --quiet %{nil}}" \
+ --define "meson_extra_configure_options -D mode=developer -D b_sanitize=${SANITIZERS:-none}" \
+ --define "__os_install_post /usr/lib/rpm/brp-suse %{nil}" \
+ --define "__elf_exclude_path ^/usr/lib/systemd/tests/unit-tests/.*$" \
+ --define "__script_requires %{nil}" \
+ "$@" \
+ "pkg/$DISTRIBUTION/systemd.spec"
+}
+
+if ! build; then
+ if [ ! -s /tmp/unpackaged-files ]; then
+ exit 1
+ fi
+
+ # rpm will append to any existing systemd.lang so delete it explicitly so we don't get duplicate file
+ # warnings.
+ rm systemd.lang
+
+ cat /tmp/unpackaged-files >>"pkg/$DISTRIBUTION/files.systemd"
+ build --noprep --nocheck
+fi
diff --git a/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.conf b/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.conf
new file mode 100644
index 0000000000..4ef13b6ca5
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.conf
@@ -0,0 +1,55 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+[Match]
+Distribution=opensuse
+
+[Config]
+InitrdInclude=initrd/
+
+[Content]
+Environment=
+ PKG_URL="https://code.opensuse.org/package/systemd"
+ PKG_BRANCH="master"
+ SYSTEMD_PACKAGES="systemd
+ udev
+ systemd-experimental
+ systemd-boot
+ systemd-container
+ systemd-homed
+ systemd-network
+ systemd-portable
+ systemd-sysvcompat
+ systemd-testsuite"
+
+# We install gawk, gzip, grep, xz, sed, rsync and docbook-xsl-stylesheets here explicitly so that the busybox
+# versions don't get installed instead.
+Packages=
+ bpftool
+ btrfs-progs
+ cryptsetup
+ dbus-broker
+ device-mapper
+ distribution-release
+ docbook-xsl-stylesheets
+ f2fs-tools
+ gawk
+ glibc-locale-base
+ grep
+ gzip
+ kernel-kvmsmall
+ openssh-clients
+ openssh-server
+ pam
+ quota
+ rpm-build
+ rsync
+ sbsigntools
+ sed
+ shadow
+ timezone
+ vim
+ xz
+
+InitrdPackages=
+ btrfs-progs
+ tpm2.0-tools
diff --git a/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.prepare b/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.prepare
new file mode 100755
index 0000000000..dd01a3f20e
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/10-opensuse/mkosi.prepare
@@ -0,0 +1,61 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+if [ ! -f "pkg/$DISTRIBUTION/systemd.spec" ]; then
+ echo "spec not found at pkg/$DISTRIBUTION/systemd.spec, run mkosi once with -ff to make sure the spec is cloned" >&2
+ exit 1
+fi
+
+if [ "$1" = "final" ]; then
+ DEPS="--requires"
+else
+ DEPS="--buildrequires"
+fi
+
+mkosi-chroot \
+ rpmspec \
+ --with upstream \
+ --query \
+ "$DEPS" \
+ --define "_topdir /var/tmp" \
+ --define "_sourcedir pkg/$DISTRIBUTION" \
+ "pkg/$DISTRIBUTION/systemd.spec" |
+ grep --invert-match --regexp systemd --regexp /bin/sh --regexp "rpmlib(" --regexp udev |
+ sort --unique |
+ tee /tmp/buildrequires |
+ xargs --delimiter '\n' mkosi-install
+
+if [ "$1" = "final" ]; then
+ exit 0
+fi
+
+until mkosi-chroot \
+ rpmbuild \
+ -bd \
+ --build-in-place \
+ --with upstream \
+ --define "_topdir /var/tmp" \
+ --define "_sourcedir pkg/$DISTRIBUTION" \
+ --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
+ "pkg/$DISTRIBUTION/systemd.spec"
+do
+ EXIT_STATUS=$?
+ if [ $EXIT_STATUS -ne 11 ]; then
+ exit $EXIT_STATUS
+ fi
+
+ mkosi-chroot \
+ rpm \
+ --query \
+ --package \
+ --requires \
+ /var/tmp/SRPMS/systemd-*.buildreqs.nosrc.rpm |
+ grep --invert-match '^rpmlib(' |
+ sort --unique >/tmp/dynamic-buildrequires
+
+ sort /tmp/buildrequires /tmp/dynamic-buildrequires |
+ uniq --unique |
+ tee --append /tmp/buildrequires |
+ xargs --delimiter '\n' mkosi-install
+done
diff --git a/mkosi.images/base/mkosi.conf.d/10-ubuntu.conf b/mkosi.images/base/mkosi.conf.d/10-ubuntu/mkosi.conf
index 717809fd03..85126a1a37 100644
--- a/mkosi.images/base/mkosi.conf.d/10-ubuntu.conf
+++ b/mkosi.images/base/mkosi.conf.d/10-ubuntu/mkosi.conf
@@ -5,8 +5,7 @@ Distribution=ubuntu
[Content]
Packages=
- libbpf0
-
-BuildPackages=
+ # We would like to use linux-virtual but it does not have support for SMBIOS credentials.
+ linux-image-generic
linux-tools-common
linux-tools-generic
diff --git a/mkosi.images/system/mkosi.extra/etc/issue b/mkosi.images/base/mkosi.extra/etc/issue
index 6aa6fc0ec0..6aa6fc0ec0 100644
--- a/mkosi.images/system/mkosi.extra/etc/issue
+++ b/mkosi.images/base/mkosi.extra/etc/issue
diff --git a/mkosi.images/system/mkosi.extra/usr/lib/systemd/journald.conf.d/50-persistent.conf b/mkosi.images/base/mkosi.extra/usr/lib/systemd/journald.conf.d/50-persistent.conf
index 2f953290d3..2f953290d3 100644
--- a/mkosi.images/system/mkosi.extra/usr/lib/systemd/journald.conf.d/50-persistent.conf
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/journald.conf.d/50-persistent.conf
diff --git a/mkosi.images/system/mkosi.extra/usr/lib/systemd/mkosi-check-and-shutdown.sh b/mkosi.images/base/mkosi.extra/usr/lib/systemd/mkosi-check-and-shutdown.sh
index 9bb246263e..e0fcf30498 100755
--- a/mkosi.images/system/mkosi.extra/usr/lib/systemd/mkosi-check-and-shutdown.sh
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/mkosi-check-and-shutdown.sh
@@ -1,18 +1,18 @@
#!/bin/bash -eux
# SPDX-License-Identifier: LGPL-2.1-or-later
-# TODO: Figure out why this is failing
-systemctl reset-failed systemd-vconsole-setup.service
-
systemctl --failed --no-legend | tee /failed-services
# Check that secure boot keys were properly enrolled.
if ! systemd-detect-virt --container; then
cmp /sys/firmware/efi/efivars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c <(printf '\6\0\0\0\1')
cmp /sys/firmware/efi/efivars/SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8c <(printf '\6\0\0\0\0')
- # TODO: Figure out why this is failing
- # grep -q this_should_be_here /proc/cmdline
- # grep -q this_should_not_be_here /proc/cmdline && exit 1
+
+ if command -v sbsign &>/dev/null; then
+ cat /proc/cmdline
+ grep -q this_should_be_here /proc/cmdline
+ (! grep -q this_should_not_be_here /proc/cmdline)
+ fi
fi
# Exit with non-zero EC if the /failed-services file is not empty (we have -e set)
diff --git a/mkosi.images/system/mkosi.extra/usr/lib/systemd/system/mkosi-check-and-shutdown.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/mkosi-check-and-shutdown.service
index 7942cbfa77..7942cbfa77 100644
--- a/mkosi.images/system/mkosi.extra/usr/lib/systemd/system/mkosi-check-and-shutdown.service
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/mkosi-check-and-shutdown.service
diff --git a/mkosi.images/system/mkosi.extra/usr/lib/tmpfiles.d/99-mkosi.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-mkosi.conf
index dac79ba4ed..dac79ba4ed 100644
--- a/mkosi.images/system/mkosi.extra/usr/lib/tmpfiles.d/99-mkosi.conf
+++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-mkosi.conf
diff --git a/mkosi.images/system/mkosi.extra/usr/share/factory/mkosi/gdbinit.d/systemd.gdb b/mkosi.images/base/mkosi.extra/usr/share/factory/mkosi/gdbinit.d/systemd.gdb
index 26f882bc2b..26f882bc2b 100644
--- a/mkosi.images/system/mkosi.extra/usr/share/factory/mkosi/gdbinit.d/systemd.gdb
+++ b/mkosi.images/base/mkosi.extra/usr/share/factory/mkosi/gdbinit.d/systemd.gdb
diff --git a/mkosi.images/system/mkosi.finalize b/mkosi.images/base/mkosi.finalize
index 74b810c152..74b810c152 100755
--- a/mkosi.images/system/mkosi.finalize
+++ b/mkosi.images/base/mkosi.finalize
diff --git a/mkosi.images/base/mkosi.postinst b/mkosi.images/base/mkosi.postinst
new file mode 100755
index 0000000000..caaf253ef6
--- /dev/null
+++ b/mkosi.images/base/mkosi.postinst
@@ -0,0 +1,6 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+# shellcheck disable=SC2086
+mkosi-install $SYSTEMD_PACKAGES
diff --git a/mkosi.images/system/mkosi.postinst.chroot b/mkosi.images/base/mkosi.postinst.chroot
index 692242da38..26459b165d 100755
--- a/mkosi.images/system/mkosi.postinst.chroot
+++ b/mkosi.images/base/mkosi.postinst.chroot
@@ -1,11 +1,7 @@
-#!/bin/sh
+#!/bin/bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e
-if [ "$1" = "build" ]; then
- exit 0
-fi
-
if [ -n "$SANITIZERS" ]; then
LD_PRELOAD=$(ldd /usr/lib/systemd/systemd | grep libasan.so | awk '{print $3}')
@@ -48,22 +44,6 @@ EOF
systemctl mask systemd-hwdb-update.service
fi
-if [ -n "$IMAGE_ID" ] ; then
- sed -n \
- -i \
- -e '/^IMAGE_ID=/!p' \
- -e "\$aIMAGE_ID=$IMAGE_ID" \
- /usr/lib/os-release
-fi
-
-if [ -n "$IMAGE_VERSION" ] ; then
- sed -n \
- -i \
- -e '/^IMAGE_VERSION=/!p' \
- -e "\$aIMAGE_VERSION=$IMAGE_VERSION" \
- /usr/lib/os-release
-fi
-
if command -v authselect >/dev/null; then
# authselect 1.5.0 renamed the minimal profile to the local profile without keeping backwards compat so
# let's use the new name if it exists.
@@ -87,11 +67,6 @@ rm -f /etc/resolv.conf
. /usr/lib/os-release
-if [ "$ID" = "centos" ] && [ "$VERSION" = "8" ]; then
- alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1
- alternatives --set python3 /usr/bin/python3.9
-fi
-
mkdir -p /usr/lib/sysusers.d
cat >/usr/lib/sysusers.d/testuser.conf <<EOF
u testuser 4711 "Test User" /home/testuser
@@ -100,3 +75,12 @@ mkdir -p /usr/lib/tmpfiles.d
cat >/usr/lib/tmpfiles.d/testuser.conf <<EOF
q /home/testuser 0700 4711 4711
EOF
+
+# sbsign is not available on CentOS Stream
+if command -v sbsign &>/dev/null; then
+ # Ensure that side-loaded PE addons are loaded if signed, and ignored if not
+ addons_dir=/efi/loader/addons
+ mkdir -p "$addons_dir"
+ ukify build --secureboot-private-key mkosi.key --secureboot-certificate mkosi.crt --cmdline this_should_be_here -o "$addons_dir/good.addon.efi"
+ ukify build --cmdline this_should_not_be_here -o "$addons_dir/bad.addon.efi"
+fi
diff --git a/mkosi.images/base/mkosi.sync b/mkosi.images/base/mkosi.sync
new file mode 100755
index 0000000000..b93339afe1
--- /dev/null
+++ b/mkosi.images/base/mkosi.sync
@@ -0,0 +1,13 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+if ((CACHED)); then
+ exit 0
+fi
+
+if [ -z "$(ls --almost-all "pkg/$DISTRIBTION")" ]; then
+ git clone "$PKG_URL" --branch "$PKG_BRANCH" "pkg/$DISTRIBUTION"
+elif [ -d "pkg/$DISTRIBUTION/.git" ] && [ "$(git -C "pkg/$DISTRIBUTION" rev-parse --abbrev-ref HEAD)" = "$PKG_BRANCH" ]; then
+ git -C "pkg/$DISTRIBUTION" pull
+fi
diff --git a/mkosi.images/initrd/mkosi.conf b/mkosi.images/initrd/mkosi.conf
deleted file mode 100644
index 8e38dc1b78..0000000000
--- a/mkosi.images/initrd/mkosi.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Config]
-Dependencies=base
-
-[Output]
-Format=cpio
-
-[Content]
-BaseTrees=../../mkosi.output/base
-ExtraTrees=../../mkosi.output/base-systemd
-MakeInitrd=yes
-Bootable=no
-BuildPackages=
-
-Packages=
-Packages=
- gzip
- systemd
- udev
-
-# Arch Linux doesn't split their gcc-libs package so we manually remove unneeded stuff here to make sure it
-# doesn't end up in the initrd.
-RemoveFiles=
- /usr/lib/libgfortran.so*
- /usr/lib/libgo.so*
- /usr/lib/libgomp.so*
- /usr/lib/libgphobos.so*
- /usr/lib/libobjc.so*
- /usr/lib/libstdc++.so*
diff --git a/mkosi.images/initrd/mkosi.conf.d/10-centos.conf b/mkosi.images/initrd/mkosi.conf.d/10-centos.conf
deleted file mode 100644
index 3f92e52300..0000000000
--- a/mkosi.images/initrd/mkosi.conf.d/10-centos.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=centos
-
-[Output]
-# TODO: Switch to zstd once we stop building CentOS Stream 8.
-CompressOutput=xz
-
-[Content]
-Packages=xfsprogs
- tpm2-tools
diff --git a/mkosi.images/initrd/mkosi.conf.d/10-default.conf b/mkosi.images/initrd/mkosi.conf.d/10-default.conf
deleted file mode 100644
index 9224b92dd0..0000000000
--- a/mkosi.images/initrd/mkosi.conf.d/10-default.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=!centos
-Distribution=!opensuse
-
-[Output]
-CompressOutput=zst
-
-[Content]
-Packages=btrfs-progs
- tpm2-tools
diff --git a/mkosi.images/initrd/mkosi.conf.d/10-opensuse.conf b/mkosi.images/initrd/mkosi.conf.d/10-opensuse.conf
deleted file mode 100644
index 5cf2df397e..0000000000
--- a/mkosi.images/initrd/mkosi.conf.d/10-opensuse.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=opensuse
-
-[Output]
-CompressOutput=zst
-
-[Content]
-Packages=btrfs-progs
- tpm2.0-tools
diff --git a/mkosi.images/system/mkosi.conf b/mkosi.images/system/mkosi.conf
index 9646bbefde..9937ad3a98 100644
--- a/mkosi.images/system/mkosi.conf
+++ b/mkosi.images/system/mkosi.conf
@@ -3,49 +3,15 @@
[Config]
Dependencies=base
+[Distribution]
+CacheOnly=metadata
+
[Output]
@Format=directory
[Content]
-Autologin=yes
-BaseTrees=../../mkosi.output/base
-ExtraTrees=../../mkosi.output/base-systemd
-Packages=
- acl
- bash-completion
- coreutils
- diffutils
- dnsmasq
- dosfstools
- e2fsprogs
- findutils
- gcc # Sanitizer libraries
- gdb
- grep
- gzip
- kbd
- kexec-tools
- less
- mtools
- nano
- nftables
- openssl
- qrencode
- sed
- socat
- strace
- systemd
- tmux
- tar
- tree
- udev
- util-linux
- valgrind
- wireguard-tools
- xfsprogs
- zsh
-
-BuildPackages=
+BaseTrees=%O/base
+Initrds=%O/base.initrd
[Validation]
@SecureBoot=yes
diff --git a/mkosi.images/system/mkosi.conf.d/05-initrd.conf b/mkosi.images/system/mkosi.conf.d/05-initrd.conf
deleted file mode 100644
index 9f21754058..0000000000
--- a/mkosi.images/system/mkosi.conf.d/05-initrd.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Bootable=!no
-Format=|disk
-Format=|directory
-
-[Config]
-Dependencies=initrd
-
-[Content]
-Initrds=../../mkosi.output/initrd
diff --git a/mkosi.images/system/mkosi.conf.d/10-arch.conf b/mkosi.images/system/mkosi.conf.d/10-arch.conf
deleted file mode 100644
index e1a511c979..0000000000
--- a/mkosi.images/system/mkosi.conf.d/10-arch.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=arch
-
-[Content]
-Packages=
- bpf
- btrfs-progs
- compsize
- dhcp
- f2fs-tools
- glib2
- iproute
- linux
- man-db
- openbsd-netcat
- openssh
- pacman
- polkit
- python-pefile
- python-psutil
- python-pytest
- python3
- quota-tools
- shadow
- vim
diff --git a/mkosi.images/system/mkosi.conf.d/10-centos-fedora.conf b/mkosi.images/system/mkosi.conf.d/10-centos-fedora.conf
deleted file mode 100644
index 871186d5ca..0000000000
--- a/mkosi.images/system/mkosi.conf.d/10-centos-fedora.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=|centos
-Distribution=|fedora
-
-[Content]
-Packages=
- bpftool
- cryptsetup
- dhcp-server
- dnf
- glib2
- integritysetup
- iproute
- iproute-tc
- kernel-core
- libcap-ng-utils
- netcat
- openssh-server
- openssh-clients
- p11-kit
- pam
- passwd
- polkit
- procps-ng
- python3
- python3dist(pefile)
- python3dist(pluggy) # python3-pluggy is a pytest dependency that's not installed for some reason.
- python3dist(psutil)
- python3dist(pytest)
- quota
- vim-common
diff --git a/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.conf
index 146e03a895..af4862d4b1 100644
--- a/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.conf
+++ b/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.conf
@@ -2,7 +2,3 @@
[Match]
Distribution=centos
-
-[Content]
-Packages=
- kernel-modules # For squashfs support
diff --git a/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.repart/10-usr.conf.d/squashfs.conf b/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.repart/10-usr.conf.d/squashfs.conf
deleted file mode 100644
index 393d5f038c..0000000000
--- a/mkosi.images/system/mkosi.conf.d/10-centos/mkosi.repart/10-usr.conf.d/squashfs.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-# CentOS does not support erofs so we use squashfs instead.
-[Partition]
-Format=squashfs
diff --git a/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu.conf b/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu.conf
deleted file mode 100644
index 348bdb2992..0000000000
--- a/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=|debian
-Distribution=|ubuntu
-
-[Content]
-Packages=
- apt
- btrfs-progs
- cryptsetup-bin
- dbus-broker
- default-dbus-session-bus
- f2fs-tools
- fdisk
- iproute2
- isc-dhcp-server
- libcap-ng-utils
- netcat-openbsd
- openssh-server
- openssh-client
- passwd
- policykit-1
- procps
- python3
- python3-pefile
- python3-psutil
- python3-pytest
- quota
- xxd
diff --git a/mkosi.images/system/mkosi.conf.d/10-opensuse.conf b/mkosi.images/system/mkosi.conf.d/10-opensuse.conf
deleted file mode 100644
index 71434b4560..0000000000
--- a/mkosi.images/system/mkosi.conf.d/10-opensuse.conf
+++ /dev/null
@@ -1,24 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=opensuse
-
-[Content]
-Packages=
- bpftool
- btrfs-progs
- cryptsetup
- dbus-broker
- f2fs-tools
- glibc-locale-base
- kernel-kvmsmall
- libcap-ng-utils
- openssh-server
- openssh-clients
- python3
- python3-pefile
- python3-psutil
- python3-pytest
- quota
- shadow
- vim
diff --git a/mkosi.images/system/mkosi.conf.d/10-ubuntu.conf b/mkosi.images/system/mkosi.conf.d/10-ubuntu.conf
deleted file mode 100644
index b099e79132..0000000000
--- a/mkosi.images/system/mkosi.conf.d/10-ubuntu.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-[Match]
-Distribution=ubuntu
-
-[Content]
-Packages=
- # We would like to use linux-image-kvm but it does not have support for SMBIOS credentials.
- linux-image-generic
- linux-tools-common
- linux-tools-generic
-# "orphan_file" is enabled by default in recent versions of mkfs.ext4 but not supported by the Jammy kernel
-# so we explicitly disable it.
-Environment=SYSTEMD_REPART_MKFS_OPTIONS_EXT4="-O ^orphan_file"
diff --git a/mkosi.images/system/mkosi.repart/00-esp.conf b/mkosi.images/system/mkosi.repart/00-esp.conf
index 4be04661d9..391543d1e7 100644
--- a/mkosi.images/system/mkosi.repart/00-esp.conf
+++ b/mkosi.images/system/mkosi.repart/00-esp.conf
@@ -5,5 +5,5 @@ Type=esp
Format=vfat
CopyFiles=/boot:/
CopyFiles=/efi:/
-SizeMinBytes=512M
-SizeMaxBytes=512M
+SizeMinBytes=1G
+SizeMaxBytes=1G
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index c9cb70c424..befe6a08c5 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -22,7 +22,10 @@ src/hostname/hostnamed.c
src/locale/localed.c
src/timedate/timedated.c
units/debug-shell.service.in
+units/systemd-battery-check.service.in
+units/systemd-bootctl@.service.in
units/systemd-journald.service.in
units/systemd-pcrextend@.service.in
+units/systemd-pcrlock@.service.in
units/systemd-timesyncd.service.in
units/user@.service.in
diff --git a/po/be.po b/po/be.po
index 182d11873a..dbb02fd967 100644
--- a/po/be.po
+++ b/po/be.po
@@ -9,15 +9,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-05-13 19:20+0000\n"
"Last-Translator: Maksim Kliazovich <maxklezovich@gmail.com>\n"
-"Language-Team: Belarusian <https://translate.fedoraproject.org/projects/systemd/master/be/>\n"
+"Language-Team: Belarusian <https://translate.fedoraproject.org/projects/"
+"systemd/master/be/>\n"
"Language: be\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.15.2\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -25,7 +27,8 @@ msgid "Send passphrase back to system"
msgstr "Адправіць пароль назад сістэме"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Каб адправіць пароль назад сістэме, патрбуецца аўтэнтыфікацыя."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -34,7 +37,9 @@ msgstr "Кіраванне сістэмнымі службамі і іншымі
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Для кіравання сістэмнымі службамі і іншымі адзінкамі патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для кіравання сістэмнымі службамі і іншымі адзінкамі патрабуецца "
+"аўтэнтыфікацыя."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -42,15 +47,21 @@ msgstr "Кіраванне файламі сістэмных службаў і
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Для кіравання файламі сістэмных службаў і іншых адзінак патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для кіравання файламі сістэмных службаў і іншых адзінак патрабуецца "
+"аўтэнтыфікацыя."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Наладзіць зменныя асяроддзя кіраўніка сістэмы"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Для наладкі зменных асяроддзя сістэмнага кіраўніка патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Для наладкі зменных асяроддзя сістэмнага кіраўніка патрабуецца "
+"аўтэнтыфікацыя."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -66,7 +77,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Каб перачытаць стан systemd, патрабуецца аўтэнтыфікацыя."
#: src/home/org.freedesktop.home1.policy:13
@@ -90,8 +102,10 @@ msgid "Check credentials of a home area"
msgstr "Праверыць уліковыя даныя хатняй прасторы"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Для праверкі ўліковых даных хатняй прасторы патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Для праверкі ўліковых даных хатняй прасторы патрабуецца аўтэнтыфікацыя."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -114,151 +128,180 @@ msgid "Change password of a home area"
msgstr "Змяніць пароль для хатняй прасторы"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "Для змены пароля для хатняй прасторы патрабуецца аўтэнтыфікацыя."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Для абнаўлення хатняй прасторы патрабуецца аўтэнтыфікацыя."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Стварыць хатнюю прастору"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Для стварэння хатняй прасторы патрабуецца аўтэнтыфікацыя."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -275,8 +318,12 @@ msgid "Set static hostname"
msgstr "Наладзіць статычную назву камп’ютара"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Для наладкі як статычнай, так і зразумелай, назвы камп’ютара патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Для наладкі як статычнай, так і зразумелай, назвы камп’ютара патрабуецца "
+"аўтэнтыфікацыя."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -300,7 +347,8 @@ msgstr "Атрыманне серыйнага нумара абсталяван
#: src/hostname/org.freedesktop.hostname1.policy:62
msgid "Authentication is required to get hardware serial number."
-msgstr "Каб атрымаць серыйны нумар абсталявання, неабходна прайсці распазнаванне."
+msgstr ""
+"Каб атрымаць серыйны нумар абсталявання, неабходна прайсці распазнаванне."
#: src/hostname/org.freedesktop.hostname1.policy:71
msgid "Get system description"
@@ -311,28 +359,50 @@ msgid "Authentication is required to get system description."
msgstr "Каб атрымаць апісанне сістэмы, трэба прайсці распазнаванне."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Імпартаваць вобраз віртуальнай машыны або кантэйнера"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Для імпарту вобраза віртуальнай машыны або кантэйнера патрабуецца аўтэнтыфікацыя"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Для імпарту вобраза віртуальнай машыны або кантэйнера патрабуецца "
+"аўтэнтыфікацыя"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Экспартаваць вобраз віртуальнай машыны або кантэйнера"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Для экспарту вобраза віртуальнай машыны або кантэйнера патрабуецца аўтэнтыфікацыя"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Для экспарту вобраза віртуальнай машыны або кантэйнера патрабуецца "
+"аўтэнтыфікацыя"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Спампаваць вобраз віртуальнай машыны або кантэйнера"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Для спампоўвання вобраза віртуальнай машыны або кантэйнера патрабуецца аўтэнтыфікацыя"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Для спампоўвання вобраза віртуальнай машыны або кантэйнера патрабуецца "
+"аўтэнтыфікацыя"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Для змены пароля для хатняй прасторы патрабуецца аўтэнтыфікацыя."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -355,8 +425,11 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Дазволіць праграмам перашкаджаць выключэнню сістэмы"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць выключэнню сістэмы, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць выключэнню сістэмы, "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -364,7 +437,9 @@ msgstr "Дазволіць праграмам затрымліваць выкл
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Для таго, каб дазволіць праграмам затрымліваць выключэнне сістэмы, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб дазволіць праграмам затрымліваць выключэнне сістэмы, "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -372,7 +447,9 @@ msgstr "Дазволіць праграмам перашкаджаць пера
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць пераходу сістэмы ў рэжым сну, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць пераходу сістэмы ў рэжым сну, "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -380,55 +457,84 @@ msgstr "Дазволіць праграмам затрымліваць пера
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Для таго, каб дазволіць праграмам затрымліваць пераход сістэмы ў рэжым сну, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб дазволіць праграмам затрымліваць пераход сістэмы ў рэжым сну, "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Дазволіць праграмам перашкаджаць аўтаматычнаму прыпыненню сістэмы"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць аўтаматычнаму прыпыненню сістэмы, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць аўтаматычнаму прыпыненню "
+"сістэмы, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку выключэння"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку выключэння, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку "
+"выключэння, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку прыпынення"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку прыпынення, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку "
+"прыпынення, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку пераходу ў рэжым сну"
+msgstr ""
+"Дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку пераходу ў рэжым "
+"сну"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку пераходу ў рэжым сну, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку "
+"пераходу ў рэжым сну, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Дазволіць праграмам перашкаджаць сістэме апрацоўваць закрыццё ноўтбука"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць закрыццё ноўтбука, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць закрыццё "
+"ноўтбука, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку перазапуску"
+msgstr ""
+"Дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку перазапуску"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку перазапуску, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Для таго, каб дазволіць праграмам перашкаджаць сістэме апрацоўваць кнопку "
+"перазапуску, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -436,7 +542,9 @@ msgstr "Дазволіць праграмам працаваць у фоне п
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Для таго, каб дазволіць праграмам працаваць па-за сеансам карыстальніка, патрабуецца відавочны запыт."
+msgstr ""
+"Для таго, каб дазволіць праграмам працаваць па-за сеансам карыстальніка, "
+"патрабуецца відавочны запыт."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -444,7 +552,9 @@ msgstr "Дазволіць праграмам працаваць у фоне п
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Для таго, каб дазволіць праграмам працаваць па-за межамі сеанса карыстальніка, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб дазволіць праграмам працаваць па-за межамі сеанса "
+"карыстальніка, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -452,7 +562,9 @@ msgstr "Дазволіць далучаць прылады да працоўны
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Для таго, каб дазволіць далучаць прылады да працоўных месцаў, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб дазволіць далучаць прылады да працоўных месцаў, патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -475,16 +587,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Выключыць сістэму з іншымі прысутнымі карыстальнікамі"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Для выключэння сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Для выключэння сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Выключыць сістэму, калі праграмы перашкаджаюць гэтаму"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Для выключэння сістэмы з актыўнымі праграмамі, якія перашкаджаюць выключэнню, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для выключэння сістэмы з актыўнымі праграмамі, якія перашкаджаюць "
+"выключэнню, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -499,16 +619,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Перазагрузіць сістэму з іншымі прысутнымі карыстальнікамі"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Для перазагрузкі сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Для перазагрузкі сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Перазагрузіць сістэму, калі праграмы перашкаджаюць гэтаму"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Для перазагрузкі сістэмы з актыўнымі праграмамі, якія перашкаджаюць выключэнню, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для перазагрузкі сістэмы з актыўнымі праграмамі, якія перашкаджаюць "
+"выключэнню, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -523,16 +651,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Спыніць сістэму з іншымі прысутнымі карыстальнікамі"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Для спынення сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Для спынення сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Спыніць сістэму, калі праграмы перашкаджаюць гэтаму"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Для спынення сістэмы з актыўнымі праграмамі, якія перашкаджаюць выключэнню, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для спынення сістэмы з актыўнымі праграмамі, якія перашкаджаюць выключэнню, "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -547,16 +683,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Прыпыніць сістэму з іншымі прысутнымі карыстальнікамі"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Для прыпынення сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Для прыпынення сістэмы з іншымі прысутнымі карыстальнікамі патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Прыпыніць сістэму, калі праграмы перашкаджаюць гэтаму"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Для прыпынення сістэмы з актыўнымі праграмамі, якія перашкаджаюць выключэнню, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для прыпынення сістэмы з актыўнымі праграмамі, якія перашкаджаюць "
+"выключэнню, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -571,16 +715,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Перавесці сістэму ў рэжым сну з іншымі прысутнымі карыстальнікамі"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Для пераводу сістэмы ў рэжым сну з іншымі прысутнымі карыстальнікамі патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Для пераводу сістэмы ў рэжым сну з іншымі прысутнымі карыстальнікамі "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Перавесці сістэму ў рэжым сну, калі праграмы перашкаджаюць гэтаму"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Для пераводу сістэмы ў рэжым сну з актыўнымі праграмамі, якія перашкаджаюць выключэнню, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для пераводу сістэмы ў рэжым сну з актыўнымі праграмамі, якія перашкаджаюць "
+"выключэнню, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -588,7 +740,9 @@ msgstr "Кіраванне актыўнымі сеансамі, карыстал
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Для кіравання актыўнымі сеансамі, карыстальнікамі і працоўнымі месцамі патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для кіравання актыўнымі сеансамі, карыстальнікамі і працоўнымі месцамі "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -596,7 +750,9 @@ msgstr "Заблакаваць або разблакаваць актыўныя
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Для таго, каб заблакаваць ці разблакаваць актыўныя сеансы, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб заблакаваць ці разблакаваць актыўныя сеансы, патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -604,14 +760,17 @@ msgstr "Вызначыць \"прычыну\" перазапуску"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Для таго, каб вызначыць прычыну перазапуску, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб вызначыць прычыну перазапуску, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Запусціць наладку прашыўкі падчас наступнага запуску"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr "Для таго, каб запусціць наладку прашыўкі, патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:374
@@ -619,16 +778,24 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Вывесці меню загрузчыка падчас наступнага запуску"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Для вываду меню загрузчыка падчас наступнага запуску патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Для вываду меню загрузчыка падчас наступнага запуску патрабуецца "
+"аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Абраць пэўны загрузачны запіс падчас наступнага запуску"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Для таго, каб абраць пэўны загрузачны запіс падчас наступнага запуску, патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Для таго, каб абраць пэўны загрузачны запіс падчас наступнага запуску, "
+"патрабуецца аўтэнтыфікацыя."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -668,7 +835,8 @@ msgstr "Атрымаць абалонку ў лакальным кантэйне
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Для атрымання абалонкі ў лакальным кантэйнеры патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для атрымання абалонкі ў лакальным кантэйнеры патрабуецца аўтэнтыфікацыя."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -676,15 +844,19 @@ msgstr "Атрымаць абалонку на лакальным камп’ю
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Для атрымання абалонкі на лакальным камп’ютары патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для атрымання абалонкі на лакальным камп’ютары патрабуецца аўтэнтыфікацыя."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Атрымаць псеўда-тэрмінал у лакальным кантэйнеры"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Для атрымання псеўда-тэрмінала ў лакальным кантэйнеры патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Для атрымання псеўда-тэрмінала ў лакальным кантэйнеры патрабуецца "
+"аўтэнтыфікацыя."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -692,23 +864,32 @@ msgstr "Атрымаць псеўда-тэрмінал на лакальным
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Для атрымання псеўда-тэрмінала на лакальным камп’ютары патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для атрымання псеўда-тэрмінала на лакальным камп’ютары патрабуецца "
+"аўтэнтыфікацыя."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Кіраванне лакальнымі віртуальнымі машынамі або кантэйнерамі"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Для кіравання лакальнымі віртуальнымі машынамі і кантэйнерамі патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Для кіравання лакальнымі віртуальнымі машынамі і кантэйнерамі патрабуецца "
+"аўтэнтыфікацыя."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Кіраванне вобразамі лакальных віртуальных машын і кантэйнераў"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Для кіравання вобразамі лакальных віртуальных машын і кантэйнераў патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Для кіравання вобразамі лакальных віртуальных машын і кантэйнераў "
+"патрабуецца аўтэнтыфікацыя."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -796,7 +977,8 @@ msgstr "Вызначыць DNSSEC Negative Trust Anchors"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Для вызначэння DNSSEC Negative Trust Anchors патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для вызначэння DNSSEC Negative Trust Anchors патрабуецца аўтэнтыфікацыя."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -820,7 +1002,9 @@ msgstr "Сервер DHCP адпраўляе паведамленне з пры
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Для адпраўкі паведамлення з прымусовым абнаўленнем патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для адпраўкі паведамлення з прымусовым абнаўленнем патрабуецца "
+"аўтэнтыфікацыя."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -844,7 +1028,8 @@ msgstr "Змяніць канфігурацыю сеткавага інтэрф
#: src/network/org.freedesktop.network1.policy:177
msgid "Authentication is required to reconfigure network interface."
-msgstr "Для змены канфігурацыі сеткавага інтэрфейсу патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для змены канфігурацыі сеткавага інтэрфейсу патрабуецца аўтэнтыфікацыя."
#: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image"
@@ -859,16 +1044,22 @@ msgid "Attach or detach a portable service image"
msgstr "Далучыць альбо адлучыць вобраз пераноснай службы"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Для далучэння альбо адлучэння вобраза пераноснай службы патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Для далучэння альбо адлучэння вобраза пераноснай службы патрабуецца "
+"аўтэнтыфікацыя."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Выдаліць альбо змяніць вобраз пераноснай службы"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Для выдалення альбо змены вобраза пераноснай службы патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Для выдалення альбо змены вобраза пераноснай службы патрабуецца "
+"аўтэнтыфікацыя."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -892,7 +1083,8 @@ msgstr "Скінуць налады вырашэння назваў"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Для таго, каб скінуць налады вырашэння назваў, патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб скінуць налады вырашэння назваў, патрабуецца аўтэнтыфікацыя."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -915,7 +1107,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Наладзіць апаратны гадзіннік на мясцовы час альбо UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr "Для наладкі апаратнага гадзінніка патрабуецца аўтэнтыфікацыя."
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -923,44 +1117,61 @@ msgid "Turn network time synchronization on or off"
msgstr "Уключыць або выключыць сінхранізацыю часу па сетцы"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Для ўключэння або выключэння сінхранізацыі часу па сетцы патрабуецца аўтэнтыфікацыя."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Для ўключэння або выключэння сінхранізацыі часу па сетцы патрабуецца "
+"аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Для запуску \"$(unit)\" патрабуецца аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Для спынення \"$(unit)\" патрабуецца аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Для перачытання стану \"$(unit)\" патрабуецца аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Для перазапуску \"$(unit)\" патрабуецца аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Для адпраўкі сігналу UNIX працэсам адзінкі \"$(unit)\" патрабуецца аўтэнтыфікацыя."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Для адпраўкі сігналу UNIX працэсам адзінкі \"$(unit)\" патрабуецца "
+"аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Для таго, каб скінуць стан \"failed\" у \"$(unit)\", патрабуецца аўтэнтыфікацыя."
+msgstr ""
+"Для таго, каб скінуць стан \"failed\" у \"$(unit)\", патрабуецца "
+"аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Для змены ўласцівасцей \"$(unit)\" патрабуецца аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Для выдалення файлаў і каталогаў, якія звязаныя з \"$(unit)\", патрабуецца аўтэнтыфікацыя."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Для выдалення файлаў і каталогаў, якія звязаныя з \"$(unit)\", патрабуецца "
+"аўтэнтыфікацыя."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Для спынення альбо ўзнаўлення працэсаў \"$(unit)\" патрабуецца аўтэнтыфікацыя."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Для спынення альбо ўзнаўлення працэсаў \"$(unit)\" патрабуецца "
+"аўтэнтыфікацыя."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Неабходна аўтэнтыфікацыя для забойства '$(unit)'."
diff --git a/po/be@latin.po b/po/be@latin.po
index ce7dbb515d..e416a20ba5 100644
--- a/po/be@latin.po
+++ b/po/be@latin.po
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2016-06-09 19:50+0300\n"
"Last-Translator: Viktar Vaŭčkievič <victorenator@gmail.com>\n"
"Language-Team: \n"
@@ -15,7 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Lokalize 2.0\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -23,7 +24,8 @@ msgid "Send passphrase back to system"
msgstr "Adpravić paroĺ nazad sistemie"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Nieabchodna aŭtentyfikacyja dlia adpraŭki parolia nazad sistemie."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -32,7 +34,9 @@ msgstr "Kiravać servisami i inšymi sistemnymi adzinkami"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia servisami i inšymi sistemnymi adzinkami."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia servisami i inšymi sistemnymi "
+"adzinkami."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -40,15 +44,21 @@ msgstr "Kiravać fajlami servisaŭ i inšych sistemnych adzinak"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia fajlami servisaŭ i inšych sistemnych adzinak."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia fajlami servisaŭ i inšych "
+"sistemnych adzinak."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Ustaliavać abo skinuć zmiennyja asiaroddzia sistemnaha menedžera"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia abo skidu zmiennych asiaroddzia sistemnaha menedžera."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia abo skidu zmiennych "
+"asiaroddzia sistemnaha menedžera."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -64,7 +74,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Nieabchodna aŭtentyfikacyja dlia pieračytannia stanu systemd."
#: src/home/org.freedesktop.home1.policy:13
@@ -91,8 +102,11 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:34
#, fuzzy
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, karystaĺnikami i miescami."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, "
+"karystaĺnikami i miescami."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -101,7 +115,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:44
#, fuzzy
msgid "Authentication is required to update a user's home area."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -110,7 +125,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:54
#, fuzzy
msgid "Authentication is required to resize a user's home area."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
@@ -118,151 +134,182 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:64
#, fuzzy
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, karystaĺnikami i miescami."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, "
+"karystaĺnikami i miescami."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Nieabchodna aŭtentyfikacyja dlia pieračytannia stanu systemd."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -279,8 +326,12 @@ msgid "Set static hostname"
msgstr "Ustaliavać statyčnaje imia vuzla"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia jak statyčnaha tak i pryhožaha imia vuzla."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia jak statyčnaha tak i "
+"pryhožaha imia vuzla."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -288,7 +339,9 @@ msgstr "Ustaliavać infarmacyju ab mašynie"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia infarmacyi ab lakaĺnaj mašynie."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia infarmacyi ab lakaĺnaj "
+"mašynie."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -316,32 +369,51 @@ msgstr "Ustaliavać sistemny časavy pojas"
#: src/hostname/org.freedesktop.hostname1.policy:72
#, fuzzy
msgid "Authentication is required to get system description."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnaha časavoha pojasu."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnaha časavoha pojasu."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Impartavać vobraz VM abo kantejniera"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Nieabchodna aŭtentyfikacyja dlia impartu vobraza VM abo kantejniera"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Ekspartavać vobraz VM abo kantejniera"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Nieabchodna aŭtentyfikacyja dlia ekspartu vobraza VM abo kantejniera"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Spampavać vobraz VM abo kantejniera"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Nieabchodna aŭtentyfikacyja dlia spampoŭki vobraza VM abo kantejniera"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, "
+"karystaĺnikami i miescami."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Ustaliavać sistemnuju lakaĺ"
@@ -356,15 +428,19 @@ msgstr "Ustaliavać sistemnyja nalady klavijatury"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnych nalad klavijatury."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnych nalad klavijatury."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Dazvolić prahramam pieraškadžać vykliučenniu sistemy"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać vykliučenniu sistemy."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać vykliučenniu "
+"sistemy."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -372,7 +448,9 @@ msgstr "Dazvolić prahramam zatrymlivać vykliučennie sistemy"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam zatrymlivać vykliučennie sistemy."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam zatrymlivać vykliučennie "
+"sistemy."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -380,7 +458,9 @@ msgstr "Dazvolić prahramam pieraškadžać zasypanniu sistemy"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać zasypanniu sistemy."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać zasypanniu "
+"sistemy."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -388,73 +468,110 @@ msgstr "Dazvolić prahramam zatrymlivać zasypannie sistemy"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam zatrymlivać zasypannie sistemy."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam zatrymlivać zasypannie "
+"sistemy."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Dazvolić prahramam pieraškadžać aŭtamatyčnamu prypynienniu sistemy"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać aŭtamatyčnamu prypynienniu sistemy."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać "
+"aŭtamatyčnamu prypynienniu sistemy."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu vykliučennia"
+msgstr ""
+"Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu vykliučennia"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie apracoŭvać klavišu vykliučennia."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie "
+"apracoŭvać klavišu vykliučennia."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu prypyniennia"
+msgstr ""
+"Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu prypyniennia"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie apracoŭvać klavišu prypyniennia."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie "
+"apracoŭvać klavišu prypyniennia."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu hibiernacyi"
+msgstr ""
+"Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu hibiernacyi"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie apracoŭvać klavišu hibiernacyi."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie "
+"apracoŭvać klavišu hibiernacyi."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Dazvolić prahramam pieraškadžać sistemie apracoŭvać zakryccio kryški noŭtbuka"
+msgstr ""
+"Dazvolić prahramam pieraškadžać sistemie apracoŭvać zakryccio kryški noŭtbuka"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie apracoŭvać zakryccio kryški noŭtbuka."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie "
+"apracoŭvać zakryccio kryški noŭtbuka."
#: src/login/org.freedesktop.login1.policy:117
#, fuzzy
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu vykliučennia"
+msgstr ""
+"Dazvolić prahramam pieraškadžać sistemie apracoŭvać klavišu vykliučennia"
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie apracoŭvać klavišu vykliučennia."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dazvolu prahramam pieraškadžać sistemie "
+"apracoŭvać klavišu vykliučennia."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
-msgstr "Dazvolić karystaĺniku, jakija jašče nie ŭvajšoŭ u sistemu, vykonvać prahramy"
+msgstr ""
+"Dazvolić karystaĺniku, jakija jašče nie ŭvajšoŭ u sistemu, vykonvać prahramy"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Nieabchodny vidavočny zapyt dlia vykanannia prahram karystaĺnika, jaki jašče nie ŭvajšoŭ u sistemu."
+msgstr ""
+"Nieabchodny vidavočny zapyt dlia vykanannia prahram karystaĺnika, jaki jašče "
+"nie ŭvajšoŭ u sistemu."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
-msgstr "Dazvolić karystaĺnikam, jakija jašče nie ŭvajšli ŭ sistemu, vykonvać prahramy"
+msgstr ""
+"Dazvolić karystaĺnikam, jakija jašče nie ŭvajšli ŭ sistemu, vykonvać prahramy"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Nieabchodna aŭtentyfikacyja dlia vykanannia prahram karystaĺnika, jaki jašče nie ŭvajšoŭ u sistemu."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia vykanannia prahram karystaĺnika, jaki jašče "
+"nie ŭvajšoŭ u sistemu."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -462,7 +579,8 @@ msgstr "Dazvolić dalučać prylady da pracoŭnych miescaŭ"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -470,7 +588,8 @@ msgstr "Adkliučać prylady ad pracoŭnych miescaŭ"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Nieabchodna aŭtentyfikacyja dlia adkliučennia prylad ad pracoŭnych miescaŭ."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia adkliučennia prylad ad pracoŭnych miescaŭ."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -485,16 +604,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Vykliučyć sistemu pry prysutnasci inšych karystaĺnikaŭ"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Nieabchodna aŭtentyfikacyja dlia vykliučennia sistemy pry prysutnasci inšych karystaĺnikaŭ."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia vykliučennia sistemy pry prysutnasci inšych "
+"karystaĺnikaŭ."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Vykliučyć sistemu, kali prahramy pieraškadžajuć hetamu"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Nieabchodna aŭtentyfikacyja dlia vykliučennia sistemy, kali prahramy pieraškadžajuć hetamu."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia vykliučennia sistemy, kali prahramy "
+"pieraškadžajuć hetamu."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -509,16 +636,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Pierazahruzić sistemu pry prysutnasci inšych karystaĺnikaŭ"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Nieabchodna aŭtentyfikacyja dlia pierazahruzki sistemy pry prysutnasci inšych karystaĺnikaŭ."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia pierazahruzki sistemy pry prysutnasci "
+"inšych karystaĺnikaŭ."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Pierazahruzić sistemu, kali prahramy pieraškadžajuć hetamu"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Nieabchodna aŭtentyfikacyja dlia pierazahruzki sistemy, kali prahramy pieraškadžajuć hetamu."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia pierazahruzki sistemy, kali prahramy "
+"pieraškadžajuć hetamu."
#: src/login/org.freedesktop.login1.policy:235
#, fuzzy
@@ -537,8 +672,12 @@ msgstr "Hibiernavać sistemu pry prysutnasci inšych karystaĺnikaŭ"
#: src/login/org.freedesktop.login1.policy:247
#, fuzzy
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy pry prysutnasci inšych karystaĺnikaŭ."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy pry prysutnasci inšych "
+"karystaĺnikaŭ."
#: src/login/org.freedesktop.login1.policy:257
#, fuzzy
@@ -547,8 +686,12 @@ msgstr "Hibiernavać sistemu, kali prahramy pieraškadžajuć hetamu"
#: src/login/org.freedesktop.login1.policy:258
#, fuzzy
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy, kali prahramy pieraškadžajuć hetamu."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy, kali prahramy "
+"pieraškadžajuć hetamu."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -563,16 +706,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Prypynić sistemu pry prysutnasci inšych karystaĺnikaŭ"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Nieabchodna aŭtentyfikacyja dlia prypyniennia sistemy pry prysutnasci inšych karystaĺnikaŭ."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia prypyniennia sistemy pry prysutnasci inšych "
+"karystaĺnikaŭ."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Prypynić sistemu, kali prahramy pieraškadžajuć hetamu"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Nieabchodna aŭtentyfikacyja dlia prypyniennia sistemy, kali prahramy pieraškadžajuć hetamu."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia prypyniennia sistemy, kali prahramy "
+"pieraškadžajuć hetamu."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -587,16 +738,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibiernavać sistemu pry prysutnasci inšych karystaĺnikaŭ"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy pry prysutnasci inšych karystaĺnikaŭ."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy pry prysutnasci inšych "
+"karystaĺnikaŭ."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibiernavać sistemu, kali prahramy pieraškadžajuć hetamu"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy, kali prahramy pieraškadžajuć hetamu."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia hibiernacyi sistemy, kali prahramy "
+"pieraškadžajuć hetamu."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -604,7 +763,9 @@ msgstr "Kiravać aktyŭnymi siesijami, karystaĺnikami i pracoŭnymi miescami"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, karystaĺnikami i miescami."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia aktyŭnymi siesijami, "
+"karystaĺnikami i miescami."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -612,7 +773,9 @@ msgstr "Blakavać abo razblakavać aktyŭnuju siesiju"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Nieabchodna aŭtentyfikacyja dlia blakiroŭki abo razblakiroŭki aktyŭnaj siesii."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia blakiroŭki abo razblakiroŭki aktyŭnaj "
+"siesii."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -621,7 +784,8 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:353
#, fuzzy
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnaha časavoha pojasu."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnaha časavoha pojasu."
#: src/login/org.freedesktop.login1.policy:363
#, fuzzy
@@ -629,8 +793,12 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "Dazvolić ukazannie prašyŭcy na zahruzku interfiejsu nalad"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭkazannia prašyŭcy na zahruzku interfiejsu nalad."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭkazannia prašyŭcy na zahruzku interfiejsu "
+"nalad."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
@@ -638,8 +806,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:375
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭkazannia prašyŭcy na zahruzku interfiejsu nalad."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭkazannia prašyŭcy na zahruzku interfiejsu "
+"nalad."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
@@ -647,8 +819,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:386
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭkazannia prašyŭcy na zahruzku interfiejsu nalad."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭkazannia prašyŭcy na zahruzku interfiejsu "
+"nalad."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -656,7 +832,8 @@ msgstr "Ustaliavać usieahuĺnaje paviedamliennie"
#: src/login/org.freedesktop.login1.policy:397
msgid "Authentication is required to set a wall message"
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
#: src/login/org.freedesktop.login1.policy:406
msgid "Change Session"
@@ -689,7 +866,8 @@ msgstr "Atrymać abalonku na lakaĺnym kantejniery"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Nieabchodna aŭtentyfikacyja dlia atrymannia abalonki na lakaĺnym kantejniery."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia atrymannia abalonki na lakaĺnym kantejniery."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -697,15 +875,19 @@ msgstr "Atrymać abalonku na lakaĺnym vuzlie"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Nieabchodna aŭtentyfikacyja dlia atrymannia abalonki na lakaĺnym vuzlie."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia atrymannia abalonki na lakaĺnym vuzlie."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Atrymać psieŭda TTY na lakaĺnym kantejniery"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Nieabchodna aŭtentyfikacyja dlia atrymannia psieŭda TTY na lakaĺnym kantejniery."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia atrymannia psieŭda TTY na lakaĺnym "
+"kantejniery."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -713,23 +895,31 @@ msgstr "Atrymać psieŭda TTY na lakaĺnym vuzlie"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Nieabchodna aŭtentyfikacyja dlia atrymannia psieŭda TTY na lakaĺnym vuzlie."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia atrymannia psieŭda TTY na lakaĺnym vuzlie."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Kiravać lakaĺnymi virtuaĺnymi mašynami abo kantejnierami"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia lakaĺnymi virtuaĺnymi mašynami i kantejnierami."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia lakaĺnymi virtuaĺnymi mašynami i "
+"kantejnierami."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Kiravać vobrazami lakaĺnych virtuaĺnych mašyn i kantejnieraŭ"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Nieabchodna aŭtentyfikacyja dlia kiravannia vobrazami lakaĺnych virtuaĺnych mašyn i kantejnieraŭ."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia kiravannia vobrazami lakaĺnych virtuaĺnych "
+"mašyn i kantejnieraŭ."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -853,7 +1043,8 @@ msgstr ""
#: src/network/org.freedesktop.network1.policy:144
#, fuzzy
msgid "Authentication is required to send force renew message."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -862,7 +1053,8 @@ msgstr ""
#: src/network/org.freedesktop.network1.policy:155
#, fuzzy
msgid "Authentication is required to renew dynamic addresses."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
#: src/network/org.freedesktop.network1.policy:165
msgid "Reload network settings"
@@ -897,8 +1089,10 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
#, fuzzy
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia dalučennia prylad da pracoŭnych miescaŭ."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
@@ -906,7 +1100,8 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
#, fuzzy
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "Nieabchodna aŭtentyfikacyja dlia spampoŭki vobraza VM abo kantejniera"
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -916,7 +1111,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:23
#, fuzzy
msgid "Authentication is required to register a DNS-SD service"
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
#: src/resolve/org.freedesktop.resolve1.policy:33
msgid "Unregister a DNS-SD service"
@@ -925,7 +1121,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:34
#, fuzzy
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭsieahuĺnaha paviedamliennia"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -934,7 +1131,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:133
#, fuzzy
msgid "Authentication is required to reset name resolution settings."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnych nalad klavijatury."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnych nalad klavijatury."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -950,62 +1148,81 @@ msgstr "Ustaliavać sistemny časavy pojas"
#: src/timedate/org.freedesktop.timedate1.policy:34
msgid "Authentication is required to set the system timezone."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnaha časavoha pojasu."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia sistemnaha časavoha pojasu."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
msgstr "Ustaliavać časavy pojas (miascovy abo UTC), u jakim RTC zachoŭvaje čas"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia časavoha pojasu (miascovy abo UTC), u jakim zachoŭvajecca čas u RTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia časavoha pojasu (miascovy abo "
+"UTC), u jakim zachoŭvajecca čas u RTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Ukliučyć abo vykliučyć sinchranizacyju času pa sietcy"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭkliučennia abo vykliučennia sinchranizacyi času pa sietcy."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭkliučennia abo vykliučennia sinchranizacyi "
+"času pa sietcy."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Nieabchodna aŭtentyfikacyja dlia zapusku '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Nieabchodna aŭtentyfikacyja dlia spyniennia '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Nieabchodna aŭtentyfikacyja dlia pieračytannia stanu '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Nieabchodna aŭtentyfikacyja dlia pierazapusku '$(unit)'."
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
#, fuzzy
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭlascivasciej '$(unit)'."
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭlascivasciej '$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Nieabchodna aŭtentyfikacyja dlia anuliavannia pamylkovaha stanu '$(unit)'."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia anuliavannia pamylkovaha stanu '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭlascivasciej '$(unit)'."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia ŭstaliavannia ŭlascivasciej '$(unit)'."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Nieabchodna aŭtentyfikacyja dlia anuliavannia pamylkovaha stanu '$(unit)'."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia anuliavannia pamylkovaha stanu '$(unit)'."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Nieabchodna aŭtentyfikacyja dlia anuliavannia pamylkovaha stanu '$(unit)'."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Nieabchodna aŭtentyfikacyja dlia anuliavannia pamylkovaha stanu '$(unit)'."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Nieabchodna aŭtentyfikacyja dlia zabojstva '$(unit)'."
diff --git a/po/bg.po b/po/bg.po
index 4e965932df..95d239690e 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,10 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: systemd master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-03-17 15:20+0000\n"
"Last-Translator: Velislav Ivanov <velislav.bg@gmail.com>\n"
-"Language-Team: Bulgarian <https://translate.fedoraproject.org/projects/systemd/master/bg/>\n"
+"Language-Team: Bulgarian <https://translate.fedoraproject.org/projects/"
+"systemd/master/bg/>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,7 +25,8 @@ msgid "Send passphrase back to system"
msgstr "Изпращане на паролата към системата"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "За изпращане на паролата към системата е необходима идентификация."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -33,7 +35,8 @@ msgstr "Управление на услугите или другите мод
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "За управление на услугите или другите модули е необходима идентификация."
+msgstr ""
+"За управление на услугите или другите модули е необходима идентификация."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -41,15 +44,23 @@ msgstr "Управление на файловете за услугите ил
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "За управление на файловете за услугите или другите модули е необходима идентификация."
+msgstr ""
+"За управление на файловете за услугите или другите модули е необходима "
+"идентификация."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Задаване или изтриване на променливи на средата за системата и управлението на услугите"
+msgstr ""
+"Задаване или изтриване на променливи на средата за системата и управлението "
+"на услугите"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "За задаване или изтриване на променливи на средата за системата и управлението на услугите е необходима идентификация."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"За задаване или изтриване на променливи на средата за системата и "
+"управлението на услугите е необходима идентификация."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -65,7 +76,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "За презареждане на състоянието на systemd е необходима идентификация."
#: src/home/org.freedesktop.home1.policy:13
@@ -89,8 +101,11 @@ msgid "Check credentials of a home area"
msgstr "Проверка на идентификация на място за потребител"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "За проверка на идентификация на място за потребител е необходима идентификация."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"За проверка на идентификация на място за потребител е необходима "
+"идентификация."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -113,151 +128,181 @@ msgid "Change password of a home area"
msgstr "Промяна на парола на място за потребител"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "За промяна на парола на място за потребител е необходима идентификация."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"За промяна на парола на място за потребител е необходима идентификация."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "За обновяване на място за потребител е необходима идентификация."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Създаване на място за потребител"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "За създаване на място за потребител е необходима идентификация."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -274,8 +319,11 @@ msgid "Set static hostname"
msgstr "Задаване на статично име на машина"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "За задаване на статично име на локална машина е необходима идентификация."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"За задаване на статично име на локална машина е необходима идентификация."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -283,7 +331,8 @@ msgstr "Задаване на информация за машина"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "За задаване на информация за локална машина е необходима идентификация."
+msgstr ""
+"За задаване на информация за локална машина е необходима идентификация."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -310,28 +359,51 @@ msgid "Authentication is required to get system description."
msgstr "За вземане на описание на системата е необходима идентификация."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Внасяне на изображение на виртуална машина или контейнер"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "За внасяне на изображение на виртуална машина или контейнер е необходима идентификация."
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"За внасяне на изображение на виртуална машина или контейнер е необходима "
+"идентификация."
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Изнасяне на изображение на виртуална машина или контейнер"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "За изнасяне на изображение на виртуална машина или контейнер е необходима идентификация."
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"За изнасяне на изображение на виртуална машина или контейнер е необходима "
+"идентификация."
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Изтегляне на изображение на виртуална машина или контейнер"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "За изтегляне на изображение на виртуална машина или контейнер е необходима идентификация."
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"За изтегляне на изображение на виртуална машина или контейнер е необходима "
+"идентификация."
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"За промяна на парола на място за потребител е необходима идентификация."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -354,8 +426,11 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Позволяване на програми да предотвратяват спирането на системата"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "За позволяване на програми да предотвратяват спиране на системата е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"За позволяване на програми да предотвратяват спиране на системата е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -363,7 +438,9 @@ msgstr "Позволяване на програми да забавят спи
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "За позволяване на програми да забавят спиране на системата е необходима идентификация."
+msgstr ""
+"За позволяване на програми да забавят спиране на системата е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -371,7 +448,9 @@ msgstr "Позволяване на програми да предотвратя
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "За позволяване на програми да предотвратяват приспиване на системата е необходима идентификация."
+msgstr ""
+"За позволяване на програми да предотвратяват приспиване на системата е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -379,71 +458,116 @@ msgstr "Позволяване на програми да забавят при
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "За позволяване на програми да забавят приспиване на системата е необходима идентификация."
+msgstr ""
+"За позволяване на програми да забавят приспиване на системата е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Позволяване на програми да предотвратяват автоматично приспиване на системата"
+msgstr ""
+"Позволяване на програми да предотвратяват автоматично приспиване на системата"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "За позволяване на програми да предотвратяват автоматично приспиване на системата е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"За позволяване на програми да предотвратяват автоматично приспиване на "
+"системата е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Позволяване на програми да предотвратяват реакцията на система при натискане на клавиш за захранване"
+msgstr ""
+"Позволяване на програми да предотвратяват реакцията на система при натискане "
+"на клавиш за захранване"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "За позволяване на програми да предотвратяват реакцията на системата при натискане на клавиш за захранване е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"За позволяване на програми да предотвратяват реакцията на системата при "
+"натискане на клавиш за захранване е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Позволяване на програми да предотвратяват реакцията на системата при натискане на клавиш за приспиване"
+msgstr ""
+"Позволяване на програми да предотвратяват реакцията на системата при "
+"натискане на клавиш за приспиване"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "За позволяване на програми да предотвратяват реакция на системата при натискане на клавиш за приспиване е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"За позволяване на програми да предотвратяват реакция на системата при "
+"натискане на клавиш за приспиване е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Позволяване на програми да предотвратяват реакция на системата при натискане на клавиш за дълбоко приспиване"
+msgstr ""
+"Позволяване на програми да предотвратяват реакция на системата при натискане "
+"на клавиш за дълбоко приспиване"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "За позволяване на програми да предотвратяват реакция на системата при натискане на клавиш за дълбоко приспиване е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"За позволяване на програми да предотвратяват реакция на системата при "
+"натискане на клавиш за дълбоко приспиване е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Позволяване на програми да предотвратяват реакция на системата при затваряне на екран"
+msgstr ""
+"Позволяване на програми да предотвратяват реакция на системата при затваряне "
+"на екран"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "За позволяване на програми да предотвратяват реакция на системата при затваряне на екран е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"За позволяване на програми да предотвратяват реакция на системата при "
+"затваряне на екран е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Позволяване на програми да предотвратяват реакция на системата при натискане на клавиш за рестартиране"
+msgstr ""
+"Позволяване на програми да предотвратяват реакция на системата при натискане "
+"на клавиш за рестартиране"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "За позволяване на програми предотвратяват реакция на системата при натискане на клавиш за рестартиране е необходима идентификация."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"За позволяване на програми предотвратяват реакция на системата при натискане "
+"на клавиш за рестартиране е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
-msgstr "Позволяване на потребители, които не са се идентифицирали, да изпълняват програми"
+msgstr ""
+"Позволяване на потребители, които не са се идентифицирали, да изпълняват "
+"програми"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "За позволяване на потребители, които не са се идентифицирали, да изпълняват програми е необходима изрична заявка."
+msgstr ""
+"За позволяване на потребители, които не са се идентифицирали, да изпълняват "
+"програми е необходима изрична заявка."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
-msgstr "Позволяване на потребители, които не са се идентифицирали, да изпълняват програми"
+msgstr ""
+"Позволяване на потребители, които не са се идентифицирали, да изпълняват "
+"програми"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "За позволяване на потребители, които не са се идентифицирали, да изпълняват програми е необходима идентификация."
+msgstr ""
+"За позволяване на потребители, които не са се идентифицирали, да изпълняват "
+"програми е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -451,7 +575,9 @@ msgstr "Позволяване на закачане на устройства
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "За позволяване на закачане на устройства към работните места е необходима идентификация."
+msgstr ""
+"За позволяване на закачане на устройства към работните места е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -459,7 +585,9 @@ msgstr "Изчистване на връзките между устройств
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "За изчистване на връзки между устройства и работни места е необходима идентификация."
+msgstr ""
+"За изчистване на връзки между устройства и работни места е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -474,16 +602,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Изключване на системата, дори когато има други вписани потребители"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "За изключване на системата, дори когато има други вписани потребители, е необходима идентификация."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"За изключване на системата, дори когато има други вписани потребители, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Изключване на системата, дори когато програма иска да предотврати това"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "За изключване на системата, дори когато програма иска да предотврати това, е необходима идентификация."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"За изключване на системата, дори когато програма иска да предотврати това, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -498,16 +634,25 @@ msgid "Reboot the system while other users are logged in"
msgstr "Рестартиране на системата, дори когато има други вписани потребители"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "За рестартиране на системата, дори когато има други вписани потребители, е необходима идентификация."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"За рестартиране на системата, дори когато има други вписани потребители, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
-msgstr "Рестартиране на системата, дори когато програма иска да предотврати това"
+msgstr ""
+"Рестартиране на системата, дори когато програма иска да предотврати това"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "За рестартиране на системата, дори когато програма иска да предотврати това, е необходима идентификация."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"За рестартиране на системата, дори когато програма иска да предотврати това, "
+"е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -522,16 +667,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Спиране на системата, дори когато има други вписани потребители"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "За спиране на системата, дори когато има други вписани потребители, е необходима идентификация."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"За спиране на системата, дори когато има други вписани потребители, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Спиране на системата, дори когато програма иска да предотврати това"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "За спиране на системата, дори когато програма иска да предотврати това, е необходима идентификация."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"За спиране на системата, дори когато програма иска да предотврати това, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -546,16 +699,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Приспиване на системата, дори когато има други вписани потребители"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "За приспиване на системата, дори когато има други вписани потребители, е необходима идентификация."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"За приспиване на системата, дори когато има други вписани потребители, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Приспиване на системата, дори когато програма иска да предотврати това"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "За приспиване на системата, дори когато програма иска да предотврати това, е необходима идентификация."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"За приспиване на системата, дори когато програма иска да предотврати това, е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -567,19 +728,30 @@ msgstr "За дълбоко приспиване на системата е не
#: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while other users are logged in"
-msgstr "Дълбоко приспиване на системата, дори когато има други вписани потребители"
+msgstr ""
+"Дълбоко приспиване на системата, дори когато има други вписани потребители"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "За дълбоко приспиване на системата, дори когато има други вписани потребители, е необходима идентификация."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"За дълбоко приспиване на системата, дори когато има други вписани "
+"потребители, е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Дълбоко приспиване на системата, дори когато програма иска да предотврати това"
+msgstr ""
+"Дълбоко приспиване на системата, дори когато програма иска да предотврати "
+"това"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "За дълбоко приспиване на системата, дори когато програма иска да предотврати това, е необходима идентификация."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"За дълбоко приспиване на системата, дори когато програма иска да предотврати "
+"това, е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -587,7 +759,9 @@ msgstr "Управление на работещите сесии, потреб
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "За управление на работещите сесии, потребители и работни места е необходима идентификация."
+msgstr ""
+"За управление на работещите сесии, потребители и работни места е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -595,7 +769,8 @@ msgstr "Заключване или отключване на работещи
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "За заключване или отключване на работещи сесии е необходима идентификация."
+msgstr ""
+"За заключване или отключване на работещи сесии е необходима идентификация."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -603,31 +778,45 @@ msgstr "Задаване на причина за рестартиране (reas
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "За задаване на причина за рестартиране (reason) в ядрото е необходима идентификация."
+msgstr ""
+"За задаване на причина за рестартиране (reason) в ядрото е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Задаване на фърмуера да стартира с интерфейса за управление"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "За задаване на фърмуера да стартира с интерфейса за управление е необходима идентификация."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"За задаване на фърмуера да стартира с интерфейса за управление е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Задаване на фърмуера да стартира в програмата за начално зареждане"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "За задаване на фърмуера да стартира в програмата за начално зареждане е необходима идентификация."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"За задаване на фърмуера да стартира в програмата за начално зареждане е "
+"необходима идентификация."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Задаване на фърмуера да стартира в определен вариант"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "За задаване на фърмуера да стартира в определен вариант е необходима идентификация."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"За задаване на фърмуера да стартира в определен вариант е необходима "
+"идентификация."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -682,8 +871,11 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Получаване на псевдо терминал в локален контейнер"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "За получаване на псевдо терминал в локален контейнер е необходима идентификация."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"За получаване на псевдо терминал в локален контейнер е необходима "
+"идентификация."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -691,23 +883,32 @@ msgstr "Получаване на псевдо терминал на локал
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "За получаване на псевдо терминал на локалната машина е необходима идентификация."
+msgstr ""
+"За получаване на псевдо терминал на локалната машина е необходима "
+"идентификация."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Управление на локални виртуални машини и контейнери"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "За управление на локални виртуални машини и контейнери е необходима идентификация."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"За управление на локални виртуални машини и контейнери е необходима "
+"идентификация."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Управление на изображения на виртуални машини или контейнери"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "За управление на изображения на виртуални машини или е необходима идентификация."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"За управление на изображения на виртуални машини или е необходима "
+"идентификация."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -715,7 +916,8 @@ msgstr "Задаване на сървъри за точно време (NTP)"
#: src/network/org.freedesktop.network1.policy:23
msgid "Authentication is required to set NTP servers."
-msgstr "За задаване на сървъри за точно време (NTP) е необходима идентификация."
+msgstr ""
+"За задаване на сървъри за точно време (NTP) е необходима идентификация."
#: src/network/org.freedesktop.network1.policy:33
#: src/resolve/org.freedesktop.resolve1.policy:44
@@ -755,7 +957,8 @@ msgstr "Откриване на имена в локалната мрежа (LLM
#: src/network/org.freedesktop.network1.policy:67
#: src/resolve/org.freedesktop.resolve1.policy:78
msgid "Authentication is required to enable or disable LLMNR."
-msgstr "За откриване на имена в локалната мрежа (LLMNR) е необходима идентификация."
+msgstr ""
+"За откриване на имена в локалната мрежа (LLMNR) е необходима идентификация."
#: src/network/org.freedesktop.network1.policy:77
#: src/resolve/org.freedesktop.resolve1.policy:88
@@ -795,7 +998,9 @@ msgstr "Изрично доверяване на домейни DNSSEC (Negative
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "За изрично доверяване на домейни DNSSEC (Negative Trust Anchors) е необходима идентификация."
+msgstr ""
+"За изрично доверяване на домейни DNSSEC (Negative Trust Anchors) е "
+"необходима идентификация."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -851,23 +1056,30 @@ msgstr "Преглед на преносимо изображение на си
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "За преглед на преносимо изображение на система е необходима идентификация."
+msgstr ""
+"За преглед на преносимо изображение на система е необходима идентификация."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Превключване на преносимо изображение на система"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "За превключване на преносимо изображение на система е необходима идентификация."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"За превключване на преносимо изображение на система е необходима "
+"идентификация."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Изтриване/промяна на преносимо изображение на система"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "За изтриване/промяна на преносимо изображение на система е необходима идентификация."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"За изтриване/промяна на преносимо изображение на система е необходима "
+"идентификация."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -891,7 +1103,9 @@ msgstr "Възстановяване на настройките за откри
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "За възстановяване на настройките за откриване на имената е необходима идентификация."
+msgstr ""
+"За възстановяване на настройките за откриване на имената е необходима "
+"идентификация."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -914,49 +1128,70 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Превключване на системния часовник между местния часови пояс и UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "За превключване на системния часовник между местния часови пояс и UTC е необходима идентификация."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"За превключване на системния часовник между местния часови пояс и UTC е "
+"необходима идентификация."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Превключване на синхронизацията на времето по мрежата"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "За превключване на синхронизацията на времето по мрежата е необходима идентификация."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"За превключване на синхронизацията на времето по мрежата е необходима "
+"идентификация."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "За стартиране на „$(unit)“ е необходима идентификация."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "За спиране на „$(unit)“ е необходима идентификация."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "За презареждане на „$(unit)“ е необходима идентификация."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "За рестартиране на „$(unit)“ е необходима идентификация."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "За изпращането на сигнал на UNIX на процесите на „$(unit)“ е необходима идентификация."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"За изпращането на сигнал на UNIX на процесите на „$(unit)“ е необходима "
+"идентификация."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "За премахване на състоянието за неуспех на „$(unit)“ е необходима идентификация."
+msgstr ""
+"За премахване на състоянието за неуспех на „$(unit)“ е необходима "
+"идентификация."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "За задаване на свойствата на „$(unit)“ е необходима идентификация."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "За изтриването на файловете и директориите на „$(unit)“ е необходима идентификация."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"За изтриването на файловете и директориите на „$(unit)“ е необходима "
+"идентификация."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "За замразяване/размразяване на процесите на „$(unit)“ е необходима идентификация."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"За замразяване/размразяване на процесите на „$(unit)“ е необходима "
+"идентификация."
diff --git a/po/ca.po b/po/ca.po
index 098fbf275d..1ad7286652 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2018-02-27 04:18-0500\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Català <ubuntu-l10n-ca@lists.ubuntu.com>\n"
@@ -22,8 +22,10 @@ msgid "Send passphrase back to system"
msgstr "Retorna la frase de pas al sistema"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Es requereix autenticació per retornar la frase de pas introduïda al sistema."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Es requereix autenticació per retornar la frase de pas introduïda al sistema."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -31,7 +33,9 @@ msgstr "Gestiona els serveis del sistema o bé altres unitats."
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Es requereix autenticació per gestionar els serveis del sistema o bé altres unitats."
+msgstr ""
+"Es requereix autenticació per gestionar els serveis del sistema o bé altres "
+"unitats."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -39,15 +43,23 @@ msgstr "Gestiona el servei del sistema o bé fitxers d'unitats"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Es requereix autenticació per gestionar un servei del sistema o bé fitxers d'unitats."
+msgstr ""
+"Es requereix autenticació per gestionar un servei del sistema o bé fitxers "
+"d'unitats."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Estableix o desestableix les variables d'entorn del gestor de serveis o del sistema"
+msgstr ""
+"Estableix o desestableix les variables d'entorn del gestor de serveis o del "
+"sistema"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Es requereix autenticació per establir o desestablir les variables d'entorn del gestor de serveis o del sistema."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Es requereix autenticació per establir o desestablir les variables d'entorn "
+"del gestor de serveis o del sistema."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -63,7 +75,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Es requereix autenticació per tornar a carregar l'estat de systemd."
#: src/home/org.freedesktop.home1.policy:13
@@ -90,8 +103,11 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:34
#, fuzzy
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Es requereix autenticació per gestionar les sessions, usuaris i llocs de treball actius."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Es requereix autenticació per gestionar les sessions, usuaris i llocs de "
+"treball actius."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -100,7 +116,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:44
#, fuzzy
msgid "Authentication is required to update a user's home area."
-msgstr "Es requereix autenticació per annexar un dispositiu a un lloc de treball."
+msgstr ""
+"Es requereix autenticació per annexar un dispositiu a un lloc de treball."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -117,151 +134,182 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:64
#, fuzzy
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Es requereix autenticació per gestionar les sessions, usuaris i llocs de treball actius."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Es requereix autenticació per gestionar les sessions, usuaris i llocs de "
+"treball actius."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Es requereix autenticació per annexar un dispositiu a un lloc de treball."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Es requereix autenticació per tornar a carregar l'estat de systemd."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -278,8 +326,12 @@ msgid "Set static hostname"
msgstr "Estableix el nom d'amfitrió estàtic"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Es requereix autenticació per establir el nom d'amfitrió local configurat estàticament, així com el nom bonic d'amfitrió."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Es requereix autenticació per establir el nom d'amfitrió local configurat "
+"estàticament, així com el nom bonic d'amfitrió."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -287,7 +339,8 @@ msgstr "Estableix la informació de la màquina"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Es requereix autenticació per establir la informació de la màquina local."
+msgstr ""
+"Es requereix autenticació per establir la informació de la màquina local."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -318,28 +371,52 @@ msgid "Authentication is required to get system description."
msgstr "Es requereix autenticació per establir la zona horària del sistema."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importa una màquina virtual o una imatge de contenidor"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Es requereix autenticació per importar una màquina virtual o una imatge de contenidor"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Es requereix autenticació per importar una màquina virtual o una imatge de "
+"contenidor"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exporta una màquina virtual o una imatge de contenidor"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Es requereix autenticació per exportar una màquina virtual o una imatge de contenidor"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Es requereix autenticació per exportar una màquina virtual o una imatge de "
+"contenidor"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Baixa una màquina virtual o una imatge de contenidor"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Es requereix autenticació per baixar una màquina virtual o una imatge de contenidor"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Es requereix autenticació per baixar una màquina virtual o una imatge de "
+"contenidor"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Es requereix autenticació per gestionar les sessions, usuaris i llocs de "
+"treball actius."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -347,7 +424,8 @@ msgstr "Estableix la configuració regional del sistema"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Es requereix autenticació per establir la configuració regional del sistema."
+msgstr ""
+"Es requereix autenticació per establir la configuració regional del sistema."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -355,15 +433,19 @@ msgstr "Estableix els ajusts del teclat del sistema"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Es requereix autenticació per establir els ajusts del teclat del sistema."
+msgstr ""
+"Es requereix autenticació per establir els ajusts del teclat del sistema."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Permet a les aplicacions inhibir l'apagada del sistema"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi l'apagada del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi l'apagada del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -371,7 +453,9 @@ msgstr "Permet a les aplicacions endarrerir l'apagada del sistema"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Es requereix autenticació perquè una aplicació endarrereixi l'apagada del sistema."
+msgstr ""
+"Es requereix autenticació perquè una aplicació endarrereixi l'apagada del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -379,7 +463,9 @@ msgstr "Permet a les aplicacions inhibir el repòs del sistema"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi el repòs del sistema."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi el repòs del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -387,57 +473,92 @@ msgstr "Permet a les aplicacions endarrerir el repòs del sistema"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Es requereix autenticació perquè una aplicació endarrereixi el repòs del sistema."
+msgstr ""
+"Es requereix autenticació perquè una aplicació endarrereixi el repòs del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Permet a les aplicacions inhibir la suspensió automàtica del sistema"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi la suspensió automàtica del sistema."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi la suspensió "
+"automàtica del sistema."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Permet a les aplicacions inhibir la gestió de la tecla d'encesa per part del sistema"
+msgstr ""
+"Permet a les aplicacions inhibir la gestió de la tecla d'encesa per part del "
+"sistema"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi la gestió de la tecla d'encesa per part del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi la gestió de la "
+"tecla d'encesa per part del sistema."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Permet a les aplicacions inhibir la tecla de suspensió per part del sistema"
+msgstr ""
+"Permet a les aplicacions inhibir la tecla de suspensió per part del sistema"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi la gestió de la tecla de suspensió per part del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi la gestió de la "
+"tecla de suspensió per part del sistema."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permet a les aplicacions inhibir la gestió de la tecla d'hibernació per part del sistema"
+msgstr ""
+"Permet a les aplicacions inhibir la gestió de la tecla d'hibernació per part "
+"del sistema"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi la gestió de la tecla d'hibernació per part del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi la gestió de la "
+"tecla d'hibernació per part del sistema."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permet a les aplicacions la gestió del tancament de la tapa per part del sistema"
+msgstr ""
+"Permet a les aplicacions la gestió del tancament de la tapa per part del "
+"sistema"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi la gestió del tancament de la tapa per part del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi la gestió del "
+"tancament de la tapa per part del sistema."
#: src/login/org.freedesktop.login1.policy:117
#, fuzzy
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permet a les aplicacions inhibir la gestió de la tecla d'encesa per part del sistema"
+msgstr ""
+"Permet a les aplicacions inhibir la gestió de la tecla d'encesa per part del "
+"sistema"
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Es requereix autenticació perquè una aplicació inhibeixi la gestió de la tecla d'encesa per part del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Es requereix autenticació perquè una aplicació inhibeixi la gestió de la "
+"tecla d'encesa per part del sistema."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -445,7 +566,9 @@ msgstr "Permet a l'usuari sense inici de sessió executar programes"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Es requereix una sol·licitud explícita per executar programes com a usuari sense inici de sessió."
+msgstr ""
+"Es requereix una sol·licitud explícita per executar programes com a usuari "
+"sense inici de sessió."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -453,7 +576,9 @@ msgstr "Permet als usuaris sense inici de sessió executar programes"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Es requereix una sol·licitud explícita per executar programes com a usuari sense inici de sessió."
+msgstr ""
+"Es requereix una sol·licitud explícita per executar programes com a usuari "
+"sense inici de sessió."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -461,7 +586,8 @@ msgstr "Permet l'annexió de dispositius als llocs de treball"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Es requereix autenticació per annexar un dispositiu a un lloc de treball."
+msgstr ""
+"Es requereix autenticació per annexar un dispositiu a un lloc de treball."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -469,7 +595,9 @@ msgstr "Allibera els dispositius a les annexions dels llocs de treball"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Es requereix autenticació per restablir com s'annexionen els dispositius als llocs de treball."
+msgstr ""
+"Es requereix autenticació per restablir com s'annexionen els dispositius als "
+"llocs de treball."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -484,16 +612,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Apaga el sistema mentre hi ha altres usuaris amb la sessió iniciada"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Es requereix autenticació per apagar el sistema mentre hi ha altres usuaris amb la sessió iniciada."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Es requereix autenticació per apagar el sistema mentre hi ha altres usuaris "
+"amb la sessió iniciada."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Apaga el sistema mentre hi ha una aplicació que ha demanat inhibir-ho"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Es requereix autenticació per apagar el sistema mentre hi ha una aplicació que ha demanat inhibir-ho."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Es requereix autenticació per apagar el sistema mentre hi ha una aplicació "
+"que ha demanat inhibir-ho."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -508,16 +644,25 @@ msgid "Reboot the system while other users are logged in"
msgstr "Reinicia el sistema mentre hi ha usuaris amb la sessió iniciada"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Es requereix autenticació per reiniciar el sistema mentre hi ha usuaris amb la sessió iniciada."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Es requereix autenticació per reiniciar el sistema mentre hi ha usuaris amb "
+"la sessió iniciada."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
-msgstr "Reinicia el sistema mentre hi ha una aplicació que ha demanat inhibir-ho"
+msgstr ""
+"Reinicia el sistema mentre hi ha una aplicació que ha demanat inhibir-ho"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Es requereix autenticació per reiniciar el sistema mentre hi ha una aplicació que ha demanat inhibir-ho."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Es requereix autenticació per reiniciar el sistema mentre hi ha una "
+"aplicació que ha demanat inhibir-ho."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -532,17 +677,26 @@ msgid "Halt the system while other users are logged in"
msgstr "Atura el sistema mentre hi ha altres usuaris amb la sessió iniciada"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Es requereix autenticació per aturar el sistema mentre hi ha altres usuaris amb la sessió iniciada."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Es requereix autenticació per aturar el sistema mentre hi ha altres usuaris "
+"amb la sessió iniciada."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
-msgstr "Atura el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho"
+msgstr ""
+"Atura el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho"
#: src/login/org.freedesktop.login1.policy:258
#, fuzzy
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Es requereix autenticació per hibernar el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Es requereix autenticació per hibernar el sistema mentre hi ha una aplicació "
+"que ha demanat d'inhibir-ho."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -557,16 +711,25 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspèn el sistema mentre hi ha altres usuaris amb la sessió iniciada"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Es requereix autenticació per reiniciar el sistema mentre hi ha altres usuaris amb la sessió iniciada."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Es requereix autenticació per reiniciar el sistema mentre hi ha altres "
+"usuaris amb la sessió iniciada."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
-msgstr "Suspèn el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho"
+msgstr ""
+"Suspèn el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Es requereix autenticació per suspendre el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Es requereix autenticació per suspendre el sistema mentre hi ha una "
+"aplicació que ha demanat d'inhibir-ho."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -581,16 +744,25 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hiberna el sistema mentre hi ha altres usuaris amb la sessió iniciada"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Es requereix autenticació per hibernar el sistema mentre hi ha altres usuaris amb la sessió iniciada."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Es requereix autenticació per hibernar el sistema mentre hi ha altres "
+"usuaris amb la sessió iniciada."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Hiberna el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho"
+msgstr ""
+"Hiberna el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Es requereix autenticació per hibernar el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Es requereix autenticació per hibernar el sistema mentre hi ha una aplicació "
+"que ha demanat d'inhibir-ho."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -598,7 +770,9 @@ msgstr "Gestiona les sessions, usuaris i llocs de treball actius"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Es requereix autenticació per gestionar les sessions, usuaris i llocs de treball actius."
+msgstr ""
+"Es requereix autenticació per gestionar les sessions, usuaris i llocs de "
+"treball actius."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -606,7 +780,8 @@ msgstr "Bloqueja o desbloqueja les sessions actives"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Es requereix autenticació per bloquejar o desbloquejar les sessions actives."
+msgstr ""
+"Es requereix autenticació per bloquejar o desbloquejar les sessions actives."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -620,11 +795,17 @@ msgstr "Es requereix autenticació per establir la zona horària del sistema."
#: src/login/org.freedesktop.login1.policy:363
#, fuzzy
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Permet la indicació al microprogramari en l'arrencada perquè prepari la interfície"
+msgstr ""
+"Permet la indicació al microprogramari en l'arrencada perquè prepari la "
+"interfície"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Es requereix autenticació per indicar al microprogramari en l'arrencada perquè prepari la interfície."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Es requereix autenticació per indicar al microprogramari en l'arrencada "
+"perquè prepari la interfície."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
@@ -632,8 +813,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:375
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Es requereix autenticació per indicar al microprogramari en l'arrencada perquè prepari la interfície."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Es requereix autenticació per indicar al microprogramari en l'arrencada "
+"perquè prepari la interfície."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
@@ -641,8 +826,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:386
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Es requereix autenticació per indicar al microprogramari en l'arrencada perquè prepari la interfície."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Es requereix autenticació per indicar al microprogramari en l'arrencada "
+"perquè prepari la interfície."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -683,7 +872,8 @@ msgstr "Adquireix un shell en un contenidor local"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Es requereix autenticació per adquirir un shell en un contenidor local."
+msgstr ""
+"Es requereix autenticació per adquirir un shell en un contenidor local."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -698,8 +888,10 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Adquireix un pseudo TTY en un contenidor local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Es requereix autenticació per adquirir un pseudo TTY en un contenidor local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Es requereix autenticació per adquirir un pseudo TTY en un contenidor local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -707,23 +899,31 @@ msgstr "Adquireix un pseudo TTY a l'amfitrió local"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Es requereix autenticació per adquirir un pseudo TTY a l'amfitrió local."
+msgstr ""
+"Es requereix autenticació per adquirir un pseudo TTY a l'amfitrió local."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Gestiona les màquines virtuals i els contenidors locals "
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Es requereix autenticació per gestionar les màquines virtuals i els contenidors locals."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Es requereix autenticació per gestionar les màquines virtuals i els "
+"contenidors locals."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Gestiona les màquines virtuals i les imatges dels contenidors locals"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Es requereix autenticació per gestionar les màquines virtuals i les imatges dels contenidors locals."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Es requereix autenticació per gestionar les màquines virtuals i les imatges "
+"dels contenidors locals."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -821,7 +1021,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:122
#, fuzzy
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Es requereix autenticació per establir la configuració regional del sistema."
+msgstr ""
+"Es requereix autenticació per establir la configuració regional del sistema."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -884,7 +1085,9 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:14
#, fuzzy
msgid "Authentication is required to inspect a portable service image."
-msgstr "Es requereix autenticació per importar una màquina virtual o una imatge de contenidor"
+msgstr ""
+"Es requereix autenticació per importar una màquina virtual o una imatge de "
+"contenidor"
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
@@ -892,8 +1095,10 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
#, fuzzy
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Es requereix autenticació per annexar un dispositiu a un lloc de treball."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Es requereix autenticació per annexar un dispositiu a un lloc de treball."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
@@ -901,8 +1106,11 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
#, fuzzy
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Es requereix autenticació per baixar una màquina virtual o una imatge de contenidor"
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Es requereix autenticació per baixar una màquina virtual o una imatge de "
+"contenidor"
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -927,7 +1135,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:133
#, fuzzy
msgid "Authentication is required to reset name resolution settings."
-msgstr "Es requereix autenticació per establir els ajusts del teclat del sistema."
+msgstr ""
+"Es requereix autenticació per establir els ajusts del teclat del sistema."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -950,58 +1159,75 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Estableix el rellotge del sistema a la zona horària local o de l'UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Es requereix autenticació per controlar si el rellotge del sistema emmagatzema l'hora local o l'UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Es requereix autenticació per controlar si el rellotge del sistema "
+"emmagatzema l'hora local o l'UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Activa o desactiva la sincronització de l'hora de xarxa"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Es requereix autenticació per controlar si s'ha d'activar la sincronització de l'hora de xarxa."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Es requereix autenticació per controlar si s'ha d'activar la sincronització "
+"de l'hora de xarxa."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Es requereix autenticació per iniciar «$(unit)»."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Es requereix autenticació per aturar «$(unit)»."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Es requereix autenticació per tornar a carregar «$(unit)»."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Es requereix autenticació per reiniciar «$(unit)»."
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
#, fuzzy
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "Es requereix autenticació per establir les propietats a «$(unit)»."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "Es requereix autenticació per restablir l'estat «failed» de «$(unit)»."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Es requereix autenticació per establir les propietats a «$(unit)»."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr "Es requereix autenticació per restablir l'estat «failed» de «$(unit)»."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "Es requereix autenticació per restablir l'estat «failed» de «$(unit)»."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Es requereix autenticació per aturar el sistema mentre hi ha una aplicació que ha demanat d'inhibir-ho."
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Es requereix autenticació per aturar el sistema mentre hi ha una "
+#~ "aplicació que ha demanat d'inhibir-ho."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Es requereix autenticació per matar «$(unit)»."
diff --git a/po/cs.po b/po/cs.po
index ff3ceece41..f90383cdb9 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,15 +7,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-09-19 14:35+0000\n"
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
-"Language-Team: Czech <https://translate.fedoraproject.org/projects/systemd/master/cs/>\n"
+"Language-Team: Czech <https://translate.fedoraproject.org/projects/systemd/"
+"master/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.0.2\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -23,7 +25,8 @@ msgid "Send passphrase back to system"
msgstr "Odeslat heslo zpět do systému"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Pro odeslání zadaného hesla do systému je vyžadováno ověření."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -32,7 +35,8 @@ msgstr "Spravovat systémové služby nebo další jednotky"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Pro správu systémových služeb nebo dalších jednotek je vyžadováno ověření."
+msgstr ""
+"Pro správu systémových služeb nebo dalších jednotek je vyžadováno ověření."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -40,15 +44,20 @@ msgstr "Spravovat systémové služby nebo soubory jednotek"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Pro správu systémových služeb nebo souborů jednotek je vyžadováno ověření."
+msgstr ""
+"Pro správu systémových služeb nebo souborů jednotek je vyžadováno ověření."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Nastavit nebo rušit proměnné správce systému a služeb"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Pro nastavení nebo rušení proměnných správce systému a služeb je vyžadováno ověření."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Pro nastavení nebo rušení proměnných správce systému a služeb je vyžadováno "
+"ověření."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -63,8 +72,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Vypsat stav systemd bez omezení četnosti"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Pro opětovné načtení stavu systemd bez omezení četnosti je vyžadováno ověření."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Pro opětovné načtení stavu systemd bez omezení četnosti je vyžadováno "
+"ověření."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -87,8 +99,11 @@ msgid "Check credentials of a home area"
msgstr "Zkontrolovat pověření domovského adresáře"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Pro kontrolu pověření proti domovskému adresáři uživatele je vyžadováno ověření."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Pro kontrolu pověření proti domovskému adresáři uživatele je vyžadováno "
+"ověření."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -104,158 +119,208 @@ msgstr "Změnit velikost domovského adresáře"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Pro změnu velikosti domovského adresáře uživatele je vyžadováno ověření."
+msgstr ""
+"Pro změnu velikosti domovského adresáře uživatele je vyžadováno ověření."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Změnit heslo domovského adresáře"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "Pro změnu hesla domovského adresáře uživatele je vyžadováno ověření."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Pro aktualizaci domovského adresáře uživatele je vyžadováno ověření."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Vytvořit domovský adresář"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Pro vytvoření domovského adresáře uživatele je vyžadováno ověření."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "Domovská složka uživatele %s v tuto chvíli není dostupná, připojte prosím potřebné úložné zařízení nebo záložní souborový systém."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"Domovská složka uživatele %s v tuto chvíli není dostupná, připojte prosím "
+"potřebné úložné zařízení nebo záložní souborový systém."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Příliš časté pokusy o přihlášení uživatele %s, zkuste to znovu později."
+msgstr ""
+"Příliš časté pokusy o přihlášení uživatele %s, zkuste to znovu později."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Heslo: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "Neplatné heslo nebo nedostačující pro ověření se uživatele %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Je nám líto, zkuste znovu: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Obnovovací klíč: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Heslo/obnovovací klíč jsou nesprávné nebo nedostatečné pro ověření uživatele %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Heslo/obnovovací klíč jsou nesprávné nebo nedostatečné pro ověření uživatele "
+"%s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Je nám líto, zadejte obnovovací klíč znovu: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Bezpečnostní token uživatele %s není vložen."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Zkuste znovu s heslem: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Nesprávné nebo nedostatečné heslo a není vložen nakonfigurovaný bezpečnostní token uživatele %s."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Nesprávné nebo nedostatečné heslo a není vložen nakonfigurovaný bezpečnostní "
+"token uživatele %s."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN bezpečnostního tokenu: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "Ověřte se prosím fyzicky na bezpečnostním tokenu uživatele %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Potvrďte prosím přítomnost na bezpečnostním tokenu uživatele %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Ověřte prosím uživatele na bezpečnostním tokenu uživatele %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "PIN bezpečnostního tokenu je uzamčen, nejprve jej prosím odemkněte. (Tip: Vyjmutí a opětovné vložení může stačit.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"PIN bezpečnostního tokenu je uzamčen, nejprve jej prosím odemkněte. (Tip: "
+"Vyjmutí a opětovné vložení může stačit.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Nesprávný PIN bezpečnostního tokenu pro uživatele %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Je nám líto, zkuste PIN bezpečnostního tokenu znovu: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "PIN bezpečnostního tokenu uživatele %s je nesprávný (zbývá jen několik pokusů!)"
+msgstr ""
+"PIN bezpečnostního tokenu uživatele %s je nesprávný (zbývá jen několik "
+"pokusů!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "PIN bezpečnostního tokenu uživatele %s je nesprávný (zbývá pouze jeden pokus!)"
+msgstr ""
+"PIN bezpečnostního tokenu uživatele %s je nesprávný (zbývá pouze jeden "
+"pokus!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "Domovská složka uživatele %s v tuto chvíli není aktivní – nejprve se přihlaste lokálně."
+msgstr ""
+"Domovská složka uživatele %s v tuto chvíli není aktivní – nejprve se "
+"přihlaste lokálně."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "Domovská složka uživatele %s je v tuto chvíli uzamčená – nejprve lokálně odemkněte."
+msgstr ""
+"Domovská složka uživatele %s je v tuto chvíli uzamčená – nejprve lokálně "
+"odemkněte."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Příliš mnoho neúspěšných pokusů o přihlášení uživatele %s, proto odmítnuto."
+msgstr ""
+"Příliš mnoho neúspěšných pokusů o přihlášení uživatele %s, proto odmítnuto."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Záznam uživatele je blokován, přístup proto zamezen."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Záznam uživatele ještě není platný, přístup proto zamezen."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Záznam uživatele již není platný, přístup proto zamezen."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Záznam uživatele neplatný, přístup proto zamezen."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Příliš mnoho přihlášení, zkuste znovu za %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Je vyžadována změna hesla."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Platnost hesla skončila, je zapotřebí ho změnit."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "Platnost hesla skončila, ale není možné ho změnit – přihlášení proto odmítnuto."
+msgstr ""
+"Platnost hesla skončila, ale není možné ho změnit – přihlášení proto "
+"odmítnuto."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Platnost hesla brzy skončí – změňte si ho."
@@ -272,8 +337,12 @@ msgid "Set static hostname"
msgstr "Nastavit statický název stroje"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Pro nastavení staticky konfigurovaného názvu lokálního stroje, stejně tak pro změnu uživatelsky přívětivého jména je vyžadováno ověření."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Pro nastavení staticky konfigurovaného názvu lokálního stroje, stejně tak "
+"pro změnu uživatelsky přívětivého jména je vyžadováno ověření."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -308,28 +377,47 @@ msgid "Authentication is required to get system description."
msgstr "Pro získání popisu systému je vyžadováno ověření."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importovat obraz virtuální stroje nebo kontejneru"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Pro import obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Pro import obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exportovat obraz virtuálního stroje nebo kontejneru"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Pro export obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Pro export obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Stáhnout obraz virtuálního stroje nebo kontejneru"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Pro stažení obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Pro stažení obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Pro změnu hesla domovského adresáře uživatele je vyžadováno ověření."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -352,7 +440,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Povolit aplikacím zakázat vypnutí systému"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "Pro povolení aplikacím zakázat vypnutí systému je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:33
@@ -384,48 +473,77 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Povolit aplikacím zakázat automatické vypnutí systému"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Pro povolení aplikacím zakázat automatické vypnutí systému je vyžadováno ověření."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Pro povolení aplikacím zakázat automatické vypnutí systému je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí vypínacího tlačítka"
+msgstr ""
+"Povolit aplikacím zakázat chovaní systému na stisknutí vypínacího tlačítka"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Pro povolení aplikacím zakázat chovaní systému na stisknutí vypínacího tlačítka je vyžadováno ověření."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí vypínacího "
+"tlačítka je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí uspávacího tlačítka"
+msgstr ""
+"Povolit aplikacím zakázat chovaní systému na stisknutí uspávacího tlačítka"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Pro povolení aplikacím zakázat chovaní systému na stisknutí uspávacího tlačítka je vyžadováno ověření."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí uspávacího "
+"tlačítka je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí tlačítka hibernace"
+msgstr ""
+"Povolit aplikacím zakázat chovaní systému na stisknutí tlačítka hibernace"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Pro povolení aplikacím zakázat chovaní systému na stisknutí tlačítka hibernace je vyžadováno ověření."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí tlačítka "
+"hibernace je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Povolit aplikacím zakázat chovaní systému na zavření víka"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Pro povolení aplikacím zakázat chovaní systému na zavření víka je vyžadováno ověření."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na zavření víka je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí restartovacího tlačítka"
+msgstr ""
+"Povolit aplikacím zakázat chovaní systému na stisknutí restartovacího "
+"tlačítka"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Pro povolení aplikacím zakázat chovaní systému na stisknutí restartovacího tlačítka je vyžadováno ověření."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí restartovacího "
+"tlačítka je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -433,7 +551,8 @@ msgstr "Povolit nepřihlášenému uživateli spouštět programy"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Ke spuštění programů jako nepřihlášený uživatel je třeba speciální požadavek."
+msgstr ""
+"Ke spuštění programů jako nepřihlášený uživatel je třeba speciální požadavek."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -457,7 +576,9 @@ msgstr "Odstranit přiřazení zařízení ke stanovištím"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Pro resetování způsobu jak jsou zařízení přiřazována ke stanovištím je vyžadováno ověření."
+msgstr ""
+"Pro resetování způsobu jak jsou zařízení přiřazována ke stanovištím je "
+"vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -472,16 +593,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Vypnout systém, i když jsou přihlášeni další uživatelé"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Pro vypnutí systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Pro vypnutí systému, když jsou přihlášeni další uživatelé je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Vypnout systém, i když aplikace požádala o zákaz vypnutí"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Pro vypnutí systému, když aplikace požádala o zákaz vypnutí je vyžadováno ověření."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Pro vypnutí systému, když aplikace požádala o zákaz vypnutí je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -496,16 +625,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Restartovat systém, i když jsou přihlášeni další uživatelé"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Pro restartování systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Pro restartování systému, když jsou přihlášeni další uživatelé je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Restartovat systém, i když aplikace požádala o zákaz restartu"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Pro restartování systému, když aplikace požádala o zákaz restartu je vyžadováno ověření."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Pro restartování systému, když aplikace požádala o zákaz restartu je "
+"vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -520,16 +657,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Zastavit systém, i když jsou přihlášeni další uživatelé"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Pro zastavení systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Pro zastavení systému, když jsou přihlášeni další uživatelé je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Zastavit systém, i když aplikace požádala o zákaz zastavení"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Pro zastavení systému, když aplikace požádala o zákaz zastavení je vyžadováno ověření."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Pro zastavení systému, když aplikace požádala o zákaz zastavení je "
+"vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -544,16 +689,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Uspat systém, i když jsou přihlášeni další uživatelé"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Pro uspání systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Pro uspání systému, když jsou přihlášeni další uživatelé je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Uspat systém, i když aplikace požádala o zákaz uspání"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Pro uspání systému, když aplikace požádala o zákaz uspání je vyžadováno ověření."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Pro uspání systému, když aplikace požádala o zákaz uspání je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -568,16 +721,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernovat systém, i když jsou přihlášeni další uživatelé"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Pro hibernaci systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Pro hibernaci systému, když jsou přihlášeni další uživatelé je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernovat systém, i když aplikace požádala o zákaz hibernace"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Pro hibernaci systému, když aplikace požádala o zákaz hibernace je vyžadováno ověření."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Pro hibernaci systému, když aplikace požádala o zákaz hibernace je "
+"vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -585,7 +746,8 @@ msgstr "Spravovat aktivní sezení, uživatele a stanoviště"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Pro správu aktivních sezení, uživatelů a stanovišť je vyžadováno ověření."
+msgstr ""
+"Pro správu aktivních sezení, uživatelů a stanovišť je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -608,24 +770,34 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indikovat firmwaru, aby bootoval do instalačního prostředí"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "K indikaci firmwaru, aby bootoval do instalačního prostředí je vyžadováno ověření."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"K indikaci firmwaru, aby bootoval do instalačního prostředí je vyžadováno "
+"ověření."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indikovat zavaděči, aby bootoval do menu zavaděče"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "K indikaci zavaděči, aby bootoval do menu zavaděče je vyžadováno ověření."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"K indikaci zavaděči, aby bootoval do menu zavaděče je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indikovat zavaděči, aby bootoval specifickou položku"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "K indikaci zavaděči, aby bootoval specifickou položku je vyžadováno ověření."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"K indikaci zavaděči, aby bootoval specifickou položku je vyžadováno ověření."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -680,7 +852,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Získat pseudo TTY v lokálním kontejneru"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "Pro získání pseudo TTY v lokálním kontejneru je vyžadováno ověření."
#: src/machine/org.freedesktop.machine1.policy:74
@@ -696,16 +869,22 @@ msgid "Manage local virtual machines and containers"
msgstr "Spravovat lokální virtuální stroje a kontejnery"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Pro správu lokálních virtuálních strojů a kontejnerů je vyžadováno ověření."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Pro správu lokálních virtuálních strojů a kontejnerů je vyžadováno ověření."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Spravovat lokální obrazy virtuálních strojů a kontejnerů"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Pro správu obrazů lokálních virtuálních strojů a kontejnerů je vyžadováno ověření."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Pro správu obrazů lokálních virtuálních strojů a kontejnerů je vyžadováno "
+"ověření."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -856,16 +1035,20 @@ msgid "Attach or detach a portable service image"
msgstr "Připojit nebo odpojit obraz přenosné služby"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Pro připojení nebo odpojení obrazu přenosné služby je vyžadováno ověření."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Pro připojení nebo odpojení obrazu přenosné služby je vyžadováno ověření."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Odstranit nebo upravit obraz přenosné služby"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Pro odstranění nebo úpravu obrazu přenosné služby je vyžadováno ověření."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Pro odstranění nebo úpravu obrazu přenosné služby je vyžadováno ověření."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -912,49 +1095,64 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Nastavit RTC na lokální časovou zónu nebo UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Pro kontrolu jestli RTC ukládá lokální časovou zónu nebo UTC čas je vyžadováno ověření."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Pro kontrolu jestli RTC ukládá lokální časovou zónu nebo UTC čas je "
+"vyžadováno ověření."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Zapnout nebo vypnout synchronizaci s časem ze sítě"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "Pro kontrolu synchronizace času ze sítě je vyžadováno ověření."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Pro spuštění „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Pro vypnutí „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Pro opětovné načtení „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Pro restart „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "Pro odeslání UNIX signálu procesům „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "Pro resetování chybného stavu „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Pro nastavení vlastností na „$(unit)” je vyžadováno ověření."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Pro odstranění souborů nebo adresářů souvisejících s „$(unit)” je vyžadováno ověření."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Pro odstranění souborů nebo adresářů souvisejících s „$(unit)” je vyžadováno "
+"ověření."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Pro zmrazení nebo rozmrazení procesů jednotky „$(unit)” je vyžadováno ověření."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Pro zmrazení nebo rozmrazení procesů jednotky „$(unit)” je vyžadováno "
+"ověření."
diff --git a/po/da.po b/po/da.po
index d641045999..d6c134fd3b 100644
--- a/po/da.po
+++ b/po/da.po
@@ -6,10 +6,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-06-02 16:03+0000\n"
"Last-Translator: scootergrisen <scootergrisen@gmail.com>\n"
-"Language-Team: Danish <https://translate.fedoraproject.org/projects/systemd/master/da/>\n"
+"Language-Team: Danish <https://translate.fedoraproject.org/projects/systemd/"
+"master/da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +23,8 @@ msgid "Send passphrase back to system"
msgstr "Send adgangskode tilbage til systemet"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Der kræves godkendelse for at sende adgangskode tilbage til systemet."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -31,7 +33,8 @@ msgstr "Håndter systemtjenester eller andre enheder"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Der kræves godkendelse for at håndtere systemtjenester og andre enheder."
+msgstr ""
+"Der kræves godkendelse for at håndtere systemtjenester og andre enheder."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -39,15 +42,20 @@ msgstr "Håndter systemtjeneste eller enhedsfiler"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Der kræves godkendelse for at håndtere systemtjeneste eller enhedsfiler."
+msgstr ""
+"Der kræves godkendelse for at håndtere systemtjeneste eller enhedsfiler."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Indstil eller fjern system- og tjenesteforvalter miljøvariabler"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Der kræves godkendelse for at indstille eller fjerne system- og tjenesteforvalter miljøvariabler."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Der kræves godkendelse for at indstille eller fjerne system- og "
+"tjenesteforvalter miljøvariabler."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -63,7 +71,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Der kræves godkendelse for at genindlæse systemd-tilstanden."
#: src/home/org.freedesktop.home1.policy:13
@@ -88,8 +97,11 @@ msgstr "Tjek loginoplysninger for et hjemmeområde"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Der kræves godkendelse for at tjekke loginoplysninger mod en brugers hjemmeområde."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Der kræves godkendelse for at tjekke loginoplysninger mod en brugers "
+"hjemmeområde."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -106,7 +118,8 @@ msgstr "Tilpas størrelsen på et hjemmeområde"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Der kræves godkendelse for at tilpasse størrelsen på en brugers hjemmeområde."
+msgstr ""
+"Der kræves godkendelse for at tilpasse størrelsen på en brugers hjemmeområde."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
@@ -114,151 +127,183 @@ msgstr "Skift adgangskode for et hjemmeområde"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Der kræves godkendelse for at skifte adgangskoden for en brugers hjemmeområde."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Der kræves godkendelse for at skifte adgangskoden for en brugers "
+"hjemmeområde."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
-#: src/home/pam_systemd_home.c:287
+# https://www.freedesktop.org/software/systemd/man/sd-login.html
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Der kræves godkendelse for at opdatere en brugers hjemmeområde."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Opret et hjemmeområde"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Der kræves godkendelse for at oprette en brugers hjemmeområde."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -275,8 +320,12 @@ msgid "Set static hostname"
msgstr "Indstil statisk værtsnavn"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Der kræves godkendelse for at indstille det statisk konfigurerede lokale værtsnavn, lige så vel som det pæne værtsnavn."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Der kræves godkendelse for at indstille det statisk konfigurerede lokale "
+"værtsnavn, lige så vel som det pæne værtsnavn."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -314,36 +363,56 @@ msgid "Authentication is required to get system description."
msgstr "Der kræves godkendelse for at indstille tidszonen for systemet."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importér et VM- eller beholderaftryk"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Der kræves godkendelse for at importere et VM- eller beholderaftryk"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Eksportér et VM- eller beholderaftryk"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Der kræves godkendelse for at eksportere et VM- eller beholderaftryk"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Hent et VM- eller beholderaftryk"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Der kræves godkendelse for at hente et VM- eller beholderaftryk"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+# https://www.freedesktop.org/software/systemd/man/sd-login.html
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Der kræves godkendelse for at skifte adgangskoden for en brugers "
+"hjemmeområde."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Indstil sprogindstillinger for systemet"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Der kræves godkendelse for at indstille sprogindstillinger for systemet."
+msgstr ""
+"Der kræves godkendelse for at indstille sprogindstillinger for systemet."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -351,14 +420,16 @@ msgstr "Indstil tastaturindstillinger for systemet"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Der kræves godkendelse for at indstille tastaturindstillinger for systemet."
+msgstr ""
+"Der kræves godkendelse for at indstille tastaturindstillinger for systemet."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Tillad programmer at hæmme system nedlukning"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "Der kræves godkendelse for at et program kan hæmme system nedlukning."
#: src/login/org.freedesktop.login1.policy:33
@@ -367,7 +438,8 @@ msgstr "Tillad programmer at forsinke system nedlukning"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Der kræves godkendelse for at et program kan forsinke system nedlukning."
+msgstr ""
+"Der kræves godkendelse for at et program kan forsinke system nedlukning."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -390,48 +462,71 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Tillad programmer at hæmme automatisk system standby"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Der kræves godkendelse for at et program kan hæmme automatisk system standby."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Der kræves godkendelse for at et program kan hæmme automatisk system standby."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Tillad programmer at hæmme systemhåndtering af tænd/sluk-knappen"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Der kræves godkendelse for at et program kan hæmme systemhåndtering af tænd/sluk-knappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Der kræves godkendelse for at et program kan hæmme systemhåndtering af tænd/"
+"sluk-knappen."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Tillad programmer at hæmme systemhåndtering af standby-knappen"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Der kræves godkendelse for at et program kan hæmme systemhåndtering af standby-knappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Der kræves godkendelse for at et program kan hæmme systemhåndtering af "
+"standby-knappen."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Tillad programmer at hæmme systemhåndtering af dvale-knappen"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Der kræves godkendelse for at et program kan hæmme systemhåndtering af dvale-knappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Der kræves godkendelse for at et program kan hæmme systemhåndtering af dvale-"
+"knappen."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Tillad programmer at hæmme systemhåndtering af skærmlukning"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Der kræves godkendelse for at et program kan hæmme systemhåndtering af skærmlukning."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Der kræves godkendelse for at et program kan hæmme systemhåndtering af "
+"skærmlukning."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "Tillad programmer at hæmme systemhåndtering af genstart-knappen"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Der kræves godkendelse for at et program kan hæmme systemhåndtering af genstart-knappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Der kræves godkendelse for at et program kan hæmme systemhåndtering af "
+"genstart-knappen."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -439,7 +534,9 @@ msgstr "Tillad bruger der ikke er logget ind, at køre programmer"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Der kræves godkendelse for at brugere, som ikke er logget ind, kan køre programmer."
+msgstr ""
+"Der kræves godkendelse for at brugere, som ikke er logget ind, kan køre "
+"programmer."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -447,7 +544,9 @@ msgstr "Tillad brugere der ikke er logget ind, at køre programmer"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Der kræves godkendelse for at brugere, som ikke er logget ind, kan køre programmer."
+msgstr ""
+"Der kræves godkendelse for at brugere, som ikke er logget ind, kan køre "
+"programmer."
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:148
@@ -467,7 +566,9 @@ msgstr "Nulstil enhed monteret til en arbejdsstation"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Der kræves godkendelse for at nulstille måden enheder er monteret arbejdsstationer."
+msgstr ""
+"Der kræves godkendelse for at nulstille måden enheder er monteret "
+"arbejdsstationer."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -482,16 +583,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Sluk systemet mens andre brugere er logget på"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Der kræves godkendelse for at slukke systemet mens andre brugere er logget på."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Der kræves godkendelse for at slukke systemet mens andre brugere er logget "
+"på."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Sluk for systemet mens et program har forespurgt at hæmme det"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Der kræves godkendelse for at slukke systemet mens et program har forespurgt at hæmme det."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Der kræves godkendelse for at slukke systemet mens et program har forespurgt "
+"at hæmme det."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -506,16 +615,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Genstart systemet mens andre brugere er logget ind"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Der kræves godkendelse for at genstarte systemet mens andre brugere er logget ind."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Der kræves godkendelse for at genstarte systemet mens andre brugere er "
+"logget ind."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Genstart systemet mens et program har forespurgt at hæmme det"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Der kræves godkendelse for at genstarte systemet mens et program har forespurgt at hæmme det."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Der kræves godkendelse for at genstarte systemet mens et program har "
+"forespurgt at hæmme det."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -530,16 +647,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Stop systemet mens andre brugere er logget på"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Der kræves godkendelse for at stoppe systemet, mens andre brugere er logget på."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Der kræves godkendelse for at stoppe systemet, mens andre brugere er logget "
+"på."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Stop systemet mens et program har forespurgt at hæmme det"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Der kræves godkendelse for at stoppe systemet, mens et program har forespurgt at hæmme det."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Der kræves godkendelse for at stoppe systemet, mens et program har "
+"forespurgt at hæmme det."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -554,16 +679,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Sæt systemet på standby mens andre brugere er logget på"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Der kræves godkendelse for at indstille systemet på standby, mens andre brugere er logget på."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Der kræves godkendelse for at indstille systemet på standby, mens andre "
+"brugere er logget på."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Sæt systemet på standby mens et program har forespurgt at hæmme det"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Der kræves godkendelse for at indstille systemet på standby, mens et program har forespurgt at hæmme det."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Der kræves godkendelse for at indstille systemet på standby, mens et program "
+"har forespurgt at hæmme det."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -578,16 +711,25 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Sæt systemet i dvale-tilstand mens andre brugere er logget på"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Der kræves godkendelse for at indstille systemet i dvale-tilstand, mens andre brugere er logget på."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Der kræves godkendelse for at indstille systemet i dvale-tilstand, mens "
+"andre brugere er logget på."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Sæt systemet i dvale-tilstand mens et program har forespurgt at hæmme det"
+msgstr ""
+"Sæt systemet i dvale-tilstand mens et program har forespurgt at hæmme det"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Der kræves godkendelse for at indstille systemet i dvale-tilstand, mens et program har forespurgt at hæmme det."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Der kræves godkendelse for at indstille systemet i dvale-tilstand, mens et "
+"program har forespurgt at hæmme det."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -596,7 +738,9 @@ msgstr "Håndter aktive sessioner, brugere og arbejdsstationer"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Der kræves godkendelse for at håndtere aktive sessioner, brugere og arbejdsstationer."
+msgstr ""
+"Der kræves godkendelse for at håndtere aktive sessioner, brugere og "
+"arbejdsstationer."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -612,31 +756,45 @@ msgstr "Indstil \"årsagen\" til genstart i kernen"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Der kræves godkendelse for at indstille \"årsagen\" til genstart i kernen."
+msgstr ""
+"Der kræves godkendelse for at indstille \"årsagen\" til genstart i kernen."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Tillad meddelelse til firmwaren om at starte op i opsætningsgrænseflade"
+msgstr ""
+"Tillad meddelelse til firmwaren om at starte op i opsætningsgrænseflade"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Der kræves godkendelse for at meddele firmwaren om at starte op i opsætningsgrænseflade."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Der kræves godkendelse for at meddele firmwaren om at starte op i "
+"opsætningsgrænseflade."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Angiv at opstartsindlæseren skal starte til opstartsindlæsermenuen"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Der kræves godkendelse for at angive at opstartsindlæseren skal starte til opstartsindlæsermenuen."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Der kræves godkendelse for at angive at opstartsindlæseren skal starte til "
+"opstartsindlæsermenuen."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Angiv at opstartsindlæseren skal starte til en bestemt post"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Der kræves godkendelse for at angive at opstartsindlæseren skal starte til en bestemt post."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Der kræves godkendelse for at angive at opstartsindlæseren skal starte til "
+"en bestemt post."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -691,8 +849,10 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Anskaf en pseudo-TTY i en lokal container"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Der kræves godkendelse for at anskaffe en pseudo-TTY i en lokal container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Der kræves godkendelse for at anskaffe en pseudo-TTY i en lokal container."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -700,23 +860,31 @@ msgstr "Anskaf en pseudo-TTY på den lokale vært"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Der kræves godkendelse for at anskaffe en pseudo-TTY på den lokale vært."
+msgstr ""
+"Der kræves godkendelse for at anskaffe en pseudo-TTY på den lokale vært."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Håndter lokale virtuelle maskiner og containere"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Der kræves godkendelse for at håndtere lokale virtuelle maskiner og containere."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Der kræves godkendelse for at håndtere lokale virtuelle maskiner og "
+"containere."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Håndter lokal virtuel maskine- og beholderaftryk"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Der kræves godkendelse for at håndtere lokal virtuel maskine- og beholderaftryk."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Der kræves godkendelse for at håndtere lokal virtuel maskine- og "
+"beholderaftryk."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -804,7 +972,8 @@ msgstr "Indstil Negative Trust Anchors for DNSSEC"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Der kræves godkendelse for at indstille sprogindstillinger for systemet."
+msgstr ""
+"Der kræves godkendelse for at indstille sprogindstillinger for systemet."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -860,7 +1029,8 @@ msgstr "Undersøg et transportabel tjeneste-aftryk"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Der kræves godkendelse for at undersøg et transportabel tjeneste-aftryk."
+msgstr ""
+"Der kræves godkendelse for at undersøg et transportabel tjeneste-aftryk."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
@@ -868,16 +1038,22 @@ msgstr "Tilslut eller frakobl et transportabel tjeneste-aftryk"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Der kræves godkendelse for at tilslutte eller frakoble et transportabel tjeneste-aftryk."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Der kræves godkendelse for at tilslutte eller frakoble et transportabel "
+"tjeneste-aftryk."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Slet eller rediger et transportabel tjeneste-aftryk"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Der kræves godkendelse for at slette eller redigere et transportabel tjeneste-aftryk."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Der kræves godkendelse for at slette eller redigere et transportabel "
+"tjeneste-aftryk."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -893,7 +1069,8 @@ msgstr "Fjern registreringen af en DNS-SD-tjeneste"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Der kræves godkendelse for at fjerne registreringen af en DNS-SD-tjeneste"
+msgstr ""
+"Der kræves godkendelse for at fjerne registreringen af en DNS-SD-tjeneste"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -924,58 +1101,76 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Indstil RTC til lokal tidszone eller UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Der kræves godkendelse for at kontrollere hvorvidt RTC'en gemmer den lokale tid eller UTC-tid."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Der kræves godkendelse for at kontrollere hvorvidt RTC'en gemmer den lokale "
+"tid eller UTC-tid."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Slå synkronisering af netværkstid til eller fra"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Der kræves godkendelse for at kontrollere hvorvidt synkronisering af netværkstid skal aktiveres."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Der kræves godkendelse for at kontrollere hvorvidt synkronisering af "
+"netværkstid skal aktiveres."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Der kræves godkendelse for at starte '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Der kræves godkendelse for at stoppe '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Der kræves godkendelse for at genindlæse '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Der kræves godkendelse for at genstarte '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "Der kræves godkendelse for at indstille egenskaber på '$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Der kræves godkendelse for at nulstille \"fejl\"-tilstanden på '$(unit)'."
+msgstr ""
+"Der kræves godkendelse for at nulstille \"fejl\"-tilstanden på '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Der kræves godkendelse for at indstille egenskaber på '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Der kræves godkendelse for at nulstille \"fejl\"-tilstanden på '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Der kræves godkendelse for at nulstille \"fejl\"-tilstanden på '$(unit)'."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Der kræves godkendelse for at nulstille \"fejl\"-tilstanden på '$(unit)'."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Der kræves godkendelse for at nulstille \"fejl\"-tilstanden på '$(unit)'."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Autentificering er nødvendig for at eliminere '$(unit)'."
#~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
-#~ msgstr "Tryk Ctrl-C for at annulere alle igangværende kontrolleringer af filsystemet"
+#~ msgstr ""
+#~ "Tryk Ctrl-C for at annulere alle igangværende kontrolleringer af "
+#~ "filsystemet"
#~ msgid "Checking in progress on %d disk (%3.1f%% complete)"
#~ msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
diff --git a/po/de.po b/po/de.po
index cef84cb646..3783ea576a 100644
--- a/po/de.po
+++ b/po/de.po
@@ -11,10 +11,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-09-06 21:21+0000\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
-"Language-Team: German <https://translate.fedoraproject.org/projects/systemd/master/de/>\n"
+"Language-Team: German <https://translate.fedoraproject.org/projects/systemd/"
+"master/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,8 +28,11 @@ msgid "Send passphrase back to system"
msgstr "Passphrase zurück an das System senden"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Legitimierung ist zum Senden des eingegebenen Kennworts zurück an das System notwendig."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Legitimierung ist zum Senden des eingegebenen Kennworts zurück an das System "
+"notwendig."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -36,7 +40,9 @@ msgstr "Systemdienste und andere Einheiten verwalten"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Legitimierung ist notwendig für die Verwaltung von Systemdiensten und anderen Einheiten."
+msgstr ""
+"Legitimierung ist notwendig für die Verwaltung von Systemdiensten und "
+"anderen Einheiten."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -44,14 +50,19 @@ msgstr "Systemdienste und Einheitendateien verwalten"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Legitimierung ist notwendig für die Verwaltung von Systemdiensten und Einheitendateien."
+msgstr ""
+"Legitimierung ist notwendig für die Verwaltung von Systemdiensten und "
+"Einheitendateien."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Umgebungsvariablen der System- und Dienstverwaltung festlegen oder entfernen"
+msgstr ""
+"Umgebungsvariablen der System- und Dienstverwaltung festlegen oder entfernen"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr "Legitimierung ist notwendig für die System- und Dienstverwaltung."
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -67,8 +78,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Den systemd-Zustand ohne Geschwindigkeitsbegrenzung abspeichern"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Legitimierung ist notwendig, um den systemd-Zustand ohne Geschwindigkeitsbegrenzung abzuspeichern."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Legitimierung ist notwendig, um den systemd-Zustand ohne "
+"Geschwindigkeitsbegrenzung abzuspeichern."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -76,7 +90,9 @@ msgstr "Einen persönlichen Bereich anlegen"
#: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area."
-msgstr "Legitimierung ist zum Anlegen des persönlichen Bereichs eines Benutzers notwendig."
+msgstr ""
+"Legitimierung ist zum Anlegen des persönlichen Bereichs eines Benutzers "
+"notwendig."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -84,7 +100,9 @@ msgstr "Einen persönlichen Bereich entfernen"
#: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area."
-msgstr "Legitimierung ist zum Entfernen des persönlichen Bereichs eines Benutzers notwendig."
+msgstr ""
+"Legitimierung ist zum Entfernen des persönlichen Bereichs eines Benutzers "
+"notwendig."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
@@ -92,8 +110,11 @@ msgstr "Die Zugangsdaten für einen persönlichen Bereich überprüfen"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Legitimierung ist zur Überprüfung der Zugangsdaten für den persönlichen Bereich eines Benutzers notwendig."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Legitimierung ist zur Überprüfung der Zugangsdaten für den persönlichen "
+"Bereich eines Benutzers notwendig."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -102,7 +123,9 @@ msgstr "Einen persönlichen Bereich aktualisieren"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Legitimierung ist zum Aktualisieren des persönlichen Bereichs eines Benutzers notwendig."
+msgstr ""
+"Legitimierung ist zum Aktualisieren des persönlichen Bereichs eines "
+"Benutzers notwendig."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -110,7 +133,9 @@ msgstr "Größe eines persönlichen Bereichs ändern"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Legitimierung ist für die Größenänderung des persönlichen Bereichs eines Benutzers notwendig."
+msgstr ""
+"Legitimierung ist für die Größenänderung des persönlichen Bereichs eines "
+"Benutzers notwendig."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
@@ -118,151 +143,187 @@ msgstr "Passwort eines persönlichen Bereichs ändern"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Legitimierung ist zum Ändern des Passworts eines persönlichen Bereichs eines Benutzers notwendig."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Legitimierung ist zum Ändern des Passworts eines persönlichen Bereichs eines "
+"Benutzers notwendig."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+# https://www.freedesktop.org/software/systemd/man/sd-login.html
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Legitimierung ist zum Aktualisieren des persönlichen Bereichs eines "
+"Benutzers notwendig."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Einen persönlichen Bereich anlegen"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Legitimierung ist zum Anlegen des persönlichen Bereichs eines Benutzers "
+"notwendig."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -279,8 +340,12 @@ msgid "Set static hostname"
msgstr "Statischen Rechnernamen festlegen"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Authentifizierung ist erforderlich, um den statisch geänderten, lokalen Rechnernamen, sowie den beschönigten Rechnernamen festzulegen."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Authentifizierung ist erforderlich, um den statisch geänderten, lokalen "
+"Rechnernamen, sowie den beschönigten Rechnernamen festzulegen."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -288,7 +353,9 @@ msgstr "Maschinen-Information festlegen"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Legitimierung ist zum Festlegen der lokalen Maschinen-Information erforderlich."
+msgstr ""
+"Legitimierung ist zum Festlegen der lokalen Maschinen-Information "
+"erforderlich."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -315,28 +382,53 @@ msgid "Authentication is required to get system description."
msgstr "Legitimierung ist zum Ermitteln der Systembeschreibung notwendig."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Abbild einer VM oder eines Containers importieren"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Legitimierung ist zum Importieren eines VM- oder Containerabbilds erforderlich"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Legitimierung ist zum Importieren eines VM- oder Containerabbilds "
+"erforderlich"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Abbild einer VM oder eines Containers exportieren"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Legitimierung ist zum Exportieren eines VM- oder Containerabbilds erforderlich"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Legitimierung ist zum Exportieren eines VM- oder Containerabbilds "
+"erforderlich"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Abbild einer VM oder eines Containers herunterladen"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Legitimierung ist zum Herunterladen eines VM- oder Containerabbilds erforderlich"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Legitimierung ist zum Herunterladen eines VM- oder Containerabbilds "
+"erforderlich"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+# https://www.freedesktop.org/software/systemd/man/sd-login.html
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Legitimierung ist zum Ändern des Passworts eines persönlichen Bereichs eines "
+"Benutzers notwendig."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -344,7 +436,9 @@ msgstr "Die lokale Sprachumgebung festlegen"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Legitimierung ist zum Festlegen der systemweiten Spracheinstellungen erforderlich."
+msgstr ""
+"Legitimierung ist zum Festlegen der systemweiten Spracheinstellungen "
+"erforderlich."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -352,15 +446,20 @@ msgstr "Tastatureinstellungen des Systems festlegen"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Legitimierung ist zum Festlegen der Tastatureinstellungen des Systems erforderlich."
+msgstr ""
+"Legitimierung ist zum Festlegen der Tastatureinstellungen des Systems "
+"erforderlich."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Anwendungen dürfen das Herunterfahren des Systems unterbinden"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Legitimierung ist notwendig, um Anwendungen das Herunterfahren des Systems zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Legitimierung ist notwendig, um Anwendungen das Herunterfahren des Systems "
+"zu erlauben."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -368,7 +467,9 @@ msgstr "Anwendungen dürfen das Herunterfahren des Systems verzögern"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Legitimierung ist notwendig, um Anwendungen das Verzögern des Herunterfahren des Systems zu erlauben."
+msgstr ""
+"Legitimierung ist notwendig, um Anwendungen das Verzögern des Herunterfahren "
+"des Systems zu erlauben."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -376,7 +477,9 @@ msgstr "Anwendungen dürfen den Bereitschaftsmodus unterbinden"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Legitimierung ist erforderlich, um Anwendungen das Unterbinden des Bereitschaftsmodus zu erlauben."
+msgstr ""
+"Legitimierung ist erforderlich, um Anwendungen das Unterbinden des "
+"Bereitschaftsmodus zu erlauben."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -384,55 +487,89 @@ msgstr "Anwendungen dürfen den Bereitschaftsmodus verzögern"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Legitimierung ist erforderlich, um Anwendungen das Verzögern des Bereitschaftsmodus zu erlauben."
+msgstr ""
+"Legitimierung ist erforderlich, um Anwendungen das Verzögern des "
+"Bereitschaftsmodus zu erlauben."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Anwendungen dürfen den automatischen Bereitschaftsmodus unterbinden"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Legitimierung ist notwendig, um Anwendungen das Unterbinden des automatischen Bereitschaftsmodus zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Legitimierung ist notwendig, um Anwendungen das Unterbinden des "
+"automatischen Bereitschaftsmodus zu erlauben."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Anwendungen dürfen das Auswerten des Ein-/Ausschaltknopfs des Systems unterbinden"
+msgstr ""
+"Anwendungen dürfen das Auswerten des Ein-/Ausschaltknopfs des Systems "
+"unterbinden"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Legitmierung ist erforderlich, um Anwendungen das Unterbinden der Auswertung der Ein-/Ausschaltknopfs des Systems zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Legitmierung ist erforderlich, um Anwendungen das Unterbinden der Auswertung "
+"der Ein-/Ausschaltknopfs des Systems zu erlauben."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Anwendungen dürfen das Auswerten des Bereitschaftsknopfs des Systems unterbinden"
+msgstr ""
+"Anwendungen dürfen das Auswerten des Bereitschaftsknopfs des Systems "
+"unterbinden"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Legitimierung ist erforderlich, um Anwendungen das Unterbinden der Auswertung des Bereitschaftsknopfes des Systems zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Legitimierung ist erforderlich, um Anwendungen das Unterbinden der "
+"Auswertung des Bereitschaftsknopfes des Systems zu erlauben."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Anwendungen dürfen das Auswerten des Knopfs für den Ruhezustand unterbinden"
+msgstr ""
+"Anwendungen dürfen das Auswerten des Knopfs für den Ruhezustand unterbinden"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Legitimierung ist erforderlich, um Anwendungen das Unterbinden der Auswertung des Knopfs für den Ruhezustand zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Legitimierung ist erforderlich, um Anwendungen das Unterbinden der "
+"Auswertung des Knopfs für den Ruhezustand zu erlauben."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Anwendungen dürfen das Auswerten des Notebookdeckelschalters unterbinden"
+msgstr ""
+"Anwendungen dürfen das Auswerten des Notebookdeckelschalters unterbinden"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Legitimierung ist erforderlich, um Anwendungen das Unterbinden der Auswertung des Notebookdeckelschalters des Systems zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Legitimierung ist erforderlich, um Anwendungen das Unterbinden der "
+"Auswertung des Notebookdeckelschalters des Systems zu erlauben."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Anwendungen dürfen das Auswerten des Neustartknopfs durch das System unterbinden"
+msgstr ""
+"Anwendungen dürfen das Auswerten des Neustartknopfs durch das System "
+"unterbinden"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Legitimierung ist erforderlich, um Anwendungen das Unterbinden der Auswertung der Neustartknopfs des Systems zu erlauben."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Legitimierung ist erforderlich, um Anwendungen das Unterbinden der "
+"Auswertung der Neustartknopfs des Systems zu erlauben."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -440,7 +577,9 @@ msgstr "Nicht angemeldetem Benutzer die Ausführung von Programmen erlauben"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Legitimierung ist erforderlich, damit nicht angemeldete Benutzer Programme ausführen dürfen."
+msgstr ""
+"Legitimierung ist erforderlich, damit nicht angemeldete Benutzer Programme "
+"ausführen dürfen."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -448,7 +587,9 @@ msgstr "Nicht angemeldete Benutzer dürfen Programme ausführen"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Legitimierung ist erforderlich, damit nicht angemeldete Benutzer Programme ausführen dürfen."
+msgstr ""
+"Legitimierung ist erforderlich, damit nicht angemeldete Benutzer Programme "
+"ausführen dürfen."
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:148
@@ -458,7 +599,9 @@ msgstr "Das Anschließen von Geräten an Arbeitsstationen erlauben"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Legitimierung ist zum Anschließen eines Geräts an eine Arbeitsstation notwendig."
+msgstr ""
+"Legitimierung ist zum Anschließen eines Geräts an eine Arbeitsstation "
+"notwendig."
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:159
@@ -468,7 +611,9 @@ msgstr "Zurücksetzen der an eine Arbeitsstation angeschlossenen Geräte"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Legitimierung ist zum Zurücksetzen notwendig, wie Geräte an eine Arbeitsstation angeschlossen werden."
+msgstr ""
+"Legitimierung ist zum Zurücksetzen notwendig, wie Geräte an eine "
+"Arbeitsstation angeschlossen werden."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -483,16 +628,25 @@ msgid "Power off the system while other users are logged in"
msgstr "Das System herunter fahren, während andere Benutzer angemeldet sind"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Legitimierung ist zum Herunterfahren des Systems notwendig, während andere Benutzer angemeldet sind."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Legitimierung ist zum Herunterfahren des Systems notwendig, während andere "
+"Benutzer angemeldet sind."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
-msgstr "Das System ausschalten, während eine Anwendung anfordert es zu unterbinden"
+msgstr ""
+"Das System ausschalten, während eine Anwendung anfordert es zu unterbinden"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Legitimierung ist zum Ausschalten des Systems notwendig, während eine Anwendung anfordert es zu unterbinden."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Legitimierung ist zum Ausschalten des Systems notwendig, während eine "
+"Anwendung anfordert es zu unterbinden."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -507,16 +661,25 @@ msgid "Reboot the system while other users are logged in"
msgstr "Das Systems neu starten, während andere Benutzer angemeldet sind"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Legitimierung ist zum Neustart des Systems notwendig, während andere Benutzer angemeldet sind."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Legitimierung ist zum Neustart des Systems notwendig, während andere "
+"Benutzer angemeldet sind."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
-msgstr "Das System neu starten, während eine Anwendung anfordert es zu unterbinden"
+msgstr ""
+"Das System neu starten, während eine Anwendung anfordert es zu unterbinden"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Legitimierung ist zum Neustart des Systems notwendig, während eine Anwendung anforderte es zu unterbinden."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Legitimierung ist zum Neustart des Systems notwendig, während eine Anwendung "
+"anforderte es zu unterbinden."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -531,16 +694,26 @@ msgid "Halt the system while other users are logged in"
msgstr "Das System herunterfahren, während andere Benutzer angemeldet sind"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Legitimierung ist zum Herunterfahren des Systems notwendig, während andere Benutzer angemeldet sind."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Legitimierung ist zum Herunterfahren des Systems notwendig, während andere "
+"Benutzer angemeldet sind."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
-msgstr "Das System in den Ruhezustand versetzen, während eine Anwendung wünscht dies zu verhindern"
+msgstr ""
+"Das System in den Ruhezustand versetzen, während eine Anwendung wünscht dies "
+"zu verhindern"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Legitimierung ist zum Versetzen des System in den Ruhezustand notwendig, während eine Anwendung wünscht dies zu verhindern."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Legitimierung ist zum Versetzen des System in den Ruhezustand notwendig, "
+"während eine Anwendung wünscht dies zu verhindern."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -552,19 +725,30 @@ msgstr "Legitimierung ist zum Versetzen des Systems in Bereitschaft notwendig."
#: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while other users are logged in"
-msgstr "Das System in Bereitschaft versetzen, während andere Benutzer angemeldet sind"
+msgstr ""
+"Das System in Bereitschaft versetzen, während andere Benutzer angemeldet sind"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Legitimierung ist zum Versetzen des Systems in Bereitschaft notwendig, während andere Benutzer angemeldet sind."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Legitimierung ist zum Versetzen des Systems in Bereitschaft notwendig, "
+"während andere Benutzer angemeldet sind."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
-msgstr "Das System in Bereitschaft versetzen, während eine Anwendung anfordert dies zu unterbinden"
+msgstr ""
+"Das System in Bereitschaft versetzen, während eine Anwendung anfordert dies "
+"zu unterbinden"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Legitimierung ist zum Versetzen des Systems in Bereitschaft notwendig, während eine Anwendung anfordert dies zu unterbinden."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Legitimierung ist zum Versetzen des Systems in Bereitschaft notwendig, "
+"während eine Anwendung anfordert dies zu unterbinden."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -572,23 +756,36 @@ msgstr "Den Ruhezustand des Systems aktivieren"
#: src/login/org.freedesktop.login1.policy:301
msgid "Authentication is required to hibernate the system."
-msgstr "Legitimierung ist zum Aktivieren des Ruhezustands des Systems notwendig."
+msgstr ""
+"Legitimierung ist zum Aktivieren des Ruhezustands des Systems notwendig."
#: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while other users are logged in"
-msgstr "Den Ruhezustand des Systems aktivieren, während andere Benutzer angemeldet sind"
+msgstr ""
+"Den Ruhezustand des Systems aktivieren, während andere Benutzer angemeldet "
+"sind"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Legitimierung ist zum Aktivieren des Ruhezustands des Systems notwendig, während andere Benutzer angemeldet sind."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Legitimierung ist zum Aktivieren des Ruhezustands des Systems notwendig, "
+"während andere Benutzer angemeldet sind."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Das System in den Ruhezustand versetzen, während eine Anwendung wünscht dies zu verhindern"
+msgstr ""
+"Das System in den Ruhezustand versetzen, während eine Anwendung wünscht dies "
+"zu verhindern"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Legitimierung ist zum Versetzen des System in den Ruhezustand notwendig, während eine Anwendung wünscht dies zu verhindern."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Legitimierung ist zum Versetzen des System in den Ruhezustand notwendig, "
+"während eine Anwendung wünscht dies zu verhindern."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -597,7 +794,9 @@ msgstr "Aktive Sitzungen, Benutzer und Arbeitsstationen verwalten"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Legitimierung ist zur Verwaltung aktiver Sitzungen, Benutzern und Arbeitsstationen notwendig."
+msgstr ""
+"Legitimierung ist zur Verwaltung aktiver Sitzungen, Benutzern und "
+"Arbeitsstationen notwendig."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -605,7 +804,8 @@ msgstr "Aktive Sitzungen sperren und entsperren"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Legitimierung ist zum Sperren und Entsperren aktiver Sitzungen notwendig."
+msgstr ""
+"Legitimierung ist zum Sperren und Entsperren aktiver Sitzungen notwendig."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -613,31 +813,44 @@ msgstr "Den Reboot-\"Grund\" im Kernel festlegen"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Legitimierung ist zum Festlegen des Neustart-Grunds im Kernel notwendig."
+msgstr ""
+"Legitimierung ist zum Festlegen des Neustart-Grunds im Kernel notwendig."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Der Firmware mitteilen, die Einrichtungsoberfläche zu starten"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Legitimierung ist zum Mitteilen der Firmware notwendig, die Einrichtungsoberfläche zu starten."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Legitimierung ist zum Mitteilen der Firmware notwendig, die "
+"Einrichtungsoberfläche zu starten."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Dem Systemstarter mitteilen, das Systemstartmenü zu laden"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Legitimierung ist zum Mitteilen des Systemstarters notwendig, das Systemstartmenü zu laden."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Legitimierung ist zum Mitteilen des Systemstarters notwendig, das "
+"Systemstartmenü zu laden."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Dem Systemstarter mitteilen, einen bestimmten Eintrag zu starten"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Legitimierung ist zum Mitteilen des Systemstarters notwendig, einen bestimmten Eintrag zu starten."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Legitimierung ist zum Mitteilen des Systemstarters notwendig, einen "
+"bestimmten Eintrag zu starten."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -677,7 +890,9 @@ msgstr "Eine Shell in einem lokalen Container erhalten"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Legitimierung ist zum Erhalten einer Shell in einem lokalen Container notwendig."
+msgstr ""
+"Legitimierung ist zum Erhalten einer Shell in einem lokalen Container "
+"notwendig."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -685,15 +900,19 @@ msgstr "Eine Shell auf dem lokalen Rechner erhalten"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Legitimierung ist zum Erhalten einer Shell auf dem lokalen Rechner notwendig."
+msgstr ""
+"Legitimierung ist zum Erhalten einer Shell auf dem lokalen Rechner notwendig."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Ein Pseudo-TTY in einem lokalen Container erhalten"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Legitimierung ist zum Erhalten eines Pseudo-TTY in einem lokalen Container notwendig."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Legitimierung ist zum Erhalten eines Pseudo-TTY in einem lokalen Container "
+"notwendig."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -701,23 +920,32 @@ msgstr "Ein Pseudo-TTY auf dem lokalen Rechner erhalten"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Legitimierung ist zum Erhalten eines Pseudo-TTY auf dem lokalen Rechner notwendig."
+msgstr ""
+"Legitimierung ist zum Erhalten eines Pseudo-TTY auf dem lokalen Rechner "
+"notwendig."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Lokale virtuelle Maschinen und Container verwalten"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Legitimierung ist zum Verwalten lokaler virtueller Maschinen und Container erforderlich."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Legitimierung ist zum Verwalten lokaler virtueller Maschinen und Container "
+"erforderlich."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Lokale virtuelle Maschinen und Containerabbilder verwalten"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Legitimierung ist zum Verwalten lokaler virtueller Maschinen und Containerabbildern erforderlich."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Legitimierung ist zum Verwalten lokaler virtueller Maschinen und "
+"Containerabbildern erforderlich."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -765,7 +993,8 @@ msgstr "LLMNR aktivieren/deaktivieren"
#: src/network/org.freedesktop.network1.policy:67
#: src/resolve/org.freedesktop.resolve1.policy:78
msgid "Authentication is required to enable or disable LLMNR."
-msgstr "Legitimierung ist zum Aktivieren oder Deaktivieren von LLMNR notwendig."
+msgstr ""
+"Legitimierung ist zum Aktivieren oder Deaktivieren von LLMNR notwendig."
#: src/network/org.freedesktop.network1.policy:77
#: src/resolve/org.freedesktop.resolve1.policy:88
@@ -775,7 +1004,9 @@ msgstr "Multicast-DNS aktivieren/deaktivieren"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Legitimierung ist zum Aktivieren oder Deaktivieren von Multicast-DNS notwendig."
+msgstr ""
+"Legitimierung ist zum Aktivieren oder Deaktivieren von Multicast-DNS "
+"notwendig."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -785,7 +1016,9 @@ msgstr "DNS over TLS aktivieren/deaktivieren"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Legitimierung ist zum Aktivieren oder Deaktivieren von DNS über TLS notwendig."
+msgstr ""
+"Legitimierung ist zum Aktivieren oder Deaktivieren von DNS über TLS "
+"notwendig."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -795,7 +1028,8 @@ msgstr "DNSSEC aktivieren/deaktivieren"
#: src/network/org.freedesktop.network1.policy:100
#: src/resolve/org.freedesktop.resolve1.policy:111
msgid "Authentication is required to enable or disable DNSSEC."
-msgstr "Legitimierung ist zum Aktivieren oder Deaktivieren von DNSSEC notwendig."
+msgstr ""
+"Legitimierung ist zum Aktivieren oder Deaktivieren von DNSSEC notwendig."
#: src/network/org.freedesktop.network1.policy:110
#: src/resolve/org.freedesktop.resolve1.policy:121
@@ -805,7 +1039,9 @@ msgstr "Negative Vertrauensanker für DNSSEC festlegen"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Legitimierung ist zum Festlegen von negativen Vertrauensankern für DNSSEC erforderlich."
+msgstr ""
+"Legitimierung ist zum Festlegen von negativen Vertrauensankern für DNSSEC "
+"erforderlich."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -845,7 +1081,8 @@ msgstr "Netzwerkeinstellungen neu laden"
#: src/network/org.freedesktop.network1.policy:166
msgid "Authentication is required to reload network settings."
-msgstr "Legitimierung ist zum erneuten Laden der Netzwerkeinstellungen notwendig."
+msgstr ""
+"Legitimierung ist zum erneuten Laden der Netzwerkeinstellungen notwendig."
#: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface"
@@ -853,7 +1090,8 @@ msgstr "Netzwerkschnittstelle neu konfigurieren"
#: src/network/org.freedesktop.network1.policy:177
msgid "Authentication is required to reconfigure network interface."
-msgstr "Legitimierung ist zur Neukonfiguration der Netzwerkschnittstelle notwendig."
+msgstr ""
+"Legitimierung ist zur Neukonfiguration der Netzwerkschnittstelle notwendig."
#: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image"
@@ -861,7 +1099,9 @@ msgstr "Ein Abbild eines portablen Dienstes inspizieren"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Legitimierung ist zum Inspizieren eines Abbilds eines portablen Dienstes erforderlich."
+msgstr ""
+"Legitimierung ist zum Inspizieren eines Abbilds eines portablen Dienstes "
+"erforderlich."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
@@ -869,16 +1109,22 @@ msgstr "Ein Abbild eines portablen Dienstes ein- oder aushängen"
# https://www.freedesktop.org/software/systemd/man/sd-login.html
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Legitimierung ist zum Ein-/Aushängen eines Abbilds eines portablen Dienstes erforderlich."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Legitimierung ist zum Ein-/Aushängen eines Abbilds eines portablen Dienstes "
+"erforderlich."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Ein Abbild eines portablen Dienstes löschen oder bearbeiten"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Legitimierung ist zum Bearbeiten oder Löschen eines Abbilds eines portablen Dienstes erforderlich."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Legitimierung ist zum Bearbeiten oder Löschen eines Abbilds eines portablen "
+"Dienstes erforderlich."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -902,7 +1148,9 @@ msgstr "Namensauflösungseinstellungen zurücksetzen"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Legitimierung ist zum Zurücksetzen der Namensauflösungseinstellungen erforderlich."
+msgstr ""
+"Legitimierung ist zum Zurücksetzen der Namensauflösungseinstellungen "
+"erforderlich."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -925,53 +1173,75 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Echtzeituhr auf lokale Zeitzone oder UTC setzen"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Legitimierung ist notwendig zum Festlegen, ob die Echtzeituhr auf lokale Zeitzone oder UTC eingestellt ist."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Legitimierung ist notwendig zum Festlegen, ob die Echtzeituhr auf lokale "
+"Zeitzone oder UTC eingestellt ist."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Netzwerkzeitabgeich ein- oder ausschalten"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Legitimierung ist zum Festlegen, ob Netzwerkzeitabgeich eingeschaltet sein soll, erforderlich."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Legitimierung ist zum Festlegen, ob Netzwerkzeitabgeich eingeschaltet sein "
+"soll, erforderlich."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Legitimierung ist zum Starten von »$(unit)« notwendig."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Legitimierung ist zum Stoppen von »$(unit)« notwendig."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Legitimierung ist zum erneuten Laden von »$(unit)« notwendig."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Legitimierung ist zum Neustarten von »$(unit)« notwendig."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Legitimierung ist zum Senden eines UNIX-Signals an die Prozesse von »$(unit)« notwendig."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Legitimierung ist zum Senden eines UNIX-Signals an die Prozesse von "
+"»$(unit)« notwendig."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Legitimierung ist zum Zurücksetzen des Status »fehlgeschlagen« von »$(unit)« notwendig"
+msgstr ""
+"Legitimierung ist zum Zurücksetzen des Status »fehlgeschlagen« von »$(unit)« "
+"notwendig"
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Legitimierung ist zum Festlegen der Eigenschaften von »$(unit)« notwendig."
+msgstr ""
+"Legitimierung ist zum Festlegen der Eigenschaften von »$(unit)« notwendig."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Legitimierung ist zum Löschen von Dateien und Verzeichnissen, die zu »$(unit)« gehören, erforderlich."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Legitimierung ist zum Löschen von Dateien und Verzeichnissen, die zu "
+"»$(unit)« gehören, erforderlich."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Legitimierung ist zum Zurücksetzen des Status »fehlgeschlagen« von »$(unit)« notwendig"
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Legitimierung ist zum Zurücksetzen des Status »fehlgeschlagen« von »$(unit)« "
+"notwendig"
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Legitimierung ist zum Eliminieren von »$(unit)« notwendig."
diff --git a/po/el.po b/po/el.po
index 6efbcdd79e..ca84144777 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2014-04-29 09:17+0300\n"
"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n"
"Language-Team: team@lists.gnome.gr\n"
@@ -22,8 +22,11 @@ msgid "Send passphrase back to system"
msgstr "Αποστολή του συνθηματικού πίσω στο σύστημα"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Απαιτείται πιστοποίηση για αποστολή του εισερχόμενου συνθηματικού πίσω στο σύστημα."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Απαιτείται πιστοποίηση για αποστολή του εισερχόμενου συνθηματικού πίσω στο "
+"σύστημα."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -32,7 +35,9 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:34
#, fuzzy
msgid "Authentication is required to manage system services or other units."
-msgstr "Απαιτείται πιστοποίηση για να προσπελάσετε τον διαχειριστή συστήματος και υπηρεσιών."
+msgstr ""
+"Απαιτείται πιστοποίηση για να προσπελάσετε τον διαχειριστή συστήματος και "
+"υπηρεσιών."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -41,7 +46,9 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:44
#, fuzzy
msgid "Authentication is required to manage system service or unit files."
-msgstr "Απαιτείται πιστοποίηση για να προσπελάσετε τον διαχειριστή συστήματος και υπηρεσιών."
+msgstr ""
+"Απαιτείται πιστοποίηση για να προσπελάσετε τον διαχειριστή συστήματος και "
+"υπηρεσιών."
#: src/core/org.freedesktop.systemd1.policy.in:54
#, fuzzy
@@ -50,8 +57,12 @@ msgstr "Προνομιούχος πρόσβαση διαχειριστή συσ
#: src/core/org.freedesktop.systemd1.policy.in:55
#, fuzzy
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Απαιτείται πιστοποίηση για να προσπελάσετε τον διαχειριστή συστήματος και υπηρεσιών."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Απαιτείται πιστοποίηση για να προσπελάσετε τον διαχειριστή συστήματος και "
+"υπηρεσιών."
#: src/core/org.freedesktop.systemd1.policy.in:64
#, fuzzy
@@ -69,7 +80,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
#: src/home/org.freedesktop.home1.policy:13
@@ -96,8 +108,10 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:34
#, fuzzy
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -106,7 +120,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:44
#, fuzzy
msgid "Authentication is required to update a user's home area."
-msgstr "Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -123,151 +138,181 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:64
#, fuzzy
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/home/pam_systemd_home.c:287
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -284,8 +329,12 @@ msgid "Set static hostname"
msgstr "Ορισμός στατικού ονόματος οικοδεσπότη"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Απαιτείται πιστοποίηση για να ορίσετε το στατικά ρυθμισμένο όνομα τοπικού οικοδεσπότη, καθώς και το pretty όνομα οικοδεσπότη."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ορίσετε το στατικά ρυθμισμένο όνομα τοπικού "
+"οικοδεσπότη, καθώς και το pretty όνομα οικοδεσπότη."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -324,39 +373,51 @@ msgid "Authentication is required to get system description."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα ζώνης του συστήματος."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
#, fuzzy
-msgid "Authentication is required to import a VM or container image"
+msgid "Authentication is required to import an image"
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
#, fuzzy
-msgid "Authentication is required to export a VM or container image"
+msgid "Authentication is required to export disk image"
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
#, fuzzy
-msgid "Authentication is required to download a VM or container image"
+msgid "Authentication is required to download a disk image"
msgstr "Απαιτείται πιστοποίηση για να ορίσετε πληροφορίες τοπικής μηχανής."
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Ορισμός τοπικών ρυθμίσεων συστήματος"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Απαιτείται πιστοποίηση για να ορίσετε τις τοπικές ρυθμίσεις του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ορίσετε τις τοπικές ρυθμίσεις του συστήματος."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -364,23 +425,32 @@ msgstr "Ορισμός ρυθμίσεων πληκτρολογίου συστή
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Απαιτείται πιστοποίηση για να ορίσετε τις ρυθμίσεις πληκτρολογίου του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ορίσετε τις ρυθμίσεις πληκτρολογίου του "
+"συστήματος."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν τον τερματισμό του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν τον τερματισμό του συστήματος"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει τον τερματισμό του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει τον "
+"τερματισμό του συστήματος."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
-msgstr "Να επιτρέπεται στις εφαρμογές να καθυστερούν τον τερματισμό του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να καθυστερούν τον τερματισμό του συστήματος"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να καθυστερήσει τον τερματισμό του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να καθυστερήσει "
+"τον τερματισμό του συστήματος."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -388,7 +458,9 @@ msgstr "Να επιτρέπεται στις εφαρμογές να αποτρ
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την ύπνωση του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"ύπνωση του συστήματος."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -396,57 +468,95 @@ msgstr "Να επιτρέπεται στις εφαρμογές να καθυσ
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να καθυστερήσει την ύπνωση του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να καθυστερήσει "
+"την ύπνωση του συστήματος."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν την αυτόματη αναστολή του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν την αυτόματη αναστολή του "
+"συστήματος"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την αυτόματη αναστολή του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"αυτόματη αναστολή του συστήματος."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου ενεργοποίησης του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου "
+"ενεργοποίησης του συστήματος"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την διαχείριση του πλήκτρου ενεργοποίησης του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"διαχείριση του πλήκτρου ενεργοποίησης του συστήματος."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου αναστολής του συστήματος."
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου "
+"αναστολής του συστήματος."
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την διαχείριση του πλήκτρου αναστολής του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"διαχείριση του πλήκτρου αναστολής του συστήματος."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου αδρανοποίησης του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου "
+"αδρανοποίησης του συστήματος"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την διαχείριση του πλήκτρου αδρανοποίησης του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"διαχείριση του πλήκτρου αδρανοποίησης του συστήματος."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του διακόπτη καλύμματος του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του διακόπτη "
+"καλύμματος του συστήματος"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την διαχείριση του διακόπτη καλύμματος του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"διαχείριση του διακόπτη καλύμματος του συστήματος."
#: src/login/org.freedesktop.login1.policy:117
#, fuzzy
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου ενεργοποίησης του συστήματος"
+msgstr ""
+"Να επιτρέπεται στις εφαρμογές να αποτρέπουν τη διαχείριση του πλήκτρου "
+"ενεργοποίησης του συστήματος"
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την διαχείριση του πλήκτρου ενεργοποίησης του συστήματος."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μια εφαρμογή να αποτρέψει την "
+"διαχείριση του πλήκτρου ενεργοποίησης του συστήματος."
#: src/login/org.freedesktop.login1.policy:128
#, fuzzy
@@ -456,7 +566,9 @@ msgstr "Να επιτρέπεται σε μη συνδεμένους χρήστ
#: src/login/org.freedesktop.login1.policy:129
#, fuzzy
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μη συνδεμένους χρήστες να εκτελούν προγράμματα."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μη συνδεμένους χρήστες να "
+"εκτελούν προγράμματα."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -464,7 +576,9 @@ msgstr "Να επιτρέπεται σε μη συνδεμένους χρήστ
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Απαιτείται πιστοποίηση για να επιτρέπεται σε μη συνδεμένους χρήστες να εκτελούν προγράμματα."
+msgstr ""
+"Απαιτείται πιστοποίηση για να επιτρέπεται σε μη συνδεμένους χρήστες να "
+"εκτελούν προγράμματα."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -472,7 +586,8 @@ msgstr "Να επιτρέπεται η προσάρτηση συσκευών σ
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -480,7 +595,9 @@ msgstr "Αφαίρεση συσκευής από προσαρτήσεις στα
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Απαιτείται πιστοποίηση για επαναφορά του τρόπου που οι συσκευές προσαρτώνται στους σταθμούς εργασίας."
+msgstr ""
+"Απαιτείται πιστοποίηση για επαναφορά του τρόπου που οι συσκευές προσαρτώνται "
+"στους σταθμούς εργασίας."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -495,16 +612,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Σβήσιμο του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Απαιτείται πιστοποίηση για σβήσιμο του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Απαιτείται πιστοποίηση για σβήσιμο του συστήματος ενώ άλλοι χρήστες είναι "
+"συνδεμένοι."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Απενεργοποίηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί."
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Απαιτείται πιστοποίηση για απενεργοποίηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Απαιτείται πιστοποίηση για απενεργοποίηση του συστήματος ενώ μια εφαρμογή "
+"ζήτησε να αποτραπεί."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -519,16 +644,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Επανεκκίνηση του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Απαιτείται πιστοποίηση για επανεκκίνηση του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Απαιτείται πιστοποίηση για επανεκκίνηση του συστήματος ενώ άλλοι χρήστες "
+"είναι συνδεμένοι."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Επανεκκίνηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Απαιτείται πιστοποίηση για επανεκκίνηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Απαιτείται πιστοποίηση για επανεκκίνηση του συστήματος ενώ μια εφαρμογή "
+"ζήτησε να αποτραπεί."
#: src/login/org.freedesktop.login1.policy:235
#, fuzzy
@@ -547,8 +680,12 @@ msgstr "Αδρανοποίηση του συστήματος ενώ άλλοι
#: src/login/org.freedesktop.login1.policy:247
#, fuzzy
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ άλλοι χρήστες "
+"είναι συνδεμένοι."
#: src/login/org.freedesktop.login1.policy:257
#, fuzzy
@@ -557,8 +694,12 @@ msgstr "Αδρανοποίηση του συστήματος ενώ μια εφ
#: src/login/org.freedesktop.login1.policy:258
#, fuzzy
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ μια εφαρμογή "
+"ζήτησε να αποτραπεί."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -573,16 +714,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Αναστολή του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Απαιτείται πιστοποίηση για αναστολή του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Απαιτείται πιστοποίηση για αναστολή του συστήματος ενώ άλλοι χρήστες είναι "
+"συνδεμένοι."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Αναστολή του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Απαιτείται πιστοποίηση για αναστολή του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Απαιτείται πιστοποίηση για αναστολή του συστήματος ενώ μια εφαρμογή ζήτησε "
+"να αποτραπεί."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -597,16 +746,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Αδρανοποίηση του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ άλλοι χρήστες είναι συνδεμένοι."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ άλλοι χρήστες "
+"είναι συνδεμένοι."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Αδρανοποίηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ μια εφαρμογή ζήτησε να αποτραπεί."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Απαιτείται πιστοποίηση για αδρανοποίηση του συστήματος ενώ μια εφαρμογή "
+"ζήτησε να αποτραπεί."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -615,7 +772,8 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:333
#, fuzzy
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -642,7 +800,9 @@ msgstr "Απαιτείται πιστοποίηση για να ορίσετε
#: src/login/org.freedesktop.login1.policy:364
#, fuzzy
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
#: src/login/org.freedesktop.login1.policy:374
@@ -651,7 +811,9 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:375
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
#: src/login/org.freedesktop.login1.policy:385
@@ -660,7 +822,9 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:386
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
#: src/login/org.freedesktop.login1.policy:396
@@ -725,7 +889,8 @@ msgstr "Απαιτείται πιστοποίηση για να ορίσετε
#: src/machine/org.freedesktop.machine1.policy:65
#, fuzzy
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
#: src/machine/org.freedesktop.machine1.policy:74
@@ -743,7 +908,8 @@ msgstr ""
#: src/machine/org.freedesktop.machine1.policy:85
#, fuzzy
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε πληροφορίες τοπικής μηχανής."
#: src/machine/org.freedesktop.machine1.policy:95
@@ -752,7 +918,9 @@ msgstr ""
#: src/machine/org.freedesktop.machine1.policy:96
#, fuzzy
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε πληροφορίες τοπικής μηχανής."
#: src/network/org.freedesktop.network1.policy:22
@@ -850,7 +1018,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:122
#, fuzzy
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Απαιτείται πιστοποίηση για να ορίσετε τις τοπικές ρυθμίσεις του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ορίσετε τις τοπικές ρυθμίσεις του συστήματος."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -921,8 +1090,10 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
#, fuzzy
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Απαιτείται πιστοποίηση για προσάρτηση μιας συσκευής σε έναν σταθμό εργασίας."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
@@ -930,7 +1101,8 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
#, fuzzy
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε πληροφορίες τοπικής μηχανής."
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -958,7 +1130,9 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:133
#, fuzzy
msgid "Authentication is required to reset name resolution settings."
-msgstr "Απαιτείται πιστοποίηση για να ορίσετε τις ρυθμίσεις πληκτρολογίου του συστήματος."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ορίσετε τις ρυθμίσεις πληκτρολογίου του "
+"συστήματος."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -981,60 +1155,73 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Ορισμός RTC στην τοπική ζώνη ώρας ή UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Απαιτείται πιστοποίηση για να ελέγξετε αν το RTC αποθηκεύει την τοπική ή την ώρα UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ελέγξετε αν το RTC αποθηκεύει την τοπική ή την "
+"ώρα UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Ενεργοποίηση/Απενεργοποίηση συγχρονισμού ώρας δικτύου"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Απαιτείται πιστοποίηση για να ελέγξετε αν ο συγχρονισμός ώρας δικτύου θα ενεργοποιηθεί."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Απαιτείται πιστοποίηση για να ελέγξετε αν ο συγχρονισμός ώρας δικτύου θα "
+"ενεργοποιηθεί."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
#, fuzzy
msgid "Authentication is required to start '$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
#, fuzzy
msgid "Authentication is required to stop '$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
#, fuzzy
msgid "Authentication is required to reload '$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
#, fuzzy
msgid "Authentication is required to restart '$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
#, fuzzy
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
#, fuzzy
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
#, fuzzy
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε την ώρα του συστήματος."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "Απαιτείται πιστοποίηση για να ορίσετε τοπικά όνομα οικοδεσπότη."
#, fuzzy
diff --git a/po/es.po b/po/es.po
index 6d442caaef..501aea79e6 100644
--- a/po/es.po
+++ b/po/es.po
@@ -9,10 +9,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-08-26 18:05+0000\n"
"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
-"Language-Team: Spanish <https://translate.fedoraproject.org/projects/systemd/master/es/>\n"
+"Language-Team: Spanish <https://translate.fedoraproject.org/projects/systemd/"
+"master/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,8 +26,10 @@ msgid "Send passphrase back to system"
msgstr "Devolver contraseña al sistema"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Necesita autenticarse para devolver la contraseña introducida al sistema."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Necesita autenticarse para devolver la contraseña introducida al sistema."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -34,7 +37,9 @@ msgstr "Administrar servicios del sistema u otras unidades"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Necesita autenticarse para administrar los servicios de sistema u otras unidades."
+msgstr ""
+"Necesita autenticarse para administrar los servicios de sistema u otras "
+"unidades."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -42,15 +47,21 @@ msgstr "Administrar servicio del sistema o archivos de unidad"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Necesita autenticarse para administrar el servicio de sistema o los archivos de unidad."
+msgstr ""
+"Necesita autenticarse para administrar el servicio de sistema o los archivos "
+"de unidad."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Administrar variables de entorno del sistema y del gestor de servicios"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Necesita autenticarse para administrar las variables de entorno del sistema y del gestor de servicios."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Necesita autenticarse para administrar las variables de entorno del sistema "
+"y del gestor de servicios."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -66,7 +77,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Necesita autenticarse para recargar el estado de systemd."
#: src/home/org.freedesktop.home1.policy:13
@@ -90,8 +102,11 @@ msgid "Check credentials of a home area"
msgstr "Comprobar las credenciales de un área home"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Necesita autenticarse para comprobar las credenciales del espacio personal de un usuario."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Necesita autenticarse para comprobar las credenciales del espacio personal "
+"de un usuario."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -99,7 +114,8 @@ msgstr "Actualizar un espacio personal"
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Necesita autenticarse para actualizar el espacio personal de un usuario."
+msgstr ""
+"Necesita autenticarse para actualizar el espacio personal de un usuario."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -107,158 +123,191 @@ msgstr "Redimensionar un espacio personal"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Necesita autenticarse para redimensionar el espacio personal de un usuario."
+msgstr ""
+"Necesita autenticarse para redimensionar el espacio personal de un usuario."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Cambiar contraseña de un espacio personal"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Necesita autenticarse para cambiar la contraseña del espacio personal de un usuario."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Necesita autenticarse para cambiar la contraseña del espacio personal de un "
+"usuario."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Necesita autenticarse para actualizar el espacio personal de un usuario."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Crear un área home"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Se requiere autenticación para crear un área home de usuario."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -275,8 +324,12 @@ msgid "Set static hostname"
msgstr "Establecer nombre estático del equipo"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Necesita autenticarse para establecer el nombre estático de equipo local, así como el nombre visible del equipo."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Necesita autenticarse para establecer el nombre estático de equipo local, "
+"así como el nombre visible del equipo."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -314,28 +367,52 @@ msgid "Authentication is required to get system description."
msgstr "Necesita autenticarse para establecer la zona horaria del sistema."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importar una imagen de máquina virtual o de contenedor"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Necesita autenticarse para importar una imagen de máquina virtual o de contenedor"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Necesita autenticarse para importar una imagen de máquina virtual o de "
+"contenedor"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exportar imagen de máquina virtual o de contenedor"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Necesita autenticarse para exportar una imagen de máquina virtual o de contenedor"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Necesita autenticarse para exportar una imagen de máquina virtual o de "
+"contenedor"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Descargar una imagen de máquina virtual o de contenedor"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Necesita autenticarse para descargar una imagen de máquina virtual o de contenedor"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Necesita autenticarse para descargar una imagen de máquina virtual o de "
+"contenedor"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Necesita autenticarse para cambiar la contraseña del espacio personal de un "
+"usuario."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -358,8 +435,10 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Permitir que las aplicaciones impidan el apagado del sistema"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Necesita autenticarse para que una aplicación impida el apagado del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida el apagado del sistema."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -367,7 +446,8 @@ msgstr "Permitir a las aplicaciones retrasar el apagado del sistema"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Necesita autenticarse para que una aplicación retrase el apagado del sistema."
+msgstr ""
+"Necesita autenticarse para que una aplicación retrase el apagado del sistema."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -375,7 +455,9 @@ msgstr "Permitir a las aplicaciones impedir la hibernación del sistema"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Necesita autenticarse para que una aplicación impida la hibernación del sistema."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida la hibernación del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -383,57 +465,94 @@ msgstr "Permitir a las aplicaciones retrasar la hibernación del sistema"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Necesita autenticarse para que una aplicación retrase la hibernación del sistema."
+msgstr ""
+"Necesita autenticarse para que una aplicación retrase la hibernación del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Permitir a las aplicaciones impedir la suspensión automática del sistema"
+msgstr ""
+"Permitir a las aplicaciones impedir la suspensión automática del sistema"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Necesita autenticarse para que una aplicación impida la suspensión automática del sistema."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida la suspensión "
+"automática del sistema."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Permitir a las aplicaciones impedir el manejo de la tecla de encendido/apagado por parte del sistema"
+msgstr ""
+"Permitir a las aplicaciones impedir el manejo de la tecla de encendido/"
+"apagado por parte del sistema"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Necesita autenticarse para que una aplicación impida el manejo de la tecla de encendido/apagado por parte del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida el manejo de la tecla "
+"de encendido/apagado por parte del sistema."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Permitir a las aplicaciones impedir el manejo de la tecla de suspensión por parte del sistema"
+msgstr ""
+"Permitir a las aplicaciones impedir el manejo de la tecla de suspensión por "
+"parte del sistema"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Necesita autenticarse para que una aplicación impida el manejo de la tecla de suspensión por parte del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida el manejo de la tecla "
+"de suspensión por parte del sistema."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permitir a las aplicaciones impedir el manejo de la tecla de hibernación por parte del sistema"
+msgstr ""
+"Permitir a las aplicaciones impedir el manejo de la tecla de hibernación por "
+"parte del sistema"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Necesita autenticarse para que una aplicación impida el manejo de la tecla de hibernación por parte del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida el manejo de la tecla "
+"de hibernación por parte del sistema."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permitir a las aplicaciones impedir el manejo del cierre de la tapa del portátil por parte del sistema"
+msgstr ""
+"Permitir a las aplicaciones impedir el manejo del cierre de la tapa del "
+"portátil por parte del sistema"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Necesita autenticarse para que una aplicación impida el manejo del cierre de la tapa del portátil por parte del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida el manejo del cierre de "
+"la tapa del portátil por parte del sistema."
#: src/login/org.freedesktop.login1.policy:117
#, fuzzy
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permitir a las aplicaciones impedir el manejo de la tecla de encendido/apagado por parte del sistema"
+msgstr ""
+"Permitir a las aplicaciones impedir el manejo de la tecla de encendido/"
+"apagado por parte del sistema"
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Necesita autenticarse para que una aplicación impida el manejo de la tecla de encendido/apagado por parte del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Necesita autenticarse para que una aplicación impida el manejo de la tecla "
+"de encendido/apagado por parte del sistema."
#: src/login/org.freedesktop.login1.policy:128
#, fuzzy
@@ -443,7 +562,9 @@ msgstr "Permitir la ejecución de programas a usuarios no conectados"
#: src/login/org.freedesktop.login1.policy:129
#, fuzzy
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Se requiere autenticación para la ejecución de programas por usuarios no conectados."
+msgstr ""
+"Se requiere autenticación para la ejecución de programas por usuarios no "
+"conectados."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -451,7 +572,9 @@ msgstr "Permitir la ejecución de programas a usuarios no conectados"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Necesita autenticarse para la ejecución de programas por usuarios no conectados."
+msgstr ""
+"Necesita autenticarse para la ejecución de programas por usuarios no "
+"conectados."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -459,7 +582,8 @@ msgstr "Permitir la conexión de dispositivos a los puestos de trabajo"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Necesita autenticarse para conectar un dispositivo a un puesto de trabajo."
+msgstr ""
+"Necesita autenticarse para conectar un dispositivo a un puesto de trabajo."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -467,7 +591,9 @@ msgstr "Refrescar los dispositivos asociados a cada puesto de trabajo"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Necesita autenticarse para reconfigurar los dispositivos asociados a cada puesto de trabajo."
+msgstr ""
+"Necesita autenticarse para reconfigurar los dispositivos asociados a cada "
+"puesto de trabajo."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -482,16 +608,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Apagar el sistema mientras todavía hay usuarios conectados"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Necesita autenticarse para apagar el sistema mientras todavía hay usuarios conectados."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Necesita autenticarse para apagar el sistema mientras todavía hay usuarios "
+"conectados."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Apagar el sistema a pesar de que una aplicación lo impide"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Necesita autenticarse para apagar el sistema a pesar de que una aplicación lo impide."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Necesita autenticarse para apagar el sistema a pesar de que una aplicación "
+"lo impide."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -506,16 +640,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Reiniciar el sistema mientras todavía hay usuarios conectados"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Necesita autenticarse para reiniciar el sistema mientras todavía hay usuarios conectados."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Necesita autenticarse para reiniciar el sistema mientras todavía hay "
+"usuarios conectados."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Reiniciar el sistema a pesar de que una aplicación lo impide"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Necesita autenticarse para reiniciar el sistema a pesar de que una aplicación lo impide."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Necesita autenticarse para reiniciar el sistema a pesar de que una "
+"aplicación lo impide."
#: src/login/org.freedesktop.login1.policy:235
#, fuzzy
@@ -534,8 +676,12 @@ msgstr "Hibernar el sistema mientras todavía hay usuarios conectados"
#: src/login/org.freedesktop.login1.policy:247
#, fuzzy
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Se requiere autenticación para hibernar el sistema mientras todavía hay usuarios conectados."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Se requiere autenticación para hibernar el sistema mientras todavía hay "
+"usuarios conectados."
#: src/login/org.freedesktop.login1.policy:257
#, fuzzy
@@ -544,8 +690,12 @@ msgstr "Hibernar el sistema a pesar de que una aplicación lo impide"
#: src/login/org.freedesktop.login1.policy:258
#, fuzzy
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Se requiere autenticación para hibernar el sistema a pesar de que una aplicación lo impide."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Se requiere autenticación para hibernar el sistema a pesar de que una "
+"aplicación lo impide."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -560,16 +710,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspender el sistema mientras todavía hay usuarios conectados"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Necesita autenticarse para suspender el sistema mientras todavía hay usuarios conectados."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Necesita autenticarse para suspender el sistema mientras todavía hay "
+"usuarios conectados."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Suspender el sistema a pesar de que una aplicación lo impide"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Necesita autenticarse para suspender el sistema a pesar de que una aplicación lo impide."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Necesita autenticarse para suspender el sistema a pesar de que una "
+"aplicación lo impide."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -584,16 +742,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernar el sistema mientras todavía hay usuarios conectados"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Necesita autenticarse para hibernar el sistema mientras todavía hay usuarios conectados."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Necesita autenticarse para hibernar el sistema mientras todavía hay usuarios "
+"conectados."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernar el sistema a pesar de que una aplicación lo impide"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Necesita autenticarse para hibernar el sistema a pesar de que una aplicación lo impide."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Necesita autenticarse para hibernar el sistema a pesar de que una aplicación "
+"lo impide."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -601,7 +767,9 @@ msgstr "Administrar sesiones activas, usuarios y puestos de trabajo"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Necesita autenticarse para administrar las sesiones activas, usuarios y puestos de trabajo."
+msgstr ""
+"Necesita autenticarse para administrar las sesiones activas, usuarios y "
+"puestos de trabajo."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -617,32 +785,46 @@ msgstr "Establecer la «razón» de reinicio en el núcleo"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Necesita autenticarse para establecer la «razón» de reinicio en el núcleo."
+msgstr ""
+"Necesita autenticarse para establecer la «razón» de reinicio en el núcleo."
#: src/login/org.freedesktop.login1.policy:363
#, fuzzy
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Permitir indicación al firmware para arrancar la interfaz de configuración"
+msgstr ""
+"Permitir indicación al firmware para arrancar la interfaz de configuración"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Necesita autenticarse para indicar al firmware que arranque la interfaz de configuración."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Necesita autenticarse para indicar al firmware que arranque la interfaz de "
+"configuración."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indicar al cargador de arranque que inicie el menú de selección"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Necesita autenticarse para indicar al cargador de arranque que inicie el menú de selección."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Necesita autenticarse para indicar al cargador de arranque que inicie el "
+"menú de selección."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indicar al cargador de arranque que inicie una entrada concreta"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Necesita autenticarse para indicar al cargador de arranque que inicie una entrada concreta."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Necesita autenticarse para indicar al cargador de arranque que inicie una "
+"entrada concreta."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -682,7 +864,9 @@ msgstr "Se adquiere un intérprete de órdenes en un contenedor local"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Necesita autenticarse para adquirir un intérprete de órdenes en un contenedor local."
+msgstr ""
+"Necesita autenticarse para adquirir un intérprete de órdenes en un "
+"contenedor local."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -690,15 +874,19 @@ msgstr "Se adquiere un intérprete de órdenes en el equipo local"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Necesita autenticarse para adquirir un intérprete de órdenes del equipo local."
+msgstr ""
+"Necesita autenticarse para adquirir un intérprete de órdenes del equipo "
+"local."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Se adquiere un seudo-TTY en el contenedor local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Necesita autenticarse para adquirir un seudo-TTY en el contenedor local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Necesita autenticarse para adquirir un seudo-TTY en el contenedor local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -713,16 +901,23 @@ msgid "Manage local virtual machines and containers"
msgstr "Administrar máquinas virtuales y contenedores locales"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Necesita autenticarse para administrar las máquinas virtuales y los contenedores locales."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Necesita autenticarse para administrar las máquinas virtuales y los "
+"contenedores locales."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Administrar imágenes de máquina virtual y de contenedores locales"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Necesita autenticarse para administrar las imágenes de máquina virtual y de contenedores locales."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Necesita autenticarse para administrar las imágenes de máquina virtual y de "
+"contenedores locales."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -810,7 +1005,9 @@ msgstr "Establecer anclas de confianza negativas de DNSSEC"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Necesita autenticarse para establecer las anclas de confianza negativas de DNSSEC."
+msgstr ""
+"Necesita autenticarse para establecer las anclas de confianza negativas de "
+"DNSSEC."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -867,7 +1064,9 @@ msgstr "Inspeccionar una imagen de servicio portátil"
#: src/portable/org.freedesktop.portable1.policy:14
#, fuzzy
msgid "Authentication is required to inspect a portable service image."
-msgstr "Se requiere autenticación para importar una imagen de máquina virtual o de contenedor"
+msgstr ""
+"Se requiere autenticación para importar una imagen de máquina virtual o de "
+"contenedor"
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
@@ -875,8 +1074,11 @@ msgstr "Adjuntar o desadjuntar una imagen de servicio portátil"
#: src/portable/org.freedesktop.portable1.policy:24
#, fuzzy
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Se requiere autenticación para conectar un dispositivo a un puesto de trabajo."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Se requiere autenticación para conectar un dispositivo a un puesto de "
+"trabajo."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
@@ -884,8 +1086,11 @@ msgstr "Eliminar o modificar imagen de servicio portátil"
#: src/portable/org.freedesktop.portable1.policy:35
#, fuzzy
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Se requiere autenticación para descargar una imagen de máquina virtual o de contenedor"
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Se requiere autenticación para descargar una imagen de máquina virtual o de "
+"contenedor"
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -935,61 +1140,80 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Establecer reloj del sistema en formato de hora local/tiempo UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Necesita autenticarse para establecer el reloj del sistema en formato de hora local o tiempo UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Necesita autenticarse para establecer el reloj del sistema en formato de "
+"hora local o tiempo UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Activar/desactivar la sincronización de hora por red"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Necesita autenticarse para activar/desactivar la sincronización de hora por red."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Necesita autenticarse para activar/desactivar la sincronización de hora por "
+"red."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Necesita autenticarse para iniciar «$(unit)»."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Necesita autenticarse para detener «$(unit)»."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Necesita autenticarse para recargar «$(unit)»."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Necesita autenticarse para reiniciar «$(unit)»."
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
#, fuzzy
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Se requiere autenticación para establecer las propiedades de '$(unit)'."
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Se requiere autenticación para establecer las propiedades de '$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Necesita autenticarse para reiniciar el estado de «fallido» de «$(unit)»."
+msgstr ""
+"Necesita autenticarse para reiniciar el estado de «fallido» de «$(unit)»."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Necesita autenticarse para establecer las propiedades de «$(unit)»."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Se requiere autenticación para reiniciar el estado de «fallido» de '$(unit)'."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Se requiere autenticación para reiniciar el estado de «fallido» de '$(unit)'."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Se requiere autenticación para reiniciar el estado de «fallido» de '$(unit)'."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Se requiere autenticación para reiniciar el estado de «fallido» de '$(unit)'."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Se requiere autenticación para matar a '$(unit)'."
#~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
-#~ msgstr "Presione Ctrl+C para cancelar todas las comprobaciones del sistema de archivos en curso"
+#~ msgstr ""
+#~ "Presione Ctrl+C para cancelar todas las comprobaciones del sistema de "
+#~ "archivos en curso"
#~ msgid "Checking in progress on %d disk (%3.1f%% complete)"
#~ msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
diff --git a/po/et.po b/po/et.po
index 9324b28ba1..f37b48bed5 100644
--- a/po/et.po
+++ b/po/et.po
@@ -4,10 +4,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2022-10-24 15:23+0000\n"
"Last-Translator: H A <contact+fedora@hen.ee>\n"
-"Language-Team: Estonian <https://translate.fedoraproject.org/projects/systemd/master/et/>\n"
+"Language-Team: Estonian <https://translate.fedoraproject.org/projects/"
+"systemd/master/et/>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,8 @@ msgid "Send passphrase back to system"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -29,7 +31,8 @@ msgstr "Halda süsteemi teenuseid või teisi ühikuid"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Autentimine on vajalik, et hallata süsteemi teenuseid või teisi ühikuid."
+msgstr ""
+"Autentimine on vajalik, et hallata süsteemi teenuseid või teisi ühikuid."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -44,8 +47,12 @@ msgid "Set or unset system and service manager environment variables"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Autentimine on vajalik, et määrata või kustutada süsteemi- või teenusehalduri keskkonnamuutujaid."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Autentimine on vajalik, et määrata või kustutada süsteemi- või "
+"teenusehalduri keskkonnamuutujaid."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -61,7 +68,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Autentimine on vajalik, et laadida systemd olekut uuesti."
#: src/home/org.freedesktop.home1.policy:13
@@ -85,7 +93,8 @@ msgid "Check credentials of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr ""
#: src/home/org.freedesktop.home1.policy:43
@@ -109,151 +118,180 @@ msgid "Change password of a home area"
msgstr "Muuda koduala parooli"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "Autentimine on vajalik, et muuta kasutaja koduala parooli."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Autentmine on vajalik, et uuendada kasutaja koduala."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Loo koduala"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Autentimine on vajalik, et luua kasutaja koduala."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -270,8 +308,12 @@ msgid "Set static hostname"
msgstr "Säti staatiline hostinimi"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Autentmine on vajalik, et sättida staatiline konfigureeritud kohalikku hostinime ja ka kena hostinime."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Autentmine on vajalik, et sättida staatiline konfigureeritud kohalikku "
+"hostinime ja ka kena hostinime."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -306,29 +348,45 @@ msgid "Authentication is required to get system description."
msgstr "Autentimine on vajalik, et hankida süsteemi kirjeldust."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Impordi VM või konteinerpilti"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Autentmine on vajalik, et importida VM või konteinerpilti"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Ekspordi VM või konteinerpilti"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Autentmine on vajalik, et eksportida VM või konteinerpilti"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Lae alla VM või konteinerpildi"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Autentmine on vajalik, et laadida alla VM või konteinerpildi"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Autentimine on vajalik, et muuta kasutaja koduala parooli."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Määra süsteemi lokaali"
@@ -350,7 +408,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Luba rakendustel takistada süsteemi välja lülitamist"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr ""
#: src/login/org.freedesktop.login1.policy:33
@@ -382,15 +441,20 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Luba rakendustel takistada automaatset süsteemiuinakut"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Autentimine on vajalik, et rakendus takistaks automaatset süsteemiuinakut."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Autentimine on vajalik, et rakendus takistaks automaatset süsteemiuinakut."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Luba rakendustel blokeerida süsteemi toitenuppu"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr "Autentimine on vajalik, et rakendus blokeeriks süsteemi toitenuppu."
#: src/login/org.freedesktop.login1.policy:86
@@ -398,7 +462,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Luba rakendustel blokeerida süsteemi uinakunuppu"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr "Autentimine on vajalik, et rakendus blokeeriks süsteemi uinakunuppu."
#: src/login/org.freedesktop.login1.policy:97
@@ -406,7 +472,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:107
@@ -414,7 +482,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr ""
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr ""
#: src/login/org.freedesktop.login1.policy:117
@@ -422,7 +492,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:128
@@ -439,7 +511,9 @@ msgstr "Luba mitte sisse logitud kasutajadel programme käivitada"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Autentimine on vajalik, et käivitada programme mitte sisse logitud kasutajana."
+msgstr ""
+"Autentimine on vajalik, et käivitada programme mitte sisse logitud "
+"kasutajana."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -470,15 +544,21 @@ msgid "Power off the system while other users are logged in"
msgstr "Lülita välja süsteem, isegi kui teised kasutajad on sisse logitud"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Autentimine on vajalik, et lülitada süsteemi välja, kui teised kasutajad on sisse logitud."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Autentimine on vajalik, et lülitada süsteemi välja, kui teised kasutajad on "
+"sisse logitud."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:202
@@ -494,16 +574,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Taaskäivita süsteem, isegi kui teised kasutajad on sisse logitud"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Autentimine on vajalik, et taaskäivitada süsteemi, kui teised kasutajad on sisse logitud."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Autentimine on vajalik, et taaskäivitada süsteemi, kui teised kasutajad on "
+"sisse logitud."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Taaskäivita süsteem, kui üks rakendus takistab seda"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Autentimine on vajalik, et taaskäivitada süsteemi, kui rakendus takistab seda."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentimine on vajalik, et taaskäivitada süsteemi, kui rakendus takistab "
+"seda."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -518,16 +606,23 @@ msgid "Halt the system while other users are logged in"
msgstr "Peata süsteem, isegi kui teised kasutajad on sisse logitud"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Autentimine on vajalik, et peatada süsteemi, kui teised kasutajad on sisse logitud."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Autentimine on vajalik, et peatada süsteemi, kui teised kasutajad on sisse "
+"logitud."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Peata süsteem, kui üks rakendus takistab seda"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Autentimine on vajalik, et peatada süsteemi, kui üks rakendus takistab seda."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentimine on vajalik, et peatada süsteemi, kui üks rakendus takistab seda."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -542,7 +637,9 @@ msgid "Suspend the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:289
@@ -550,7 +647,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:300
@@ -566,7 +665,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:321
@@ -574,7 +675,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:332
@@ -583,7 +686,8 @@ msgstr "Halda aktiivseid seansse, kasutajaid ja kohti"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Autentimine on vajalik, et hallata aktiivseid seansse, kasutajaid ning kohti."
+msgstr ""
+"Autentimine on vajalik, et hallata aktiivseid seansse, kasutajaid ning kohti."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -599,14 +703,17 @@ msgstr "Määra taaskäivitamise \"põhjus\" kernelis"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Autentimine on vajalik, et määrata taaskäivitamise \"põhjuse\" kernelis."
+msgstr ""
+"Autentimine on vajalik, et määrata taaskäivitamise \"põhjuse\" kernelis."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr ""
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr ""
#: src/login/org.freedesktop.login1.policy:374
@@ -614,16 +721,24 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Viita buudilaadurile, et buutida buudilaaduri menüüsse"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Autentimine on vajalik, et viitata buudilaadurile, et buutida buudilaaduri menüüsse."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Autentimine on vajalik, et viitata buudilaadurile, et buutida buudilaaduri "
+"menüüsse."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Viita buudilaadurile, et buutida spetsiifiline valik"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Autentimine on vajalik, et viitata buudilaadurile, et buutida spetsiifilist buudilaaduri valikut."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Autentimine on vajalik, et viitata buudilaadurile, et buutida spetsiifilist "
+"buudilaaduri valikut."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -678,7 +793,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74
@@ -694,16 +810,23 @@ msgid "Manage local virtual machines and containers"
msgstr "Halda kohalikke virtuaalsüsteeme ja konteinereid"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Autentimine on vajalik, et hallata kohalikke virtuaalsüsteeme ja konteinereid."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Autentimine on vajalik, et hallata kohalikke virtuaalsüsteeme ja "
+"konteinereid."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Halda kohalikke virtuaalmasinaid ja konteinerpilte"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Autentimine on vajalik, et hallata kohalikke virtuaalmasinaid ja konteinerpilte."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Autentimine on vajalik, et hallata kohalikke virtuaalmasinaid ja "
+"konteinerpilte."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -791,7 +914,8 @@ msgstr "Säti DNSSEC negatiivsed usaldusankrud"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Autentimine on vajalik, et seadistada DNSSEC negatiivsed usaldusankrud."
+msgstr ""
+"Autentimine on vajalik, et seadistada DNSSEC negatiivsed usaldusankrud."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -854,7 +978,8 @@ msgid "Attach or detach a portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:34
@@ -862,7 +987,8 @@ msgid "Delete or modify portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -910,49 +1036,63 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Määra RTC (reaalaja kella) kohaliku ajavööndina või UTC'na"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Autentimine on vajalik, et kontrollida kas RTC hoiab kohalikku või UTC aega."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Autentimine on vajalik, et kontrollida kas RTC hoiab kohalikku või UTC aega."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Lülita võrgu ajasünkroneerimine sisse või välja"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Autentimine on vajalik, et kontrollida kas võrgu ajasünkroneerimine peaks olema lubatud."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Autentimine on vajalik, et kontrollida kas võrgu ajasünkroneerimine peaks "
+"olema lubatud."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Autentimine on vajalik, et käivitada '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Autentimine on vajalik, et peatada '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Autentimine on vajalik, et laadida '$(unit)' uuesti."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Autentimine on vajalik, et restartida '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Autentimine on vajalik, et saata UNIX signaali '$(unit)' protsessidele."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Autentimine on vajalik, et saata UNIX signaali '$(unit)' protsessidele."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Autentimine on vajalik, et lähtestada '$(unit)' \"ebaõnnestunud\" olekut."
+msgstr ""
+"Autentimine on vajalik, et lähtestada '$(unit)' \"ebaõnnestunud\" olekut."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Autentimine on vajalik, et määrata '$(unit)' omadusi."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr "Autentimine on vajalik, et kustutada '$(unit)' faile ja kauste."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr ""
diff --git a/po/eu.po b/po/eu.po
index fc067188de..8e50697a77 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -5,10 +5,11 @@ msgid ""
msgstr ""
"Project-Id-Version: systemd\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-06-03 15:48+0000\n"
"Last-Translator: Asier Sarasua Garmendia <asier.sarasua@gmail.com>\n"
-"Language-Team: Basque <https://translate.fedoraproject.org/projects/systemd/master/eu/>\n"
+"Language-Team: Basque <https://translate.fedoraproject.org/projects/systemd/"
+"master/eu/>\n"
"Language: eu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,8 +22,10 @@ msgid "Send passphrase back to system"
msgstr "Bidali pasaesaldia bueltan sistemara"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Autentifikazioa behar da sartutako pasaesaldia bueltan sistemara bidaltzeko."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Autentifikazioa behar da sartutako pasaesaldia bueltan sistemara bidaltzeko."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -30,7 +33,9 @@ msgstr "Kudeatu sistema-zerbitzuak edo beste unitate batzuk"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Autentifikazioa behar da sistema-zerbitzuak edo beste unitate batzuk kudeatzeko."
+msgstr ""
+"Autentifikazioa behar da sistema-zerbitzuak edo beste unitate batzuk "
+"kudeatzeko."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -38,15 +43,23 @@ msgstr "Kudeatu sistema-zerbitzua edo unitate-fitxategiak"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Autentifikazioa behar da sistema-zerbitzua edo unitate-fitxategiak kudeatzeko."
+msgstr ""
+"Autentifikazioa behar da sistema-zerbitzua edo unitate-fitxategiak "
+"kudeatzeko."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Ezarri edo kendu ezarpena sistema- eta zerbitzu-kudeatzailearen ingurune-aldagaiei"
+msgstr ""
+"Ezarri edo kendu ezarpena sistema- eta zerbitzu-kudeatzailearen ingurune-"
+"aldagaiei"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Autentifikazioa behar da sistema- eta zerbitzu-kudeatzailearen ingurune-aldagaiak ezartzeko edo ezarpena kentzeko."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Autentifikazioa behar da sistema- eta zerbitzu-kudeatzailearen ingurune-"
+"aldagaiak ezartzeko edo ezarpena kentzeko."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -62,7 +75,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Autentifikazioa behar da systemd egoera birkargatzeko."
#: src/home/org.freedesktop.home1.policy:13
@@ -86,7 +100,8 @@ msgid "Check credentials of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr ""
#: src/home/org.freedesktop.home1.policy:43
@@ -110,151 +125,179 @@ msgid "Change password of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr ""
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Autentifikazioa behar da ostalari-izena ezartzeko."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Autentifikazioa behar da sistemaren eskualde-ezarpenak ezartzeko."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -271,8 +314,12 @@ msgid "Set static hostname"
msgstr "Ezarri ostalari-izen estatikoa"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Autentifikazioa behar da estatikoki konfiguratutako ostalari-izen lokala ezartzeko, bai eta ostalari-izen polita ezartzeko ere."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Autentifikazioa behar da estatikoki konfiguratutako ostalari-izen lokala "
+"ezartzeko, bai eta ostalari-izen polita ezartzeko ere."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -307,29 +354,42 @@ msgid "Authentication is required to get system description."
msgstr "Autentifikazioa behar da sistemaren deskribapena eskuratzeko."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr ""
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr "Autentifikazioa behar da sistema itzaltzeko."
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr ""
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr "Autentifikazioa behar da sistema itzaltzeko."
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr "Autentifikazioa behar da systemd egoera birkargatzeko."
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
msgstr ""
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Autentifikazioa behar da ostalari-izena ezartzeko."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Ezarri sistemaren eskualde-ezarpenak"
@@ -351,7 +411,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr ""
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr ""
#: src/login/org.freedesktop.login1.policy:33
@@ -360,7 +421,8 @@ msgstr "Onartu aplikazioek sistemaren itxiera atzeratu dezaten"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Autentifikazioa behar da aplikazioek sistemaren itxiera atzeratu dezaten."
+msgstr ""
+"Autentifikazioa behar da aplikazioek sistemaren itxiera atzeratu dezaten."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -383,7 +445,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr ""
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr ""
#: src/login/org.freedesktop.login1.policy:75
@@ -391,7 +455,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:86
@@ -399,7 +465,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:97
@@ -407,7 +475,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:107
@@ -415,7 +485,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr ""
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr ""
#: src/login/org.freedesktop.login1.policy:117
@@ -423,7 +495,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:128
@@ -471,15 +545,21 @@ msgid "Power off the system while other users are logged in"
msgstr "Itzali sistema beste erabiltzaile batzuk saioa hasita dutenean"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Autentifikazioa behar da beste erabiltzaile batzuk saioa hasita dutenean sistema itzaltzeko."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Autentifikazioa behar da beste erabiltzaile batzuk saioa hasita dutenean "
+"sistema itzaltzeko."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:202
@@ -495,7 +575,9 @@ msgid "Reboot the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:224
@@ -503,7 +585,9 @@ msgid "Reboot the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:235
@@ -519,7 +603,9 @@ msgid "Halt the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:257
@@ -527,7 +613,9 @@ msgid "Halt the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:268
@@ -543,7 +631,9 @@ msgid "Suspend the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:289
@@ -551,7 +641,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:300
@@ -567,7 +659,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:321
@@ -575,7 +669,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:332
@@ -607,7 +703,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr ""
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr ""
#: src/login/org.freedesktop.login1.policy:374
@@ -615,7 +713,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr ""
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr ""
#: src/login/org.freedesktop.login1.policy:385
@@ -623,7 +723,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr ""
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr ""
#: src/login/org.freedesktop.login1.policy:396
@@ -679,7 +781,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74
@@ -695,7 +798,8 @@ msgid "Manage local virtual machines and containers"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:95
@@ -703,7 +807,9 @@ msgid "Manage local virtual machine and container images"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr ""
#: src/network/org.freedesktop.network1.policy:22
@@ -855,7 +961,8 @@ msgid "Attach or detach a portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:34
@@ -863,7 +970,8 @@ msgid "Delete or modify portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -911,7 +1019,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -919,41 +1029,48 @@ msgid "Turn network time synchronization on or off"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr ""
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr ""
diff --git a/po/fi.po b/po/fi.po
index 62da39bc32..49bda1f8f7 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -6,10 +6,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-08-21 17:21+0000\n"
"Last-Translator: Jan Kuparinen <copper_fin@hotmail.com>\n"
-"Language-Team: Finnish <https://translate.fedoraproject.org/projects/systemd/master/fi/>\n"
+"Language-Team: Finnish <https://translate.fedoraproject.org/projects/systemd/"
+"master/fi/>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,8 +23,11 @@ msgid "Send passphrase back to system"
msgstr "Lähetä tunnuslause takaisin järjestelmään"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Todennus vaaditaan jotta syötetty tunnuslause lähetetään takaisin järjestelmään."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Todennus vaaditaan jotta syötetty tunnuslause lähetetään takaisin "
+"järjestelmään."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -31,7 +35,8 @@ msgstr "Hallinnoi järjestelmäpalveluja tai muita yksiköitä"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Todennus vaaditaan järjestelmäpalvelujen tai muiden yksiköiden hallintaan."
+msgstr ""
+"Todennus vaaditaan järjestelmäpalvelujen tai muiden yksiköiden hallintaan."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -39,15 +44,20 @@ msgstr "Hallitse järjestelmäpalvelu- tai yksikkötiedostoja"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Todennus vaaditaan järjestelmän palvelu- tai yksikkötiedostojen hallintaan."
+msgstr ""
+"Todennus vaaditaan järjestelmän palvelu- tai yksikkötiedostojen hallintaan."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Aseta tai poista järjestelmän ja palvelunhallinnan ympäristömuuttujia"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Todennus vaaditaan järjestelmän ja palvelunhallinnan ympäristömuuttujien asettamiseen tai poistamiseen."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Todennus vaaditaan järjestelmän ja palvelunhallinnan ympäristömuuttujien "
+"asettamiseen tai poistamiseen."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -62,8 +72,10 @@ msgid "Dump the systemd state without rate limits"
msgstr "Dumppaa systemd-tila ilman nopeusrajoituksia"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Todennus vaaditaan järjestelmätilan tyhjentämiseksi ilman nopeusrajoituksia."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Todennus vaaditaan järjestelmätilan tyhjentämiseksi ilman nopeusrajoituksia."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -86,8 +98,10 @@ msgid "Check credentials of a home area"
msgstr "Tarkista kotialueen valtuudet"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Todennus vaaditaan, jotta käyttäjän kotialueen valtuuksia voi tarkistaa."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Todennus vaaditaan, jotta käyttäjän kotialueen valtuuksia voi tarkistaa."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -110,151 +124,200 @@ msgid "Change password of a home area"
msgstr "Muuta kotialueen salasana"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "Todennus vaaditaan käyttäjän kotialueen salasanan vaihtamiseksi."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Todennus vaaditaan käyttäjän kotialueen päivittämiseksi."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Luo kotialue"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Todennus vaaditaan käyttäjän kotialueen luomiseksi."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "Käyttäjän %s kotihakemisto ei ole tällä hetkellä saatavissa, liitä tarvittava tallennuslaite tai taustatiedostojärjestelmä."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"Käyttäjän %s kotihakemisto ei ole tällä hetkellä saatavissa, liitä "
+"tarvittava tallennuslaite tai taustatiedostojärjestelmä."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Liian nopeat peräkkäiset kirjautumisyritykset käyttäjälle %s, yritä uudelleen myöhemmin."
+msgstr ""
+"Liian nopeat peräkkäiset kirjautumisyritykset käyttäjälle %s, yritä "
+"uudelleen myöhemmin."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Salasana: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "Salasana on virheellinen tai ei riitä käyttäjän %s todentamiseen."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Yritä uudelleen: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Palautusavain: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Salasana/palautusavain on virheellinen tai se ei riitä käyttäjän %s todentamiseen."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Salasana/palautusavain on virheellinen tai se ei riitä käyttäjän %s "
+"todentamiseen."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Anna palautusavain uudelleen: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Käyttäjän %s suojaustunnusta ei ole laitettu sisään."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Yritä uudelleen salasanalla: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Salasana on virheellinen tai riittämätön, eikä käyttäjän %s määritettyä suojaustunnusta ei ole laitettu sisään."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Salasana on virheellinen tai riittämätön, eikä käyttäjän %s määritettyä "
+"suojaustunnusta ei ole laitettu sisään."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "Turvatunnuksen PIN-koodi: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "Todenna fyysisesti käyttäjän %s suojaustunnuksella."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Vahvista käyttäjän %s suojaustunnuksen olemassaolo."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Vahvista käyttäjä käyttäjän %s suojaustunnuksella."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "Turvatunnuksen PIN-koodi on lukittu, avaa se ensin. (Vihje: Poistaminen ja uudelleen asettaminen saattaa riittää.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"Turvatunnuksen PIN-koodi on lukittu, avaa se ensin. (Vihje: Poistaminen ja "
+"uudelleen asettaminen saattaa riittää.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Suojaustunnuksen PIN-koodi virheellinen käyttäjälle %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Yritä uudelleen suojaustunnuksen PIN-koodi: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "Käyttäjän %s suojaustunnuksen PIN-koodi on virheellinen (vain muutama yritys jäljellä!)"
+msgstr ""
+"Käyttäjän %s suojaustunnuksen PIN-koodi on virheellinen (vain muutama yritys "
+"jäljellä!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "Käyttäjän %s suojaustunnuksen PIN-koodi on virheellinen (vain yksi yritys jäljellä!)"
+msgstr ""
+"Käyttäjän %s suojaustunnuksen PIN-koodi on virheellinen (vain yksi yritys "
+"jäljellä!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "Käyttäjän %s kotihakemisto ei ole tällä hetkellä aktiivinen, kirjaudu ensin paikallisesti sisään."
+msgstr ""
+"Käyttäjän %s kotihakemisto ei ole tällä hetkellä aktiivinen, kirjaudu ensin "
+"paikallisesti sisään."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "Käyttäjän %s kotihakemisto on tällä hetkellä lukittu, avaa lukitus ensin paikallisesti."
+msgstr ""
+"Käyttäjän %s kotihakemisto on tällä hetkellä lukittu, avaa lukitus ensin "
+"paikallisesti."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Liian monta epäonnistunutta kirjautumisyritystä käyttäjälle %s, kieltäydytään."
+msgstr ""
+"Liian monta epäonnistunutta kirjautumisyritystä käyttäjälle %s, "
+"kieltäydytään."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Käyttäjätietue on estetty, mikä estää pääsyn."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Käyttäjätietue ei ole vielä voimassa, mikä estää pääsyn."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Käyttäjätietue ei ole enää voimassa, mikä estää pääsyn."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Käyttäjätietue ei ole voimassa, mikä estää pääsyn."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Liian monta kirjautumista, yritä uudelleen ajassa %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Salasanan vaihto vaaditaan."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Salasana vanhentunut, vaaditaan vaihto."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "Salasana on vanhentunut, mutta ei voi vaihtaa, estetään kirjautuminen."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Salasana vanhenee pian, vaihda se."
@@ -271,8 +334,12 @@ msgid "Set static hostname"
msgstr "Aseta staattinen koneen nimi"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Todennus vaaditaan staattisesti määritetyn paikallisen konenimen ja kauniin konenimen asettamiseksi."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Todennus vaaditaan staattisesti määritetyn paikallisen konenimen ja kauniin "
+"konenimen asettamiseksi."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -307,28 +374,47 @@ msgid "Authentication is required to get system description."
msgstr "Järjestelmän kuvauksen saamiseksi vaaditaan todennus."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Tuo virtuaalikoneen tai kontin levykuva"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Todennus vaaditaan, jos haluat tuoda virtuaalikoneen tai kontin levykuvan"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Todennus vaaditaan, jos haluat tuoda virtuaalikoneen tai kontin levykuvan"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Vie virtuaalikoneen tai kontin levykuva"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Todennus vaaditaan, jos haluat viedä virtuaalikoneen tai kontin levykuvan"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Todennus vaaditaan, jos haluat viedä virtuaalikoneen tai kontin levykuvan"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Lataa virtuaalikoneen tai kontin levykuva"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Todennus vaaditaan, jos haluat ladata virtuaalikoneen tai kontin levykuvan"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Todennus vaaditaan, jos haluat ladata virtuaalikoneen tai kontin levykuvan"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Todennus vaaditaan käyttäjän kotialueen salasanan vaihtamiseksi."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -351,7 +437,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Salli sovellusten estää järjestelmän sammuttaminen"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän sammutuksen."
#: src/login/org.freedesktop.login1.policy:33
@@ -360,7 +447,8 @@ msgstr "Salli sovellusten viivyttää järjestelmän sammuttaminen"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Todennus vaaditaan, jotta sovellus viivyttäisi järjestelmän sammutuksen."
+msgstr ""
+"Todennus vaaditaan, jotta sovellus viivyttäisi järjestelmän sammutuksen."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -383,7 +471,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Salli sovellusten estää järjestelmän automaattinen pysäyttäminen"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän pysäyttämisen."
#: src/login/org.freedesktop.login1.policy:75
@@ -391,40 +481,59 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr "Salli sovellusten estää järjestelmän virtapainikkeen käyttö"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän virtapainikkeen käytön."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Todennus vaaditaan, jotta sovellus estää järjestelmän virtapainikkeen käytön."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Salli sovellusten estää järjestelmän pysäytyspainikkeen käyttö"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän pysäytyspainikkeen käytön."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Todennus vaaditaan, jotta sovellus estää järjestelmän pysäytyspainikkeen "
+"käytön."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Salli sovellusten estää järjestelmän horrostilapainikkeen käyttö"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän horrostilapainikkeen käytön."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Todennus vaaditaan, jotta sovellus estää järjestelmän horrostilapainikkeen "
+"käytön."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Salli sovellusten estää järjestelmän kansikytkimen käyttö"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän kansikytkimen käytön."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Todennus vaaditaan, jotta sovellus estää järjestelmän kansikytkimen käytön."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Salli sovellusten estää järjestelmän uudelleenkäynnistyspainikkeen käyttö"
+msgstr ""
+"Salli sovellusten estää järjestelmän uudelleenkäynnistyspainikkeen käyttö"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Todennus vaaditaan, jotta sovellus estää järjestelmän uudelleenkäynnistyspainikkeen käytön."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Todennus vaaditaan, jotta sovellus estää järjestelmän "
+"uudelleenkäynnistyspainikkeen käytön."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -432,7 +541,9 @@ msgstr "Salli sisäänkirjautumattomien käyttäjien suorittaa ohjelmia"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Ohjelmien suorittamiseen sisäänkirjautumattomana käyttäjänä tarvitaan nimenomainen pyyntö."
+msgstr ""
+"Ohjelmien suorittamiseen sisäänkirjautumattomana käyttäjänä tarvitaan "
+"nimenomainen pyyntö."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -440,7 +551,9 @@ msgstr "Salli sisäänkirjautumattomien käyttäjien suorittaa ohjelmia"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Todennus vaaditaan ohjelmien suorittamiseen sisäänkirjautumattomana käyttäjänä."
+msgstr ""
+"Todennus vaaditaan ohjelmien suorittamiseen sisäänkirjautumattomana "
+"käyttäjänä."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -456,7 +569,8 @@ msgstr "Poista laitteen ja paikan liitokset"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Todennus vaaditaan nollaamaan, miten laitteet on yhdistetty paikkoihin."
+msgstr ""
+"Todennus vaaditaan nollaamaan, miten laitteet on yhdistetty paikkoihin."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -471,16 +585,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Sammuta järjestelmä, vaikka muita käyttäjiä on kirjautuneena sisään"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Todennus vaaditaan järjestelmän sammuttamiseksi, kun muita käyttäjiä on kirjautuneena sisään."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Todennus vaaditaan järjestelmän sammuttamiseksi, kun muita käyttäjiä on "
+"kirjautuneena sisään."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Sammuta järjestelmä, vaikka joku sovellus estää sen"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Todennus vaaditaan järjestelmän sammuttamiseksi, kun joku sovellus estää tämän."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Todennus vaaditaan järjestelmän sammuttamiseksi, kun joku sovellus estää "
+"tämän."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -492,19 +614,29 @@ msgstr "Todennus vaaditaan järjestelmän uudelleen käynnistämiseksi."
#: src/login/org.freedesktop.login1.policy:213
msgid "Reboot the system while other users are logged in"
-msgstr "Käynnistä järjestelmä uudelleen, vaikka muita käyttäjiä on kirjautuneena sisään"
+msgstr ""
+"Käynnistä järjestelmä uudelleen, vaikka muita käyttäjiä on kirjautuneena "
+"sisään"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Todennus vaaditaan järjestelmän uudelleen käynnistämiseksi, kun muita käyttäjiä on kirjautuneena sisään."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Todennus vaaditaan järjestelmän uudelleen käynnistämiseksi, kun muita "
+"käyttäjiä on kirjautuneena sisään."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Käynnistä järjestelmä uudelleen, vaikka joku sovellus estää sen"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Todennus vaaditaan järjestelmän uudelleen käynnistämisksi, kun joku sovellus estää tämän."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Todennus vaaditaan järjestelmän uudelleen käynnistämisksi, kun joku sovellus "
+"estää tämän."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -519,16 +651,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Pysäytä järjestelmä, vaikka muita käyttäjiä on kirjautuneena sisään"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Todennus vaaditaan järjestelmän pysäyttämiseksi, kun muita käyttäjiä on kirjautuneena sisään."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Todennus vaaditaan järjestelmän pysäyttämiseksi, kun muita käyttäjiä on "
+"kirjautuneena sisään."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Pysäytä järjestelmä, vaikka joku sovellus estää sen"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Todennus vaaditaan järjestelmän pysäyttämiseksi, kun joku sovellus estää tämän."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Todennus vaaditaan järjestelmän pysäyttämiseksi, kun joku sovellus estää "
+"tämän."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -540,19 +680,29 @@ msgstr "Todennus vaaditaan järjestelmän pysäyttämiseksi väliaikaisesti."
#: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while other users are logged in"
-msgstr "Pysäytä järjestelmä väliaikaisesti, vaikka muita käyttäjiä on kirjautuneena sisään"
+msgstr ""
+"Pysäytä järjestelmä väliaikaisesti, vaikka muita käyttäjiä on kirjautuneena "
+"sisään"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Todennus vaaditaan järjestelmän väliaikaiseksi pysäyttämiseksi, kun muita käyttäjiä on kirjautuneena sisään."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Todennus vaaditaan järjestelmän väliaikaiseksi pysäyttämiseksi, kun muita "
+"käyttäjiä on kirjautuneena sisään."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Pysäytä järjestelmä väliaikaisesti, vaikka joku sovellus estää sen"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Todennus vaaditaan järjestelmän väliaikaiseksi pysäyttämiseksi, kun joku sovellus estää tämän."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Todennus vaaditaan järjestelmän väliaikaiseksi pysäyttämiseksi, kun joku "
+"sovellus estää tämän."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -567,16 +717,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Horrosta järjestelmä, vaikka muita käyttäjiä on kirjautuneena sisään"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Todennus vaaditaan järjestelmän horrostamiseksi, kun muita käyttäjiä on kirjautuneena sisään."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Todennus vaaditaan järjestelmän horrostamiseksi, kun muita käyttäjiä on "
+"kirjautuneena sisään."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Horrosta järjestelmä, vaikka joku sovellus estää sen"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Todennus vaaditaan järjestelmän horrostamiseksi, kun joku sovellus estää tämän."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Todennus vaaditaan järjestelmän horrostamiseksi, kun joku sovellus estää "
+"tämän."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -584,7 +742,9 @@ msgstr "Hallinnoi aktiivisia istuntoja, käyttäjiä ja paikkoja"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Todennus vaaditaan aktiivisten istuntojen, käyttäjien ja paikkojen hallintaan."
+msgstr ""
+"Todennus vaaditaan aktiivisten istuntojen, käyttäjien ja paikkojen "
+"hallintaan."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -592,7 +752,8 @@ msgstr "Lukitse tai avaa aktiiviset istunnot"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Todennus vaaditaan aktiivisten istuntojen lukitsemiseksi tai avaamiseksi."
+msgstr ""
+"Todennus vaaditaan aktiivisten istuntojen lukitsemiseksi tai avaamiseksi."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -600,31 +761,46 @@ msgstr "Aseta uudelleenkäynnistyksen \"syy\" ytimeen"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Todennus vaaditaan, jotta ytimen uudelleenkäynnistyksen \"syy\" voidaan asettaa."
+msgstr ""
+"Todennus vaaditaan, jotta ytimen uudelleenkäynnistyksen \"syy\" voidaan "
+"asettaa."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Ilmoita laiteohjelmistolle, että käynnistyy asennusliittymään"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Todennus vaaditaan ilmoittamaan laiteohjelmistolle, että se käynnistyy asennusliittymään."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Todennus vaaditaan ilmoittamaan laiteohjelmistolle, että se käynnistyy "
+"asennusliittymään."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
-msgstr "Ilmoita käynnistyslataimelle, että se käynnistyy käynnistyslatausvalikkoon"
+msgstr ""
+"Ilmoita käynnistyslataimelle, että se käynnistyy käynnistyslatausvalikkoon"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Todennus vaaditaan ilmoittamaan käynnistyslataajalle, että se käynnistyy käynnistyslatausvalikkoon."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Todennus vaaditaan ilmoittamaan käynnistyslataajalle, että se käynnistyy "
+"käynnistyslatausvalikkoon."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Ilmoita käynnistyslataimelle, että käynnistää tietyn vaihtoehdon"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Todennus vaaditaan ilmoittamaan käynnistyslataajalle, että käynnistää tietyn vaihtoehdon."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Todennus vaaditaan ilmoittamaan käynnistyslataajalle, että käynnistää tietyn "
+"vaihtoehdon."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -679,7 +855,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Hanki pseudo TTY paikallisesta kontista"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "Paikallisen kontin pseudo TTY:n saaminen vaatii todentamisen."
#: src/machine/org.freedesktop.machine1.policy:74
@@ -695,16 +872,22 @@ msgid "Manage local virtual machines and containers"
msgstr "Hallitse paikallisia virtuaalikoneita ja kontteja"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Todennus vaaditaan paikallisten virtuaalikoneiden ja konttien hallintaan."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Todennus vaaditaan paikallisten virtuaalikoneiden ja konttien hallintaan."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Hallitse paikallisia virtuaalikoneita ja konttilevykuvia"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Todennus vaaditaan paikallisten virtuaalikoneiden ja konttilevykuvien hallintaan."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Todennus vaaditaan paikallisten virtuaalikoneiden ja konttilevykuvien "
+"hallintaan."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -752,7 +935,8 @@ msgstr "Ota LLMNR käyttöön tai poista se käytöstä"
#: src/network/org.freedesktop.network1.policy:67
#: src/resolve/org.freedesktop.resolve1.policy:78
msgid "Authentication is required to enable or disable LLMNR."
-msgstr "Todennus vaaditaan LLMNR:n ottamiseksi käyttöön tai poistamiseksi käytöstä."
+msgstr ""
+"Todennus vaaditaan LLMNR:n ottamiseksi käyttöön tai poistamiseksi käytöstä."
#: src/network/org.freedesktop.network1.policy:77
#: src/resolve/org.freedesktop.resolve1.policy:88
@@ -762,7 +946,9 @@ msgstr "Ota monilähetyksen DNS käyttöön tai poista se käytöstä"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Todennus vaaditaan, jotta monilähetys-DNS voidaan ottaa käyttöön tai poistaa käytöstä."
+msgstr ""
+"Todennus vaaditaan, jotta monilähetys-DNS voidaan ottaa käyttöön tai poistaa "
+"käytöstä."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -772,7 +958,9 @@ msgstr "Ota käyttöön/poista käytöstä DNS TLS:n kautta"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Todennus vaaditaan DNS:n käyttöön ottamiseksi tai poistamiseksi käytöstä TLS:n kautta."
+msgstr ""
+"Todennus vaaditaan DNS:n käyttöön ottamiseksi tai poistamiseksi käytöstä TLS:"
+"n kautta."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -782,7 +970,8 @@ msgstr "Ota DNSSEC käyttöön tai poista se käytöstä"
#: src/network/org.freedesktop.network1.policy:100
#: src/resolve/org.freedesktop.resolve1.policy:111
msgid "Authentication is required to enable or disable DNSSEC."
-msgstr "Todennus vaaditaan, jotta DNSSEC voidaan ottaa käyttöön tai poistaa käytöstä."
+msgstr ""
+"Todennus vaaditaan, jotta DNSSEC voidaan ottaa käyttöön tai poistaa käytöstä."
#: src/network/org.freedesktop.network1.policy:110
#: src/resolve/org.freedesktop.resolve1.policy:121
@@ -792,7 +981,8 @@ msgstr "Aseta DNSSEC-negatiiviset luottamusankkurit"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Todennus vaaditaan DNSSEC-negatiivisten luottamusankkureiden asettamiseksi."
+msgstr ""
+"Todennus vaaditaan DNSSEC-negatiivisten luottamusankkureiden asettamiseksi."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -855,16 +1045,22 @@ msgid "Attach or detach a portable service image"
msgstr "Liitä tai irrota kannettava palvelulevykuva"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Todennus vaaditaan kannettavan palvelulevykuvan liittämiseen tai irrottamiseen."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Todennus vaaditaan kannettavan palvelulevykuvan liittämiseen tai "
+"irrottamiseen."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Poista tai muokkaa kannettavaa palvelulevykuvaa"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Todennus vaaditaan, jos haluat poistaa tai muokata kannettavaa palvelulevykuvaa."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Todennus vaaditaan, jos haluat poistaa tai muokata kannettavaa "
+"palvelulevykuvaa."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -908,52 +1104,71 @@ msgstr "Todennus vaaditaan järjestelmän aikavyöhykkeen asettamiseksi."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
-msgstr "Aseta RTC(reaaliaikainen kello) paikalliseksi aikavyöhykkeeksi tai UTC:ksi"
+msgstr ""
+"Aseta RTC(reaaliaikainen kello) paikalliseksi aikavyöhykkeeksi tai UTC:ksi"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Todennus vaaditaan sen säätämiseksi, tallentaako RTC paikallisen vai UTC-ajan."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Todennus vaaditaan sen säätämiseksi, tallentaako RTC paikallisen vai UTC-"
+"ajan."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Ota verkon ajan synkronointi käyttöön tai poista se käytöstä"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Todennus vaaditaan sen hallitsemiseksi, onko verkkoajan synkronointi käytössä."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Todennus vaaditaan sen hallitsemiseksi, onko verkkoajan synkronointi "
+"käytössä."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Todennus vaaditaan $(unit):n aloittamiseksi."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Todennus vaaditaan $(unit):n lopettamiseksi."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Todennus vaaditaan $(unit):n uudelleen lataamiseksi."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Todennus vaaditaan $(unit):n uudelleen käynnistämiseksi."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Todennus vaaditaan UNIX-signaalin lähettämiseen '$(unit)'-prosesseihin."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Todennus vaaditaan UNIX-signaalin lähettämiseen '$(unit)'-prosesseihin."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "Todennus vaaditaan \"epäonnistuneen\" tilan \"$(unit)\" nollaamiseksi."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Todennus vaaditaan, jotta ominaisuudet asetetaan arvoon '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Todennus vaaditaan tiedostojen ja hakemistojen poistamiseen, jotka liittyvät '$(unit)':iin."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Todennus vaaditaan tiedostojen ja hakemistojen poistamiseen, jotka liittyvät "
+"'$(unit)':iin."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Todennus vaaditaan '$(unit)'-yksikön prosessien jäädyttämiseksi tai sulattamiseksi."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Todennus vaaditaan '$(unit)'-yksikön prosessien jäädyttämiseksi tai "
+"sulattamiseksi."
diff --git a/po/fr.po b/po/fr.po
index 0f54fc51e3..4b4c3fb15e 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -10,10 +10,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-10-12 16:36+0000\n"
"Last-Translator: Pierre GRASSER <pierre.grasser@proton.me>\n"
-"Language-Team: French <https://translate.fedoraproject.org/projects/systemd/master/fr/>\n"
+"Language-Team: French <https://translate.fedoraproject.org/projects/systemd/"
+"master/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,7 +27,8 @@ msgid "Send passphrase back to system"
msgstr "Renvoyer la phrase secrète au système"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Authentification requise pour renvoyer la phrase secrète au système."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -35,7 +37,8 @@ msgstr "Gérer les services système ou d'autres unités"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Authentification requise pour gérer les services système ou d'autres unités."
+msgstr ""
+"Authentification requise pour gérer les services système ou d'autres unités."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -43,15 +46,23 @@ msgstr "Gérer les fichiers d'un service ou d'une unité système"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Authentification requise pour gérer les fichiers d'un service ou d'une unité système."
+msgstr ""
+"Authentification requise pour gérer les fichiers d'un service ou d'une unité "
+"système."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Définir ou supprimer des variables d’environnement du gestionnaire du système et des services"
+msgstr ""
+"Définir ou supprimer des variables d’environnement du gestionnaire du "
+"système et des services"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Authentification requise pour définir ou supprimer des variables d’environnement du gestionnaire du système et des services."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Authentification requise pour définir ou supprimer des variables "
+"d’environnement du gestionnaire du système et des services."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -66,8 +77,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Récupérer l'état de systemd sans limites de taux"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Authentification requise pour récupérer l'état de systemd sans limites de taux."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Authentification requise pour récupérer l'état de systemd sans limites de "
+"taux."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -75,7 +89,8 @@ msgstr "Créer un espace personnel"
#: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area."
-msgstr "Authentification requise pour créer l’espace personnel d’un utilisateur."
+msgstr ""
+"Authentification requise pour créer l’espace personnel d’un utilisateur."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -83,15 +98,19 @@ msgstr "Retirer un espace personnel"
#: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area."
-msgstr "Authentification requise pour retirer l’espace personnel d’un utilisateur."
+msgstr ""
+"Authentification requise pour retirer l’espace personnel d’un utilisateur."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
msgstr "Vérifier les identifiants d’un espace personnel"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Authentification requise pour vérifier les identifiants de l’espace personnel d’un utilisateur."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Authentification requise pour vérifier les identifiants de l’espace "
+"personnel d’un utilisateur."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -99,7 +118,9 @@ msgstr "Mettre à jour un espace personnel"
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Authentification requise pour mettre à jour l’espace personnel d’un utilisateur."
+msgstr ""
+"Authentification requise pour mettre à jour l’espace personnel d’un "
+"utilisateur."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -114,151 +135,208 @@ msgid "Change password of a home area"
msgstr "Changer le mot de passe d’un espace personnel"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Authentification requise pour changer le mot de passe de l’espace personnel d’un utilisateur."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Authentification requise pour changer le mot de passe de l’espace personnel "
+"d’un utilisateur."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Authentification requise pour mettre à jour l’espace personnel d’un "
+"utilisateur."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Créer un espace personnel"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Authentification requise pour créer l’espace personnel d’un utilisateur."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "L'espace personnel de %s est actuellement absent, veuillez connecter le périphérique ou le système de fichiers qui le contient."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"L'espace personnel de %s est actuellement absent, veuillez connecter le "
+"périphérique ou le système de fichiers qui le contient."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Trop de tentatives de connexion à l'utilisateur %s, réessayez plus tard."
+msgstr ""
+"Trop de tentatives de connexion à l'utilisateur %s, réessayez plus tard."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Mot de passe : "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Mot de passe incorrect ou insuffisant pour l'authentification de l'utilisateur %s."
+msgstr ""
+"Mot de passe incorrect ou insuffisant pour l'authentification de "
+"l'utilisateur %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Désolé, réessayez : "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Clé de récupération : "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Mot de passe ou clé de récupération incorrecte ou insuffisante pour l'authentification de l'utilisateur %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Mot de passe ou clé de récupération incorrecte ou insuffisante pour "
+"l'authentification de l'utilisateur %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Désolé, entrez à nouveau la clé de récupération : "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Clé de sécurité de l'utilisateur %s non insérée."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Réessayez avec un mot de passe : "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Mot de passe incorrect ou insuffisant, et la clé de sécurité de l'utilisateur %s n'est pas insérée."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Mot de passe incorrect ou insuffisant, et la clé de sécurité de "
+"l'utilisateur %s n'est pas insérée."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN de la clé de sécurité : "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "Veuillez vous authentifier physiquement à l'aide de la clé de sécurité de l'utilisateur %s."
+msgstr ""
+"Veuillez vous authentifier physiquement à l'aide de la clé de sécurité de "
+"l'utilisateur %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
-msgstr "Veuillez confirmer votre présence sur la clé de sécurité de l'utilisateur %s."
+msgstr ""
+"Veuillez confirmer votre présence sur la clé de sécurité de l'utilisateur %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
-msgstr "Veuillez confirmer l'utilisateur sur la clé de sécurité de l'utilisateur %s."
+msgstr ""
+"Veuillez confirmer l'utilisateur sur la clé de sécurité de l'utilisateur %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "Le PIN de la clé de sécurité est verrouillé, veuillez commencer par le déverrouiller. (Astuce : débrancher et rebrancher peut suffire.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"Le PIN de la clé de sécurité est verrouillé, veuillez commencer par le "
+"déverrouiller. (Astuce : débrancher et rebrancher peut suffire.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "PIN de la clé de sécurité incorrect pour l'utilisateur %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Désolé, entrez à nouveau le PIN de la clé de sécurité : "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "PIN de la clé de sécurité de l'utilisateur %s incorrect (plus que quelques essais restants !)"
+msgstr ""
+"PIN de la clé de sécurité de l'utilisateur %s incorrect (plus que quelques "
+"essais restants !)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "PIN de la clé de sécurité de l'utilisateur %s incorrect (plus qu'un essai restant !)"
+msgstr ""
+"PIN de la clé de sécurité de l'utilisateur %s incorrect (plus qu'un essai "
+"restant !)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "L'espace personnel de l'utilisateur %s est actuellement inactif, veuillez vous connecter localement dans un premier temps."
+msgstr ""
+"L'espace personnel de l'utilisateur %s est actuellement inactif, veuillez "
+"vous connecter localement dans un premier temps."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "L'espace personnel de l'utilisateur %s est actuellement verrouillé, veuillez commencer par un déverrouillage local."
+msgstr ""
+"L'espace personnel de l'utilisateur %s est actuellement verrouillé, veuillez "
+"commencer par un déverrouillage local."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "Trop d'échecs de connexion pour l'utilisateur %s, refus."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "L'utilisateur est bloqué, accès refusé."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "L'utilisateur n'est pas encore valide, accès refusé."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "L'utilisateur n'est plus valide, accès refusé."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Utilisateur invalide, accès refusé."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Trop de tentatives de connexion, réessayez dans %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Modification du mot de passe obligatoire."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Mot de passe expiré, modification obligatoire."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "Mot de passe expiré et impossible à modifier, connexion refusée."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Le mot de passe va bientôt expirer, veuillez le modifier."
@@ -275,8 +353,12 @@ msgid "Set static hostname"
msgstr "Définir le nom d’hôte statique"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Authentification requise pour définir le nom d’hôte local de manière statique, ainsi que le nom d’hôte familier."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Authentification requise pour définir le nom d’hôte local de manière "
+"statique, ainsi que le nom d’hôte familier."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -284,7 +366,8 @@ msgstr "Définir les informations sur la machine"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Authentification requise pour définir les informations sur la machine locale."
+msgstr ""
+"Authentification requise pour définir les informations sur la machine locale."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -311,28 +394,52 @@ msgid "Authentication is required to get system description."
msgstr "Authentification requise pour obtenir la description du système."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importer une image de machine virtuelle ou de conteneur"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Authentification requise pour importer une image de machine virtuelle ou de conteneur"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Authentification requise pour importer une image de machine virtuelle ou de "
+"conteneur"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exporter une image de machine virtuelle ou de conteneur"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Authentification requise pour exporter une image de machine virtuelle ou de conteneur"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Authentification requise pour exporter une image de machine virtuelle ou de "
+"conteneur"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Télécharger une image de machine virtuelle (VM) ou de conteneur"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Authentification requise pour télécharger une image de machine virtuelle ou de conteneur"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Authentification requise pour télécharger une image de machine virtuelle ou "
+"de conteneur"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Authentification requise pour changer le mot de passe de l’espace personnel "
+"d’un utilisateur."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -348,15 +455,19 @@ msgstr "Définir les paramètres de clavier du système"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Authentification requise pour définir les paramètres de clavier du système."
+msgstr ""
+"Authentification requise pour définir les paramètres de clavier du système."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Permettre aux applications d’empêcher l’arrêt du système"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Authentification requise pour permettre à une application d’empêcher l’arrêt du système."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher l’arrêt "
+"du système."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -364,7 +475,9 @@ msgstr "Permettre aux applications de retarder l’arrêt du système"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Authentification requise pour permettre à une application de retarder l’arrêt du système."
+msgstr ""
+"Authentification requise pour permettre à une application de retarder "
+"l’arrêt du système."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -372,7 +485,9 @@ msgstr "Permettre aux applications d’empêcher la mise en veille du système"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Authentification requise pour permettre à une application d’empêcher la mise en veille du système."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher la mise "
+"en veille du système."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -380,55 +495,92 @@ msgstr "Permettre aux applications de retarder la mise en veille du système"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Authentification requise pour permettre à une application de retarder la mise en veille du système."
+msgstr ""
+"Authentification requise pour permettre à une application de retarder la "
+"mise en veille du système."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Permettre aux applications d’empêcher l’hibernation automatique du système"
+msgstr ""
+"Permettre aux applications d’empêcher l’hibernation automatique du système"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Authentification requise pour permettre à une application d’empêcher l’hibernation automatique du système."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher "
+"l’hibernation automatique du système."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Permettre aux applications d’empêcher le système de gérer le bouton d’alimentation"
+msgstr ""
+"Permettre aux applications d’empêcher le système de gérer le bouton "
+"d’alimentation"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Authentification requise pour permettre à une application d’empêcher le système de gérer le bouton d’alimentation."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher le "
+"système de gérer le bouton d’alimentation."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Permettre aux applications d’empêcher le système de gérer le bouton de mise en veille"
+msgstr ""
+"Permettre aux applications d’empêcher le système de gérer le bouton de mise "
+"en veille"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Authentification requise pour permettre à une application d’empêcher le système de gérer le bouton de mise en veille."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher le "
+"système de gérer le bouton de mise en veille."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permettre aux applications d’empêcher au système de gérer le bouton d’hibernation"
+msgstr ""
+"Permettre aux applications d’empêcher au système de gérer le bouton "
+"d’hibernation"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Authentification requise pour permettre à une application d’empêcher le système de gérer le bouton d'hibernation."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher le "
+"système de gérer le bouton d'hibernation."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permettre aux applications d’empêcher le système de gérer la fermeture du capot"
+msgstr ""
+"Permettre aux applications d’empêcher le système de gérer la fermeture du "
+"capot"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Authentification requise pour permettre à une application d’empêcher le système de gérer la fermeture du capot."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher le "
+"système de gérer la fermeture du capot."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permettre aux applications d’empêcher le système de gérer le bouton de redémarrage"
+msgstr ""
+"Permettre aux applications d’empêcher le système de gérer le bouton de "
+"redémarrage"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Authentification requise pour permettre à une application d’empêcher le système de gérer le bouton de redémarrage."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Authentification requise pour permettre à une application d’empêcher le "
+"système de gérer le bouton de redémarrage."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -436,7 +588,9 @@ msgstr "Permettre à un utilisateur non connecté d’exécuter des programmes"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Requête explicite requise pour exécuter des programmes en tant qu’utilisateur non connecté."
+msgstr ""
+"Requête explicite requise pour exécuter des programmes en tant "
+"qu’utilisateur non connecté."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -444,7 +598,9 @@ msgstr "Permettre aux utilisateurs non connectés d’exécuter des programmes"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Authentification requise pour exécuter des programmes en tant qu’utilisateur non connecté."
+msgstr ""
+"Authentification requise pour exécuter des programmes en tant qu’utilisateur "
+"non connecté."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -452,7 +608,8 @@ msgstr "Permet d’associer des périphériques à des postes (seats)"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Authentification requise pour associer un périphérique à un poste (seat)."
+msgstr ""
+"Authentification requise pour associer un périphérique à un poste (seat)."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -460,7 +617,9 @@ msgstr "Supprimer toutes les associations des périphériques aux postes (seats)
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Authentification requise pour réinitialiser les associations des périphériques aux postes (seats)."
+msgstr ""
+"Authentification requise pour réinitialiser les associations des "
+"périphériques aux postes (seats)."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -475,16 +634,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Éteindre le système alors que d’autres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Authentification requise pour éteindre le système alors que d’autres utilisateurs sont connectés."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Authentification requise pour éteindre le système alors que d’autres "
+"utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Éteindre le système alors qu’une application l'en empêche"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Authentification requise pour éteindre le système alors qu’une application l'en empêche."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authentification requise pour éteindre le système alors qu’une application "
+"l'en empêche."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -499,16 +666,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Redémarrer le système alors que d’autres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Authentification requise pour redémarrer le système alors que d’autres utilisateurs sont connectés."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Authentification requise pour redémarrer le système alors que d’autres "
+"utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Redémarrer le système alors qu’une application l'en empêche"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Authentification requise pour redémarrer le système alors qu’une application l'en empêche."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authentification requise pour redémarrer le système alors qu’une application "
+"l'en empêche."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -523,16 +698,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Arrêter le système alors que d’autres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Authentification requise pour arrêter le système alors que d’autres utilisateurs sont connectés."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Authentification requise pour arrêter le système alors que d’autres "
+"utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Arrêter le système alors qu’une application l'en empêche"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Authentification requise pour arrêter le système alors qu’une application l'en empêche."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authentification requise pour arrêter le système alors qu’une application "
+"l'en empêche."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -544,19 +727,28 @@ msgstr "Authentification requise pour mettre le système en veille."
#: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while other users are logged in"
-msgstr "Mettre le système en veille alors que d’autres utilisateurs sont connectés"
+msgstr ""
+"Mettre le système en veille alors que d’autres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Authentification requise pour mettre le système en veille alors que d’autres utilisateurs sont connectés."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Authentification requise pour mettre le système en veille alors que d’autres "
+"utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Mettre le système en veille alors qu’une application l'en empêche"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Authentification requise pour mettre le système en veille alors qu’une application l'en empêche."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authentification requise pour mettre le système en veille alors qu’une "
+"application l'en empêche."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -568,19 +760,29 @@ msgstr "Authentification requise pour mettre le système en hibernation."
#: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while other users are logged in"
-msgstr "Mettre le système en hibernation alors que d’autres utilisateurs sont connectés"
+msgstr ""
+"Mettre le système en hibernation alors que d’autres utilisateurs sont "
+"connectés"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Authentification requise pour mettre le système en hibernation alors que d’autres utilisateurs sont connectés."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Authentification requise pour mettre le système en hibernation alors que "
+"d’autres utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Mettre le système en hibernation alors qu’une application l'en empêche"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Authentification requise pour mettre le système en hibernation alors qu’une application l'en empêche."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authentification requise pour mettre le système en hibernation alors qu’une "
+"application l'en empêche."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -588,7 +790,9 @@ msgstr "Gérer les sessions actives, les utilisateurs et les postes (seats)"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Authentification requise pour gérer les sessions actives, les utilisateurs et les postes (seats)."
+msgstr ""
+"Authentification requise pour gérer les sessions actives, les utilisateurs "
+"et les postes (seats)."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -596,7 +800,9 @@ msgstr "Verrouiller ou déverrouiller des sessions actives"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Authentification requise pour verrouiller ou déverrouiller des sessions actives."
+msgstr ""
+"Authentification requise pour verrouiller ou déverrouiller des sessions "
+"actives."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -604,31 +810,44 @@ msgstr "Définir la raison du redémarrage dans le noyau"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Authentification requise pour définir la raison du redémarrage dans le noyau."
+msgstr ""
+"Authentification requise pour définir la raison du redémarrage dans le noyau."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indiquer au firmware de démarrer sur l’interface de configuration"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Authentification requise pour indiquer au firmware de démarrer sur l’interface de configuration."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Authentification requise pour indiquer au firmware de démarrer sur "
+"l’interface de configuration."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indiquer au boot loader d’afficher le menu de sélection"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Authentification requise pour indiquer au boot loader d'afficher le menu de sélection."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Authentification requise pour indiquer au boot loader d'afficher le menu de "
+"sélection."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indiquer au boot loader de démarrer une entrée spécifique"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Authentification requise pour indiquer au boot loader de démarrer une entrée spécifique."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Authentification requise pour indiquer au boot loader de démarrer une entrée "
+"spécifique."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -668,7 +887,8 @@ msgstr "Obtenir un shell dans un conteneur local"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Authentification requise pour obtenir un shell dans un conteneur local."
+msgstr ""
+"Authentification requise pour obtenir un shell dans un conteneur local."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -683,8 +903,11 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Obtenir un pseudo-terminal dans un conteneur local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Authentification requise pour obtenir un pseudo-terminal dans un conteneur local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Authentification requise pour obtenir un pseudo-terminal dans un conteneur "
+"local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -692,23 +915,31 @@ msgstr "Obtenir un pseudo-terminal sur l’hôte local"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Authentification requise pour obtenir un pseudo-terminal sur l’hôte local."
+msgstr ""
+"Authentification requise pour obtenir un pseudo-terminal sur l’hôte local."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Gérer les machines virtuelles et conteneurs locaux"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Authentification requise pour gérer les machines virtuelles et les conteneurs locaux."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Authentification requise pour gérer les machines virtuelles et les "
+"conteneurs locaux."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Gérer les images des machines virtuelles et des conteneurs locaux"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Authentification requise pour gérer les images des machines virtuelles et des conteneurs locaux."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Authentification requise pour gérer les images des machines virtuelles et "
+"des conteneurs locaux."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -796,7 +1027,8 @@ msgstr "Définir les Negative Trust Anchors DNSSEC"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Authentification requise pour définir les Negative Trust Anchors DNSSEC."
+msgstr ""
+"Authentification requise pour définir les Negative Trust Anchors DNSSEC."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -820,7 +1052,8 @@ msgstr "Envoi d'un message de renouvellement forcé par le serveur DHCP"
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Authentification requise pour envoyer un message de renouvellement forcé."
+msgstr ""
+"Authentification requise pour envoyer un message de renouvellement forcé."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -859,16 +1092,22 @@ msgid "Attach or detach a portable service image"
msgstr "Attacher ou détacher une image de service portable"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Authentification requise pour attacher ou détacher une image de service portable."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Authentification requise pour attacher ou détacher une image de service "
+"portable."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Supprimer ou modifier une image de service portable"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Authentification requise pour supprimer ou modifier une image de service portable."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Authentification requise pour supprimer ou modifier une image de service "
+"portable."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -892,7 +1131,9 @@ msgstr "Réinitialiser les paramètres de résolution de noms"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Authentification requise pour réinitialiser les paramètres de résolution de noms."
+msgstr ""
+"Authentification requise pour réinitialiser les paramètres de résolution de "
+"noms."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -915,61 +1156,87 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Synchroniser l’horloge matérielle à l’heure locale ou UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Authentification requise pour synchroniser l’horloge matérielle à l’heure locale ou UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Authentification requise pour synchroniser l’horloge matérielle à l’heure "
+"locale ou UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Activer ou désactiver la synchronisation de l’heure avec le réseau"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Authentification requise pour activer ou désactiver la synchronisation de l’heure avec le réseau."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Authentification requise pour activer ou désactiver la synchronisation de "
+"l’heure avec le réseau."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Authentification requise pour démarrer « $(unit) »."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Authentification requise pour arrêter « $(unit) »."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Authentification requise pour recharger « $(unit) »."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Authentification requise pour redémarrer « $(unit) »."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Authentification requise pour envoyer un signal UNIX aux processus de « $(unit) »."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Authentification requise pour envoyer un signal UNIX aux processus de "
+"« $(unit) »."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Authentification requise pour réinitialiser l’état « échec » de « $(unit) »."
+msgstr ""
+"Authentification requise pour réinitialiser l’état « échec » de « $(unit) »."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Authentification requise pour définir des propriétés de « $(unit) »."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Authentification requise pour supprimer les fichiers et les dossiers associés à « $(unit) »."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Authentification requise pour supprimer les fichiers et les dossiers "
+"associés à « $(unit) »."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Authentification requise pour suspendre ou reprendre les processus de l'unité « $(unit) »."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Authentification requise pour suspendre ou reprendre les processus de "
+"l'unité « $(unit) »."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Authentification requise pour arrêter le système alors qu'une application a demandé de l'empêcher."
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Authentification requise pour arrêter le système alors qu'une application "
+#~ "a demandé de l'empêcher."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Authentification requise pour tuer « $(unit) »."
#~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
-#~ msgstr "Appuyez sur Ctrl+C pour annuler toutes vérifications en cours du système de fichiers"
+#~ msgstr ""
+#~ "Appuyez sur Ctrl+C pour annuler toutes vérifications en cours du système "
+#~ "de fichiers"
#~ msgid "Checking in progress on %d disk (%3.1f%% complete)"
#~ msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
diff --git a/po/gl.po b/po/gl.po
index 3a5d439857..affe434ad3 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -5,10 +5,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-04-14 18:20+0000\n"
"Last-Translator: Fran Diéguez <frandieguez@gnome.org>\n"
-"Language-Team: Galician <https://translate.fedoraproject.org/projects/systemd/master/gl/>\n"
+"Language-Team: Galician <https://translate.fedoraproject.org/projects/"
+"systemd/master/gl/>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,8 +22,11 @@ msgid "Send passphrase back to system"
msgstr "Enviar frase de paso de volta ao sistema"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Requírese autenticación para enviar a frase de paso escrita de volta ao sistema."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Requírese autenticación para enviar a frase de paso escrita de volta ao "
+"sistema."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -30,7 +34,9 @@ msgstr "Xestionar os servizos do sistema ou outras unidades"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Requírese autenticación para xestionar os servizos do sistema ou outras unidades."
+msgstr ""
+"Requírese autenticación para xestionar os servizos do sistema ou outras "
+"unidades."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -38,15 +44,23 @@ msgstr "Xestionar os servizos do sistema ou outros ficheiros"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Requírese autenticación para xestionar os servizos do sistema ou outros ficheiros."
+msgstr ""
+"Requírese autenticación para xestionar os servizos do sistema ou outros "
+"ficheiros."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Estabelecer ou desestabelecer as variables de ambiente do sistema ou do xestor de servizos"
+msgstr ""
+"Estabelecer ou desestabelecer as variables de ambiente do sistema ou do "
+"xestor de servizos"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Requírese autenticación para estabelecer ou desestabelecer as variábeis de ambiente do xestor de servizos."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Requírese autenticación para estabelecer ou desestabelecer as variábeis de "
+"ambiente do xestor de servizos."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -62,7 +76,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Requírese autenticación para recargar o estado de systemd."
#: src/home/org.freedesktop.home1.policy:13
@@ -86,8 +101,11 @@ msgid "Check credentials of a home area"
msgstr "Comprobar as credenciais dun área persoal"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Requírese autenticación para comprobar as credenciais do espazo persoal dun usuario."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Requírese autenticación para comprobar as credenciais do espazo persoal dun "
+"usuario."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -103,158 +121,190 @@ msgstr "Redimensionar un espazo persoal"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Requírese autenticación para redimensionar o espazo persoal dun usuario."
+msgstr ""
+"Requírese autenticación para redimensionar o espazo persoal dun usuario."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Cambiar contrasinal dun espazo persoal"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Requírese autenticación para cambiar o contrasinal dun espazo persoal dun usuario."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Requírese autenticación para cambiar o contrasinal dun espazo persoal dun "
+"usuario."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Requírese autenticación para actualizar o espazo persoal dun usuario."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Crear un área persoal"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Requírese autenticación para crear un área persoal."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -271,8 +321,13 @@ msgid "Set static hostname"
msgstr "Estabelecer o nome do equipo estático"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Requírese autenticación para estabelecer de forma o nome do equipo local estabelecido de forma estática, así como o nome do equipo lexíbel por persoas."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Requírese autenticación para estabelecer de forma o nome do equipo local "
+"estabelecido de forma estática, así como o nome do equipo lexíbel por "
+"persoas."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -280,7 +335,8 @@ msgstr "Estabelecer a información da máquina"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Requírese autenticación para estabelecer a información da máquina local."
+msgstr ""
+"Requírese autenticación para estabelecer a información da máquina local."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -307,36 +363,55 @@ msgid "Authentication is required to get system description."
msgstr "Requírese autenticación para obter a descrición do sistema."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importar unha imaxe de MV ou contenedor"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Requírese autenticación para imporar unha imaxe de MV ou contenedor"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exportar unha imaxe de MV ou contenedor"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Requírese autenticación para exportar unha imaxe de MV ou contenedor"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Descargar unha imaxe de MV ou contenedor"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Requírese autenticación para descargar unha imaxe de MV ou contenedor"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Requírese autenticación para cambiar o contrasinal dun espazo persoal dun "
+"usuario."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Estabelecer a configuración rexional do sistema"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Requírese autenticación para estabelecer a configuración rexional do sistema."
+msgstr ""
+"Requírese autenticación para estabelecer a configuración rexional do sistema."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -344,15 +419,20 @@ msgstr "Estabelecer as preferencias do teclado do sistema"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Requírese autenticación para estabelecer as preferencias do teclado do sistema."
+msgstr ""
+"Requírese autenticación para estabelecer as preferencias do teclado do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Permitir ás aplicacións inhibit o apagado do sistema"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Requírese autenticación para permitirlle a unha aplicación poida inhibir o apagado do sistema."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación poida inhibir o "
+"apagado do sistema."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -360,7 +440,9 @@ msgstr "Permitir ás aplicacións atrasar o apagado do sistema"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Requírese autenticación para permitirlle a unha aplicación atrasar o apagado do sistema."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación atrasar o apagado "
+"do sistema."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -368,7 +450,9 @@ msgstr "Permitir ás aplicacións inhibir a suspensión do sistema"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a suspensión do sistema."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a "
+"suspensión do sistema."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -376,55 +460,86 @@ msgstr "Permitir ás aplicacións atrasar a suspensión do sistema"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Requírese autenticación para permitirlle a unha aplicación atrasar a suspensión do sistema."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación atrasar a "
+"suspensión do sistema."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Permitir ás aplicacións inhibir a suspensión automática do sistema"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a suspensión automática do sistema."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a "
+"suspensión automática do sistema."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Permitir ás aplicacións inhibir a xestión do sistema da tecla de acendido"
+msgstr ""
+"Permitir ás aplicacións inhibir a xestión do sistema da tecla de acendido"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a xestión do sistema da tecla de acendido."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a xestión "
+"do sistema da tecla de acendido."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Permitir ás aplicacións inhibir a xestión do sistema da tecla de suspensión"
+msgstr ""
+"Permitir ás aplicacións inhibir a xestión do sistema da tecla de suspensión"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a xestión do sistema da tecla de suspensión."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a xestión "
+"do sistema da tecla de suspensión."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permitir ás aplicacións inhibir a xestión do sistema da tecla de hibernado"
+msgstr ""
+"Permitir ás aplicacións inhibir a xestión do sistema da tecla de hibernado"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a xestión do sistema da tecla de hibernado."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a xestión "
+"do sistema da tecla de hibernado."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permitir ás aplicacións inhibir a xestión do sistema do interruptor da tapa"
+msgstr ""
+"Permitir ás aplicacións inhibir a xestión do sistema do interruptor da tapa"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a xestión do sistema do interruptor da tapa."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a xestión "
+"do sistema do interruptor da tapa."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permitir ás aplicacións inhibir a xestión do sistema da tecla de reinicio"
+msgstr ""
+"Permitir ás aplicacións inhibir a xestión do sistema da tecla de reinicio"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Requírese autenticación para permitirlle a unha aplicación inhibir a xestión do sistema da tecla de acendido."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Requírese autenticación para permitirlle a unha aplicación inhibir a xestión "
+"do sistema da tecla de acendido."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -432,7 +547,9 @@ msgstr "Permitirlle a usuarios sen unha sesión iniciada executar programas"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Requírese autenticación para poder executar programas como un usuario sen unha sesión iniciada."
+msgstr ""
+"Requírese autenticación para poder executar programas como un usuario sen "
+"unha sesión iniciada."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -440,7 +557,9 @@ msgstr "Permitirlle a usuarios sen unha sesión iniciada executar programas"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Requírese autenticación para permitirlle executar programas a un usuario sen unha sesión iniciada."
+msgstr ""
+"Requírese autenticación para permitirlle executar programas a un usuario sen "
+"unha sesión iniciada."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -456,7 +575,9 @@ msgstr "Reiniciar os anexos do dispositivo aos asentos"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Requírese autenticación para reiniciar como os dispositivos están anexados aos asentos."
+msgstr ""
+"Requírese autenticación para reiniciar como os dispositivos están anexados "
+"aos asentos."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -471,16 +592,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Apagar o sistema mentres hai usuarios con unha sesión iniciada"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Requírese autenticación para apagar o sistema mentres hai usuarios con unha sesión iniciada."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Requírese autenticación para apagar o sistema mentres hai usuarios con unha "
+"sesión iniciada."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Apagar o sistema cando unha aplicación solicitou a súa inhibición"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Requírese autenticación para apagar o sistema mentres unha aplicación solicitou a súa inhibición."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Requírese autenticación para apagar o sistema mentres unha aplicación "
+"solicitou a súa inhibición."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -495,16 +624,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Reiniciar o sistema mentres outros usuarios teñen unha sesión iniciada"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Requírese autenticación para reiniciar o sistema mentres outros usuarios teñen unha sesión iniciada."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Requírese autenticación para reiniciar o sistema mentres outros usuarios "
+"teñen unha sesión iniciada."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Reiniciar o sistema cando unha aplicación solicitou a súa inhibición"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Requírese autenticación para reiniciar o sistema mentres unha aplicación solicitou a súa inhibición."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Requírese autenticación para reiniciar o sistema mentres unha aplicación "
+"solicitou a súa inhibición."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -519,16 +656,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Deter o sistema mentres outros usuarios teñen unha sesión iniciada"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Requírese autenticación para deter o sistema mentres outros usuarios teñen unha sesión iniciada."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Requírese autenticación para deter o sistema mentres outros usuarios teñen "
+"unha sesión iniciada."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Deter o sistema cando unha aplicación solicitou a súa inhibición"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Requírese autenticación para hibernar o sistema mentres unha aplicación solicitou a súa inhibición."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Requírese autenticación para hibernar o sistema mentres unha aplicación "
+"solicitou a súa inhibición."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -543,16 +688,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspender o sistema mentres outros usuarios teñen unha sesión iniciada"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Requírese autenticación para suspender o sistema mentres outros usuarios teñen unha sesión iniciada."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Requírese autenticación para suspender o sistema mentres outros usuarios "
+"teñen unha sesión iniciada."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Suspender o sistema cando unha aplicación solicitou a súa inhibición"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Requírese autenticación para suspender o sistema mentres unha aplicación solicitou a súa inhibición."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Requírese autenticación para suspender o sistema mentres unha aplicación "
+"solicitou a súa inhibición."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -567,16 +720,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernar o sistema mentres outros usuarios teñen unha sesión iniciada"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Requírese autenticación para hibernar o sistema mentres outros usuarios teñen unha sesión iniciada."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Requírese autenticación para hibernar o sistema mentres outros usuarios "
+"teñen unha sesión iniciada."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernar o sistema cando unha aplicación solicitou a súa inhibición"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Requírese autenticación para hibernar o sistema mentres unha aplicación solicitou a súa inhibición."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Requírese autenticación para hibernar o sistema mentres unha aplicación "
+"solicitou a súa inhibición."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -584,7 +745,9 @@ msgstr "Xestionar as sesións, usuarios e asentos activos"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Requírese autenticación para xestionar as sesións, usuarios e asentos activos."
+msgstr ""
+"Requírese autenticación para xestionar as sesións, usuarios e asentos "
+"activos."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -592,7 +755,8 @@ msgstr "Bloquear ou desbloquear sesión activas"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Requírese autenticación para bloquear ou desbloquear as sesións activas."
+msgstr ""
+"Requírese autenticación para bloquear ou desbloquear as sesións activas."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -600,31 +764,46 @@ msgstr "Estabelecer a «razón» de reinicio no núcleo"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Requírese autenticación para estabelecer a «razón» de reinicio no núcleo."
+msgstr ""
+"Requírese autenticación para estabelecer a «razón» de reinicio no núcleo."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indícalle ao firmware arrincar para configurar unha interface"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Requírese autenticación para indicarlle ao firmware arrincar para configurar unha interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Requírese autenticación para indicarlle ao firmware arrincar para configurar "
+"unha interface."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
-msgstr "Indicarlle ao xestor de arranque para arrincar ao menú do xestor de arranque"
+msgstr ""
+"Indicarlle ao xestor de arranque para arrincar ao menú do xestor de arranque"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Requírese autenticación para indicarlle ao xestor de arranque arrincar ao menú do xestor de arranque."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Requírese autenticación para indicarlle ao xestor de arranque arrincar ao "
+"menú do xestor de arranque."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
-msgstr "Indícalle ao cargador de arranque que arranque nunha entrada específica"
+msgstr ""
+"Indícalle ao cargador de arranque que arranque nunha entrada específica"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Requírese autenticación para indicarlle ao xestor de arranque arrincar a unha entrada específica do xestor de arranque."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Requírese autenticación para indicarlle ao xestor de arranque arrincar a "
+"unha entrada específica do xestor de arranque."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -679,8 +858,10 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Adquirir unha pseudo TTY nun contenedor local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Requírese autenticación para adquirir unha pseudo TTY nun contenedor local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Requírese autenticación para adquirir unha pseudo TTY nun contenedor local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -688,23 +869,31 @@ msgstr "Adquirir unha pseudo TTY nun equipo local"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Requírese autenticación para adquirir unha pseudo TTY nun equipo local."
+msgstr ""
+"Requírese autenticación para adquirir unha pseudo TTY nun equipo local."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Xestionar máquinas virtuais e contenedores locais"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Requírese autenticación para xestionar máquinas virtuais e contenedores locais."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Requírese autenticación para xestionar máquinas virtuais e contenedores "
+"locais."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Xestionar imaxes locais virtuais e contenedores locais"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Requírese autenticación para xestionar imaxes de máquinas virtuais e contenedores locais."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Requírese autenticación para xestionar imaxes de máquinas virtuais e "
+"contenedores locais."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -762,7 +951,8 @@ msgstr "Activar/desactivar DNS multicast"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Requírese autenticación para estabelecer activar ou desactivar DNS multicast."
+msgstr ""
+"Requírese autenticación para estabelecer activar ou desactivar DNS multicast."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -772,7 +962,8 @@ msgstr "Activar/desactivar DNS sobre TLS"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Requírese autenticación para estabelecer activar ou desactivar DNS sobre TLS."
+msgstr ""
+"Requírese autenticación para estabelecer activar ou desactivar DNS sobre TLS."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -792,7 +983,8 @@ msgstr "Estabelecer DNSSEC Negative Trust Anchors"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Requírese autenticación para estabelecer DNSSEC Negative Trust Anchors."
+msgstr ""
+"Requírese autenticación para estabelecer DNSSEC Negative Trust Anchors."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -848,23 +1040,30 @@ msgstr "Inspeccionar unha imaxe de servizo portábel"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Requírese autenticación para inspeccionar unha imaxe de servizo portábel."
+msgstr ""
+"Requírese autenticación para inspeccionar unha imaxe de servizo portábel."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Anexar e desanexar unha imaxe de servizo portábel"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Requírese autenticación para anexar ou desanexar unha imaxe de servizo portábel."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Requírese autenticación para anexar ou desanexar unha imaxe de servizo "
+"portábel."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Eliminar ou modificar unha imaxe de servizo portábel"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Requírese autenticación para eliminar ou modificar unha imaxe de servizo portábel."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Requírese autenticación para eliminar ou modificar unha imaxe de servizo "
+"portábel."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -888,7 +1087,9 @@ msgstr "Reverter a preferencia de resolución de nomes"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Requírese autenticación para restabelecer as preferencias de resolución de nomes."
+msgstr ""
+"Requírese autenticación para restabelecer as preferencias de resolución de "
+"nomes."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -911,52 +1112,74 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Estabelecer o RTC ao fuso horario ou UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Requírese autenticación para controlar se o RTC almacena a hora local ou a UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Requírese autenticación para controlar se o RTC almacena a hora local ou a "
+"UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Activar ou desactivar a sincronización de hora por rede"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Requírese autenticación para controlar se a sincronización de hora por rede debería activarse."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Requírese autenticación para controlar se a sincronización de hora por rede "
+"debería activarse."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Requírese autenticación para inciar '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Requírese autenticación para deter '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Requírese autenticación para recargar '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Requírese autenticación para reiniciar '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Requírese autenticación para enviarlle un sinal UNIX aos procesos de '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Requírese autenticación para enviarlle un sinal UNIX aos procesos de "
+"'$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Requírese autenticación para reinicair o estado «fallido» de '$(unit)'."
+msgstr ""
+"Requírese autenticación para reinicair o estado «fallido» de '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Requírese autenticación para estabelecer as propiedades en '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Requírese autenticación para eliminar ficheiros ou directorios asociados con '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Requírese autenticación para eliminar ficheiros ou directorios asociados con "
+"'$(unit)'."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "Requírese autenticación para conxelar o proceso da unidade '$(unit)'."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Requírese autenticación para deter o sistema mentres unha aplicación solicitou a súa inhibición."
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Requírese autenticación para deter o sistema mentres unha aplicación "
+#~ "solicitou a súa inhibición."
diff --git a/po/he.po b/po/he.po
index cc5ffc450a..df69757d8a 100644
--- a/po/he.po
+++ b/po/he.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: systemd\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-11-22 00:01+0000\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <https://translate.fedoraproject.org/projects/systemd/"
@@ -122,7 +122,27 @@ msgid ""
"Authentication is required to change the password of a user's home area."
msgstr "נדרש אימות כדי להחליף סיסמה של אזור בית למשתמש."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "נדרש אימות כדי לעדכן אזור בית למשתמש."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "יצירת אזור בית"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "נדרש אימות כדי ליצור אזור בית למשתמש."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
msgid ""
"Home of user %s is currently absent, please plug in the necessary storage "
@@ -131,75 +151,75 @@ msgstr ""
"למשתמש %s חסר בית, נא לחבר את התקן האחסון הנחוץ או את מערכת הקבצים שמגבה "
"אותו."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr "ניסיונות כניסה תכופים מדי למשתמש %s, נא לנסות שוב מאוחר יותר."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "סיסמה: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "הסיסמה שגויה או בלתי הולמת לאימות המשתמש %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "מחילה, נא לנסות שוב: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "מפתח שחזור: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
msgid ""
"Password/recovery key incorrect or not sufficient for authentication of user "
"%s."
msgstr "סיסמה/מפתח שחזור שגויים או לא מספיקים לאימות המשתמש %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "מחילה, נא לספק את מפתח השחזור מחדש: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "לא סופק אסימון אבטחה למשתמש %s."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "נא לנסות שוב עם סיסמה: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
msgid ""
"Password incorrect or not sufficient, and configured security token of user "
"%s not inserted."
msgstr "הסיסמה שגויה או שאינה מספיקה, ואסימון האבטחה למשתמש %s לא סופק."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "קוד אישי לאסימון אבטחה: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "נא לבצע אימות פיזי באסימון האבטחה למשתמש %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "נא לאשר את נוכחות אסימון האבטחה למשתמש %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "נא לאמת את המשתמש באסימון האבטחה למשתמש %s."
-#: src/home/pam_systemd_home.c:424
+#: src/home/pam_systemd_home.c:429
msgid ""
"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
"insertion might suffice.)"
@@ -207,76 +227,76 @@ msgstr ""
"אסימון האבטחה נעול בקוד אישי (PIN), נא לשחרר אותו תחילה. (הסרה: ניתוק וחיבור "
"מחדש אמורים להספיק.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "הקוד האישי (PIN) למשתמש %s שגוי."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "מחילה, נא לנסות שוב קוד אסימון אבטחה אישי (PIN): "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
"קוד אסימון אבטחה אישי (PIN) למשתמש %s שגוי (נותרו עוד מספר ניסיונות בודדים!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr "קוד אסימון אבטחה אישי (PIN) למשתמש %s שגוי (נותר עוד ניסיון אחד!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr "הבית של המשתמש %s אינו פעיל כרגע, נא להיכנס מקומית תחילה."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr "הבית של המשתמש %s נעול כרגע, נא לשחרר אותו מקומית תחילה."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "יותר מדי ניסיונות כניסה כושלים למשתמש %s, יסורב מעתה."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "רשומת המשתמש חסומה, הגישה נמנעת."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "רשומת המשתמש לא תקפה עדיין, הגישה נמנעת."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "רשומת המשתמש אינה תקפה עוד, הגישה נמנעת."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "רשומת המשתמש אינה תקפה, הגישה נמנעת."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "יותר מדי ניסיונות כניסה, כדאי לנסות שוב בעוד %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "צריך לשנות את הסיסמה."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "תוקף הסיסמה פג, צריך להחליף."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "תוקף הסיסמה פג, אך אי אפשר להחליף, הכניסה מסורבת."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "תוקף הסיסמה יפוג בקרוב, נא להחליף."
@@ -331,29 +351,47 @@ msgid "Authentication is required to get system description."
msgstr "נדרש אימות כדי למשוך את תיאור המערכת."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "לייבא מכונה וירטואלית או דמות של מכולה (container image)"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "נדרש אימות כדי לייבא מכונה וירטואלית או דמות של מכולה (container image)"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"נדרש אימות כדי לייבא מכונה וירטואלית או דמות של מכולה (container image)"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "ייצוא מכונה וירטואלית או דמות של מכולה (container image)"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "נדרש אימות כדי לייצא מכונה וירטואלית או דמות של מכולה (container image)"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"נדרש אימות כדי לייצא מכונה וירטואלית או דמות של מכולה (container image)"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "הורדת מכונה וירטואלית או דמות מכולה"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "נדרש אימות כדי להוריד מכונה וירטואלית או דמות מכולה"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "נדרש אימות כדי להחליף סיסמה של אזור בית למשתמש."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "הגדרת אזור ושפת המערכת"
@@ -761,7 +799,8 @@ msgstr "ניהול מכונות וירטואליות ומכולות מקומיו
#: src/machine/org.freedesktop.machine1.policy:85
msgid ""
"Authentication is required to manage local virtual machines and containers."
-msgstr "נדרש אימות כדי לנהל מכונות וירטואליות (VM) ומכולות (container) מקומיות."
+msgstr ""
+"נדרש אימות כדי לנהל מכונות וירטואליות (VM) ומכולות (container) מקומיות."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
@@ -771,7 +810,8 @@ msgstr "ניהול דמויות של מכונות וירטואליות ומכו
msgid ""
"Authentication is required to manage local virtual machine and container "
"images."
-msgstr "נדרש אימות לניהול דמויות של מכונות וירטואליות (VM) ומכולות (container)."
+msgstr ""
+"נדרש אימות לניהול דמויות של מכונות וירטואליות (VM) ומכולות (container)."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -999,43 +1039,43 @@ msgid ""
"shall be enabled."
msgstr "נדרש אימות כדי להפעיל או לכבות סנכרון שעון מהרשת."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "נדרש אימות כדי להפעיל את ‚$(unit)’."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "נדרש אימות כדי לעצור את ‚$(unit)’."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "נדרש אימות כדי לרענן את ‚$(unit)’."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "נדרש אימות כדי להפעיל את ‚$(unit)’ מחדש."
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
msgid ""
"Authentication is required to send a UNIX signal to the processes of "
"'$(unit)'."
msgstr "נדרש אימות כדי לשלוח אות יוניקס לתהליכים של ‚$(unit)’."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "נדרש אימות כדי לאפס את המצב „נכשל” של ‚$(unit)’."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "נדרש אימות כדי להגדיר מאפיינים על ‚$(unit)’."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
msgid ""
"Authentication is required to delete files and directories associated with "
"'$(unit)'."
msgstr "נדרש אימות כדי למחוק קבצים ותיקיות שמשויכים אל ‚$(unit)’."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
msgid ""
"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "נדרש אימות כדי להפשיר או להקפיא את התהליכים של ‚$(unit)’."
diff --git a/po/hr.po b/po/hr.po
index 9a5069a85e..536a839751 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -7,15 +7,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2022-10-31 11:19+0000\n"
"Last-Translator: Gogo Gogsi <linux.hr@protonmail.com>\n"
-"Language-Team: Croatian <https://translate.fedoraproject.org/projects/systemd/master/hr/>\n"
+"Language-Team: Croatian <https://translate.fedoraproject.org/projects/"
+"systemd/master/hr/>\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.14.1\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -23,7 +25,8 @@ msgid "Send passphrase back to system"
msgstr "Pošalji lozinku natrag u sustav"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Potrebna je ovjera za slanje upisane lozinke natrag u sustav."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -40,15 +43,20 @@ msgstr "Upravljajte uslugama sustava ili datotekama jedinica"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Potrebna je ovjera za upravljanje uslugama sustava ili datotekama jedinica."
+msgstr ""
+"Potrebna je ovjera za upravljanje uslugama sustava ili datotekama jedinica."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Postavite ili uklonite varijable okruženja sustava i usluga"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Potrebna je ovjera za postavljanje ili uklanjanje varijabla okruženja sustava i usluga."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Potrebna je ovjera za postavljanje ili uklanjanje varijabla okruženja "
+"sustava i usluga."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -64,7 +72,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Potrebna je ovjera za ponovno učitavanja systemd stanja."
#: src/home/org.freedesktop.home1.policy:13
@@ -88,8 +97,10 @@ msgid "Check credentials of a home area"
msgstr "Provjeri vjerodajnice osobnog prostora"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Potrebna je ovjera za provjeru vjerodajnica osobnog prostora korisnika."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Potrebna je ovjera za provjeru vjerodajnica osobnog prostora korisnika."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -112,151 +123,180 @@ msgid "Change password of a home area"
msgstr "Promijeni lozinku osobnog prostora"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "Potrebna je ovjera za promjenu lozinke osobnog prostora korisnika."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Potrebna je ovjera za nadopunu osobnog prostora korisnika."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Stvori osobni prostor"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Potrebna je ovjera za stvaranje osobnog prostora korisnika."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -273,8 +313,12 @@ msgid "Set static hostname"
msgstr "Postavi nepromjenjivi naziv račumala"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Potrebna je ovjera za postavljenje nepromjenjivog naziva lokalnog računala, kao i prijatnog naziva računala."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Potrebna je ovjera za postavljenje nepromjenjivog naziva lokalnog računala, "
+"kao i prijatnog naziva računala."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -309,29 +353,45 @@ msgid "Authentication is required to get system description."
msgstr "Potrebna je ovjera za prikaz informacija sustava."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Uvezi VM ili spremnik slike"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Potrebna je ovjera za uvoz WM ili spremnika slike"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Izvezi VM ili spremnik slike"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Potrebna je ovjera za izvoz WM ili spremnika slike"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Preuzmi VM ili spremnik slike"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Potrebna je ovjera za preuzimanje VM ili spremnika slike"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Potrebna je ovjera za promjenu lozinke osobnog prostora korisnika."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Postavi sustav lokalizacije"
@@ -353,8 +413,11 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Dopusti aplikacijama sprječavanje isključivanja sustava"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju isključivanja sustava."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju isključivanja "
+"sustava."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -362,7 +425,8 @@ msgstr "Dopusti aplikacijama odgodu isključivanja sustava"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u odgodi isključivanja sustava."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u odgodi isključivanja sustava."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -370,7 +434,9 @@ msgstr "Dopusti aplikacijama sprječavanje spavanja sustava"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju spavanja sustava."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju spavanja "
+"sustava."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -385,48 +451,74 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Dopusti aplikacijama sprječavanje automatskog suspendiranja sustava"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju automatskog suspendiranja sustava."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju automatskog "
+"suspendiranja sustava."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Dopusti aplikacijama sprječavanje rukovanja sustava tipkom isključivanja"
+msgstr ""
+"Dopusti aplikacijama sprječavanje rukovanja sustava tipkom isključivanja"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja sustava tipkom isključivanja."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja "
+"sustava tipkom isključivanja."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Dopusti aplikacijama sprječavanje rukovanja sustava tipkom suspenzije"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja sustava tipkom suspenzije."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja "
+"sustava tipkom suspenzije."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Dopusti aplikacijama sprječavanje rukovanja sustava tipkom hibernacije"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja sustava tipkom hibernacije."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja "
+"sustava tipkom hibernacije."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Dopusti aplikacijama sprječavanje rukovanja sustava preklopnicama"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Potrebna je ovjera za dopuštanje sprječavanja rukovanja sustava preklopnicama."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Potrebna je ovjera za dopuštanje sprječavanja rukovanja sustava "
+"preklopnicama."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Dopusti aplikacijama sprječavanje rukovanja sustava tipkom isključivanja"
+msgstr ""
+"Dopusti aplikacijama sprječavanje rukovanja sustava tipkom isključivanja"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja sustava tipkom isključivanja."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Potrebna je ovjera za dopuštanje aplikacijama u sprječavanju rukovanja "
+"sustava tipkom isključivanja."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -434,7 +526,9 @@ msgstr "Dopusti neprijavljenim korisnicima pokretanje programa"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Potrebna je ovjera za dopuštanje neprijavljenim korisnicima pokretanje programa."
+msgstr ""
+"Potrebna je ovjera za dopuštanje neprijavljenim korisnicima pokretanje "
+"programa."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -442,7 +536,9 @@ msgstr "Dopusti neprijavljenim korisnicima pokretanje programa"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Potrebna je ovjera za dopuštanje neprijavljenim korisnicima pokretanje programa."
+msgstr ""
+"Potrebna je ovjera za dopuštanje neprijavljenim korisnicima pokretanje "
+"programa."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -458,7 +554,8 @@ msgstr "Ukloni povezani uređaj sa skupa sesija i hardvera"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Potrebna je ovjera za obnovu povezivanja uređaja sa skupom sesija i hardvera."
+msgstr ""
+"Potrebna je ovjera za obnovu povezivanja uređaja sa skupom sesija i hardvera."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -473,16 +570,25 @@ msgid "Power off the system while other users are logged in"
msgstr "Isključi sustav kada su ostali korisnici prijavljeni"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Potrebna je ovjera za isključivanje sustava kada su ostali korisnici prijavljeni."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Potrebna je ovjera za isključivanje sustava kada su ostali korisnici "
+"prijavljeni."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
-msgstr "Isključi sustav kada je aplikacija zatražila sprječavanje isključivanja"
+msgstr ""
+"Isključi sustav kada je aplikacija zatražila sprječavanje isključivanja"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Potrebna je ovjera za isključivanje sustava kada je aplikacija zatražila sprječavanje isključivanja."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Potrebna je ovjera za isključivanje sustava kada je aplikacija zatražila "
+"sprječavanje isključivanja."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -497,16 +603,26 @@ msgid "Reboot the system while other users are logged in"
msgstr "Ponovno pokreni sustav kada su ostali korisnici prijavljeni"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Potrebna je ovjera za ponovno pokretanje sustava kada su ostali korisnici prijavljeni."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Potrebna je ovjera za ponovno pokretanje sustava kada su ostali korisnici "
+"prijavljeni."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
-msgstr "Ponovno pokreni sustav kada je aplikacija zatražila sprječavanje ponovnog pokretanja"
+msgstr ""
+"Ponovno pokreni sustav kada je aplikacija zatražila sprječavanje ponovnog "
+"pokretanja"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Potrebna je ovjera za ponovno pokretanje sustava kada je aplikacija zatražila sprječavanje ponovnog pokretanja."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Potrebna je ovjera za ponovno pokretanje sustava kada je aplikacija "
+"zatražila sprječavanje ponovnog pokretanja."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -521,16 +637,25 @@ msgid "Halt the system while other users are logged in"
msgstr "Zaustavi sustav kada su ostali korisnici prijavljeni"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Potrebna je ovjera za zaustavljanje sustava kada su drugi korisnici prijavljeni."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Potrebna je ovjera za zaustavljanje sustava kada su drugi korisnici "
+"prijavljeni."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
-msgstr "Zaustavi sustav kada je aplikacija zatražila sprječavanje zaustavljanja"
+msgstr ""
+"Zaustavi sustav kada je aplikacija zatražila sprječavanje zaustavljanja"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Potrebna je ovjera za zaustavljanje sustava kada je aplikacija zatražila sprječavanje hibernacije."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Potrebna je ovjera za zaustavljanje sustava kada je aplikacija zatražila "
+"sprječavanje hibernacije."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -545,16 +670,25 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspendiraj sustav kada su drugi korisnici prijavljeni"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Potrebna je ovjera za suspendiranje sustava kada su drugi korisnici prijavljeni."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Potrebna je ovjera za suspendiranje sustava kada su drugi korisnici "
+"prijavljeni."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
-msgstr "Suspendiraj sustav kada je aplikacija zatražila sprječavanje suspendiranja"
+msgstr ""
+"Suspendiraj sustav kada je aplikacija zatražila sprječavanje suspendiranja"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Potrebna je ovjera za suspendiranje sustava kada je aplikacija zatražila sprječavanje suspendiranja."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Potrebna je ovjera za suspendiranje sustava kada je aplikacija zatražila "
+"sprječavanje suspendiranja."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -569,24 +703,36 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hiberniraj sustav kada su ostali korisnici prijavljeni"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Potrebna je ovjera za hibernaciju sustava kada su drugi korisnici prijavljeni."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Potrebna je ovjera za hibernaciju sustava kada su drugi korisnici "
+"prijavljeni."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Hiberniraj sustav kada je aplikacija zatražila sprječavanje hibernacije"
+msgstr ""
+"Hiberniraj sustav kada je aplikacija zatražila sprječavanje hibernacije"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Potrebna je ovjera za hibernaciju sustava kada je aplikacija zatražila sprječavanje hibernacije."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Potrebna je ovjera za hibernaciju sustava kada je aplikacija zatražila "
+"sprječavanje hibernacije."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
-msgstr "Upravljanje aktivnim sesijama, korisnicima i skupovima sesija i hardvera"
+msgstr ""
+"Upravljanje aktivnim sesijama, korisnicima i skupovima sesija i hardvera"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Potrebna je ovjera za upravljanje aktivnim sesijama, korisnicima i skupovima sesija i hardvera."
+msgstr ""
+"Potrebna je ovjera za upravljanje aktivnim sesijama, korisnicima i skupovima "
+"sesija i hardvera."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -602,14 +748,17 @@ msgstr "Postavi \"reason\" ponovnog pokretanja u kernel"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Potrebna je ovjera za postaviti \"reason\" ponovnog pokretanja u kernelu."
+msgstr ""
+"Potrebna je ovjera za postaviti \"reason\" ponovnog pokretanja u kernelu."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Najavi firmveru da pokrene sučelje postavljanja"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr "Potrebna je ovjera za najavu firmveru da pokrene sučelje postavljanja."
#: src/login/org.freedesktop.login1.policy:374
@@ -617,16 +766,23 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Najavi učitaču pokretanja da pokrene izbornik učitača pokretanja"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Potrebna je ovjera za najavu učitaču pokretanja da pokrene izbornik učitača pokretanja."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Potrebna je ovjera za najavu učitaču pokretanja da pokrene izbornik učitača "
+"pokretanja."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Najavi učitaču pokretanja da pokrene određeni unos"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Potrebna je ovjera za najavu učitaču pokretanja da pokrene određeni unos."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Potrebna je ovjera za najavu učitaču pokretanja da pokrene određeni unos."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -681,7 +837,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Pokretanje pseudo TTY na lokalnom spremniku"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "Potrebna je ovjera za pokretanje pseudo TTY na lokalnom spremniku."
#: src/machine/org.freedesktop.machine1.policy:74
@@ -697,16 +854,23 @@ msgid "Manage local virtual machines and containers"
msgstr "Upravljanje lokalnim vurtualnim strojevima i spremnicima"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Potrebna je ovjera za upravljanje lokalnim vurtualnim strojevima i spremnicima."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Potrebna je ovjera za upravljanje lokalnim vurtualnim strojevima i "
+"spremnicima."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Upravljanje lokalnim vurtualnim strojevima i spremnicima slika"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Potrebna je ovjera za upravljanje lokalnim vurtualnim strojevima i spremnicima slika."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Potrebna je ovjera za upravljanje lokalnim vurtualnim strojevima i "
+"spremnicima slika."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -764,7 +928,8 @@ msgstr "Omogući/Onemogući glatko osvježavanje"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Potrebna je ovjera za omogućavanje ili onemogućavanje DNS grupnog emitiranja."
+msgstr ""
+"Potrebna je ovjera za omogućavanje ili onemogućavanje DNS grupnog emitiranja."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -794,7 +959,8 @@ msgstr "Postavi DNSSEC negativna pouzdana sidrišta"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Potrebna je ovjera za postavljanje DNSSEC negativnih pouzdanih sidrišta."
+msgstr ""
+"Potrebna je ovjera za postavljanje DNSSEC negativnih pouzdanih sidrišta."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -857,15 +1023,18 @@ msgid "Attach or detach a portable service image"
msgstr "Dodaj ili ukloni prijenosnu sliku usluge"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Potrebna je ovjera za dodavanje ili uklanjanje prijenosne slike usluge."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Potrebna je ovjera za dodavanje ili uklanjanje prijenosne slike usluge."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Obriši ili promijeni prijenosnu sliku usluge"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "Potrebna je ovjera za brisnje ili promijenu prijenosne slike usluge."
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -913,49 +1082,64 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Postavi RTC u lokalnu vremensku zonu ili UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Potrebna je ovjera za postavljanje RTC-a u lokalnu vremensku zonu ili UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Potrebna je ovjera za postavljanje RTC-a u lokalnu vremensku zonu ili UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Uključi ili isključi mrežno uklađivanje vremena"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Potrebna je ovjera za uključivanje ili isključivanje mrežnog usklađivanja vremena."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Potrebna je ovjera za uključivanje ili isključivanje mrežnog usklađivanja "
+"vremena."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Potrebna je ovjera za pokretanje '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Potrebna je ovjera za zaustavljanje '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Potrebna je ovjera za ponovno učitavnje '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Potrebna je ovjera za ponovno pokretanje'$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "Potrebna je ovjera za slanje UNIX signala u procese '$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "Potrebna je ovjera za vraćanje \"neuspjelog\" stanja '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Potrebna je ovjera za postavljanje svojstava na '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Potrebna je ovjera za brisanje datoteka i direktorija pridruženih sa '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Potrebna je ovjera za brisanje datoteka i direktorija pridruženih sa "
+"'$(unit)'."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Potrebna je ovjera za zamrzavanje ili odmrzavanje procesa '$(unit)' jedinice."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Potrebna je ovjera za zamrzavanje ili odmrzavanje procesa '$(unit)' jedinice."
diff --git a/po/hu.po b/po/hu.po
index 8ea704f2f3..0c75aa6dae 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -10,10 +10,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-09-27 01:36+0000\n"
"Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n"
-"Language-Team: Hungarian <https://translate.fedoraproject.org/projects/systemd/master/hu/>\n"
+"Language-Team: Hungarian <https://translate.fedoraproject.org/projects/"
+"systemd/master/hu/>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,8 +27,11 @@ msgid "Send passphrase back to system"
msgstr "Jelmondat visszaküldése a rendszernek"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Hitelesítés szükséges a megadott jelmondatnak a rendszernek való visszaküldéséhez."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Hitelesítés szükséges a megadott jelmondatnak a rendszernek való "
+"visszaküldéséhez."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -35,7 +39,8 @@ msgstr "Rendszerszolgáltatások vagy más egységek kezelése"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Hitelesítés szükséges a rendszerszolgáltatások vagy más egységek kezeléséhez."
+msgstr ""
+"Hitelesítés szükséges a rendszerszolgáltatások vagy más egységek kezeléséhez."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -43,15 +48,22 @@ msgstr "Rendszerszolgáltatás- vagy egységfájlok kezelése"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Hitelesítés szükséges a rendszerszolgáltatás- vagy egységfájlok kezeléséhez."
+msgstr ""
+"Hitelesítés szükséges a rendszerszolgáltatás- vagy egységfájlok kezeléséhez."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Rendszer- és szolgáltatáskezelő környezeti változóinak beállítása vagy törlése"
+msgstr ""
+"Rendszer- és szolgáltatáskezelő környezeti változóinak beállítása vagy "
+"törlése"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Hitelesítés szükséges a rendszer- és szolgáltatáskezelő környezeti változóinak beállításához vagy törléséhez."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Hitelesítés szükséges a rendszer- és szolgáltatáskezelő környezeti "
+"változóinak beállításához vagy törléséhez."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -66,8 +78,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "A systemd állapotának kiírása sebességkorlátok nélkül"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Hitelesítés szükséges a systemd állapotának sebességkorlátok nélküli kiírásához."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Hitelesítés szükséges a systemd állapotának sebességkorlátok nélküli "
+"kiírásához."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -90,8 +105,11 @@ msgid "Check credentials of a home area"
msgstr "Saját terület hitelesítő adatainak ellenőrzése"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Hitelesítés szükséges a hitelesítő adatoknak a felhasználó saját területével való összevetéséhez."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Hitelesítés szükséges a hitelesítő adatoknak a felhasználó saját területével "
+"való összevetéséhez."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -114,151 +132,202 @@ msgid "Change password of a home area"
msgstr "Saját terület jelszavának megváltoztatása"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Hitelesítés szükséges a felhasználó saját területe jelszavának megváltoztatásához."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Hitelesítés szükséges a felhasználó saját területe jelszavának "
+"megváltoztatásához."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Hitelesítés szükséges a felhasználó saját területének frissítéséhez."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Saját terület létrehozása"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Hitelesítés szükséges a felhasználó saját területének létrehozásához."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "%s felhasználó saját mappája jelenleg hiányzik, csatlakoztassa a szükséges tárolóeszközt vagy a biztonsági mentési fájlrendszert."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"%s felhasználó saját mappája jelenleg hiányzik, csatlakoztassa a szükséges "
+"tárolóeszközt vagy a biztonsági mentési fájlrendszert."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Túl gyakori bejelentkezési kísérletek %s felhasználónál, próbálja újra később."
+msgstr ""
+"Túl gyakori bejelentkezési kísérletek %s felhasználónál, próbálja újra "
+"később."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Jelszó: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "A jelszó helytelen vagy nem elegendő %s felhasználó hitelesítéséhez."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Elnézést, próbálja újra: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Helyreállítási kulcs: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "A jelszó vagy a helyreállítási kulcs helytelen vagy nem elegendő %s felhasználó hitelesítéséhez."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"A jelszó vagy a helyreállítási kulcs helytelen vagy nem elegendő %s "
+"felhasználó hitelesítéséhez."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Elnézést, adja meg újra a helyreállítási kulcsot: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "%s felhasználó biztonsági tokenje nincs behelyezve."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Próbálja újra jelszóval: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "A jelszó helytelen vagy nem elegendő, és %s felhasználó beállított biztonsági tokenje nincs behelyezve."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"A jelszó helytelen vagy nem elegendő, és %s felhasználó beállított "
+"biztonsági tokenje nincs behelyezve."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "Biztonsági token PIN-kódja: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "Hitelesítsen fizikailag %s felhasználó biztonsági tokenjén."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Erősítse meg a jelenlétet %s felhasználó biztonsági tokenjén."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Ellenőrizze a felhasználót %s felhasználó biztonsági tokenjén."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "A biztonsági token PIN-kódja zárolva van, először oldja fel (tipp: az eltávolítás és az ismételt behelyezés elegendő lehet)."
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"A biztonsági token PIN-kódja zárolva van, először oldja fel (tipp: az "
+"eltávolítás és az ismételt behelyezés elegendő lehet)."
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "A biztonsági token PIN-kódja helytelen %s felhasználónál."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Elnézést, próbálja újra a biztonsági token PIN-kódját: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "%s felhasználó biztonsági tokenjének PIN-kódja helytelen (már csak néhány próbálkozás maradt!)"
+msgstr ""
+"%s felhasználó biztonsági tokenjének PIN-kódja helytelen (már csak néhány "
+"próbálkozás maradt!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "%s felhasználó biztonsági tokenjének PIN-kódja helytelen (már egy próbálkozás maradt!)"
+msgstr ""
+"%s felhasználó biztonsági tokenjének PIN-kódja helytelen (már egy "
+"próbálkozás maradt!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "%s felhasználó saját mappája jelenleg nem aktív, először jelentkezzen be helyileg."
+msgstr ""
+"%s felhasználó saját mappája jelenleg nem aktív, először jelentkezzen be "
+"helyileg."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "%s felhasználó saját mappája jelenleg zárolva van, először oldja fel helyileg."
+msgstr ""
+"%s felhasználó saját mappája jelenleg zárolva van, először oldja fel "
+"helyileg."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Túl sok sikertelen bejelentkezési kísérlet %s felhasználónál, elutasítás."
+msgstr ""
+"Túl sok sikertelen bejelentkezési kísérlet %s felhasználónál, elutasítás."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "A felhasználói bejegyzés tiltva van, a hozzáférés megtiltása."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "A felhasználói bejegyzés még nem érvényes, a hozzáférés megtiltása."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "A felhasználói bejegyzés már nem érvényes, a hozzáférés megtiltása."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "A felhasználói bejegyzés nem érvényes, a hozzáférés megtiltása."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Túl sok bejelentkezés, próbálja újra %s múlva."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Jelszóváltoztatás szükséges."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "A jelszó lejárt, változtatás szükséges."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "A jelszó lejárt, de nem lehet megváltoztatni, a bejelentkezés elutasítása."
+msgstr ""
+"A jelszó lejárt, de nem lehet megváltoztatni, a bejelentkezés elutasítása."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "A jelszó hamarosan lejár, változtassa meg."
@@ -275,8 +344,12 @@ msgid "Set static hostname"
msgstr "Statikus gépnév beállítása"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Hitelesítés szükséges a statikusan megadott helyi gépnév, valamint a szép gépnév beállításához."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Hitelesítés szükséges a statikusan megadott helyi gépnév, valamint a szép "
+"gépnév beállításához."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -311,29 +384,47 @@ msgid "Authentication is required to get system description."
msgstr "Hitelesítés szükséges a rendszer leírásának lekéréséhez."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "VM vagy konténer lemezképének importálása"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Hitelesítés szükséges a VM vagy konténer lemezképének importálásához."
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "VM vagy konténer lemezképének exportálása"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Hitelesítés szükséges a VM vagy konténer lemezképének exportálásához."
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "VM vagy konténer lemezképének letöltése"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Hitelesítés szükséges a VM vagy konténer lemezképének letöltéséhez."
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Hitelesítés szükséges a felhasználó saját területe jelszavának "
+"megváltoztatásához."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Rendszer területi beállításának megadása"
@@ -348,15 +439,19 @@ msgstr "Rendszer billentyűzetbeállításainak megadása"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Hitelesítés szükséges a rendszer billentyűzetbeállításainak megadásához."
+msgstr ""
+"Hitelesítés szükséges a rendszer billentyűzetbeállításainak megadásához."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Az alkalmazások meggátolhatják a rendszer leállítását"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a rendszerleállítás meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a rendszerleállítás "
+"meggátlásához."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -364,7 +459,9 @@ msgstr "Az alkalmazások késleltethetik a rendszer leállítását"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a rendszerleállítás késleltetéséhez."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a rendszerleállítás "
+"késleltetéséhez."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -372,7 +469,8 @@ msgstr "Az alkalmazások meggátolhatják a rendszer altatását"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a rendszeraltatás meggátlásához."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a rendszeraltatás meggátlásához."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -380,55 +478,86 @@ msgstr "Az alkalmazások késleltethetik a rendszer altatását"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a rendszeraltatás késleltetéséhez."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a rendszeraltatás "
+"késleltetéséhez."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Az alkalmazások meggátolhatják a rendszer automatikus felfüggesztését"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Hitelesítés szükséges egy alkalmazás számára az automatikus rendszerfelfüggesztés meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára az automatikus "
+"rendszerfelfüggesztés meggátlásához."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Az alkalmazások meggátolhatják a bekapcsoló gomb rendszer általi kezelését"
+msgstr ""
+"Az alkalmazások meggátolhatják a bekapcsoló gomb rendszer általi kezelését"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a bekapcsoló gomb rendszer általi kezelésének meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a bekapcsoló gomb rendszer "
+"általi kezelésének meggátlásához."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Az alkalmazások meggátolhatják a felfüggesztés gomb rendszer általi kezelését"
+msgstr ""
+"Az alkalmazások meggátolhatják a felfüggesztés gomb rendszer általi kezelését"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a felfüggesztés gomb rendszer általi kezelésének meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a felfüggesztés gomb rendszer "
+"általi kezelésének meggátlásához."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Az alkalmazások meggátolhatják a hibernálás gomb rendszer általi kezelését"
+msgstr ""
+"Az alkalmazások meggátolhatják a hibernálás gomb rendszer általi kezelését"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a hibernálás gomb rendszer általi kezelésének meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a hibernálás gomb rendszer "
+"általi kezelésének meggátlásához."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Az alkalmazások meggátolhatják a fedélkapcsoló rendszer általi kezelését"
+msgstr ""
+"Az alkalmazások meggátolhatják a fedélkapcsoló rendszer általi kezelését"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Hitelesítés szükséges egy alkalmazás számára a fedélkapcsoló rendszer általi kezelésének meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára a fedélkapcsoló rendszer általi "
+"kezelésének meggátlásához."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Az alkalmazások meggátolhatják az újraindítás gomb rendszer általi kezelését"
+msgstr ""
+"Az alkalmazások meggátolhatják az újraindítás gomb rendszer általi kezelését"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Hitelesítés szükséges egy alkalmazás számára az újraindítás gomb rendszer általi kezelésének meggátlásához."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Hitelesítés szükséges egy alkalmazás számára az újraindítás gomb rendszer "
+"általi kezelésének meggátlásához."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -436,7 +565,9 @@ msgstr "Programfuttatás engedélyezése be nem jelentkezett felhasználó szám
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Határozott kérés szükséges a be nem jelentkezett felhasználókénti programfuttatáshoz."
+msgstr ""
+"Határozott kérés szükséges a be nem jelentkezett felhasználókénti "
+"programfuttatáshoz."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -444,7 +575,9 @@ msgstr "Programfuttatás engedélyezése be nem jelentkezett felhasználók szá
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Hitelesítés szükséges a be nem jelentkezett felhasználókénti programfuttatáshoz."
+msgstr ""
+"Hitelesítés szükséges a be nem jelentkezett felhasználókénti "
+"programfuttatáshoz."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -452,7 +585,9 @@ msgstr "Eszközök munkaállomásokhoz csatolásának engedélyezése"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Hitelesítés szükséges az eszköz munkaállomáshoz csatolásának engedélyezéséhez."
+msgstr ""
+"Hitelesítés szükséges az eszköz munkaállomáshoz csatolásának "
+"engedélyezéséhez."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -460,7 +595,9 @@ msgstr "Eszközök és munkaállomások csatolásainak törlése"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Hitelesítés szükséges az eszközök munkaállomásokhoz csatolásainak alaphelyzetbe állításához."
+msgstr ""
+"Hitelesítés szükséges az eszközök munkaállomásokhoz csatolásainak "
+"alaphelyzetbe állításához."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -472,19 +609,28 @@ msgstr "Hitelesítés szükséges a rendszer kikapcsolásához."
#: src/login/org.freedesktop.login1.policy:180
msgid "Power off the system while other users are logged in"
-msgstr "A rendszer kikapcsolása, miközben más felhasználók be vannak jelentkezve"
+msgstr ""
+"A rendszer kikapcsolása, miközben más felhasználók be vannak jelentkezve"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Hitelesítés szükséges a rendszer kikapcsolásához, miközben más felhasználók be vannak jelentkezve."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Hitelesítés szükséges a rendszer kikapcsolásához, miközben más felhasználók "
+"be vannak jelentkezve."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "A rendszer kikapcsolása, miközben egy alkalmazás meggátolja azt"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Hitelesítés szükséges a rendszer kikapcsolásához, miközben egy alkalmazás meggátolja azt."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Hitelesítés szükséges a rendszer kikapcsolásához, miközben egy alkalmazás "
+"meggátolja azt."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -496,19 +642,28 @@ msgstr "Hitelesítés szükséges a rendszer újraindításához."
#: src/login/org.freedesktop.login1.policy:213
msgid "Reboot the system while other users are logged in"
-msgstr "A rendszer újraindítása, miközben más felhasználók be vannak jelentkezve"
+msgstr ""
+"A rendszer újraindítása, miközben más felhasználók be vannak jelentkezve"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Hitelesítés szükséges a rendszer újraindításához, miközben más felhasználók be vannak jelentkezve."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Hitelesítés szükséges a rendszer újraindításához, miközben más felhasználók "
+"be vannak jelentkezve."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "A rendszer újraindítása, miközben egy alkalmazás meggátolja azt"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Hitelesítés szükséges a rendszer újraindításához, miközben egy alkalmazás meggátolja azt."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Hitelesítés szükséges a rendszer újraindításához, miközben egy alkalmazás "
+"meggátolja azt."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -523,16 +678,24 @@ msgid "Halt the system while other users are logged in"
msgstr "A rendszer leállítása, miközben más felhasználók be vannak jelentkezve"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Hitelesítés szükséges a rendszer leállításához, miközben más felhasználók be vannak jelentkezve."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Hitelesítés szükséges a rendszer leállításához, miközben más felhasználók be "
+"vannak jelentkezve."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "A rendszer leállítása, miközben egy alkalmazás meggátolja azt"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Hitelesítés szükséges a rendszer leállításához, miközben egy alkalmazás meggátolja azt."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Hitelesítés szükséges a rendszer leállításához, miközben egy alkalmazás "
+"meggátolja azt."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -544,19 +707,28 @@ msgstr "Hitelesítés szükséges a rendszer felfüggesztéséhez."
#: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while other users are logged in"
-msgstr "A rendszer felfüggesztése, miközben más felhasználók be vannak jelentkezve"
+msgstr ""
+"A rendszer felfüggesztése, miközben más felhasználók be vannak jelentkezve"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Hitelesítés szükséges a rendszer felfüggesztéséhez, miközben más felhasználók be vannak jelentkezve."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Hitelesítés szükséges a rendszer felfüggesztéséhez, miközben más "
+"felhasználók be vannak jelentkezve."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "A rendszer felfüggesztése, miközben egy alkalmazás meggátolja azt"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Hitelesítés szükséges a rendszer felfüggesztéséhez, miközben egy alkalmazás meggátolja azt."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Hitelesítés szükséges a rendszer felfüggesztéséhez, miközben egy alkalmazás "
+"meggátolja azt."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -568,19 +740,28 @@ msgstr "Hitelesítés szükséges a rendszer hibernálásához."
#: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while other users are logged in"
-msgstr "A rendszer hibernálása, miközben más felhasználók be vannak jelentkezve"
+msgstr ""
+"A rendszer hibernálása, miközben más felhasználók be vannak jelentkezve"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Hitelesítés szükséges a rendszer hibernálásához, miközben más felhasználók be vannak jelentkezve."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Hitelesítés szükséges a rendszer hibernálásához, miközben más felhasználók "
+"be vannak jelentkezve."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "A rendszer hibernálása, miközben egy alkalmazás meggátolja azt"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Hitelesítés szükséges a rendszer hibernálásához, miközben egy alkalmazás meggátolja azt."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Hitelesítés szükséges a rendszer hibernálásához, miközben egy alkalmazás "
+"meggátolja azt."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -588,7 +769,9 @@ msgstr "Aktív munkamenetek, felhasználók és munkaállomások kezelése"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Hitelesítés szükséges az aktív munkamenetek, felhasználók és munkaállomások kezeléséhez."
+msgstr ""
+"Hitelesítés szükséges az aktív munkamenetek, felhasználók és munkaállomások "
+"kezeléséhez."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -596,7 +779,8 @@ msgstr "Aktív munkamenetek zárolása vagy feloldása"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Hitelesítés szükséges az aktív munkamenetek zárolásához vagy feloldásához."
+msgstr ""
+"Hitelesítés szükséges az aktív munkamenetek zárolásához vagy feloldásához."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -604,31 +788,51 @@ msgstr "Az újraindítás „okának” beállítása a rendszermagban"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Hitelesítés szükséges a rendszer újraindítási „okának” beállításához a rendszermagban."
+msgstr ""
+"Hitelesítés szükséges a rendszer újraindítási „okának” beállításához a "
+"rendszermagban."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Jelzés a belső vezérlőprogram számára, hogy a beállítófelületet indítsa el rendszerindításkor"
+msgstr ""
+"Jelzés a belső vezérlőprogram számára, hogy a beállítófelületet indítsa el "
+"rendszerindításkor"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Hitelesítés szükséges annak jelzéséhez, hogy a belső vezérlőprogram a beállítófelületet indítsa el rendszerindításkor."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Hitelesítés szükséges annak jelzéséhez, hogy a belső vezérlőprogram a "
+"beállítófelületet indítsa el rendszerindításkor."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
-msgstr "Jelzés a rendszerbetöltő számára, hogy a rendszerbetöltő menüt indítsa el rendszerindításkor"
+msgstr ""
+"Jelzés a rendszerbetöltő számára, hogy a rendszerbetöltő menüt indítsa el "
+"rendszerindításkor"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Hitelesítés szükséges annak jelzéséhez, hogy a rendszerbetöltő a rendszerbetöltő menüt indítsa el rendszerindításkor."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Hitelesítés szükséges annak jelzéséhez, hogy a rendszerbetöltő a "
+"rendszerbetöltő menüt indítsa el rendszerindításkor."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
-msgstr "Jelzés a rendszerbetöltő számára, hogy egy adott bejegyzést indítson el rendszerindításkor"
+msgstr ""
+"Jelzés a rendszerbetöltő számára, hogy egy adott bejegyzést indítson el "
+"rendszerindításkor"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Hitelesítés szükséges annak jelzéséhez, hogy a rendszerbetöltő egy adott rendszerbetöltő-bejegyzést indítson el rendszerindításkor."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Hitelesítés szükséges annak jelzéséhez, hogy a rendszerbetöltő egy adott "
+"rendszerbetöltő-bejegyzést indítson el rendszerindításkor."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -668,7 +872,8 @@ msgstr "Parancsértelmező elérése helyi konténerben"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Hitelesítés szükséges a parancsértelmező helyi konténerben való eléréséhez."
+msgstr ""
+"Hitelesítés szükséges a parancsértelmező helyi konténerben való eléréséhez."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -683,8 +888,10 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Pszeudoterminál elérése helyi konténerben"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Hitelesítés szükséges a pszeudoterminál helyi konténerben való eléréséhez."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Hitelesítés szükséges a pszeudoterminál helyi konténerben való eléréséhez."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -699,7 +906,8 @@ msgid "Manage local virtual machines and containers"
msgstr "Helyi virtuális gépek és konténerek kezelése"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr "Hitelesítés szükséges helyi virtuális gépek és konténerek kezeléséhez."
#: src/machine/org.freedesktop.machine1.policy:95
@@ -707,8 +915,12 @@ msgid "Manage local virtual machine and container images"
msgstr "Helyi virtuális gépek és konténerek lemezképeinek kezelése"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Hitelesítés szükséges a helyi virtuális gépek és konténerek lemezképeinek kezeléséhez."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Hitelesítés szükséges a helyi virtuális gépek és konténerek lemezképeinek "
+"kezeléséhez."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -766,7 +978,8 @@ msgstr "Csoportcímes DNS engedélyezése vagy letiltása"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Hitelesítés szükséges a csoportcímes DNS engedélyezéséhez vagy letiltásához."
+msgstr ""
+"Hitelesítés szükséges a csoportcímes DNS engedélyezéséhez vagy letiltásához."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -776,7 +989,8 @@ msgstr "TLS feletti DNS engedélyezése vagy letiltása"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Hitelesítés szükséges a TLS feletti DNS engedélyezéséhez vagy letiltásához."
+msgstr ""
+"Hitelesítés szükséges a TLS feletti DNS engedélyezéséhez vagy letiltásához."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -852,23 +1066,30 @@ msgstr "Hordozható szolgáltatás lemezképének vizsgálata"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Hitelesítés szükséges a hordozható szolgáltatás lemezképének vizsgálatához."
+msgstr ""
+"Hitelesítés szükséges a hordozható szolgáltatás lemezképének vizsgálatához."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Hordozható szolgáltatás lemezképének csatolása vagy leválasztása"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Hitelesítés szükséges a hordozható szolgáltatás lemezképének csatolásához vagy leválasztásához."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Hitelesítés szükséges a hordozható szolgáltatás lemezképének csatolásához "
+"vagy leválasztásához."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Hordozható szolgáltatás lemezképének törlése vagy módosítása"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Hitelesítés szükséges a hordozható szolgáltatás lemezképének törléséhez vagy módosításához."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Hitelesítés szükséges a hordozható szolgáltatás lemezképének törléséhez vagy "
+"módosításához."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -884,7 +1105,8 @@ msgstr "DNS-SD szolgáltatás regisztrációjának törlése"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Hitelesítés szükséges a DNS-SD szolgáltatás regisztrációjának törléséhez."
+msgstr ""
+"Hitelesítés szükséges a DNS-SD szolgáltatás regisztrációjának törléséhez."
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -915,52 +1137,74 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Az RTC beállítása helyi időzónára vagy UTC-re"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Hitelesítés szükséges annak vezérléséhez, hogy az RTC a helyi vagy az UTC időt tárolja."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Hitelesítés szükséges annak vezérléséhez, hogy az RTC a helyi vagy az UTC "
+"időt tárolja."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Hálózati időszinkronizáció be- vagy kikapcsolása"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Hitelesítés szükséges annak vezérléséhez, hogy a hálózati időszinkronizáció engedélyezve legyen."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Hitelesítés szükséges annak vezérléséhez, hogy a hálózati időszinkronizáció "
+"engedélyezve legyen."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Hitelesítés szükséges a(z) „$(unit)” elindításához."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Hitelesítés szükséges a(z) „$(unit)” leállításához."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Hitelesítés szükséges a(z) „$(unit)” újratöltéséhez."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Hitelesítés szükséges a(z) „$(unit)” újraindításához."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Hitelesítés szükséges a(z) „$(unit)” folyamatainak történő UNIX szignál küldéséhez."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Hitelesítés szükséges a(z) „$(unit)” folyamatainak történő UNIX szignál "
+"küldéséhez."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Hitelesítés szükséges a(z) „$(unit)” „failed” állapotának visszaállításához."
+msgstr ""
+"Hitelesítés szükséges a(z) „$(unit)” „failed” állapotának visszaállításához."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Hitelesítés szükséges a(z) „$(unit)” egységen lévő tulajdonságok beállításához."
+msgstr ""
+"Hitelesítés szükséges a(z) „$(unit)” egységen lévő tulajdonságok "
+"beállításához."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Hitelesítés szükséges a(z) „$(unit)” egységhez hozzárendelt fájlok és könyvtárak törléséhez."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Hitelesítés szükséges a(z) „$(unit)” egységhez hozzárendelt fájlok és "
+"könyvtárak törléséhez."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Hitelesítés szükséges a(z) „$(unit)” egység folyamatainak lefagyasztásához vagy kiolvasztásához."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Hitelesítés szükséges a(z) „$(unit)” egység folyamatainak lefagyasztásához "
+"vagy kiolvasztásához."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Hitelesítés szükséges a következő kilövéséhez: „$(unit)”."
diff --git a/po/id.po b/po/id.po
index 35dbdc2683..d941484d98 100644
--- a/po/id.po
+++ b/po/id.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2024-01-21 10:36+0000\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"Language-Team: Indonesian <https://translate.fedoraproject.org/projects/"
@@ -22,8 +22,11 @@ msgid "Send passphrase back to system"
msgstr "Kirim frasa sandi kembali ke sistem"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Otentikasi diperlukan untuk mengirim frasa sandi yang dimasukkan kembali ke sistem."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Otentikasi diperlukan untuk mengirim frasa sandi yang dimasukkan kembali ke "
+"sistem."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -31,7 +34,8 @@ msgstr "Kelola layanan sistem atau unit lainnya"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Otentikasi diperlukan untuk mengelola layanan sistem atau unit lainnya."
+msgstr ""
+"Otentikasi diperlukan untuk mengelola layanan sistem atau unit lainnya."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -46,8 +50,12 @@ msgid "Set or unset system and service manager environment variables"
msgstr "Atur atau hapus variabel lingkungan manajer layanan dan sistem"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Otentikasi diperlukan untuk menata atau menghapus variabel lingkungan manajer layanan dan sistem."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Otentikasi diperlukan untuk menata atau menghapus variabel lingkungan "
+"manajer layanan dan sistem."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -62,7 +70,8 @@ msgid "Dump the systemd state without rate limits"
msgstr "Curahkan keadaan systemd tanpa pembatasan laju"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr ""
"Otentikasi diperlukan untuk mencurahkan keadaan systemd tanpa pembatasan "
"laju."
@@ -88,8 +97,11 @@ msgid "Check credentials of a home area"
msgstr "Memeriksa kredensial dari suatu area rumah"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Otentikasi diperlukan untuk memeriksa kredensial atas suatu area rumah pengguna."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Otentikasi diperlukan untuk memeriksa kredensial atas suatu area rumah "
+"pengguna."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -112,165 +124,196 @@ msgid "Change password of a home area"
msgstr "Ubah kata sandi dari suatu area rumah"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Otentikasi diperlukan untuk mengubah kata sandi dari suatu area rumah pengguna."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Otentikasi diperlukan untuk mengubah kata sandi dari suatu area rumah "
+"pengguna."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Otentikasi diperlukan untuk memperbarui suatu area rumah pengguna."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Menciptakan suatu area rumah"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Otentikasi diperlukan untuk mencipta suatu area rumah pengguna."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
"Home dari pengguna %s saat ini tidak ada, harap tancapkan perangkat "
"penyimpanan yang diperlukan atau sistem berkas pendukung."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr "Percobaan log masuk terlalu sering bagi pengguna %s, coba lagi nanti."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Kata Sandi: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "Kata sandi salah atau tidak memadai bagi otentikasi dari pengguna %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Maaf, coba lagi: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Kunci pemulihan: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
"Kata sandi/kunci pemulihan salah atau tidak memadai untuk otentikasi "
"pengguna %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Maaf, masukkan lagi kunci pemulihan: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Token keamanan pengguna %s tidak ditancapkan."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Coba lagi dengan kata sandi: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
"Kata sandi salah atau tidak memadai, dan token keamanan yang terkonfigurasi "
"dari pengguna %s tidak ditancapkan."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN token keamanan: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "Harap otentikasikan secara fisik pada token keamanan dari pengguna %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Harap konfirmasikan keberadaan pada token keamanan dari pengguna %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Harap verifikasikan pengguna pada token keamanan dari pengguna %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
"PIN token keamanan terkunci, harap buka dulu kuncinya. (Petunjuk: Mencabut "
"dan menancapkan ulang mungkin sudah cukup)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "PIN token keamanan salah bagi pengguna %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Maaf, coba lagi PIN token keamanan: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
"PIN token keamanan dari pengguna %s salah (hanya beberapa percobaan tersisa!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
"PIN token keamanan dari pengguna %s salah (hanya satu percobaan tersisa!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
"Home dari pengguna %s saat ini tidak aktif, harap log masuk secara lokal "
"terlebih dahulu."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
"Home dari pengguna %s saat ini terkunci, harap buka kunci secara lokal "
"terlebih dahulu."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "Terlalu banyak upaya log masuk yang gagal bagi pengguna %s, menolak."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Rekaman pengguna terblokir, menolak akses."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Rekaman pengguna belum valid, menolak akses."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Rekaman pengguna tidak valid lagi, menolak akses."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Rekaman pengguna tidak valid, menolak akses."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Terlalu banyak log masuk, coba lagi dalam %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Perubahan kata sandi diperlukan."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Kata sandi kedaluwarsa, perubahan diperlukan."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "Kata sandi kedaluwarsa, tapi tidak bisa mengubah, menolak log masuk."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Kata sandi akan segera kedaluwarsan, harap diubah."
@@ -287,8 +330,12 @@ msgid "Set static hostname"
msgstr "Setel nama host statik"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Otentikasi diperlukan untuk menata nama host lokal yang dikonfigurasi statik, maupun nama host cantik."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Otentikasi diperlukan untuk menata nama host lokal yang dikonfigurasi "
+"statik, maupun nama host cantik."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -323,29 +370,47 @@ msgid "Authentication is required to get system description."
msgstr "Otentikasi diperlukan untuk mendapatkan deskripsi sistem."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Impor sebuah image kontainer atau VM"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Otentikasi diperlukan untuk mengimpor suatu image kontainer atau VM"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Ekspor sebuah image kontainer atau VM"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Otentikasi diperlukan untuk mengekspor suatu image kontainer atau VM"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Unduh sebuah image kontainer atau VM"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Otentikasi diperlukan untuk mengunduh suatu image kontainer atau VM"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Otentikasi diperlukan untuk mengubah kata sandi dari suatu area rumah "
+"pengguna."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Setel locale sistem"
@@ -367,8 +432,10 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Ijinkan aplikasi untuk mencegah shutdown sistem"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah shutdown sistem."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah shutdown sistem."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -376,7 +443,8 @@ msgstr "Ijinkan aplikasi untuk menunda shutdown sistem"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk menunda shutdown sistem."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk menunda shutdown sistem."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -399,48 +467,71 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Ijinkan aplikasi mencegah suspensi sistem otomatis"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah suspensi sistem."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah suspensi sistem."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Ijinkan aplikasi mencegah penanganan sistem atas tombol daya"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem atas tombol daya."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem "
+"atas tombol daya."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Ijinkan aplikasi mencegah penanganan sistem atas tombol suspensi"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem atas tombol suspensi."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem "
+"atas tombol suspensi."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Ijinkan aplikasi mencegah penanganan sistem atas tombol hibernasi"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem dari tombol hibernasi."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem "
+"dari tombol hibernasi."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Ijinkan aplikasi mencegah penanganan sistem atas saklar lid"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem atas saklar lid."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem "
+"atas saklar lid."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "Izinkan aplikasi mencegah penanganan sistem atas tombol reboot"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem atas tombol reboot."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Otentikasi diperlukan bagi suatu aplikasi untuk mencegah penanganan sistem "
+"atas tombol reboot."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -448,7 +539,9 @@ msgstr "Ijinkan pengguna yang tidak log masuk menjalankan program"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Permintaan eksplisit diperlukan untuk menjalankan program sebagai pengguna yang tidak log masuk."
+msgstr ""
+"Permintaan eksplisit diperlukan untuk menjalankan program sebagai pengguna "
+"yang tidak log masuk."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -456,7 +549,9 @@ msgstr "Ijinkan pengguna yang tidak log masuk menjalankan program"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Otentikasi diperlukan untuk menjalankan program sebagai pengguna yang tidak log masuk."
+msgstr ""
+"Otentikasi diperlukan untuk menjalankan program sebagai pengguna yang tidak "
+"log masuk."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -472,7 +567,8 @@ msgstr "Siram perangkat untuk mendudukkan lampiran"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Otentikasi diperlukan untuk me-reset bagaimana perangkat dicantolkan ke seat."
+msgstr ""
+"Otentikasi diperlukan untuk me-reset bagaimana perangkat dicantolkan ke seat."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -487,16 +583,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Matikan daya sistem ketika pengguna lain sedang log masuk"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Otentikasi diperlukan untuk mematikan daya sistem ketika pengguna lain sedang log masuk."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Otentikasi diperlukan untuk mematikan daya sistem ketika pengguna lain "
+"sedang log masuk."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Matikan daya sistem ketika sebuah aplikasi meminta untuk mencegahnya"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Otentikasi diperlukan untuk mematikan daya sistem ketika sebuah aplikasi meminta untuk mencegahnya."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Otentikasi diperlukan untuk mematikan daya sistem ketika sebuah aplikasi "
+"meminta untuk mencegahnya."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -511,16 +615,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Boot ulang sistem ketika pengguna lain sedang log masuk"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Otentikasi diperlukan untuk mem-boot ulang sistem ketika pengguna lain sedang log masuk."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Otentikasi diperlukan untuk mem-boot ulang sistem ketika pengguna lain "
+"sedang log masuk."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Boot ulang sistem ketika sebuah aplikasi meminta untuk mencegahnya"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Otentikasi diperlukan untuk mem-boot ulang sistem ketika sebuah aplikasi meminta untuk mencegahnya."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Otentikasi diperlukan untuk mem-boot ulang sistem ketika sebuah aplikasi "
+"meminta untuk mencegahnya."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -535,16 +647,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Halt sistem ketika pengguna lain sedang log masuk"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Otentikasi diperlukan untuk meng-halt sistem ketika pengguna lain sedang log masuk."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Otentikasi diperlukan untuk meng-halt sistem ketika pengguna lain sedang log "
+"masuk."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Halt sistem ketika sebuah aplikasi meminta untuk mencegahnya"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Otentikasi diperlukan untuk menghentikan sistem ketika sebuah aplikasi meminta mencegahnya."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Otentikasi diperlukan untuk menghentikan sistem ketika sebuah aplikasi "
+"meminta mencegahnya."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -559,16 +679,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspensikan sistem ketika pengguna lain sedang log masuk"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Otentikasi diperlukan untuk mensuspensi sistem ketika pengguna lain sedang log masuk."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Otentikasi diperlukan untuk mensuspensi sistem ketika pengguna lain sedang "
+"log masuk."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Suspensikan sistem ketika sebuah aplikasi meminta untuk mencegahnya"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Otentikasi diperlukan untuk mensuspensi sistem ketika suatu aplikasi meminta untuk mencegahnya."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Otentikasi diperlukan untuk mensuspensi sistem ketika suatu aplikasi meminta "
+"untuk mencegahnya."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -583,16 +711,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernasikan sistem ketika pengguna lain sedang log masuk"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Otentikasi diperlukan untuk menghibernasi sistem ketika pengguna lain sedang log masuk."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Otentikasi diperlukan untuk menghibernasi sistem ketika pengguna lain sedang "
+"log masuk."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernasikan sistem ketika sebuah aplikasi meminta untuk mencegahnya"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Otentikasi diperlukan untuk menghibernasi sistem ketika sebuah aplikasi meminta mencegahnya."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Otentikasi diperlukan untuk menghibernasi sistem ketika sebuah aplikasi "
+"meminta mencegahnya."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -623,24 +759,36 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indikasikan ke firmware untuk boot ke antar muka penyiapan"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Otentikasi diperlukan untuk mengindikasikan ke firmware agar boot ke antarmuka penyiapan."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Otentikasi diperlukan untuk mengindikasikan ke firmware agar boot ke "
+"antarmuka penyiapan."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indikasikan ke boot loader untuk boot ke menu boot loader"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Otentikasi diperlukan untuk mengindikasikan ke boot loader agar boot ke menu boot loader."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Otentikasi diperlukan untuk mengindikasikan ke boot loader agar boot ke menu "
+"boot loader."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indikasikan ke boot loader untuk boot suatu entri spesifik"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Otentikasi diperlukan untuk mengindikasikan ke boot loader agar boot ke entri boot loader tertentu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Otentikasi diperlukan untuk mengindikasikan ke boot loader agar boot ke "
+"entri boot loader tertentu."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -680,7 +828,9 @@ msgstr "Dapatkan sebuah shell dalam kontainer lokal"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Otentikasi diperlukan untuk mendapatkan suatu shell dalam sebuah kontainer lokal."
+msgstr ""
+"Otentikasi diperlukan untuk mendapatkan suatu shell dalam sebuah kontainer "
+"lokal."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -695,8 +845,11 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Dapatkan sebuah TTY semu dalam suatu kontainer lokal"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Otentikasi diperlukan untuk mendapatkan suatu TTY semu dalam sebuah kontainer lokal."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Otentikasi diperlukan untuk mendapatkan suatu TTY semu dalam sebuah "
+"kontainer lokal."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -704,23 +857,30 @@ msgstr "Dapatkan sebuah TTY semu pada host lokal"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Otentikasi diperlukan untuk mendapatkan suatu TTY semu pada host lokal."
+msgstr ""
+"Otentikasi diperlukan untuk mendapatkan suatu TTY semu pada host lokal."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Kelola mesin virtual lokal dan kontainer"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Otentikasi diperlukan untuk mengelola mesin virtual lokal dan kontainer."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Otentikasi diperlukan untuk mengelola mesin virtual lokal dan kontainer."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Kelola mesin virtual lokal dan image kontainer"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Otentikasi diperlukan untuk mengelola mesin virtual lokal dan image kontainer."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Otentikasi diperlukan untuk mengelola mesin virtual lokal dan image "
+"kontainer."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -778,7 +938,8 @@ msgstr "Fungsikan/nonaktifkan DNS multicast"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Otentikasi diperlukan untuk memfungsikan atau menonaktifkan DNS multicast."
+msgstr ""
+"Otentikasi diperlukan untuk memfungsikan atau menonaktifkan DNS multicast."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -788,7 +949,8 @@ msgstr "Fungsikan/nonaktifkan DNS over TLS"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Otentikasi diperlukan untuk memfungsikan atau menonaktifkan DNS over TLS."
+msgstr ""
+"Otentikasi diperlukan untuk memfungsikan atau menonaktifkan DNS over TLS."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -871,16 +1033,22 @@ msgid "Attach or detach a portable service image"
msgstr "Cantol atau lepaskan suatu image layanan portabel"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Otentikasi diperlukan untuk mencantol atau melepas suatu image layanan portabel."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Otentikasi diperlukan untuk mencantol atau melepas suatu image layanan "
+"portabel."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Hapus atau ubah image layanan portabel"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Otentikasi diperlukan untuk menghapus atau mengubah suatu image layanan portabel."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Otentikasi diperlukan untuk menghapus atau mengubah suatu image layanan "
+"portabel."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -927,55 +1095,79 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Atur RTC ke zona waktu lokal atau UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Otentikasi diperlukan untuk mengendalikan apakah RTC menyimpan waktu UTC atau lokal."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Otentikasi diperlukan untuk mengendalikan apakah RTC menyimpan waktu UTC "
+"atau lokal."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Nyalakan atau matikan penyelarasan waktu jaringan"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Otentikasi diperlukan untuk mengendalikan apakah sinkronisasi waktu jaringan mesti difungsikan."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Otentikasi diperlukan untuk mengendalikan apakah sinkronisasi waktu jaringan "
+"mesti difungsikan."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Otentikasi diperlukan untuk memulai '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Otentikasi diperlukan untuk menghentikan '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Otentikasi diperlukan untuk memuat ulang '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Otentikasi diperlukan untuk memulai ulang '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Otentikasi diperlukan untuk megirim suatu sinyal UNIX ke proses dari '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Otentikasi diperlukan untuk megirim suatu sinyal UNIX ke proses dari "
+"'$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Otentikasi diperlukan untuk me-reset keadaan \"failed\" dari '$(unit)'."
+msgstr ""
+"Otentikasi diperlukan untuk me-reset keadaan \"failed\" dari '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Otentikasi diperlukan untuk menata properti pada '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Otentikasi diperlukan untuk menghapus berkas dan direktori yang terkait dengan '$(unit)'."
-
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Otentikasi diperlukan untuk membekukan atau melanjutkan proses dari unit '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Otentikasi diperlukan untuk menghapus berkas dan direktori yang terkait "
+"dengan '$(unit)'."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Otentikasi diperlukan untuk meng-halt sistem ketika sebuah aplikasi meminta untuk mencegahnya."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Otentikasi diperlukan untuk membekukan atau melanjutkan proses dari unit "
+"'$(unit)'."
+
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Otentikasi diperlukan untuk meng-halt sistem ketika sebuah aplikasi "
+#~ "meminta untuk mencegahnya."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Otentikasi diperlukan untuk mematikan '$(unit)'."
diff --git a/po/it.po b/po/it.po
index 379cdde08f..08d4f13f93 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-11-10 10:20+0100\n"
"Last-Translator: Daniele Medri <dmedri@gmail.com>\n"
"Language-Team: italian\n"
@@ -23,8 +23,11 @@ msgid "Send passphrase back to system"
msgstr "Invia la frase segreta (passphrase) al sistema"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Autenticazione richiesta per inviare la frase segreta (passphrase) al sistema."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Autenticazione richiesta per inviare la frase segreta (passphrase) al "
+"sistema."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -32,7 +35,8 @@ msgstr "Gestisci i servizi o le altre unità di sistema"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Autenticazione richiesta per gestire i servizi o le altre unità di sistema."
+msgstr ""
+"Autenticazione richiesta per gestire i servizi o le altre unità di sistema."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -40,15 +44,22 @@ msgstr "Gestisci i file dei servizi o delle unità di sistema"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Autenticazione richiesta per gestire i file dei servizi o delle unità di sistema."
+msgstr ""
+"Autenticazione richiesta per gestire i file dei servizi o delle unità di "
+"sistema."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Configura le variabili d'ambiente per la gestione dei servizi e del sistema"
+msgstr ""
+"Configura le variabili d'ambiente per la gestione dei servizi e del sistema"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Autenticazione richiesta per configurare le variabili d'ambiente per la gestione dei servizi e del sistema."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Autenticazione richiesta per configurare le variabili d'ambiente per la "
+"gestione dei servizi e del sistema."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -63,8 +74,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Eseguire il dump dello stato di systemd senza limiti di frequenza"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "L'autenticazione è richiesta per il dump dello stato di systemd senza limiti di frequenza."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"L'autenticazione è richiesta per il dump dello stato di systemd senza limiti "
+"di frequenza."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -87,8 +101,11 @@ msgid "Check credentials of a home area"
msgstr "Controlla credenziali di un'area home"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Autenticazione richiesta per controllare le credenziali di un'area home per l'utente."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Autenticazione richiesta per controllare le credenziali di un'area home per "
+"l'utente."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -111,151 +128,201 @@ msgid "Change password of a home area"
msgstr "Modifica password di un'area home"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Autenticazione richiesta per modificare la password dell'area home di un utente."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Autenticazione richiesta per modificare la password dell'area home di un "
+"utente."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Autenticazione richiesta per aggiornare l'area home di un utente."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Crea un'area home"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Autenticazione richiesta per creare l'area home di un utente."
-#: src/home/pam_systemd_home.c:287
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "La home dell'utente %s è al momento inesistente, per piacere collega il necessario dispositivo di memorizzazione o il file system necessario."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"La home dell'utente %s è al momento inesistente, per piacere collega il "
+"necessario dispositivo di memorizzazione o il file system necessario."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Tentativi di autenticazione frequenti per l'utente %s, riprova più tardi."
+msgstr ""
+"Tentativi di autenticazione frequenti per l'utente %s, riprova più tardi."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Password: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Password incorretta o non sufficiente per l'autenticazione dell'utente %s."
+msgstr ""
+"Password incorretta o non sufficiente per l'autenticazione dell'utente %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Per piacere, prova ancora: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Chiave di ripristino: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Password/chiave di ripristino incorretta o non sufficiente per l'autenticazione dell'utente %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Password/chiave di ripristino incorretta o non sufficiente per "
+"l'autenticazione dell'utente %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Per piacere, digita nuovamente la chiave di ripristino: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Token di sicurezza per l'utente %s non inserito."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Prova ancora con la password: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Password non corretta o non sufficiente, e token di sicurezza configurato per l'utente %s non inserito."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Password non corretta o non sufficiente, e token di sicurezza configurato "
+"per l'utente %s non inserito."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN del token di sicurezza: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "Per piacere, autenticate fisicamente il token di sicurezza dell'utente %s."
+msgstr ""
+"Per piacere, autenticate fisicamente il token di sicurezza dell'utente %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
-msgstr "Per piacere conferma la presenza sul token di sicurezza dell'utente %s."
+msgstr ""
+"Per piacere conferma la presenza sul token di sicurezza dell'utente %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Per piacere verifica l'utente sul token di sicurezza dell'utente %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "Il PIN del token di sicurezza è bloccato, per piacere sbloccalo prima. (Suggerimento: la rimozione e il reinserimento potrebbero essere sufficienti.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"Il PIN del token di sicurezza è bloccato, per piacere sbloccalo prima. "
+"(Suggerimento: la rimozione e il reinserimento potrebbero essere "
+"sufficienti.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "PIN del token di sicurezza errato per l'utente %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Spiacente, riprova il PIN del token di sicurezza: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "PIN del token di sicurezza dell'utente %s errato (pochi tentativi rimasti!)"
+msgstr ""
+"PIN del token di sicurezza dell'utente %s errato (pochi tentativi rimasti!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "PIN del token di sicurezza dell'utente %s errato (un tentativo rimasto!)"
+msgstr ""
+"PIN del token di sicurezza dell'utente %s errato (un tentativo rimasto!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "La Home dell'utente %s è attualmente non attiva, per piacere accedi prima localmente."
+msgstr ""
+"La Home dell'utente %s è attualmente non attiva, per piacere accedi prima "
+"localmente."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "La Home dell'utente %s è attualmente bloccata, per piacere sbloccala prima localmente."
+msgstr ""
+"La Home dell'utente %s è attualmente bloccata, per piacere sbloccala prima "
+"localmente."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "Troppi tentativi d'accesso falliti per l'utente %s, rifiuto."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Record utente bloccato, accesso negato."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Record utente non è ancora valido, accesso negato."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Record utente non più valido, accesso negato."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Record utente non valido, accesso negato."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Troppi tentativi d'accesso, riprova in %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Aggiornamento password richiesto."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "La password è scaduta, aggiornamento richiesto."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "La password è scaduta, ma non può essere cambiata, login rifiutato."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "La password scadrà a breve, per piacere cambiala."
@@ -272,8 +339,12 @@ msgid "Set static hostname"
msgstr "Configura il nome host statico"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Autenticazione richiesta per configurare staticamente il nome host locale e il nome host descrittivo."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Autenticazione richiesta per configurare staticamente il nome host locale e "
+"il nome host descrittivo."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -281,7 +352,9 @@ msgstr "Configura le informazioni sulla macchina"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Autenticazione richiesta per configurare le informazioni sulla macchina locale."
+msgstr ""
+"Autenticazione richiesta per configurare le informazioni sulla macchina "
+"locale."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -297,7 +370,8 @@ msgstr "Ottieni il numero di serie dell'hardware"
#: src/hostname/org.freedesktop.hostname1.policy:62
msgid "Authentication is required to get hardware serial number."
-msgstr "L'autenticazione è necessaria per ottenere il numero di serie dell'hardware."
+msgstr ""
+"L'autenticazione è necessaria per ottenere il numero di serie dell'hardware."
#: src/hostname/org.freedesktop.hostname1.policy:71
msgid "Get system description"
@@ -308,36 +382,56 @@ msgid "Authentication is required to get system description."
msgstr "L'autenticazione è necessaria per ottenere la descrizione del sistema."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importa un'immagine VM o un container"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "Autenticazione richiesta per importare un'immagine VM o un container"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Esporta un'immagine VM o un container"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "Autenticazione richiesta per esportare un'immagine VM o un container"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Scarica un'immagine VM o un container"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "Autenticazione richiesta per scaricare un'immagine VM o un container"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Autenticazione richiesta per modificare la password dell'area home di un "
+"utente."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Configura le impostazioni regionali di sistema"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Autenticazione richiesta per configurare le impostazioni regionali di sistema."
+msgstr ""
+"Autenticazione richiesta per configurare le impostazioni regionali di "
+"sistema."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -352,8 +446,11 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Consenti alle applicazioni di inibire lo spegnimento del sistema"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Autenticazione richiesta per un'applicazione per inibire lo spegnimento del sistema."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Autenticazione richiesta per un'applicazione per inibire lo spegnimento del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -361,7 +458,9 @@ msgstr "Consenti alle applicazioni di ritardare lo spegnimento del sistema"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Autenticazione richiesta ad un'applicazione per ritardare lo spegnimento del sistema."
+msgstr ""
+"Autenticazione richiesta ad un'applicazione per ritardare lo spegnimento del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -369,7 +468,9 @@ msgstr "Consenti alle applicazioni di inibire la pausa del sistema"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Autenticazione richiesta affinché un'applicazione possa inibire la pausa del sistema."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa inibire la pausa del "
+"sistema."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -377,55 +478,92 @@ msgstr "Consenti alle applicazioni di ritardare la pausa del sistema"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Autenticazione richiesta affinché un'applicazione possa ritardare la pausa del sistema."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa ritardare la pausa "
+"del sistema."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Consenti alle applicazioni di inibire la sospensione automatica del sistema"
+msgstr ""
+"Consenti alle applicazioni di inibire la sospensione automatica del sistema"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Autenticazione richiesta affinché un'applicazione possa inibire la sospensione automatica del sistema."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa inibire la "
+"sospensione automatica del sistema."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Consenti alle applicazioni di inibire la gestione di sistema del tasto accensione"
+msgstr ""
+"Consenti alle applicazioni di inibire la gestione di sistema del tasto "
+"accensione"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Autenticazione richiesta affinché un'applicazione possa inibire la gestione di sistema del tasto accensione."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa inibire la gestione "
+"di sistema del tasto accensione."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Consenti alle applicazioni di inibire la gestione di sistema del tasto di sospensione"
+msgstr ""
+"Consenti alle applicazioni di inibire la gestione di sistema del tasto di "
+"sospensione"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Autenticazione richiesta affinché un'applicazione possa inibire la gestione di sistema del tasto di sospensione."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa inibire la gestione "
+"di sistema del tasto di sospensione."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Consenti alle applicazioni di inibire la gestione di sistema del tasto di ibernazione"
+msgstr ""
+"Consenti alle applicazioni di inibire la gestione di sistema del tasto di "
+"ibernazione"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Autenticazione richiesta affinché un'applicazione possa inibire la gestione di sistema del tasto di ibernazione."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa inibire la gestione "
+"di sistema del tasto di ibernazione."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Consenti alle applicazioni di inibire la gestione di sistema all'apertura o chiusura del portatile"
+msgstr ""
+"Consenti alle applicazioni di inibire la gestione di sistema all'apertura o "
+"chiusura del portatile"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Autenticazione richiesta per consentire a un'applicazione di inibire la gestione di sistema all'apertura o chiusura del portatile."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Autenticazione richiesta per consentire a un'applicazione di inibire la "
+"gestione di sistema all'apertura o chiusura del portatile."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Consenti alle applicazioni di inibire la gestione di sistema del tasto di riavvio"
+msgstr ""
+"Consenti alle applicazioni di inibire la gestione di sistema del tasto di "
+"riavvio"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Autenticazione richiesta affinché un'applicazione possa inibire la gestione di sistema del tasto di riavvio."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Autenticazione richiesta affinché un'applicazione possa inibire la gestione "
+"di sistema del tasto di riavvio."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -433,7 +571,9 @@ msgstr "Consenti agli utenti non connessi di eseguire programmi"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "È necessaria una richiesta esplicita per eseguire programmi come utenti non connessi."
+msgstr ""
+"È necessaria una richiesta esplicita per eseguire programmi come utenti non "
+"connessi."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -441,7 +581,9 @@ msgstr "Consenti agli utenti non connessi di eseguire programmi"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Autenticazione richiesta per consentire agli utenti non connessi di eseguire programmi."
+msgstr ""
+"Autenticazione richiesta per consentire agli utenti non connessi di eseguire "
+"programmi."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -449,7 +591,8 @@ msgstr "Consenti di collegare dispositivi alle postazioni"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Autenticazione richiesta per collegare un dispositivo ad una postazione."
+msgstr ""
+"Autenticazione richiesta per collegare un dispositivo ad una postazione."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -457,7 +600,9 @@ msgstr "Scollega i dispositivi dalla postazione"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Autenticazione richiesta per ripristinare come i dispositivi sono collegati alle postazioni."
+msgstr ""
+"Autenticazione richiesta per ripristinare come i dispositivi sono collegati "
+"alle postazioni."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -472,16 +617,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Spegni il sistema mentre altri utenti sono connessi"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Autenticazione richiesta per spegnere il sistema mentre altri utenti sono connessi."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Autenticazione richiesta per spegnere il sistema mentre altri utenti sono "
+"connessi."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Spegni il sistema mentre un'applicazione chiede di inibirne l'azione"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Autenticazione richiesta per spegnere il sistema mentre un'applicazione chiede di inibirne l'azione."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autenticazione richiesta per spegnere il sistema mentre un'applicazione "
+"chiede di inibirne l'azione."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -496,16 +649,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Riavvia il sistema mentre altri utenti sono connessi"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Autenticazione richiesta per riavviare il sistema mentre altri utenti sono connessi."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Autenticazione richiesta per riavviare il sistema mentre altri utenti sono "
+"connessi."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Riavvia il sistema mentre un'applicazione chiede di inibirne l'azione"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Autenticazione richiesta per riavviare il sistema mentre un'applicazione chiede di inibirne l'azione."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autenticazione richiesta per riavviare il sistema mentre un'applicazione "
+"chiede di inibirne l'azione."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -520,16 +681,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Ferma il sistema mentre altri utenti sono connessi"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Autenticazione richiesta per fermare il sistema mentre altri utenti sono connessi."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Autenticazione richiesta per fermare il sistema mentre altri utenti sono "
+"connessi."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Ferma il sistema mentre un'applicazione chiede di inibirne l'azione"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Autenticazione richiesta per ibernare il sistema mentre un'applicazione ne inibisce l'azione."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autenticazione richiesta per ibernare il sistema mentre un'applicazione ne "
+"inibisce l'azione."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -544,16 +713,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Sospendi il sistema mentre altri utenti sono connessi"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Autenticazione richiesta per sospendere il sistema mentre altri utenti sono connessi."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Autenticazione richiesta per sospendere il sistema mentre altri utenti sono "
+"connessi."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Sospendi il sistema mentre un'applicazione chiede di inibirne l'azione"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Autenticazione richiesta per sospendere il sistema mentre un'applicazione chiede di inibirne l'azione."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autenticazione richiesta per sospendere il sistema mentre un'applicazione "
+"chiede di inibirne l'azione."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -568,16 +745,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Iberna il sistema mentre altri utenti sono connessi"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Autenticazione richiesta per ibernare il sistema mentre altri utenti sono connessi."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Autenticazione richiesta per ibernare il sistema mentre altri utenti sono "
+"connessi."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Iberna il sistema mentre un'applicazione chiede di inibirne l'azione"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Autenticazione richiesta per ibernare il sistema mentre un'applicazione chiede di inibirne l'azione."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autenticazione richiesta per ibernare il sistema mentre un'applicazione "
+"chiede di inibirne l'azione."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -585,7 +770,9 @@ msgstr "Gestione delle sessioni attive, utenti e postazioni"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Autenticazione richiesta per gestire le sessioni attive, gli utenti e le postazioni."
+msgstr ""
+"Autenticazione richiesta per gestire le sessioni attive, gli utenti e le "
+"postazioni."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -601,31 +788,45 @@ msgstr "Indica il \"motivo\" del riavvio nel kernel"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Autenticazione richiesta per configurare il \"motivo\" del riavvio nel kernel."
+msgstr ""
+"Autenticazione richiesta per configurare il \"motivo\" del riavvio nel "
+"kernel."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indicate al firmware di avviare un'interfaccia di configurazione"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Autenticazione richiesta per indicare al firmware l'avvio di un'interfaccia di configurazione."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Autenticazione richiesta per indicare al firmware l'avvio di un'interfaccia "
+"di configurazione."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indicate al boot loader di avviare un menu"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Autenticazione richiesta per indicate al boot loader l'avvio di uno specifico menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Autenticazione richiesta per indicate al boot loader l'avvio di uno "
+"specifico menu."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indicare al boot loader di avviare una voce specifica"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Autenticazione richiesta per indicare al boot loader l'avvio di una specifica voce in elenco."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Autenticazione richiesta per indicare al boot loader l'avvio di una "
+"specifica voce in elenco."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -680,8 +881,10 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "Apri un pseudo TTY in un container locale"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Autenticazione richiesta per aprire un pseudo TTY in un container locale."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Autenticazione richiesta per aprire un pseudo TTY in un container locale."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -696,16 +899,22 @@ msgid "Manage local virtual machines and containers"
msgstr "Gestisci le virtual machine e i container locali"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Autenticazione richiesta per gestire le virtual machine e i container locali."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Autenticazione richiesta per gestire le virtual machine e i container locali."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Gestisci le immagini locali delle virtual machine e dei container"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Autenticazione richiesta per gestire le immagini delle virtual machine e dei container locali."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Autenticazione richiesta per gestire le immagini delle virtual machine e dei "
+"container locali."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -743,7 +952,9 @@ msgstr "Configura la tabella di instradamento"
#: src/network/org.freedesktop.network1.policy:56
#: src/resolve/org.freedesktop.resolve1.policy:67
msgid "Authentication is required to set default route."
-msgstr "Autenticazione richiesta per configurare la tabella di instradamento predefinita."
+msgstr ""
+"Autenticazione richiesta per configurare la tabella di instradamento "
+"predefinita."
#: src/network/org.freedesktop.network1.policy:66
#: src/resolve/org.freedesktop.resolve1.policy:77
@@ -793,7 +1004,8 @@ msgstr "Configura DNSSEC Negative Trust Anchors"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Autenticazione richiesta per configurare DNSSEC Negative Trust Anchors."
+msgstr ""
+"Autenticazione richiesta per configurare DNSSEC Negative Trust Anchors."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -849,23 +1061,30 @@ msgstr "Ispeziona un'immagine di servizio portabile"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Autenticazione richiesta per ispezionare un'immagine di servizio portabile."
+msgstr ""
+"Autenticazione richiesta per ispezionare un'immagine di servizio portabile."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Collega o meno un'immagine di servizio portabile"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Autenticazione richiesta per collegare o meno un'immagine di servizio portabile."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Autenticazione richiesta per collegare o meno un'immagine di servizio "
+"portabile."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Elimina o modifica un'immagine di servizio portabile"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Autenticazione richiesta per eliminare o modificare un'immagine di servizio portabile."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Autenticazione richiesta per eliminare o modificare un'immagine di servizio "
+"portabile."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -881,7 +1100,8 @@ msgstr "Annulla la registrazione di un servizio DNS-SD"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Autenticazione richiesta per annullare la registrazione di un servizio DNS-SD"
+msgstr ""
+"Autenticazione richiesta per annullare la registrazione di un servizio DNS-SD"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -889,7 +1109,9 @@ msgstr "Ripristina le configurazioni per la risoluzione dei nomi"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Autenticazione richiesta per ripristinare le configurazioni per la risoluzione dei nomi."
+msgstr ""
+"Autenticazione richiesta per ripristinare le configurazioni per la "
+"risoluzione dei nomi."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -909,52 +1131,74 @@ msgstr "Autenticazione richiesta per impostare il fuso orario di sistema."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
-msgstr "Imposta l'orologio di sistema (RTC) al fuso orario locale o al tempo civile (UTC)"
+msgstr ""
+"Imposta l'orologio di sistema (RTC) al fuso orario locale o al tempo civile "
+"(UTC)"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Autenticazione richiesta per verificare se l'orologio di sistema (RTC) è configurato all'orario locale o al tempo civile (UTC)."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Autenticazione richiesta per verificare se l'orologio di sistema (RTC) è "
+"configurato all'orario locale o al tempo civile (UTC)."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Attiva/Disattiva la sincronizzazione dell'orario in rete"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Autenticazione richiesta per verificare se la sincronizzazione dell'orario in rete deve essere attivata."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Autenticazione richiesta per verificare se la sincronizzazione dell'orario "
+"in rete deve essere attivata."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Autenticazione richiesta per avviare '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Autenticazione richiesta per fermare '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Autenticazione richiesta per ricaricare '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Autenticazione richiesta per riavviare '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Autenticazione richiesta per inviare un segnale UNIX ai processi di '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Autenticazione richiesta per inviare un segnale UNIX ai processi di "
+"'$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Autenticazione richiesta per riconfigurare lo stato \"fallito\" di '$(unit)'."
+msgstr ""
+"Autenticazione richiesta per riconfigurare lo stato \"fallito\" di '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Autenticazione richiesta per configurare le proprietà di '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Autenticazione richiesta per eliminare i file e le directory associate a '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Autenticazione richiesta per eliminare i file e le directory associate a "
+"'$(unit)'."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Autenticazione richiesta per bloccare/sbloccare il processo dell'unità '$(unit)'."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Autenticazione richiesta per bloccare/sbloccare il processo dell'unità "
+"'$(unit)'."
diff --git a/po/ja.po b/po/ja.po
index 7d54c0fbe5..b6be9aa1c2 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,10 +6,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-09-09 03:04+0000\n"
"Last-Translator: Takuro Onoue <kusanaginoturugi@gmail.com>\n"
-"Language-Team: Japanese <https://translate.fedoraproject.org/projects/systemd/master/ja/>\n"
+"Language-Team: Japanese <https://translate.fedoraproject.org/projects/"
+"systemd/master/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +23,8 @@ msgid "Send passphrase back to system"
msgstr "パスフレーズをシステムに送信"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "パスフレーズをシステムに送信するには認証が必要です。"
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -39,14 +41,18 @@ msgstr "システムサービスファイルやその他のユニットファイ
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "システムサービスファイルやその他のユニットファイルを管理するには認証が必要です。"
+msgstr ""
+"システムサービスファイルやその他のユニットファイルを管理するには認証が必要で"
+"す。"
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "システムマネージャ環境変数の設定もしくは解除"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr "システムマネージャ環境変数を設定もしくは解除するには認証が必要です。"
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -62,7 +68,8 @@ msgid "Dump the systemd state without rate limits"
msgstr "systemdの状態をレート制限に関係なく出力する"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "systemdの状態をレート制限に関係なく出力するには認証が必要です。"
#: src/home/org.freedesktop.home1.policy:13
@@ -86,7 +93,8 @@ msgid "Check credentials of a home area"
msgstr "ホーム領域の認証情報の確認"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr "ユーザのホーム領域に対する認証情報の確認には認証が必要です。"
#: src/home/org.freedesktop.home1.policy:43
@@ -110,151 +118,196 @@ msgid "Change password of a home area"
msgstr "ホーム領域のパスワード変更"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "ユーザのホーム領域のパスワードを変更するには認証が必要です。"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "ユーザのホーム領域の更新には認証が必要です。"
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "ホーム領域の作成"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "ユーザのホーム領域を作成するには認証が必要です。"
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "ユーザ%sのホーム領域が存在しません。必要なストレージデバイスもしくは基盤ファイルシステムを接続して下さい。"
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"ユーザ%sのホーム領域が存在しません。必要なストレージデバイスもしくは基盤ファ"
+"イルシステムを接続して下さい。"
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr "ユーザ%sのログイン試行が頻繁すぎます。後ほどやり直して下さい。"
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "パスワード: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "ユーザ%sの認証のためのパスワードが無効です。"
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "すみません、パスワードを再入力して下さい: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "復旧キー: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr "ユーザ%sの認証のためのパスワードもしくは復旧キーが無効です。"
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "すみません、復旧キーを再入力して下さい: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "ユーザ%sのセキュリティトークンが挿入されていません。"
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "パスワードを入力して再試行して下さい: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "ユーザ%sのパスワードが無効、もしくはセキュリティトークンが挿入されていません。"
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"ユーザ%sのパスワードが無効、もしくはセキュリティトークンが挿入されていませ"
+"ん。"
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "セキュリティトークンPIN: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "ユーザ%sのセキュリティトークン上で物理的な認証を行って下さい。"
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "ユーザ%sのセキュリティトークンが存在していることを確認して下さい。"
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "ユーザ%sのセキュリティトークン上のユーザを確認して下さい。"
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "セキュリティトークンPINがロックされています。アンロックして下さい。(ヒント: 一旦トークンを外して再挿入してみて下さい。)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"セキュリティトークンPINがロックされています。アンロックして下さい。(ヒント: "
+"一旦トークンを外して再挿入してみて下さい。)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "ユーザ%sのセキュリティトークンPINが正しくありません。"
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "すみません、セキュリティトークンPINを再入力して下さい: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "ユーザ%sのセキュリティトークンPINが正しくありません (残り試行可能回数が少なくなっています!)"
+msgstr ""
+"ユーザ%sのセキュリティトークンPINが正しくありません (残り試行可能回数が少なく"
+"なっています!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "ユーザ%sのセキュリティトークンPINが正しくありません (残り試行可能回数が1回です!)"
+msgstr ""
+"ユーザ%sのセキュリティトークンPINが正しくありません (残り試行可能回数が1回で"
+"す!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "ユーザ%sのホーム領域がアクティブでありません。ローカル環境にログインして下さい。"
+msgstr ""
+"ユーザ%sのホーム領域がアクティブでありません。ローカル環境にログインして下さ"
+"い。"
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "ユーザ%sのホーム領域がロックされています。ローカル環境にてアンロックして下さい。"
+msgstr ""
+"ユーザ%sのホーム領域がロックされています。ローカル環境にてアンロックして下さ"
+"い。"
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "ユーザ%sのログイン試行の失敗回数が多すぎたため、拒否されました。"
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "ユーザレコードがブロックされたため、アクセスが禁止されています。"
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "ユーザレコードがまだ有効でないため、アクセスが禁止されています。"
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "ユーザレコードがもはや有効でないため、アクセスが禁止されています。"
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "ユーザレコードが有効でないため、アクセスが禁止されています。"
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "ログイン回数が多すぎます。%s後に試して下さい。"
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "パスワードの更新が必要です。"
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "パスワードの有効期限が切れたため、パスワードの更新が必要です。"
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "パスワードの有効期限が切れましたが、パスワードの更新できませんでした。ログインを拒否します。"
+msgstr ""
+"パスワードの有効期限が切れましたが、パスワードの更新できませんでした。ログイ"
+"ンを拒否します。"
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "パスワードの有効期限がまもなく切れます。パスワードを更新して下さい。"
@@ -271,7 +324,9 @@ msgid "Set static hostname"
msgstr "静的なホスト名の設定"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr "静的なホスト名を設定するには認証が必要です。"
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -307,29 +362,45 @@ msgid "Authentication is required to get system description."
msgstr "システムの説明を取得するには認証が必要です。"
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "仮想マシンもしくはコンテナイメージの読込"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "仮想マシンもしくはコンテナイメージを読込むには認証が必要です"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "仮想マシンもしくはコンテナイメージの書出し"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "仮想マシンもしくはコンテナイメージを書出すには認証が必要です"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "仮想マシンもしくはコンテナイメージのダウンロード"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "仮想マシンもしくはコンテナイメージをダウンロードするには認証が必要です"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "ユーザのホーム領域のパスワードを変更するには認証が必要です。"
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "システムロケールの設定"
@@ -351,8 +422,10 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "アプリケーションがシステムのシャットダウンを阻害することを許可"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "アプリケーションがシステムのシャットダウンを阻害するには認証が必要です。"
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"アプリケーションがシステムのシャットダウンを阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -360,7 +433,8 @@ msgstr "アプリケーションがシステムのシャットダウンを遅延
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "アプリケーションがシステムのシャットダウンを遅延させるには認証が必要です。"
+msgstr ""
+"アプリケーションがシステムのシャットダウンを遅延させるには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -383,15 +457,20 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "アプリケーションがシステムの自動的なサスペンドを阻害することを許可"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "アプリケーションがシステムの自動的なサスペンドを阻害するには認証が必要です。"
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"アプリケーションがシステムの自動的なサスペンドを阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "アプリケーションが電源ボタンによる動作を阻害することを許可"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr "アプリケーションが電源ボタンによる動作を阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:86
@@ -399,23 +478,31 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "アプリケーションがサスペンドキーによる動作を阻害することを許可"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "アプリケーションがサスペンドキーによる動作を阻害するには認証が必要です。"
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"アプリケーションがサスペンドキーによる動作を阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "アプリケーションがハイバネートキーによる動作を阻害することを許可"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "アプリケーションがハイバネートキーによる動作を阻害するには認証が必要です。"
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"アプリケーションがハイバネートキーによる動作を阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "アプリケーションが液晶開閉による動作を阻害することを許可"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr "アプリケーションが液晶開閉による動作を阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:117
@@ -423,7 +510,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "アプリケーションが再起動ボタンによる動作を阻害することを許可"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr "アプリケーションが再起動ボタンによる動作を阻害するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:128
@@ -432,7 +521,8 @@ msgstr "ログインしていないユーザがプログラムを実行するこ
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "ログインしていないユーザがプログラムを実行するには明示的な要求が必要です。"
+msgstr ""
+"ログインしていないユーザがプログラムを実行するには明示的な要求が必要です。"
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -471,16 +561,23 @@ msgid "Power off the system while other users are logged in"
msgstr "他のユーザがログインしている状態でシステムの電源を切る"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "他のユーザがログインしている状態でシステムの電源を切るには認証が必要です。"
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"他のユーザがログインしている状態でシステムの電源を切るには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "アプリケーションが使用されている状態でシステムの電源を切る"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "アプリケーションが使用されている状態でシステムの電源を切るには認証が必要です。"
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"アプリケーションが使用されている状態でシステムの電源を切るには認証が必要で"
+"す。"
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -495,16 +592,23 @@ msgid "Reboot the system while other users are logged in"
msgstr "他のユーザがログインしている状態でシステムを再起動する"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "他のユーザがログインしている状態でシステムを再起動するには認証が必要です。"
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"他のユーザがログインしている状態でシステムを再起動するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "アプリケーションが使用されている状態でシステムを再起動する"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "アプリケーションが使用されている状態でシステムを再起動するには認証が必要です。"
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"アプリケーションが使用されている状態でシステムを再起動するには認証が必要で"
+"す。"
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -519,16 +623,22 @@ msgid "Halt the system while other users are logged in"
msgstr "他のユーザがログインしている状態でシステムを停止する"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "他のユーザがログインしている状態でシステムを停止するには認証が必要です。"
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"他のユーザがログインしている状態でシステムを停止するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "アプリケーションが使用されている状態でシステムを停止する"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "アプリケーションが使用されている状態でシステムを停止するには認証が必要です。"
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"アプリケーションが使用されている状態でシステムを停止するには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -543,16 +653,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "他のユーザがログインしている状態でシステムをサスペンドする"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "他のユーザがログインしている状態でシステムをサスペンドするには認証が必要です。"
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"他のユーザがログインしている状態でシステムをサスペンドするには認証が必要で"
+"す。"
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "アプリケーションが使用されている状態でシステムをサスペンドする"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "アプリケーションが使用されている状態でシステムをサスペンドするには認証が必要です。"
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"アプリケーションが使用されている状態でシステムをサスペンドするには認証が必要"
+"です。"
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -567,16 +685,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "他のユーザがログインしている状態でシステムをハイバネートする"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "他のユーザがログインしている状態でシステムをハイバネートするには認証が必要です。"
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"他のユーザがログインしている状態でシステムをハイバネートするには認証が必要で"
+"す。"
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "アプリケーションが使用されている状態でシステムをハイバネートする"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "アプリケーションが使用されている状態でシステムをハイバネートするには認証が必要です。"
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"アプリケーションが使用されている状態でシステムをハイバネートするには認証が必"
+"要です。"
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -592,7 +718,8 @@ msgstr "アクティブなセッションのロックもしくはアンロック
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "アクティブなセッションをロックもしくはアンロックするには認証が必要です。"
+msgstr ""
+"アクティブなセッションをロックもしくはアンロックするには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -607,23 +734,33 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "ファームウェアに「インターフェースの設定を起動」を表示させる"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "ファームウェアに「インターフェースの設定を起動」を表示させるには認証が必要です。"
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"ファームウェアに「インターフェースの設定を起動」を表示させるには認証が必要で"
+"す。"
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "ブートローダにブートローダメニューを起動するための項目を表示させる"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "ブートローダにブートローダメニューを起動するための項目を表示させるには認証が必要です。"
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"ブートローダにブートローダメニューを起動するための項目を表示させるには認証が"
+"必要です。"
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "ブートローダに特定の項目を表示させる"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr "ブートローダに特定の項目を表示させるには認証が必要です。"
#: src/login/org.freedesktop.login1.policy:396
@@ -679,7 +816,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "ローカルなコンテナの仮想TTYを取得"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "ローカルなコンテナの仮想TTYを取得するには認証が必要です。"
#: src/machine/org.freedesktop.machine1.policy:74
@@ -695,7 +833,8 @@ msgid "Manage local virtual machines and containers"
msgstr "ローカルな仮想マシンやコンテナの管理"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr "ローカルな仮想マシンやコンテナを管理するには認証が必要です。"
#: src/machine/org.freedesktop.machine1.policy:95
@@ -703,7 +842,9 @@ msgid "Manage local virtual machine and container images"
msgstr "ローカルな仮想マシンやコンテナのイメージ管理"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr "ローカルな仮想マシンやコンテナのイメージを管理するには認証が必要です。"
#: src/network/org.freedesktop.network1.policy:22
@@ -855,7 +996,8 @@ msgid "Attach or detach a portable service image"
msgstr "ポータブルサービスイメージの接続もしくは切り離し"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr "ポータブルサービスイメージを接続もしくは切り離すには認証が必要です。"
#: src/portable/org.freedesktop.portable1.policy:34
@@ -863,7 +1005,8 @@ msgid "Delete or modify portable service image"
msgstr "ポータブルサービスイメージの削除もしくは修正"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "ポータブルサービスイメージを削除もしくは修正するには認証が必要です。"
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -911,49 +1054,61 @@ msgid "Set RTC to local timezone or UTC"
msgstr "ハードウェア時刻をローカルタイムゾーンもしくはUTCに設定"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "ハードウェア時刻をローカルタイムゾーンもしくはUTCに設定するには認証が必要です。"
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"ハードウェア時刻をローカルタイムゾーンもしくはUTCに設定するには認証が必要で"
+"す。"
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "ネットワーク経由の時刻同期の有効化もしくは無効化"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "ネットワーク経由の時刻同期を有効もしくは無効にするには認証が必要です。"
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "'$(unit)'を開始するには認証が必要です。"
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "'$(unit)'を停止するには認証が必要です。"
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "'$(unit)'を再読込するには認証が必要です。"
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "'$(unit)'を再起動するには認証が必要です。"
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "'$(unit)'のプロセスにUNIXシグナルを送るには認証が必要です。"
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "'$(unit)'の「失敗」状態をリセットするには認証が必要です。"
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "'$(unit)'のプロパティを設定するには認証が必要です。"
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "'$(unit)'に関連付けられたファイルやディレクトリの削除には認証が必要です。"
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"'$(unit)'に関連付けられたファイルやディレクトリの削除には認証が必要です。"
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "'$(unit)'のプロセスを凍結もしくは凍結解除するには認証が必要です。"
diff --git a/po/ka.po b/po/ka.po
index 54ff502bc2..a0860e1ffe 100644
--- a/po/ka.po
+++ b/po/ka.po
@@ -1,26 +1,28 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
#
-# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022, 2023.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022, 2023, 2024.
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
-"PO-Revision-Date: 2023-07-15 00:15+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
+"PO-Revision-Date: 2024-03-05 21:36+0000\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
-"Language-Team: Georgian <https://translate.fedoraproject.org/projects/systemd/master/ka/>\n"
+"Language-Team: Georgian <https://translate.fedoraproject.org/projects/"
+"systemd/main/ka/>\n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.18.2\n"
+"X-Generator: Weblate 5.4\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system"
msgstr "საკვანძო ფრაზის სისტემაში გადაგზავნა"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "საკვანძო ფრაზის სისტემისთვის დასაბრუნებლად საჭიროა ავთენტიკაცია."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -44,8 +46,12 @@ msgid "Set or unset system and service manager environment variables"
msgstr "სისტემისა და სერვისების მმართველის გარემოს ცვლადების დაყენება და წაშლა"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "სისტემისა და სერვისის მენეჯერის გარემოს ცვლადების დასაყენებლად ან წასაშლელად საჭიროა ავთენტიკაცია."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"სისტემისა და სერვისის მენეჯერის გარემოს ცვლადების დასაყენებლად ან წასაშლელად "
+"საჭიროა ავთენტიკაცია."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -60,8 +66,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Systemd-ს მდგომარეობის დამპი სიხშირის შეზღუდვის გარეშე"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Systemd-ის მდგომარეობის სიხშირის შეზღუდვების გარეშე დამპისთვის აუცილებელია ავთენტიკაცია."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Systemd-ის მდგომარეობის სიხშირის შეზღუდვების გარეშე დამპისთვის აუცილებელია "
+"ავთენტიკაცია."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -84,8 +93,11 @@ msgid "Check credentials of a home area"
msgstr "სახლის ტერიტორიის მომხმარებლისა და პაროლის შემოწმება"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "სახლის ტერიტორიის მომხმარებლისა და პაროლის შემოწმებისთვის საჭიროა ავთენტიკაცია."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"სახლის ტერიტორიის მომხმარებლისა და პაროლის შემოწმებისთვის საჭიროა "
+"ავთენტიკაცია."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -108,151 +120,197 @@ msgid "Change password of a home area"
msgstr "სახლის ტერიტორიის პაროლის შეცვლა"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "სახლის ტერიტორიის პაროლის შეცვლისთვის საჭიროა ავთენტიკაცია."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr "საწყისი ადგილის ავტომატური დაბლოკვის შეჩერება"
+
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"მომხმარებლის საწყისი ადგილის ავტომატური დაბლოკვის შესაჩერებლად აუცილებელია "
+"ავთენტიკაცია."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr "საწყისი ადგილის აქტივაცია"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr "მომხმარებლის საწყისი ადგილის აქტივაციისთვის აუცილებელია ავთენტიკაცია."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "მომხმარებლისთვის %s საწყისი საქაღალდე ჯერჯერობით არ არსებობს. მიაერთეთ შესაბამისი საცავის მოწყობილობა ან ფაილური სისტემა."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"მომხმარებლისთვის %s საწყისი საქაღალდე ჯერჯერობით არ არსებობს. მიაერთეთ "
+"შესაბამისი საცავის მოწყობილობა ან ფაილური სისტემა."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "მომხმარებლისთვის %s შესვლის მეტისმეტად ხშირი მცდელობა. მოგვიანებით სცადეთ."
+msgstr ""
+"მომხმარებლისთვის %s შესვლის მეტისმეტად ხშირი მცდელობა. მოგვიანებით სცადეთ."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "პაროლი: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "მომხმარებლის (%s) ავთენტიკაციისთვის პაროლი არასწორი ან არასაკმარისია."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "თავიდან სცადეთ: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "აღდგენის გასაღები: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "მომხმარებლის (%s) ავთენტიკაციისთვის პაროლი/აღდგენის გასაღები არასწორი ან არასაკმარისია."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"მომხმარებლის (%s) ავთენტიკაციისთვის პაროლი/აღდგენის გასაღები არასწორი ან "
+"არასაკმარისია."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "თავიდან შეიყვანეთ აღდგენის გასაღები: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "მომხმარებლისთვის %s უსაფრთხოების კოდი ჩასმული არაა."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "თავიდა სცადეთ, პაროლით: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "პაროლი არასწორი ან არასაკმარისია და მომხმარებლისთვის %s უსაფრთხოების კოდი ჩასმული არაა."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"პაროლი არასწორი ან არასაკმარისია და მომხმარებლისთვის %s უსაფრთხოების კოდი "
+"ჩასმული არაა."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "უსაფრთხოების კოდის PIN-კოდი: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "მომხმარებლისთვის %s უსაფრთხოების კოდს ფიზიკური ავთენტიკაცია ესაჭიროება."
+msgstr ""
+"მომხმარებლისთვის %s უსაფრთხოების კოდს ფიზიკური ავთენტიკაცია ესაჭიროება."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "დაადასტურეთ არსებობა უსაფრთხოებით კოდში მომხმარებლისთვის %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "გადაამოწმეთ მომხმარებელი უსაფრთხოების კოდზე მომხმარებლისთვის %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "უსაფრთხოების კოდის PIN-კოდი დაბლოკილია. ჯერ განბლოკეთ ის. (მინიშნება: წაშლა და თავიდან ჩასმა, როგორც წესი, საკმარისია.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"უსაფრთხოების კოდის PIN-კოდი დაბლოკილია. ჯერ განბლოკეთ ის. (მინიშნება: წაშლა "
+"და თავიდან ჩასმა, როგორც წესი, საკმარისია.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "უსაფრთხოების კოდის PIN კოდი მომხმარებლისთვის %s არასწორია."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "უკაცრავად, თავიდან სცადეთ უსაფრთხოების კოდის PIN-კოდი: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "მომხმარებლისთვის %s უსაფრთხოების კოდის PIN კოდი არასწორია (დარჩენილია მხოლოდ რამდენიმე ცდა!)"
+msgstr ""
+"მომხმარებლისთვის %s უსაფრთხოების კოდის PIN კოდი არასწორია (დარჩენილია მხოლოდ "
+"რამდენიმე ცდა!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "მომხმარებლისთვის %s უსაფრთხოების კოდის PIN-კოდი არასწორია (დარჩა მხოლოდ ერთი!)"
+msgstr ""
+"მომხმარებლისთვის %s უსაფრთხოების კოდის PIN-კოდი არასწორია (დარჩა მხოლოდ "
+"ერთი!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "მომხმარებლისთვის %s საწყისი საქაღალდე აქტიური არაა. სცადეთ, ჯერ ლოკალურად შეხვიდეთ."
+msgstr ""
+"მომხმარებლისთვის %s საწყისი საქაღალდე აქტიური არაა. სცადეთ, ჯერ ლოკალურად "
+"შეხვიდეთ."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "მომხმარებლისთვის %s საწყისი საქაღალდე ამჟამად დაბლოკილია. გთხოვთ, ჯერ ლოკალურად განბლოკეთ ის."
+msgstr ""
+"მომხმარებლისთვის %s საწყისი საქაღალდე ამჟამად დაბლოკილია. გთხოვთ, ჯერ "
+"ლოკალურად განბლოკეთ ის."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "მომხმარებლისთვის %s შესვლის მეტისმეტად ბევრი მცდელობა. უარყოფა."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "მომხმარებლის ჩანაწერი დაბლოკილია. წვდომა აკრძალულია."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "მომხმარებლის წვდომა ჯერ არასწორია. წვდომა აკრძალულია."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "მომხმარებლის ჩანაწერო უკვე სწორი აღარაა. წვდომა აკრძალულია."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "მომხმარებლის ჩანაწერი არასწორია. წვდომის აკრძალვა."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "მეტისმეტად ხშირი შესვლა. სცადეთ თავიდან %s-ის გასვლის შემდეგ."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "პაროლის შეცვლა აუცილებელია."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "პაროლი ვადაგასულია, გთხოვთ, შეცვალეთ."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "პაროლი ვადაგასულია, მაგრამ მას ვერ შეცვლით. შესვლა აკრძალულია."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "პაროლს ვადა მალე გაუვა. გთხოვთ, შეცვალეთ."
@@ -269,7 +327,9 @@ msgid "Set static hostname"
msgstr "ჰოსტის სტატიკური სახელის დაყენება"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr "ჰოსტის სტატიკური სახელის დაყენებისთვის საჭიროა ავთენტიკაცია."
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -305,28 +365,38 @@ msgid "Authentication is required to get system description."
msgstr "სისტემის აღწერის მისაღებად საჭიროა ავთენტიკაცია."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "VM-ის ან კონტეინერის იმიჯის შემოტანა"
+msgid "Import a disk image"
+msgstr "დისკის ასლის ფაილის შემოტანა"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "VM-ის ან კონტეინერის იმიჯის შემოსატანად საჭიროა ავთენტიკაცია"
+msgid "Authentication is required to import an image"
+msgstr "დისკის ასლის შემოსატანად აუცილებელია ავთენტიკაცია"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "VM-ის ან კონტეინერის იმიჯის გატანა"
+msgid "Export a disk image"
+msgstr "დისკის ასლის ფაილის გატანა"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "VM-ის ან კონტეინერის იმიჯის გასატანად საჭიროა ავთენტიკაცია"
+msgid "Authentication is required to export disk image"
+msgstr "დისკის ასლის ფაილის გასატანად აუცილებელია ავთენტიკაცია"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "VM-ის ან კონტეინერის იმიჯის გადმოწერა"
+msgid "Download a disk image"
+msgstr "დისკის ასლის ფაილის გადმოწერა"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "VM-ის ან კონტეინერის იმიჯის გადმოსაწერად საჭიროა ავთენტიკაცია"
+msgid "Authentication is required to download a disk image"
+msgstr "დისკის ასლის ფაილის გადმოსაწერად აუცილებელია ავთენტიკაცია"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr "დისკის ასლის ფაილის გადაცემის გაუქმება"
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"დისკის ასლის ფაილის მიმდინარე გადაცემის გასაუქმებლად აუცილებელია ავთენტიკაცია"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -349,7 +419,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "აპლიკაციებისთვის სისტემის გათიშვის დაყოვნების უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "აპლიკაციას სისტემის გამორთვის დასაყოვნებლად სჭირდება ავთენტიკაცია."
#: src/login/org.freedesktop.login1.policy:33
@@ -358,7 +429,9 @@ msgstr "აპლიკაციებისთვის სისტემი
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "აპლიკაციებისთვის სისტემის გამორთვის დაყოვნების უფლების მიცემისთვის საჭიროა ავთენტიკაცია."
+msgstr ""
+"აპლიკაციებისთვის სისტემის გამორთვის დაყოვნების უფლების მიცემისთვის საჭიროა "
+"ავთენტიკაცია."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -366,7 +439,9 @@ msgstr "აპლიკაციებისთვის სისტემს
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "აპლიკაციებისთვის სისტემს დაძინების აკრძალვის უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgstr ""
+"აპლიკაციებისთვის სისტემს დაძინების აკრძალვის უფლების მიცემას ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -374,55 +449,82 @@ msgstr "აპლიკაციებისთვის სისტემს
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "აპლიკაციებისთვის სისტემს დაძინების გადადების უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgstr ""
+"აპლიკაციებისთვის სისტემს დაძინების გადადების უფლების მიცემას ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "აპლიკაციებისთვის სისტემს შეჩერების აკრძალვის უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "აპლიკაციებისთვის სისტემს შეჩერების აკრძალვის უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"აპლიკაციებისთვის სისტემს შეჩერების აკრძალვის უფლების მიცემას ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "აპლიკაციებისთვის ჩართვის ღილაკის უგულებელყოფის უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "აპლიკაციებისთვის ჩართვის ღილაკის უგულებელყოფის უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"აპლიკაციებისთვის ჩართვის ღილაკის უგულებელყოფის უფლების მიცემას ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "აპლიკაციებისთვის შეჩერების ღილაკის უგულებელყოფის უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "აპლიკაციებისთვის შეჩერების ღილაკის უგულებელყოფის უფლების მიცემას ავთენტიკაცის სჭირდება."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"აპლიკაციებისთვის შეჩერების ღილაკის უგულებელყოფის უფლების მიცემას "
+"ავთენტიკაცის სჭირდება."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "აპლიკაციებისთვის დაყვინთვის ღილაკის უგულებელყოფის უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "აპლიკაციებისთვის დაყვინთვის ღილაკის უგულებელყოფის უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"აპლიკაციებისთვის დაყვინთვის ღილაკის უგულებელყოფის უფლების მიცემას "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "აპლიკაციებისთვის ნოუთბუქის დახურვის ღილაკის უგულებელყოფის უფლების მიცემა"
+msgstr ""
+"აპლიკაციებისთვის ნოუთბუქის დახურვის ღილაკის უგულებელყოფის უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "აპლიკაციებისთვის ნოუთბუქის დახურვის ღილაკის უგულებელყოფის უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"აპლიკაციებისთვის ნოუთბუქის დახურვის ღილაკის უგულებელყოფის უფლების მიცემას "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "აპლიკაციებისთვის გადატვირთვის ღილაკის უგულებელყოფის უფლების მიცემა"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "აპლიკაციებისთვის გადატვირთვის ღილაკის უგულებელყოფის უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"აპლიკაციებისთვის გადატვირთვის ღილაკის უგულებელყოფის უფლების მიცემას "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -430,7 +532,9 @@ msgstr "არ-შესული მომხმარებლებისთ
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "არ-შესული მომხმარებლებისთვის პროგრამების გაშვების უფლების მიცემას სპეციფიკური მოთხოვნა სჭირდება."
+msgstr ""
+"არ-შესული მომხმარებლებისთვის პროგრამების გაშვების უფლების მიცემას "
+"სპეციფიკური მოთხოვნა სჭირდება."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -438,7 +542,9 @@ msgstr "არ-შესული მომხმარებლებისთ
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "არ-შესული მომხმარებლებისთვის პროგრამების გაშვების უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgstr ""
+"არ-შესული მომხმარებლებისთვის პროგრამების გაშვების უფლების მიცემას "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -446,7 +552,9 @@ msgstr "სამუშაო მაგიდებისთვის მოწ
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "სამუშაო მაგიდებისთვის მოწყობილობების მიერთების უფლების მიცემას ავთენტიკაცია სჭირდება."
+msgstr ""
+"სამუშაო მაგიდებისთვის მოწყობილობების მიერთების უფლების მიცემას ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -454,7 +562,8 @@ msgstr "სამუშაო მაგიდებისთვის მოწ
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "სამუშაო მაგიდებისთვის მოწყობილობების ბმების წასაშლელად საჭიროა ავთენტიკაცია."
+msgstr ""
+"სამუშაო მაგიდებისთვის მოწყობილობების ბმების წასაშლელად საჭიროა ავთენტიკაცია."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -469,16 +578,23 @@ msgid "Power off the system while other users are logged in"
msgstr "სისტემის გამორთვა, როცა სხვა მომხმარებლებიც არიან შესული"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "სისტემის გამორთვას, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"სისტემის გამორთვას, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "სისტემის გამორთვა, როცა აპლიკაციები ბლოკავენ ამას"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "სისტემის გამორთვას, როცა აპლიკაციები ბლოკავენ ამას, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"სისტემის გამორთვას, როცა აპლიკაციები ბლოკავენ ამას, ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -493,16 +609,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "სისტემის გამორთვა, როცა სხვა მომხმარებლებიც არიან შესული"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "სისტემის გამორთვას, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"სისტემის გამორთვას, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "სისტემის გადატვირთვა მაშინაც კი, როცა აპლიკაცია ბლოკავს"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "სისტემის გადატვირთვას მაშინაც კი, როცა აპლიკაცია ბლოკავს, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"სისტემის გადატვირთვას მაშინაც კი, როცა აპლიკაცია ბლოკავს, ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -517,16 +641,24 @@ msgid "Halt the system while other users are logged in"
msgstr "სისტემის გაჩერება მაშინაც კი, როცა სხვა მომხმარებლებიც არიან შესული"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "სისტემის გაჩერებას მაშინაც კი, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"სისტემის გაჩერებას მაშინაც კი, როცა სხვა მომხმარებლებიც არიან შესული, "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "სისტემის გაჩერება აპლიკაციის მიერ აკრძალვის შემთხვევაშიც"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "სისტემის გაჩერებას აპლიკაციის მიერ აკრძალვის შემთხვევაშიც კი სჭირდება ავთენტიკაცია."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"სისტემის გაჩერებას აპლიკაციის მიერ აკრძალვის შემთხვევაშიც კი სჭირდება "
+"ავთენტიკაცია."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -541,16 +673,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "სისტემის შეჩერება, როცა სხვა მომხმარებლებიც არიან შესული"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "სისტემის შეჩერებას, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"სისტემის შეჩერებას, როცა სხვა მომხმარებლებიც არიან შესული, ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "სისტემის შეჩერება მაშინაც კი, როცა აპლიკაცია კრძალავს ამას"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "სისტემის შეჩერებას მაშინაც კი, როცა აპლიკაცია კრძალავს ამას, სჭირდება ავთენტიკაცია."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"სისტემის შეჩერებას მაშინაც კი, როცა აპლიკაცია კრძალავს ამას, სჭირდება "
+"ავთენტიკაცია."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -565,16 +705,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "სისტემის მიძინება მაშინაც კი, როცა სხვა მომხმარებლები არიან შესული"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "სისტემის მიძინებას მაშინაც კი, როცა სხვა მომხმარებლები არიან შესული, ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"სისტემის მიძინებას მაშინაც კი, როცა სხვა მომხმარებლები არიან შესული, "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "სისტემის მიძინება მაშინაც კი, როცა აპლიკაცია კრძალავს ამას"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "სისტემის მიძინებას მაშინაც კი, როცა აპლიკაცია კრძალავს ამას, სჭირდება ავთენტიკაცია."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"სისტემის მიძინებას მაშინაც კი, როცა აპლიკაცია კრძალავს ამას, სჭირდება "
+"ავთენტიკაცია."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -582,7 +730,9 @@ msgstr "აქტიური სესიების, მომხმარე
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "აქტიური სესიების, მომხმარებლებისა და სამუშაო მაგიდების მართვას ავთენტიკაცია სჭირდება."
+msgstr ""
+"აქტიური სესიების, მომხმარებლებისა და სამუშაო მაგიდების მართვას ავთენტიკაცია "
+"სჭირდება."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -605,24 +755,37 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "მიკროკოდისთვის დაყენების ინტერფეისში ჩატვირთვის ბრძანების გადაცემა"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "მიკროკოდისთვის დაყენების ინტერფეისში ჩატვირთვის ბრძანების გადაცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"მიკროკოდისთვის დაყენების ინტერფეისში ჩატვირთვის ბრძანების გადაცემას "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "ბირთვის ჩამტვირთველისთვის მენიუში ჩატვირთვის ბრძანების გადაცემა"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "ბირთვის ჩამტვირთველისთვის მენიუში ჩატვირთვის ბრძანების გადაცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"ბირთვის ჩამტვირთველისთვის მენიუში ჩატვირთვის ბრძანების გადაცემას "
+"ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
-msgstr "ბირთვის ჩამტვირთველისთვის მითითებული ელემენტის ჩატვირთვის ბრძანების გადაცემა"
+msgstr ""
+"ბირთვის ჩამტვირთველისთვის მითითებული ელემენტის ჩატვირთვის ბრძანების გადაცემა"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "ბირთვის ჩამტვირთველისთვის მითითებული ელემენტის ჩატვირთვის ბრძანების გადაცემას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"ბირთვის ჩამტვირთველისთვის მითითებული ელემენტის ჩატვირთვის ბრძანების "
+"გადაცემას ავთენტიკაცია სჭირდება."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -677,7 +840,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "ლოკალურ კონტეინერში ფსევდოტერმინალის მიღება"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "ლოკალურ კონტეინერში ფსევდოტერმინალის მიღებას ავთენტიკაცია სჭირდება."
#: src/machine/org.freedesktop.machine1.policy:74
@@ -693,16 +857,23 @@ msgid "Manage local virtual machines and containers"
msgstr "ლოკალური ვირტუალური მანქანებისა და კონტეინერების მართვა"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "ლოკალური ვირტუალური მანქანებისა და კონტეინერების მართვას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"ლოკალური ვირტუალური მანქანებისა და კონტეინერების მართვას ავთენტიკაცია "
+"სჭირდება."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "ლოკალური ვირტუალური მანქანებისა და კონტეინერების იმიჯების მართვა"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "ლოკალური ვირტუალური მანქანებისა და კონტეინერების იმიჯების მართვას ავთენტიკაცია სჭირდება."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"ლოკალური ვირტუალური მანქანებისა და კონტეინერების იმიჯების მართვას "
+"ავთენტიკაცია სჭირდება."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -853,16 +1024,20 @@ msgid "Attach or detach a portable service image"
msgstr "გადატანადი სერვისის იმიჯის მოძრობა ან მიმაგრება"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "გადატანადი სერვისის იმიჯის მოსაძრობად ან მისამაგრებლად საჭიროა ავთენტიკაცია."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"გადატანადი სერვისის იმიჯის მოსაძრობად ან მისამაგრებლად საჭიროა ავთენტიკაცია."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "გადატანადი სერვისის იმიჯის წაშლა ან შეცვლა"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "გადატანადი სერვისის იმიჯის წასაშლელად ან შესაცვლელად საჭიროა ავთენტიკაცია."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"გადატანადი სერვისის იმიჯის წასაშლელად ან შესაცვლელად საჭიროა ავთენტიკაცია."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -909,49 +1084,64 @@ msgid "Set RTC to local timezone or UTC"
msgstr "RTC-ის ლოკალურ დროის სარტყელზე ან UTC-ზე დაყენება"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "RTC-ის ლოკალურ დროის სარტყელზე ან UTC-ზე დასაყენებლად საჭიროა ავთენტიკაცია."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"RTC-ის ლოკალურ დროის სარტყელზე ან UTC-ზე დასაყენებლად საჭიროა ავთენტიკაცია."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "დროის ქსელური სინქრონიზაციის ჩართ/გამორთ"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "დროის ქსელური სინქრონიზაციის ჩართ/გამორთ-თვის საჭიროა ავთენტიკაცია."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "'$(unit)'-ის გასაშვებად საჭიროა ავთენტიკაცია."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "'$(unit)'-ის გასაჩერებლად საჭიროა ავთენტიკაცია."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "'$(unit)'-ის გადასატვირთად საჭიროა ავთენტიკაცია."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "'$(unit)'-ის გადასატვირთად საჭიროა ავთენტიკაცია."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "'$(unit)'-ის პროცესებისთვის UNIX სიგნალის გასაგზავნად საჭიროა ავთნტიკაცია."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"'$(unit)'-ის პროცესებისთვის UNIX სიგნალის გასაგზავნად საჭიროა ავთნტიკაცია."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "'$(unit)'-ის შეცდომით გაშვების მდგომარეობის გასასუფთავებლად საჭიროა ავთენტიკაცია."
+msgstr ""
+"'$(unit)'-ის შეცდომით გაშვების მდგომარეობის გასასუფთავებლად საჭიროა "
+"ავთენტიკაცია."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "'$(unit)'-ის თვისებების დასაყენებლად საჭიროა ავთენტიკაცია."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "'$(unit)'-თან ასოცირებული ფაილების და საქაღალდეების წასაშლელად საჭიროა ავთენტიკაცია."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"'$(unit)'-თან ასოცირებული ფაილების და საქაღალდეების წასაშლელად საჭიროა "
+"ავთენტიკაცია."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "'$(unit)'-ის პროცესების გასაყინად საჭიროა ავთენტიკაცია."
diff --git a/po/kab.po b/po/kab.po
index dac977f8e2..88943938c1 100644
--- a/po/kab.po
+++ b/po/kab.po
@@ -5,10 +5,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-10-03 16:04+0000\n"
"Last-Translator: Slimane Selyan Amiri <selyan.kab@gmail.com>\n"
-"Language-Team: Kabyle <https://translate.fedoraproject.org/projects/systemd/master/kab/>\n"
+"Language-Team: Kabyle <https://translate.fedoraproject.org/projects/systemd/"
+"master/kab/>\n"
"Language: kab\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +22,8 @@ msgid "Send passphrase back to system"
msgstr "Azen awal uɛeddi ɣer unagraw"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -45,7 +47,9 @@ msgid "Set or unset system and service manager environment variables"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -61,7 +65,8 @@ msgid "Dump the systemd state without rate limits"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr ""
#: src/home/org.freedesktop.home1.policy:13
@@ -85,7 +90,8 @@ msgid "Check credentials of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr ""
#: src/home/org.freedesktop.home1.policy:43
@@ -109,151 +115,178 @@ msgid "Change password of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
msgstr ""
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Rnu tmennaḍt agejdan"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -270,7 +303,9 @@ msgid "Set static hostname"
msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -306,27 +341,36 @@ msgid "Authentication is required to get system description."
msgstr ""
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+msgid "Authentication is required to import an image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+msgid "Authentication is required to export disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+msgid "Authentication is required to download a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
msgstr ""
#: src/locale/org.freedesktop.locale1.policy:22
@@ -350,7 +394,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr ""
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr ""
#: src/login/org.freedesktop.login1.policy:33
@@ -382,7 +427,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr ""
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr ""
#: src/login/org.freedesktop.login1.policy:75
@@ -390,7 +437,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:86
@@ -398,7 +447,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:97
@@ -406,7 +457,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:107
@@ -414,7 +467,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr ""
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr ""
#: src/login/org.freedesktop.login1.policy:117
@@ -422,7 +477,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:128
@@ -470,7 +527,9 @@ msgid "Power off the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:191
@@ -478,7 +537,9 @@ msgid "Power off the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:202
@@ -494,7 +555,9 @@ msgid "Reboot the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:224
@@ -502,7 +565,9 @@ msgid "Reboot the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:235
@@ -518,7 +583,9 @@ msgid "Halt the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:257
@@ -526,7 +593,9 @@ msgid "Halt the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:268
@@ -542,7 +611,9 @@ msgid "Suspend the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:289
@@ -550,7 +621,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:300
@@ -566,7 +639,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:321
@@ -574,7 +649,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:332
@@ -606,7 +683,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr ""
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr ""
#: src/login/org.freedesktop.login1.policy:374
@@ -614,7 +693,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr ""
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr ""
#: src/login/org.freedesktop.login1.policy:385
@@ -622,7 +703,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr ""
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr ""
#: src/login/org.freedesktop.login1.policy:396
@@ -678,7 +761,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74
@@ -694,7 +778,8 @@ msgid "Manage local virtual machines and containers"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:95
@@ -702,7 +787,9 @@ msgid "Manage local virtual machine and container images"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr ""
#: src/network/org.freedesktop.network1.policy:22
@@ -854,7 +941,8 @@ msgid "Attach or detach a portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:34
@@ -862,7 +950,8 @@ msgid "Delete or modify portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -910,7 +999,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -918,41 +1009,48 @@ msgid "Turn network time synchronization on or off"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr ""
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr ""
diff --git a/po/ko.po b/po/ko.po
index 9448c46eea..0f82a74205 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -8,17 +8,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
-"PO-Revision-Date: 2024-02-13 09:36+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
+"PO-Revision-Date: 2024-03-04 16:32+0000\n"
"Last-Translator: 김인수 <simmon@nplob.com>\n"
"Language-Team: Korean <https://translate.fedoraproject.org/projects/systemd/"
-"master/ko/>\n"
+"main/ko/>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.3.1\n"
+"X-Generator: Weblate 5.4\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -26,7 +26,8 @@ msgid "Send passphrase back to system"
msgstr "시스템에 암호문 보내기"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "인증은 입력한 암호문를 시스템으로 다시 보내려면 필요합니다."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -50,8 +51,12 @@ msgid "Set or unset system and service manager environment variables"
msgstr "시스템 및 서비스 관리자 환경 변수 설정 또는 설정 해제"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "시스템 및 서비스 관리자 환경 변수를 설정하거나 설정 또는 해제하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"시스템 및 서비스 관리자 환경 변수를 설정하거나 설정 또는 해제하려면 인증이 필"
+"요합니다."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -66,7 +71,8 @@ msgid "Dump the systemd state without rate limits"
msgstr "속도 제한 없이 systemd 상태 출력"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "인증은 속도 제한 없이 systemd 상태를 출력하는데 필요합니다."
#: src/home/org.freedesktop.home1.policy:13
@@ -90,7 +96,8 @@ msgid "Check credentials of a home area"
msgstr "홈 영역 자격증명 확인"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr "사용자 홈 영역의 자격 증명을 확인하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:43
@@ -114,151 +121,186 @@ msgid "Change password of a home area"
msgstr "홈 영역 비밀번호 변경"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "사용자 홈 영역의 비밀번호를 변경하려면 인증이 필요합니다."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr "홈 영역의 자동 잠금을 금지합니다"
+
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "사용자의 홈 영역 자동 잠금을 금지 할 때에 인증이 필요합니다."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr "홈 영역 활성화"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr "사용자의 홈 영역을 활성화에 인증이 필요합니다."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "사용자 %s의 홈은 현재 비어 있으며, 필요한 저장 장치 또는 파일 시스템 백업에 연결하세요."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"사용자 %s의 홈은 현재 비어 있으며, 필요한 저장 장치 또는 파일 시스템 백업에 "
+"연결하세요."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "사용자 %s를 위해 너무나 많은 로그인 시도가 있었으며, 다음에 다시 시도하세요."
+msgstr ""
+"사용자 %s를 위해 너무나 많은 로그인 시도가 있었으며, 다음에 다시 시도하세요."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "비밀번호: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "비밀번호가 올바르지 않거나 사용자 %s의 인증에 충분하지 않습니다."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "미안하지만, 다시 시도해 주세요: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "복원 키: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "비밀번호/복구 키가 올바르지 않거나 사용자 %s의 인증에 충분하지 않습니다."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"비밀번호/복구 키가 올바르지 않거나 사용자 %s의 인증에 충분하지 않습니다."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "미안하지만, 복구 키를 재입력하세요: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "사용자 %s의 보안 토큰이 삽입되어 있지 않습니다."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "비밀번호로 다시 시도하세요: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "비밀번호가 올바르지 않거나 인증에 충분하지 않으며, 그리고 사용자 %s의 구성된 보안 토큰이 삽입되어 있지 않습니다."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"비밀번호가 올바르지 않거나 인증에 충분하지 않으며, 그리고 사용자 %s의 구성된 "
+"보안 토큰이 삽입되어 있지 않습니다."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "보안 토큰 PIN: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "사용자 %s의 보안 토큰에서 물리적으로 인증해주세요."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "사용자 %s의 보안 토큰에서 존재를 확인해 주세요."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "사용자 %s의 보안 토큰에서 사용자를 확인해 주세요."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "보안 토큰 핀이 잠겨 있으며, 이를 우선 잠금 해제를 해주세요. (암시: 제거하고 다시-삽입으로 충분 할 수 있습니다.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"보안 토큰 핀이 잠겨 있으며, 이를 우선 잠금 해제를 해주세요. (암시: 제거하고 "
+"다시-삽입으로 충분 할 수 있습니다.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "사용자 %s를 위해 잘못된 보안 토큰 핀."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "미안하지만, 보안 토큰 PIN을 다시 시도하세요: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr "사용자 %s의 보안 토큰 PIN이 잘못됨 (몇 번의 시도만 남았습니다!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr "사용자 %s의 보안 토큰 PIN이 잘못됨 (한 번만 남았습니다!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "사용자 %s의 홈은 현재 활성화되어 있지 않으며, 우선 로컬에서 로그인 해주세요."
+msgstr ""
+"사용자 %s의 홈은 현재 활성화되어 있지 않으며, 우선 로컬에서 로그인 해주세요."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr "사용자 %s의 홈은 현재 잠겨 있으며, 우선 로컬에서 잠금 해제를 해주세요."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "사용자 %s에 대한 너무 많이 실패한 로그인이 있었으며, 거부합니다."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "사용자 레코드가 차단되었으며, 접근을 금지합니다."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "사용자 레크드가 아직 유효하지 않아, 접근을 금지합니다."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "사용자 레코드가 더 이상 유효하지 않아, 접근을 금지합니다."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "사용자 레코드가 유효하지 않아, 접근을 금지합니다."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "너무 많은 로그인, %s에서 다시 시도하세요."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "비밀번호 변경이 필요합니다."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "비밀번호가 만료되었으며, 변경이 필요합니다."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "비밀번호가 만료되었으나, 변경 할 수 없고, 로그인이 거부됩니다."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "비밀번호가 곧 만료됩니다, 변경해 주세요."
@@ -275,8 +317,12 @@ msgid "Set static hostname"
msgstr "정적 호스트 이름 설정"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "로컬 호스트 이름을 지정 호스트 이름처럼 정적으로 설정하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"로컬 호스트 이름을 지정 호스트 이름처럼 정적으로 설정하려면 인증이 필요합니"
+"다."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -311,28 +357,37 @@ msgid "Authentication is required to get system description."
msgstr "시스템 시간대를 가져오려면 인증이 필요합니다."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "VM 또는 컨테이너의 이미지 가져오기"
+msgid "Import a disk image"
+msgstr "디스크 이미지 가져오기"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "VM 또는 컨테이너의 이미지를 가져오려면 인증이 필요합니다"
+msgid "Authentication is required to import an image"
+msgstr "이미지를 가져오려면 인증이 필요합니다"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "가상 머신 또는 컨테이너의 이미지 내보내기"
+msgid "Export a disk image"
+msgstr "디스크 이미지 내보내기"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "가상 머신 또는 컨테이너의 이미지를 내보내려면 인증이 필요합니다"
+msgid "Authentication is required to export disk image"
+msgstr "디스크 이미지를 내보내려면 인증이 필요합니다"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "가상 머신 또는 컨테이너 이미지 내려받기"
+msgid "Download a disk image"
+msgstr "디스크 이미지 내려받기"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "가상 머신 또는 컨테이너 이미지를 내려받기하려면 인증이 필요합니다"
+msgid "Authentication is required to download a disk image"
+msgstr "디스크 이미지를 내려받으려면 인증이 필요합니다"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr "디스크 이미지 전송을 취소합니다"
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "디스크 이미지의 전송 진행 중에 취소하려면 인증이 필요합니다"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -355,7 +410,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "프로그램의 시스템 전원 끄기 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "프로그램의 시스템 전원 끄기 방지 요청을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:33
@@ -372,7 +428,8 @@ msgstr "프로그램의 시스템 대기 상태 진입 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "프로그램의 시스템 대기 상태 진입 방지 요청을 허용하려면 인증이 필요합니다."
+msgstr ""
+"프로그램의 시스템 대기 상태 진입 방지 요청을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -380,54 +437,74 @@ msgstr "프로그램의 시스템 대기 상태 진입 지연 허용"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "프로그램의 시스템 대기 상태 진입 지연 동작을 허용하려면 인증이 필요합니다."
+msgstr ""
+"프로그램의 시스템 대기 상태 진입 지연 동작을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "프로그램의 시스템 자동 절전 상태 진입 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "프로그램의 시스템 자동 절전 상태 진입 방지 요청을 허용하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"프로그램의 시스템 자동 절전 상태 진입 방지 요청을 허용하려면 인증이 필요합니"
+"다."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "프로그램의 시스템 전원 키 처리 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "프로그램의 시스템 전원 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"프로그램의 시스템 전원 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "프로그램의 시스템 절전 키 처리 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "프로그램의 시스템 절전 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"프로그램의 시스템 절전 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "프로그램의 시스템 최대 절전 키 처리 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "프로그램의 시스템 최대 절전 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"프로그램의 시스템 최대 절전 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "프로그램의 시스템 랩톱 덮개 스위치 처리 방지 요청 허용"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "프로그램의 시스템 랩톱 덮개 스위치 처리 방지 요청을 허용하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"프로그램의 시스템 랩톱 덮개 스위치 처리 방지 요청을 허용하려면 인증이 필요합"
+"니다."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "프로그램의 재부팅 키 시스템 동작 방지 허용"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr "프로그램의 재부팅 키 시스템 동작 방지를 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:128
@@ -475,7 +552,9 @@ msgid "Power off the system while other users are logged in"
msgstr "다른 사용자가 로그인 했을 때 시스템 끄기"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
msgstr "다른 사용자가 로그인 했을 때 시스템 전원을 끄려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:191
@@ -483,8 +562,12 @@ msgid "Power off the system while an application is inhibiting this"
msgstr "프로그램이 시스템을 끄지 못하게 요청할 때 시스템 전원 끄기"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "프로그램이 시스템을 끄지 못하게 요청할 때 시스템 전원을 끄려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"프로그램이 시스템을 끄지 못하게 요청할 때 시스템 전원을 끄려면 인증이 필요합"
+"니다."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -499,16 +582,23 @@ msgid "Reboot the system while other users are logged in"
msgstr "다른 사용자가 로그인 했을 때 시스템 다시 시작"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "다른 사용자가 로그인 했을 때 시스템을 다시 시작하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"다른 사용자가 로그인 했을 때 시스템을 다시 시작하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "프로그램이 시스템을 다시 시작하지 못하게 요청할 때 시스템 다시 시작"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "프로그램이 시스템을 다시 시작하지 못하게 요청할 때 시스템을 다시 시작하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"프로그램이 시스템을 다시 시작하지 못하게 요청할 때 시스템을 다시 시작하려면 "
+"인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -523,16 +613,22 @@ msgid "Halt the system while other users are logged in"
msgstr "다른 사용자가 로그인 했을 때 시스템이 정지 상태진입"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "다른 사용자가 로그인 했을 때 시스템을 정지 상태로 놓으려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"다른 사용자가 로그인 했을 때 시스템을 정지 상태로 놓으려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "프로그램에서 전원 끄기를 막을 때 시스템 전원 끄기"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "프로그램에서 전원 끄기를 막을 때 시스템 전원을 끄려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"프로그램에서 전원 끄기를 막을 때 시스템 전원을 끄려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -547,16 +643,23 @@ msgid "Suspend the system while other users are logged in"
msgstr "다른 사용자가 로그인 했을 때 시스템 절전 상태 진입"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "다른 사용자가 로그인 했을 때 시스템을 절전 상태로 놓으려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"다른 사용자가 로그인 했을 때 시스템을 절전 상태로 놓으려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "프로그램에서 대기 모드 진입을 막을 때 시스템 대기 상태 진입"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "프로그램에서 대기 모드 진입을 막을 때 시스템을 대기 상태로 설정하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"프로그램에서 대기 모드 진입을 막을 때 시스템을 대기 상태로 설정하려면 인증이 "
+"필요합니다."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -571,16 +674,25 @@ msgid "Hibernate the system while other users are logged in"
msgstr "다른 사용자가 로그인 했을 때 시스템 최대 절전 상태 진입"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "다른 사용자가 로그인 했을 때 시스템을 최대 절전 상태로 설정하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"다른 사용자가 로그인 했을 때 시스템을 최대 절전 상태로 설정하려면 인증이 필요"
+"합니다."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "프로그램에서 최대 절전 모드로의 진입을 막을 때 시스템 최대 절전 상태 진입"
+msgstr ""
+"프로그램에서 최대 절전 모드로의 진입을 막을 때 시스템 최대 절전 상태 진입"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "프로그램에서 최대 절전 모드로의 진입을 막을 때 시스템을 최대 절전 상태로 설정하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"프로그램에서 최대 절전 모드로의 진입을 막을 때 시스템을 최대 절전 상태로 설정"
+"하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -611,7 +723,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:374
@@ -619,7 +733,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "부트로더에 부팅할 부트로더 메뉴 표시"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr "부트로더 메뉴에 부팅할 부트로더를 나타내려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:385
@@ -627,7 +743,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr "부팅할 특정 항목을 부트로더에 표시"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr "부팅할 특정 항목을 부트로더에 표시하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:396
@@ -683,7 +801,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "로컬 컨테이너에서 유사 TTY 획득"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "로컬 컨테이너에서 유사 TTY를 획득하려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:74
@@ -699,7 +818,8 @@ msgid "Manage local virtual machines and containers"
msgstr "로컬 가상 머신 및 컨테이너 관리"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr "로컬 가상 머신 및 컨테이너를 관리하려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:95
@@ -707,7 +827,9 @@ msgid "Manage local virtual machine and container images"
msgstr "로컬 가상 머신 및 컨테이너 이미지 관리"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr "로컬 가상 머신 및 컨테이너 이미지를 관리하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:22
@@ -859,7 +981,8 @@ msgid "Attach or detach a portable service image"
msgstr "이동 서비스 첨부 또는 분리"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr "이동 서비스 장착 또는 분리에는 인증이 필요합니다."
#: src/portable/org.freedesktop.portable1.policy:34
@@ -867,7 +990,8 @@ msgid "Delete or modify portable service image"
msgstr "이동 서비스 이미지 삭제 또는 변경"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "이동형 서비스 이미지를 지우거나 변경하려면 인증이 필요합니다."
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -915,49 +1039,60 @@ msgid "Set RTC to local timezone or UTC"
msgstr "RTC를 로컬 시간대 또는 UTC로 설정"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "RTC를 로컬 시간 또는 UTC 시간으로 저장할 지 여부를 제어하려면 인증이 필요합니다."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"RTC를 로컬 시간 또는 UTC 시간으로 저장할 지 여부를 제어하려면 인증이 필요합니"
+"다."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "네트워크 시간 동기화 켜거나 끄기"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "네트워크 시간 동기화의 활성화 여부를 제어하려면 인증이 필요합니다."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "인증은 '$(unit)'을 시작하는데 필요합니다."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "인증은 '$(unit)'을 멈추는데 필요합니다."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "인증은 '$(unit)'을 다시 불러오는데 필요합니다."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "인증은 '$(unit)'을 다시 시작하는데 필요합니다."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "'$(unit)'의 처리에 유닉스 신호를 전송하려면 인증이 필요합니다."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "인증은 '$(unit)'의 \"실패\"를 되돌리는데 필요합니다."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "인증은 '$(unit)'의 속성을 설정하는데 필요합니다."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr "인증은 '$(unit)'과 관련된 파일과 디렉토리를 삭제하는데 필요합니다."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "'$(unit)'단위의 처리를 동결 또는 해제하려면 인증이 필요합니다."
diff --git a/po/lt.po b/po/lt.po
index ad0bc815fd..ba61a115e2 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2024-02-15 23:36+0000\n"
"Last-Translator: mooo <hazap@hotmail.com>\n"
"Language-Team: Lithuanian <https://translate.fedoraproject.org/projects/"
@@ -24,8 +24,10 @@ msgid "Send passphrase back to system"
msgstr "Siųsti slaptafrazę atgal į sistemą"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Norint siųsti įvestą slaptafrazę atgal į sistemą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Norint siųsti įvestą slaptafrazę atgal į sistemą, reikia nustatyti tapatybę."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -33,7 +35,9 @@ msgstr "Tvarkyti sistemos tarnybas ar kitus įtaisus"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Norint tvarkyti sistemos tarnybas ar kitus įtaisus, reikia nustatyti tapatybę."
+msgstr ""
+"Norint tvarkyti sistemos tarnybas ar kitus įtaisus, reikia nustatyti "
+"tapatybę."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -41,15 +45,23 @@ msgstr "Tvarkyti sistemos tarnybos ar įtaiso failus"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Norint tvarkyti sistemos tarnybos ar įtaiso failus, reikia nustatyti tapatybę."
+msgstr ""
+"Norint tvarkyti sistemos tarnybos ar įtaiso failus, reikia nustatyti "
+"tapatybę."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Nustatyti ar atšaukti sistemos ir tarnybų tvarkytuvės aplinkos kintamųjų nustatymą"
+msgstr ""
+"Nustatyti ar atšaukti sistemos ir tarnybų tvarkytuvės aplinkos kintamųjų "
+"nustatymą"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Norint nustatyti ar atšaukti sistemos ir tarnybų tvarkytuvės aplinkos kintamųjų nustatymą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Norint nustatyti ar atšaukti sistemos ir tarnybų tvarkytuvės aplinkos "
+"kintamųjų nustatymą, reikia nustatyti tapatybę."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -65,7 +77,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Norint iš naujo įkelti systemd būseną, reikia patvirtinti tapatybę."
#: src/home/org.freedesktop.home1.policy:13
@@ -92,8 +105,11 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:34
#, fuzzy
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Norint prijungti ar atskirti perkeliamos tarnybos atvaizdį, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Norint prijungti ar atskirti perkeliamos tarnybos atvaizdį, reikia nustatyti "
+"tapatybę."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -102,7 +118,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:44
#, fuzzy
msgid "Authentication is required to update a user's home area."
-msgstr "Norint prijungti įrenginį prie darbo vietos, reikia nustatyti tapatybę."
+msgstr ""
+"Norint prijungti įrenginį prie darbo vietos, reikia nustatyti tapatybę."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -119,152 +136,183 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:64
#, fuzzy
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Norint tvarkyti aktyvius seansus, naudotojus ir darbo vietas, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Norint tvarkyti aktyvius seansus, naudotojus ir darbo vietas, reikia "
+"nustatyti tapatybę."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Norint prijungti įrenginį prie darbo vietos, reikia nustatyti tapatybę."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Norint iš naujo įkelti systemd būseną, reikia patvirtinti tapatybę."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Per daug prisijungimų, bandoma dar kartą po %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Reikia pakeisti slaptažodį."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Slaptažodis nebegalioja, reikia pakeisti."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
"Slaptažodis nebegalioja, bet jo pakeisti negalima. Atsisakoma prisijungti."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Greitu metu slaptažodis nustos galioti, prašome jį pakeisti."
@@ -274,15 +322,20 @@ msgstr "Nustatyti serverio pavadinimą"
#: src/hostname/org.freedesktop.hostname1.policy:21
msgid "Authentication is required to set the local hostname."
-msgstr "Norint nustatyti vietinio serverio pavadinimą, reikia nustatyti tapatybę."
+msgstr ""
+"Norint nustatyti vietinio serverio pavadinimą, reikia nustatyti tapatybę."
#: src/hostname/org.freedesktop.hostname1.policy:30
msgid "Set static hostname"
msgstr "Nustatyti statinį serverio pavadinimą"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Norint nustatyti statiškai sukonfigūruotą serverio pavadinimą, o taip pat lengvai įsimenamą serverio pavadinimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Norint nustatyti statiškai sukonfigūruotą serverio pavadinimą, o taip pat "
+"lengvai įsimenamą serverio pavadinimą, reikia nustatyti tapatybę."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -318,28 +371,49 @@ msgid "Authentication is required to get system description."
msgstr "Norint gauti sistemos aprašą, reikia nustatyti tapatybę."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importuoti VM ar konteinerio atvaizdį"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Norint importuoti VM ar konteinerio atvaizdį, reikia nustatyti tapatybę"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Norint importuoti VM ar konteinerio atvaizdį, reikia nustatyti tapatybę"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Eksportuoti VM ar konteinerio atvaizdį"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Norint eksportuoti VM ar konteinerio atvaizdį, reikia nustatyti tapatybę"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Norint eksportuoti VM ar konteinerio atvaizdį, reikia nustatyti tapatybę"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Atsisiųsti VM ar konteinerio atvaizdį"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Norint atsisiųsti VM ar konteinerio atvaizdį, reikia nustatyti tapatybę"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Norint atsisiųsti VM ar konteinerio atvaizdį, reikia nustatyti tapatybę"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Norint tvarkyti aktyvius seansus, naudotojus ir darbo vietas, reikia "
+"nustatyti tapatybę."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -355,15 +429,19 @@ msgstr "Nustatyti sistemos klaviatūros nustatymus"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Norint nustatyti sistemos klaviatūros nustatymus, reikia nustatyti tapatybę."
+msgstr ""
+"Norint nustatyti sistemos klaviatūros nustatymus, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Leisti programoms sulaikyti sistemos išjungimą"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Norint leisti programai sulaikyti sistemos išjungimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Norint leisti programai sulaikyti sistemos išjungimą, reikia nustatyti "
+"tapatybę."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -371,7 +449,9 @@ msgstr "Leisti programoms atidėti sistemos išjungimą"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Norint leisti programai atidėti sistemos išjungimą, reikia nustatyti tapatybę."
+msgstr ""
+"Norint leisti programai atidėti sistemos išjungimą, reikia nustatyti "
+"tapatybę."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -379,7 +459,8 @@ msgstr "Leisti programoms sulaikyti sistemos miegą"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Norint leisti programai sulaikyti sistemos miegą, reikia nustatyti tapatybę."
+msgstr ""
+"Norint leisti programai sulaikyti sistemos miegą, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -387,47 +468,68 @@ msgstr "Leisti programoms atidėti sistemos miegą"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Norint leisti programai atidėti sistemos miegą, reikia nustatyti tapatybę."
+msgstr ""
+"Norint leisti programai atidėti sistemos miegą, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Leisti programoms sulaikyti automatinį sistemos pristabdymą"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Norint leisti programai sulaikyti automatinį sistemos pristabdymą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Norint leisti programai sulaikyti automatinį sistemos pristabdymą, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Leisti programoms sulaikyti maitinimo rakto sisteminį apdorojimą"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Norint leisti programai sulaikyti maitinimo rakto sisteminį apdorojimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Norint leisti programai sulaikyti maitinimo rakto sisteminį apdorojimą, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Leisti programoms sulaikyti pristabdymo rakto sisteminį apdorojimą"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Norint leisti programai sulaikyti pristabdymo rakto sisteminį apdorojimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Norint leisti programai sulaikyti pristabdymo rakto sisteminį apdorojimą, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Leisti programoms sulaikyti užmigdymo rakto sisteminį apdorojimą"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Norint leisti programai sulaikyti užmigdymo rakto sisteminį apdorojimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Norint leisti programai sulaikyti užmigdymo rakto sisteminį apdorojimą, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Leisti programoms sulaikyti dangčio perjungiklio sisteminį apdorojimą"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Norint leisti programai sulaikyti dangčio perjungiklio sisteminį apdorojimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Norint leisti programai sulaikyti dangčio perjungiklio sisteminį apdorojimą, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:117
#, fuzzy
@@ -436,8 +538,12 @@ msgstr "Leisti programoms sulaikyti maitinimo rakto sisteminį apdorojimą"
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Norint leisti programai sulaikyti maitinimo rakto sisteminį apdorojimą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Norint leisti programai sulaikyti maitinimo rakto sisteminį apdorojimą, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -445,7 +551,9 @@ msgstr "Leisti neprisijungusiam naudotojui vykdyti programas"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Norint vykdyti programas kaip neprisijungusiam naudotojui, reikia aiškiai išreikštos užklausos."
+msgstr ""
+"Norint vykdyti programas kaip neprisijungusiam naudotojui, reikia aiškiai "
+"išreikštos užklausos."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -453,7 +561,9 @@ msgstr "Leisti neprisijungusiems naudotojams vykdyti programas"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Norint vykdyti programas kaip neprisijungusiems naudotojams, reikia nustatyti tapatybę."
+msgstr ""
+"Norint vykdyti programas kaip neprisijungusiems naudotojams, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -461,7 +571,8 @@ msgstr "Leisti prijungti įrenginius prie darbo vietų"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Norint prijungti įrenginį prie darbo vietos, reikia nustatyti tapatybę."
+msgstr ""
+"Norint prijungti įrenginį prie darbo vietos, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -469,7 +580,9 @@ msgstr "Išvalyti įrenginių prijungimus prie darbo vietų"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Norint atstatyti tai, kaip įrenginiai yra prijungti prie darbo vietų, reikia nustatyti tapatybę."
+msgstr ""
+"Norint atstatyti tai, kaip įrenginiai yra prijungti prie darbo vietų, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -484,16 +597,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Išjungti sistemos maitinimą nepaisant kitų prisijungusių naudotojų"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Norint išjungti sistemos maitinimą nepaisant kitų prisijungusių naudotojų, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Norint išjungti sistemos maitinimą nepaisant kitų prisijungusių naudotojų, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Išjungti sistemos maitinimą, nors programa paprašė tai sulaikyti"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Norint išjungti sistemos maitinimą, nepaisant to, kad programa paprašė tai sulaikyti, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Norint išjungti sistemos maitinimą, nepaisant to, kad programa paprašė tai "
+"sulaikyti, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -508,16 +629,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Paleisti sistemą iš naujo nepaisant kitų prisijungusių naudotojų"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Norint paleisti sistemą iš naujo nepaisant kitų prisijungusių naudotojų, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Norint paleisti sistemą iš naujo nepaisant kitų prisijungusių naudotojų, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Paleisti sistemą iš naujo, nors programa paprašė tai sulaikyti"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Norint paleisti sistemą iš naujo, nepaisant to, kad programa paprašė tai sulaikyti, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Norint paleisti sistemą iš naujo, nepaisant to, kad programa paprašė tai "
+"sulaikyti, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -532,8 +661,12 @@ msgid "Halt the system while other users are logged in"
msgstr "Stabdyti sistemą nepaisant kitų prisijungusių naudotojų"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Norint stabdyti sistemą nepaisant kitų prisijungusių naudotojų, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Norint stabdyti sistemą nepaisant kitų prisijungusių naudotojų, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
@@ -541,8 +674,12 @@ msgstr "Stabdyti sistemą, nors programa paprašė tai sulaikyti"
#: src/login/org.freedesktop.login1.policy:258
#, fuzzy
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Norint užmigdyti sistemą, nepaisant to, kad programa paprašė tai sulaikyti, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Norint užmigdyti sistemą, nepaisant to, kad programa paprašė tai sulaikyti, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -557,16 +694,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Pristabdyti sistemą nepaisant kitų prisijungusių naudotojų"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Norint pristabdyti sistemą nepaisant kitų prisijungusių naudotojų, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Norint pristabdyti sistemą nepaisant kitų prisijungusių naudotojų, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Pristabdyti sistemą, nors programa paprašė tai sulaikyti"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Norint pristabdyti sistemą, nepaisant to, kad programa paprašė tai sulaikyti, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Norint pristabdyti sistemą, nepaisant to, kad programa paprašė tai "
+"sulaikyti, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -581,16 +726,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Užmigdyti sistemą nepaisant kitų prisijungusių naudotojų"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Norint užmigdyti sistemą nepaisant kitų prisijungusių naudotojų, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Norint užmigdyti sistemą nepaisant kitų prisijungusių naudotojų, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Užmigdyti sistemą, nors programa paprašė tai sulaikyti"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Norint užmigdyti sistemą, nepaisant to, kad programa paprašė tai sulaikyti, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Norint užmigdyti sistemą, nepaisant to, kad programa paprašė tai sulaikyti, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -598,7 +751,9 @@ msgstr "Tvarkyti aktyvius seansus, naudotojus ir darbo vietas"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Norint tvarkyti aktyvius seansus, naudotojus ir darbo vietas, reikia nustatyti tapatybę."
+msgstr ""
+"Norint tvarkyti aktyvius seansus, naudotojus ir darbo vietas, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -606,7 +761,8 @@ msgstr "Užrakinti ar atrakinti aktyvius seansus"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Norint užrakinti ar atrakinti aktyvius seansus, reikia nustatyti tapatybę."
+msgstr ""
+"Norint užrakinti ar atrakinti aktyvius seansus, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -614,31 +770,45 @@ msgstr "Nustatyti paleidimo iš naujo \"priežastį\" branduolyje"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Norint nustatyti paleidimo iš naujo \"priežastį\" branduolyje, reikia nustatyti tapatybę."
+msgstr ""
+"Norint nustatyti paleidimo iš naujo \"priežastį\" branduolyje, reikia "
+"nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Nurodyti programinei aparatinei įrangai pasileisti į sąrankos sąsają"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Norint nurodyti programinei aparatinei įrangai pasileisti į sąrankos sąsają, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Norint nurodyti programinei aparatinei įrangai pasileisti į sąrankos sąsają, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Nurodyti pradiniam įkėlikliui paleisti pradinio įkėliklio meniu"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Norint nurodyti pradiniam įkėlikliui paleisti pradinio įkėliklio meniu, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Norint nurodyti pradiniam įkėlikliui paleisti pradinio įkėliklio meniu, "
+"reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Nurodyti pradiniam įkėlikliui paleisti tam tikrą įrašą"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Norint nurodyti pradiniam įkėlikliui paleisti tam tikrą pradinio įkėliklio įrašą, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Norint nurodyti pradiniam įkėlikliui paleisti tam tikrą pradinio įkėliklio "
+"įrašą, reikia nustatyti tapatybę."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -663,7 +833,8 @@ msgstr "Prisijungti prie vietinio konteinerio"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Norint prisijungti prie vietinio konteinerio, reikia nustatyti tapatybę."
+msgstr ""
+"Norint prisijungti prie vietinio konteinerio, reikia nustatyti tapatybę."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -679,7 +850,8 @@ msgstr "Įgyti apvalkalą vietiniame konteineryje"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Norint įgyti apvalkalą vietiniame konteineryje, reikia nustatyti tapatybę."
+msgstr ""
+"Norint įgyti apvalkalą vietiniame konteineryje, reikia nustatyti tapatybę."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -687,15 +859,18 @@ msgstr "Įgyti apvalkalą vietiniame serveryje"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Norint įgyti apvalkalą vietiniame serveryje, reikia nustatyti tapatybę."
+msgstr ""
+"Norint įgyti apvalkalą vietiniame serveryje, reikia nustatyti tapatybę."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Įgyti pseudo TTY vietiniame konteineryje"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Norint įgyti pseudo TTY vietiniame konteineryje, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Norint įgyti pseudo TTY vietiniame konteineryje, reikia nustatyti tapatybę."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -703,23 +878,31 @@ msgstr "Įgyti pseudo TTY vietiniame serveryje"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Norint įgyti pseudo TTY vietiniame serveryje, reikia nustatyti tapatybę."
+msgstr ""
+"Norint įgyti pseudo TTY vietiniame serveryje, reikia nustatyti tapatybę."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Tvarkyti vietines virtualiąsias mašinas ir konteinerius"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Norint tvarkyti vietines virtualiąsias mašinas ir konteinerius, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Norint tvarkyti vietines virtualiąsias mašinas ir konteinerius, reikia "
+"nustatyti tapatybę."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Tvarkyti vietinę virtualiąją mašiną ir konteinerio atvaizdžius"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Norint tvarkyti vietinę virtualiąją mašiną ir konteinerio atvaizdžius, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Norint tvarkyti vietinę virtualiąją mašiną ir konteinerio atvaizdžius, "
+"reikia nustatyti tapatybę."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -873,23 +1056,30 @@ msgstr "Išnagrinėti perkeliamos tarnybos atvaizdį"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Norint išnagrinėti perkeliamos tarnybos atvaizdį, reikia nustatyti tapatybę."
+msgstr ""
+"Norint išnagrinėti perkeliamos tarnybos atvaizdį, reikia nustatyti tapatybę."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Prijungti ar atskirti perkeliamos tarnybos atvaizdį"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Norint prijungti ar atskirti perkeliamos tarnybos atvaizdį, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Norint prijungti ar atskirti perkeliamos tarnybos atvaizdį, reikia nustatyti "
+"tapatybę."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Ištrinti ar modifikuoti perkeliamos tarnybos atvaizdį"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Norint ištrinti ar modifikuoti perkeliamos tarnybos atvaizdį, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Norint ištrinti ar modifikuoti perkeliamos tarnybos atvaizdį, reikia "
+"nustatyti tapatybę."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -914,7 +1104,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:133
#, fuzzy
msgid "Authentication is required to reset name resolution settings."
-msgstr "Norint nustatyti sistemos klaviatūros nustatymus, reikia nustatyti tapatybę."
+msgstr ""
+"Norint nustatyti sistemos klaviatūros nustatymus, reikia nustatyti tapatybę."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -934,60 +1125,85 @@ msgstr "Norint nustatyti sistemos laiko juostą, reikia nustatyti tapatybę."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
-msgstr "Nustatyti tikrojo laiko daviklį (RTC) į vietinę laiko juostą ar suderintąjį pasaulinį laiką (UTC)"
+msgstr ""
+"Nustatyti tikrojo laiko daviklį (RTC) į vietinę laiko juostą ar suderintąjį "
+"pasaulinį laiką (UTC)"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Norint valdyti ar tikrojo laiko daviklis (RTC) atmintyje saugos vietinį, ar suderintąjį pasaulinį laiką (UTC), reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Norint valdyti ar tikrojo laiko daviklis (RTC) atmintyje saugos vietinį, ar "
+"suderintąjį pasaulinį laiką (UTC), reikia nustatyti tapatybę."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Įjungti ar išjungti tinklo laiko sinchronizavimą"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Norint valdyti ar tinklo laiko sinchronizavimas turėtų būti įjungtas, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Norint valdyti ar tinklo laiko sinchronizavimas turėtų būti įjungtas, reikia "
+"nustatyti tapatybę."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Norint paleisti \"$(unit)\", reikia nustatyti tapatybę."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Norint stabdyti \"$(unit)\", reikia nustatyti tapatybę."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Norint įkelti \"$(unit)\" iš naujo, reikia nustatyti tapatybę."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Norint paleisti \"$(unit)\" iš naujo, reikia nustatyti tapatybę."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Norint siųsti UNIX signalą į \"$(unit)\" procesus, reikia nustatyti tapatybę."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Norint siųsti UNIX signalą į \"$(unit)\" procesus, reikia nustatyti tapatybę."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Norint atstatyti \"$(unit)\" įtaiso \"failed\" būseną, reikia nustatyti tapatybę."
+msgstr ""
+"Norint atstatyti \"$(unit)\" įtaiso \"failed\" būseną, reikia nustatyti "
+"tapatybę."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Norint nustatyti \"$(unit)\" savybes, reikia nustatyti tapatybę."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Norint atstatyti \"$(unit)\" įtaiso \"failed\" būseną, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Norint atstatyti \"$(unit)\" įtaiso \"failed\" būseną, reikia nustatyti "
+"tapatybę."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Norint siųsti UNIX signalą į \"$(unit)\" procesus, reikia nustatyti tapatybę."
-
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Norint stabdyti sistemą, nepaisant to, kad programa paprašė tai sulaikyti, reikia nustatyti tapatybę."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Norint siųsti UNIX signalą į \"$(unit)\" procesus, reikia nustatyti tapatybę."
+
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Norint stabdyti sistemą, nepaisant to, kad programa paprašė tai "
+#~ "sulaikyti, reikia nustatyti tapatybę."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Norint nutraukti \"$(unit)\", reikia nustatyti tapatybę."
diff --git a/po/nl.po b/po/nl.po
index 7e046de67b..68ae636b57 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,10 +7,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-08-21 17:21+0000\n"
"Last-Translator: Maarten <maarten@posteo.de>\n"
-"Language-Team: Dutch <https://translate.fedoraproject.org/projects/systemd/master/nl/>\n"
+"Language-Team: Dutch <https://translate.fedoraproject.org/projects/systemd/"
+"master/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,8 +24,11 @@ msgid "Send passphrase back to system"
msgstr "Stuur de wachtzin terug naar het systeem"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Authenticatie is vereist voor het terugsturen van de wachtzin naar het systeem."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Authenticatie is vereist voor het terugsturen van de wachtzin naar het "
+"systeem."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -32,7 +36,9 @@ msgstr "Beheer de systeemdiensten of andere eenheden"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Authenticatie is vereist voor het beheren van de systeemdiensten of andere eenheden."
+msgstr ""
+"Authenticatie is vereist voor het beheren van de systeemdiensten of andere "
+"eenheden."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -40,15 +46,21 @@ msgstr "Beheer de bestanden van systeemdiensten of van eenheden"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Authenticatie is vereist voor het beheren van de bestanden van systeemdiensten of van eenheden."
+msgstr ""
+"Authenticatie is vereist voor het beheren van de bestanden van "
+"systeemdiensten of van eenheden."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Stel de omgevingsvariabelen in van de systeem- en dienstenbeheerder"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Authenticatie is vereist voor het instellen van de omgevingsvariabelen van de systeem- en dienstenbeheerder."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de omgevingsvariabelen van "
+"de systeem- en dienstenbeheerder."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -56,15 +68,20 @@ msgstr "Laad de opgeslagen toestand van systemd opnieuw"
#: src/core/org.freedesktop.systemd1.policy.in:65
msgid "Authentication is required to reload the systemd state."
-msgstr "Authenticatie is vereist voor het opnieuw laden van de opgeslagen toestand van systemd."
+msgstr ""
+"Authenticatie is vereist voor het opnieuw laden van de opgeslagen toestand "
+"van systemd."
#: src/core/org.freedesktop.systemd1.policy.in:74
msgid "Dump the systemd state without rate limits"
msgstr "Dump de toestand van systemd zonder snelheidsbeperkingen"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Authenticatie is vereist voor het opslaan van de toestand van systemd zonder snelheidsbeperkingen."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Authenticatie is vereist voor het opslaan van de toestand van systemd zonder "
+"snelheidsbeperkingen."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -80,15 +97,19 @@ msgstr "Verwijder een persoonlijke ruimte"
#: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area."
-msgstr "Authenticatie is vereist voor het verwijderen van een persoonlijke ruimte."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van een persoonlijke ruimte."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
msgstr "Controleer de legitimatie van een persoonlijke ruimte"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Authenticatie is vereist voor het controleren van de legitimatie van een persoonlijke ruimte."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het controleren van de legitimatie van een "
+"persoonlijke ruimte."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -96,7 +117,8 @@ msgstr "Werk een persoonlijke ruimte bij"
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Authenticatie is vereist voor het bijwerken van een persoonlijke ruimte."
+msgstr ""
+"Authenticatie is vereist voor het bijwerken van een persoonlijke ruimte."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -104,160 +126,234 @@ msgstr "Verander de grootte van een persoonlijke ruimte"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Authenticatie is vereist voor het veranderen van de grootte van een persoonlijke ruimte."
+msgstr ""
+"Authenticatie is vereist voor het veranderen van de grootte van een "
+"persoonlijke ruimte."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Wijzig het wachtwoord van een persoonlijke ruimte"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Authenticatie is vereist voor het wijzigen van het wachtwoord van een persoonlijke ruimte."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het wijzigen van het wachtwoord van een "
+"persoonlijke ruimte."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het bijwerken van een persoonlijke ruimte."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Maak een persoonlijke ruimte"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "Authenticatie is vereist voor het maken van een persoonlijke ruimte."
-#: src/home/pam_systemd_home.c:287
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "De thuismap van gebruiker %s is thans niet aanwezig in het bestandssysteem. Gelieve het benodigde opslagapparaat aan te sluiten of het bestandssysteem aan te koppelen dat de thuismap bevat."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"De thuismap van gebruiker %s is thans niet aanwezig in het bestandssysteem. "
+"Gelieve het benodigde opslagapparaat aan te sluiten of het bestandssysteem "
+"aan te koppelen dat de thuismap bevat."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Gebruiker %s heeft te veel aanmeldpogingen gedaan. Probeer het later nog eens."
+msgstr ""
+"Gebruiker %s heeft te veel aanmeldpogingen gedaan. Probeer het later nog "
+"eens."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Wachtwoord: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Wachtwoord is onjuist of niet voldoende voor de authenticatie van gebruiker %s."
+msgstr ""
+"Wachtwoord is onjuist of niet voldoende voor de authenticatie van gebruiker "
+"%s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Sorry, probeer het nog eens: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Herstelcode: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Het wachtwoord of de herstelcode is onjuist of niet voldoende voor de authenticatie van gebruiker %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Het wachtwoord of de herstelcode is onjuist of niet voldoende voor de "
+"authenticatie van gebruiker %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Sorry, voer de herstelcode nogmaals in: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Het beveiligingsmiddel van gebruiker %s is niet ingestoken."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Probeer het nog eens met wachtwoord: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Het wachtwoord is onjuist of niet voldoende, en het geconfigureerde beveiligingsmiddel van gebruiker %s is niet ingestoken."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Het wachtwoord is onjuist of niet voldoende, en het geconfigureerde "
+"beveiligingsmiddel van gebruiker %s is niet ingestoken."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN van het beveiligingsmiddel: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "Gelieve in persoon het beveiligingsmiddel van gebruiker %s te authenticeren."
+msgstr ""
+"Gelieve in persoon het beveiligingsmiddel van gebruiker %s te authenticeren."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
-msgstr "Gelieve te bevestigen dat het beveiligingsmiddel van gebruiker %s aanwezig is."
+msgstr ""
+"Gelieve te bevestigen dat het beveiligingsmiddel van gebruiker %s aanwezig "
+"is."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
-msgstr "Gelieve te verifiëren dat het beveiligingsmiddel van gebruiker %s aan die gebruiker toebehoort."
+msgstr ""
+"Gelieve te verifiëren dat het beveiligingsmiddel van gebruiker %s aan die "
+"gebruiker toebehoort."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "De PIN van het beveiligingsmiddel is geblokkeerd, gelieve de blokkering eerst op te heffen. (Tip: verwijderen en weer insteken zou voldoende kunnen zijn.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"De PIN van het beveiligingsmiddel is geblokkeerd, gelieve de blokkering "
+"eerst op te heffen. (Tip: verwijderen en weer insteken zou voldoende kunnen "
+"zijn.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "De PIN van het beveiligingsmiddel is onjuist voor gebruiker %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Sorry, probeer de PIN van het beveiligingsmiddel nogmaals: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "De PIN van het beveiligingsmiddel is onjuist voor gebruiker %s. U kunt het nog maar enkele malen proberen!"
+msgstr ""
+"De PIN van het beveiligingsmiddel is onjuist voor gebruiker %s. U kunt het "
+"nog maar enkele malen proberen!"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "De PIN van het beveiligingsmiddel is onjuist voor gebruiker %s. U kunt het nog maar eenmaal proberen!"
+msgstr ""
+"De PIN van het beveiligingsmiddel is onjuist voor gebruiker %s. U kunt het "
+"nog maar eenmaal proberen!"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "De thuismap van gebruiker %s is thans niet aangekoppeld. Gelieve u eerst plaatselijk aan te melden."
+msgstr ""
+"De thuismap van gebruiker %s is thans niet aangekoppeld. Gelieve u eerst "
+"plaatselijk aan te melden."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "De thuismap van gebruiker %s is thans vergrendeld. Gelieve de vergrendeling eerst op te heffen op het plaatselijke systeem."
+msgstr ""
+"De thuismap van gebruiker %s is thans vergrendeld. Gelieve de vergrendeling "
+"eerst op te heffen op het plaatselijke systeem."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Er zijn te veel aanmeldpogingen voor gebruiker %s niet succesvol geweest. Verdere aanmelding voor die gebruiker wordt geweigerd."
+msgstr ""
+"Er zijn te veel aanmeldpogingen voor gebruiker %s niet succesvol geweest. "
+"Verdere aanmelding voor die gebruiker wordt geweigerd."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
-msgstr "De registratie van de gebruiker wordt geblokkeerd, waardoor zijn toegang tot het systeem wordt belet."
+msgstr ""
+"De registratie van de gebruiker wordt geblokkeerd, waardoor zijn toegang tot "
+"het systeem wordt belet."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
-msgstr "De registratie van de gebruiker is nog niet geldig, waardoor zijn toegang tot het systeem wordt belet."
+msgstr ""
+"De registratie van de gebruiker is nog niet geldig, waardoor zijn toegang "
+"tot het systeem wordt belet."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
-msgstr "De registratie van de gebruiker is niet meer geldig, waardoor zijn toegang tot het systeem wordt belet."
+msgstr ""
+"De registratie van de gebruiker is niet meer geldig, waardoor zijn toegang "
+"tot het systeem wordt belet."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
-msgstr "De registratie van de gebruiker is niet geldig, waardoor zijn toegang tot het systeem wordt belet."
+msgstr ""
+"De registratie van de gebruiker is niet geldig, waardoor zijn toegang tot "
+"het systeem wordt belet."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Er zijn te veel aanmeldingen. Probeer het nog eens over %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Wijziging van uw wachtwoord is vereist."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Het wachtwoord is verlopen. Wijziging van het wachtwoord is vereist."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "Het wachtwoord is verlopen maar kan niet worden gewijzigd. Daarom wordt de aanmelding geweigerd."
+msgstr ""
+"Het wachtwoord is verlopen maar kan niet worden gewijzigd. Daarom wordt de "
+"aanmelding geweigerd."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
-msgstr "Het wachtwoord zal spoedig verlopen. Gelieve het wachtwoord te wijzigen."
+msgstr ""
+"Het wachtwoord zal spoedig verlopen. Gelieve het wachtwoord te wijzigen."
#: src/hostname/org.freedesktop.hostname1.policy:20
msgid "Set hostname"
@@ -272,8 +368,12 @@ msgid "Set static hostname"
msgstr "Stel de technische computernaam in"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Authenticatie is vereist voor het instellen van zowel de technische als de gebruikersvriendelijke computernaam."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Authenticatie is vereist voor het instellen van zowel de technische als de "
+"gebruikersvriendelijke computernaam."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -281,7 +381,9 @@ msgstr "Opgeven van de algemene informatie over de computer"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Authenticatie is vereist voor het opgeven van de algemene informatie over de computer."
+msgstr ""
+"Authenticatie is vereist voor het opgeven van de algemene informatie over de "
+"computer."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -289,7 +391,8 @@ msgstr "Verkrijg de UUID van het product"
#: src/hostname/org.freedesktop.hostname1.policy:52
msgid "Authentication is required to get product UUID."
-msgstr "Authenticatie is vereist voor het verkrijgen van de UUID van het product."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van de UUID van het product."
#: src/hostname/org.freedesktop.hostname1.policy:61
msgid "Get hardware serial number"
@@ -297,7 +400,9 @@ msgstr "Verkrijg het serienummer van de hardware"
#: src/hostname/org.freedesktop.hostname1.policy:62
msgid "Authentication is required to get hardware serial number."
-msgstr "Authenticatie is vereist voor het verkrijgen van het serienummer van de hardware."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van het serienummer van de "
+"hardware."
#: src/hostname/org.freedesktop.hostname1.policy:71
msgid "Get system description"
@@ -305,31 +410,59 @@ msgstr "Verkrijg de beschrijving van het systeem"
#: src/hostname/org.freedesktop.hostname1.policy:72
msgid "Authentication is required to get system description."
-msgstr "Authenticatie is vereist voor het verkrijgen van de systeembeschrijving."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van de systeembeschrijving."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "Importeer het schijfbestand van een virtuele machine of dat van een container"
+#, fuzzy
+msgid "Import a disk image"
+msgstr ""
+"Importeer het schijfbestand van een virtuele machine of dat van een container"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Authenticatie is vereist voor het importeren van het schijfbestand van een virtuele machine of dat van een container."
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Authenticatie is vereist voor het importeren van het schijfbestand van een "
+"virtuele machine of dat van een container."
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "Exporteer het schijfbestand van een virtuele machine of dat van een container"
+#, fuzzy
+msgid "Export a disk image"
+msgstr ""
+"Exporteer het schijfbestand van een virtuele machine of dat van een container"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Authenticatie is vereist voor het exporteren van het schijfbestand van een virtuele machine of dat van een container."
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Authenticatie is vereist voor het exporteren van het schijfbestand van een "
+"virtuele machine of dat van een container."
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "Download het schijfbestand van een virtuele machine of dat van een container"
+#, fuzzy
+msgid "Download a disk image"
+msgstr ""
+"Download het schijfbestand van een virtuele machine of dat van een container"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Authenticatie is vereist voor het downloaden van het schijfbestand van een virtuele machine of dat van een container."
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Authenticatie is vereist voor het downloaden van het schijfbestand van een "
+"virtuele machine of dat van een container."
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Authenticatie is vereist voor het wijzigen van het wachtwoord van een "
+"persoonlijke ruimte."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -337,7 +470,8 @@ msgstr "Stel de taal van het systeem in"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Authenticatie is vereist voor het instellen van de taal van het systeem."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de taal van het systeem."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -345,111 +479,177 @@ msgstr "Opgeven van de indeling van het toetsenbord aan het besturingssysteem"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Authenticatie is vereist voor het opgeven van de indeling van het toetsenbord."
+msgstr ""
+"Authenticatie is vereist voor het opgeven van de indeling van het "
+"toetsenbord."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
-msgstr "Geef toestemming aan toepassingsprogramma's het afsluiten van het systeem te verhinderen"
+msgstr ""
+"Geef toestemming aan toepassingsprogramma's het afsluiten van het systeem te "
+"verhinderen"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma het afsluiten van het systeem mag verhinderen."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma het afsluiten van "
+"het systeem mag verhinderen."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
-msgstr "Geef toestemming aan toepassingsprogramma's het afsluiten van het systeem uit te stellen"
+msgstr ""
+"Geef toestemming aan toepassingsprogramma's het afsluiten van het systeem "
+"uit te stellen"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma het afsluiten van het systeem mag uitstellen."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma het afsluiten van "
+"het systeem mag uitstellen."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
-msgstr "Geef toestemming aan toepassingsprogramma's de slaapstand van het systeem te verhinderen"
+msgstr ""
+"Geef toestemming aan toepassingsprogramma's de slaapstand van het systeem te "
+"verhinderen"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma de slaapstand van het systeem mag verhinderen."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma de slaapstand van "
+"het systeem mag verhinderen."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
-msgstr "Geef toestemming aan toepassingsprogramma's de slaapstand van het systeem uit te stellen"
+msgstr ""
+"Geef toestemming aan toepassingsprogramma's de slaapstand van het systeem "
+"uit te stellen"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma de slaapstand van het systeem mag uitstellen."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma de slaapstand van "
+"het systeem mag uitstellen."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Sta toepassingsprogramma's toe dat zij verhinderen dat het systeem automatisch in de pauzestand komt"
+msgstr ""
+"Sta toepassingsprogramma's toe dat zij verhinderen dat het systeem "
+"automatisch in de pauzestand komt"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen dat het systeem automatisch in de pauzestand komt."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen "
+"dat het systeem automatisch in de pauzestand komt."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan het uitzetten van de computer met de drukknop"
+msgstr ""
+"Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan "
+"het uitzetten van de computer met de drukknop"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen dat gevolg wordt gegeven aan het uitzetten van de computer met de drukknop."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen "
+"dat gevolg wordt gegeven aan het uitzetten van de computer met de drukknop."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan het indrukken van de pauzeknop"
+msgstr ""
+"Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan "
+"het indrukken van de pauzeknop"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen dat gevolg wordt gegeven aan het indrukken van de pauzeknop."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen "
+"dat gevolg wordt gegeven aan het indrukken van de pauzeknop."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan het indrukken van de slaapknop"
+msgstr ""
+"Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan "
+"het indrukken van de slaapknop"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen dat gevolg wordt gegeven aan het indrukken van de slaapknop."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen "
+"dat gevolg wordt gegeven aan het indrukken van de slaapknop."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan het dichtklappen van een draagbare computer"
+msgstr ""
+"Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan "
+"het dichtklappen van een draagbare computer"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen dat gevolg wordt gegeven aan het dichtklappen van een draagbare computer."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen "
+"dat gevolg wordt gegeven aan het dichtklappen van een draagbare computer."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan het indrukken van de drukknop voor het herstarten van de computer"
+msgstr ""
+"Sta toepassingsprogramma's toe te verhinderen dat gevolg wordt gegeven aan "
+"het indrukken van de drukknop voor het herstarten van de computer"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen dat gevolg wordt gegeven aan het indrukken van de drukknop voor het herstarten van de computer."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassingsprogramma mag verhinderen "
+"dat gevolg wordt gegeven aan het indrukken van de drukknop voor het "
+"herstarten van de computer."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
-msgstr "Sta aan een gebruiker die niet is aangemeld toe programma's uit te voeren"
+msgstr ""
+"Sta aan een gebruiker die niet is aangemeld toe programma's uit te voeren"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Een uitdrukkelijk verzoek is vereist alvorens een gebruiker die niet is aangemeld programma's mag uitvoeren."
+msgstr ""
+"Een uitdrukkelijk verzoek is vereist alvorens een gebruiker die niet is "
+"aangemeld programma's mag uitvoeren."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
-msgstr "Sta aan gebruikers die niet zijn aangemeld toe dat zij programma's uitvoeren"
+msgstr ""
+"Sta aan gebruikers die niet zijn aangemeld toe dat zij programma's uitvoeren"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Authenticatie is vereist alvorens een gebruiker die niet is aangemeld programma's mag uitvoeren."
+msgstr ""
+"Authenticatie is vereist alvorens een gebruiker die niet is aangemeld "
+"programma's mag uitvoeren."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
-msgstr "Maak het mogelijk dat apparaten kunnen worden toegewezen aan verschillende werkplekken"
+msgstr ""
+"Maak het mogelijk dat apparaten kunnen worden toegewezen aan verschillende "
+"werkplekken"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Authenticatie is vereist alvorens een apparaat kan worden toegewezen aan een werkplek."
+msgstr ""
+"Authenticatie is vereist alvorens een apparaat kan worden toegewezen aan een "
+"werkplek."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -457,7 +657,9 @@ msgstr "Verwijder alle toewijzingen van apparaten aan werkplekken"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Authenticatie is vereist voor het ongedaan maken van de toewijzingen van apparaten aan werkplekken."
+msgstr ""
+"Authenticatie is vereist voor het ongedaan maken van de toewijzingen van "
+"apparaten aan werkplekken."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -472,16 +674,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Sluit het systeem af terwijl andere gebruikers nog zijn aangemeld"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Authenticatie is vereist voor het afsluiten van het systeem terwijl andere gebruikers nog zijn aangemeld."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het afsluiten van het systeem terwijl andere "
+"gebruikers nog zijn aangemeld."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Sluit het systeem af terwijl een toepassingsprogramma dit verhindert"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Authenticatie is vereist voor het afsluiten van het systeem terwijl een toepassingsprogramma dit verhindert."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het afsluiten van het systeem terwijl een "
+"toepassingsprogramma dit verhindert."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -496,16 +706,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Herstart het systeem terwijl andere gebruikers nog zijn aangemeld"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Authenticatie is vereist voor het herstarten van het systeem terwijl andere gebruikers nog zijn aangemeld."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Authenticatie is vereist voor het herstarten van het systeem terwijl andere "
+"gebruikers nog zijn aangemeld."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Herstart het systeem terwijl een toepassing dit verhindert"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Authenticatie is vereist voor het herstarten van het systeem terwijl een toepassing dit verhindert."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het herstarten van het systeem terwijl een "
+"toepassing dit verhindert."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -520,16 +738,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Stop het systeem terwijl andere gebruikers nog zijn aangemeld"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Authenticatie is vereist voor het stoppen van het systeem terwijl andere gebruikers nog zijn aangemeld."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Authenticatie is vereist voor het stoppen van het systeem terwijl andere "
+"gebruikers nog zijn aangemeld."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Stop het systeem terwijl een toepassingsprogramma dit verhindert"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Authenticatie is vereist voor het stoppen van het systeem terwijl een toepassing dit verhindert."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het stoppen van het systeem terwijl een "
+"toepassing dit verhindert."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -537,23 +763,35 @@ msgstr "Zet het systeem in de pauzestand"
#: src/login/org.freedesktop.login1.policy:269
msgid "Authentication is required to suspend the system."
-msgstr "Authenticatie is vereist voor het in pauzestand zetten van het systeem."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand zetten van het systeem."
#: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while other users are logged in"
-msgstr "Zet het systeem in pauzestand terwijl andere gebruikers nog zijn aangemeld"
+msgstr ""
+"Zet het systeem in pauzestand terwijl andere gebruikers nog zijn aangemeld"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Authenticatie is vereist voor het in de pauzestand zetten van het systeem terwijl andere gebruikers nog zijn aangemeld."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het in de pauzestand zetten van het systeem "
+"terwijl andere gebruikers nog zijn aangemeld."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
-msgstr "Zet het systeem in de pauzestand terwijl een toepassingsprogramma dit verhindert"
+msgstr ""
+"Zet het systeem in de pauzestand terwijl een toepassingsprogramma dit "
+"verhindert"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Authenticatie is vereist voor het in de pauzestand zetten van het systeem terwijl een toepassingsprogramma dit verhindert."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het in de pauzestand zetten van het systeem "
+"terwijl een toepassingsprogramma dit verhindert."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -561,31 +799,47 @@ msgstr "Zet het systeem in de slaapstand"
#: src/login/org.freedesktop.login1.policy:301
msgid "Authentication is required to hibernate the system."
-msgstr "Authenticatie is vereist voor het in de slaapstand zetten van het systeem."
+msgstr ""
+"Authenticatie is vereist voor het in de slaapstand zetten van het systeem."
#: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while other users are logged in"
-msgstr "Zet het systeem in de slaapstand terwijl andere gebruikers nog zijn aangemeld"
+msgstr ""
+"Zet het systeem in de slaapstand terwijl andere gebruikers nog zijn aangemeld"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Authenticatie is vereist voor het in de slaapstand zetten van het systeem terwijl andere gebruikers nog zijn aangemeld."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het in de slaapstand zetten van het systeem "
+"terwijl andere gebruikers nog zijn aangemeld."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Zet het systeem in de slaapstand terwijl een toepassingsprogramma dit verhindert"
+msgstr ""
+"Zet het systeem in de slaapstand terwijl een toepassingsprogramma dit "
+"verhindert"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Authenticatie is vereist voor het in de slaapstand zetten van het systeem terwijl een toepassing dit verhindert."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het in de slaapstand zetten van het systeem "
+"terwijl een toepassing dit verhindert."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
-msgstr "Beheren van de actieve sessies, van de gebruikers en van de apparaten die zijn toegewezen aan de werkplekken"
+msgstr ""
+"Beheren van de actieve sessies, van de gebruikers en van de apparaten die "
+"zijn toegewezen aan de werkplekken"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Authenticatie is vereist voor het beheren van de actieve sessies, van de gebruikers en van de apparaten die zijn toegewezen aan de werkplekken."
+msgstr ""
+"Authenticatie is vereist voor het beheren van de actieve sessies, van de "
+"gebruikers en van de apparaten die zijn toegewezen aan de werkplekken."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -593,7 +847,9 @@ msgstr "Vergrendel of ontgrendel de actieve sessies"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Authenticatie is vereist voor het vergrendelen of ontgrendelen van de actieve sessies."
+msgstr ""
+"Authenticatie is vereist voor het vergrendelen of ontgrendelen van de "
+"actieve sessies."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -601,39 +857,64 @@ msgstr "Opgeven van de reden voor een herstart, aan de systeemkern"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Authenticatie is vereist voor het opgeven van de reden voor een herstart aan de systeemkern."
+msgstr ""
+"Authenticatie is vereist voor het opgeven van de reden voor een herstart aan "
+"de systeemkern."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Geef de aanwijzing aan de firmware van het moederbord dat bij het opstarten het configuratieprogramma gestart moet worden"
+msgstr ""
+"Geef de aanwijzing aan de firmware van het moederbord dat bij het opstarten "
+"het configuratieprogramma gestart moet worden"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Authenticatie is vereist voor het geven van de aanwijzing aan de firmware van het moederbord dat bij het opstarten het configuratieprogramma gestart moet worden."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Authenticatie is vereist voor het geven van de aanwijzing aan de firmware "
+"van het moederbord dat bij het opstarten het configuratieprogramma gestart "
+"moet worden."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
-msgstr "Geef de aanwijzing aan opstartlader dat hij zijn opstartmenu moet weergeven"
+msgstr ""
+"Geef de aanwijzing aan opstartlader dat hij zijn opstartmenu moet weergeven"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Authenticatie is vereist voor het geven van de aanwijzing aan de opstartlader dat hij zijn opstartmenu moet weergeven."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Authenticatie is vereist voor het geven van de aanwijzing aan de "
+"opstartlader dat hij zijn opstartmenu moet weergeven."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
-msgstr "Geef de aanwijzing aan de opstartlader dat hij een specifieke keuzemogelijkheid van zijn opstartmenu moet opstarten"
+msgstr ""
+"Geef de aanwijzing aan de opstartlader dat hij een specifieke "
+"keuzemogelijkheid van zijn opstartmenu moet opstarten"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Authenticatie is vereist voor het geven van de aanwijzing aan de opstartlader dat hij een specifieke keuzemogelijkheid van zijn opstartmenu moet opstarten."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Authenticatie is vereist voor het geven van de aanwijzing aan de "
+"opstartlader dat hij een specifieke keuzemogelijkheid van zijn opstartmenu "
+"moet opstarten."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
-msgstr "Opgeven van een bericht dat naar alle aangemelde gebruikers zal worden verzonden"
+msgstr ""
+"Opgeven van een bericht dat naar alle aangemelde gebruikers zal worden "
+"verzonden"
#: src/login/org.freedesktop.login1.policy:397
msgid "Authentication is required to set a wall message"
-msgstr "Authenticatie is vereist voor het opgeven van een bericht dat naar alle aangemelde gebruikers zal worden verzonden."
+msgstr ""
+"Authenticatie is vereist voor het opgeven van een bericht dat naar alle "
+"aangemelde gebruikers zal worden verzonden."
#: src/login/org.freedesktop.login1.policy:406
msgid "Change Session"
@@ -649,7 +930,8 @@ msgstr "Aanmelden bij een plaatselijke container"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Authenticatie is vereist voor het aanmelden bij een plaatselijke container."
+msgstr ""
+"Authenticatie is vereist voor het aanmelden bij een plaatselijke container."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -665,7 +947,9 @@ msgstr "Verkrijg een shell in een plaatselijke container"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Authenticatie is vereist voor het verkrijgen van een shell in een plaatselijke container."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een shell in een "
+"plaatselijke container."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -673,15 +957,19 @@ msgstr "Verkrijg een shell op deze computer"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Authenticatie is vereist voor het verkrijgen van een shell op deze computer."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een shell op deze computer."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Verkrijg een pseudo-terminal in een plaatselijke container"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Authenticatie is vereist voor het verkrijgen van een pseudo-terminal in een plaatselijke container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een pseudo-terminal in een "
+"plaatselijke container."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -689,23 +977,34 @@ msgstr "Verkrijg een pseudo-terminal op deze computer"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Authenticatie is vereist voor het verkrijgen van een pseudo-terminal op deze computer."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een pseudo-terminal op deze "
+"computer."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Beheer de plaatselijke virtuele machines en de containers"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Authenticatie is vereist voor het beheren van plaatselijke virtuele machines en containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Authenticatie is vereist voor het beheren van plaatselijke virtuele machines "
+"en containers."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
-msgstr "Beheren van de plaatselijke schijfbestanden van virtuele machines en die van containers"
+msgstr ""
+"Beheren van de plaatselijke schijfbestanden van virtuele machines en die van "
+"containers"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Authenticatie is vereist voor het beheren van de plaatselijke schijfbestanden van virtuele machines en die van containers."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Authenticatie is vereist voor het beheren van de plaatselijke "
+"schijfbestanden van virtuele machines en die van containers."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -763,7 +1062,8 @@ msgstr "Schakel multicast-DNS in of uit"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Authenticatie is vereist voor het in- of uitschakelen van multicast-DNS."
+msgstr ""
+"Authenticatie is vereist voor het in- of uitschakelen van multicast-DNS."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -773,7 +1073,8 @@ msgstr "Schakel DNS over TLS in of uit"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Authenticatie is vereist voor het in- of uitschakelen van DNS over TLS."
+msgstr ""
+"Authenticatie is vereist voor het in- of uitschakelen van DNS over TLS."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -793,7 +1094,8 @@ msgstr "Geef DNSSEC Negative Trust Anchors op"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Authenticatie is vereist voor het opgeven van DNSSEC Negative Trust Anchors."
+msgstr ""
+"Authenticatie is vereist voor het opgeven van DNSSEC Negative Trust Anchors."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -801,7 +1103,8 @@ msgstr "Zet de instellingen voor NTP terug"
#: src/network/org.freedesktop.network1.policy:122
msgid "Authentication is required to reset NTP settings."
-msgstr "Authenticatie is vereist voor het terugzetten van de instellingen voor NTP."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de instellingen voor NTP."
#: src/network/org.freedesktop.network1.policy:132
msgid "Revert DNS settings"
@@ -809,15 +1112,18 @@ msgstr "Zet de instellingen voor DNS terug"
#: src/network/org.freedesktop.network1.policy:133
msgid "Authentication is required to reset DNS settings."
-msgstr "Authenticatie is vereist voor het terugzetten van de instellingen voor DNS."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de instellingen voor DNS."
#: src/network/org.freedesktop.network1.policy:143
msgid "DHCP server sends force renew message"
-msgstr "Draag de DHCP-server op een FORCERENEW-bericht naar zijn cliënten te zenden"
+msgstr ""
+"Draag de DHCP-server op een FORCERENEW-bericht naar zijn cliënten te zenden"
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Authenticatie is vereist voor het verzenden van een FORCERENEW-bericht."
+msgstr ""
+"Authenticatie is vereist voor het verzenden van een FORCERENEW-bericht."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -825,7 +1131,8 @@ msgstr "Hernieuw de dynamische adressen"
#: src/network/org.freedesktop.network1.policy:155
msgid "Authentication is required to renew dynamic addresses."
-msgstr "Authenticatie is vereist voor het hernieuwen van de dynamische adressen."
+msgstr ""
+"Authenticatie is vereist voor het hernieuwen van de dynamische adressen."
#: src/network/org.freedesktop.network1.policy:165
msgid "Reload network settings"
@@ -833,7 +1140,8 @@ msgstr "Laad de netwerkinstellingen opnieuw"
#: src/network/org.freedesktop.network1.policy:166
msgid "Authentication is required to reload network settings."
-msgstr "Authenticatie is vereist voor het opnieuw laden van de netwerkinstellingen."
+msgstr ""
+"Authenticatie is vereist voor het opnieuw laden van de netwerkinstellingen."
#: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface"
@@ -841,7 +1149,9 @@ msgstr "Configureer de verbinding met het netwerk opnieuw"
#: src/network/org.freedesktop.network1.policy:177
msgid "Authentication is required to reconfigure network interface."
-msgstr "Authenticatie is vereist voor het opnieuw configureren van de verbinding met het netwerk."
+msgstr ""
+"Authenticatie is vereist voor het opnieuw configureren van de verbinding met "
+"het netwerk."
#: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image"
@@ -849,23 +1159,31 @@ msgstr "Inspecteer de representatie van een portable service"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Authenticatie is vereist voor het inspecteren van de representatie van een portable service."
+msgstr ""
+"Authenticatie is vereist voor het inspecteren van de representatie van een "
+"portable service."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Koppel de representatie van een portable service aan of af"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Authenticatie is vereist voor het aan- of afkoppelen van de representatie van een portable service."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het aan- of afkoppelen van de representatie "
+"van een portable service."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Verwijder of wijzig de representatie van een portable service"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Authenticatie is vereist voor het verwijderen of wijzigen van de representatie van een portable service."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen of wijzigen van de "
+"representatie van een portable service."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -881,15 +1199,21 @@ msgstr "Verwijder de registratie van een DNS-SD-dienst"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Authenticatie is vereist voor het verwijderen van de registratie van een DNS-SD-dienst"
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van de registratie van een DNS-"
+"SD-dienst"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
-msgstr "Draai de instellingen terug die gebruikt worden voor het omzetten van domeinnamen in IP-adressen"
+msgstr ""
+"Draai de instellingen terug die gebruikt worden voor het omzetten van "
+"domeinnamen in IP-adressen"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Authenticatie is vereist voor het terugzetten van de instellingen die gebruikt worden voor de omzetting van domeinnamen in IP-adressen."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de instellingen die "
+"gebruikt worden voor de omzetting van domeinnamen in IP-adressen."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -905,56 +1229,81 @@ msgstr "Stel de tijdzone in die het systeem gebruikt"
#: src/timedate/org.freedesktop.timedate1.policy:34
msgid "Authentication is required to set the system timezone."
-msgstr "Authenticatie is vereist voor het instellen van de tijdzone die het systeem gebruikt."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de tijdzone die het systeem "
+"gebruikt."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
msgstr "Stel de RTC in op het gebruik van de plaatselijke tijdzone of van UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Authenticatie is vereist om in te stellen dat de RTC de tijd moet opslaan als plaatselijke tijd of gerekend naar de UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Authenticatie is vereist om in te stellen dat de RTC de tijd moet opslaan "
+"als plaatselijke tijd of gerekend naar de UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Schakel synchronisatie van de systeemtijd met een tijdserver in of uit"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Authenticatie is vereist voor het in- of uitschakelen van synchronisatie van de systeemtijd met een tijdserver."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Authenticatie is vereist voor het in- of uitschakelen van synchronisatie van "
+"de systeemtijd met een tijdserver."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Authenticatie is vereist voor het starten van '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Authenticatie is vereist voor het stoppen van '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Authenticatie is vereist voor het opnieuw laden van '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Authenticatie is vereist voor het opnieuw starten van '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Authenticatie is vereist voor het zenden van een UNIX-signaal naar de processen van '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het zenden van een UNIX-signaal naar de "
+"processen van '$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Authenticatie is vereist voor het terugzetten van de toestand \"failed\" van '$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de toestand \"failed\" van "
+"'$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Authenticatie is vereist voor het instellen van de eigenschappen van '$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de eigenschappen van "
+"'$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Authenticatie is vereist voor het verwijderen van bestanden en mappen die gerelateerd zijn aan '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van bestanden en mappen die "
+"gerelateerd zijn aan '$(unit)'."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Authenticatie is vereist voor het bevriezen of ontdooien van de processen die behoren tot '$(unit)'."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Authenticatie is vereist voor het bevriezen of ontdooien van de processen "
+"die behoren tot '$(unit)'."
diff --git a/po/pa.po b/po/pa.po
index a534634519..26a3d390ef 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2024-01-16 14:35+0000\n"
"Last-Translator: A S Alam <aalam@users.noreply.translate.fedoraproject.org>\n"
"Language-Team: Punjabi <https://translate.fedoraproject.org/projects/systemd/"
@@ -22,7 +22,8 @@ msgid "Send passphrase back to system"
msgstr "ਵਾਕ ਵਾਪਸ ਸਿਸਟਮ ਨੂੰ ਭੇਜੋ"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "ਦਿੱਤਾ ਵਾਕ ਸਿਸਟਮ ਨੂੰ ਵਾਪਸ ਭੇਜਣ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -46,7 +47,9 @@ msgid "Set or unset system and service manager environment variables"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -63,7 +66,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "systemd ਹਾਲਤ ਲੋਡ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
#: src/home/org.freedesktop.home1.policy:13
@@ -87,7 +91,8 @@ msgid "Check credentials of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr ""
#: src/home/org.freedesktop.home1.policy:43
@@ -111,155 +116,181 @@ msgid "Change password of a home area"
msgstr "ਹੋਮ ਖੇਤਰ ਲਈ ਪਾਸਵਰਡ ਬਦਲੋ"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "ਵਰਤੋਂਕਾਰ ਦੇ ਹੋਮ ਖੇਤਰ ਲਈ ਪਾਸਵਰਡ ਨੂੰ ਬਦਲਣ ਲਈ ਪਰਮਾਣਿਕਤਾ ਚਾਹੀਦੀ ਹੈ।"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "ਵਰਤੋਂਕਾਰ ਦੇ ਹੋਮ ਖੇਤਰ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਪਰਮਾਣਿਕਤਾ ਚਾਹੀਦੀ ਹੈ।"
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "ਹੋਮ ਖੇਤਰ ਬਣਾਓ"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "ਵਰਤੋਂਕਾਰ ਦੇ ਹੋਮ ਖੇਤਰ ਨੂੰ ਬਣਾਉਣ ਲਈ ਪਰਮਾਣਿਕਤਾ ਚਾਹੀਦੀ ਹੈ।"
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr ""
-"ਵਰਤੋਂਕਾਰ %s ਲਈ ਬਹੁਤ ਛੇਤੀ ਛੇਤੀ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ, ਬਾਅਦ ਵਿੱਚ ਕੋਸ਼ਿਸ਼ ਕਰਿਓ।"
+msgstr "ਵਰਤੋਂਕਾਰ %s ਲਈ ਬਹੁਤ ਛੇਤੀ ਛੇਤੀ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ, ਬਾਅਦ ਵਿੱਚ ਕੋਸ਼ਿਸ਼ ਕਰਿਓ।"
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "ਪਾਸਵਰਡ: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "ਵਰਤੋਂਕਾਰ %s ਦੀ ਪਰਮਾਣਿਕਤਾ ਲਈ ਪਾਸਵਰਡ ਗਲਤ ਹੈ ਜਾਂ ਕਾਫ਼ੀ ਨਹੀਂ ਹੈ।"
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "ਅਫ਼ਸੋਸ, ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਿਓ: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "ਰਿਕਵਰੀ ਕੁੰਜੀ: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr ""
-"ਵਰਤੋਂਕਾਰ %s ਦੀ ਪਰਮਾਣਿਕਤਾ ਲਈ ਪਾਸਵਰਡ/ਰਿਕਵਰੀ ਕੁੰਜੀ ਗਲਤ ਹੈ ਜਾਂ ਕਾਫ਼ੀ ਨਹੀਂ ਹੈ।"
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr "ਵਰਤੋਂਕਾਰ %s ਦੀ ਪਰਮਾਣਿਕਤਾ ਲਈ ਪਾਸਵਰਡ/ਰਿਕਵਰੀ ਕੁੰਜੀ ਗਲਤ ਹੈ ਜਾਂ ਕਾਫ਼ੀ ਨਹੀਂ ਹੈ।"
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "ਅਫ਼ਸੋਸ, ਰਿਕਵਰੀ ਕੁੰਜੀ ਫੇਰ ਭਰਿਓ: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "%s ਵਰਤੋਂਕਾਰ ਲਈ ਸੁਰੱਖਿਆ ਟੋਕਨ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ।"
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "ਪਾਸਵਰਡ ਨਾਲ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਿਓ: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "ਸੁਰੱਖਿਆ ਟੋਕਨ ਪਿੰਨ: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr ""
-"%s ਵਰਤੋਂਕਾਰ ਦਾ ਹੋਮ ਇਸ ਵੇਲੇ ਲਾਕ ਹੈ, ਪਹਿਲਾਂ ਇਸ ਨੂੰ ਲੋਕਲ ਰੂਪ ਵਿੱਚ ਅਣ-ਲਾਕ ਕਰੋ।"
+msgstr "%s ਵਰਤੋਂਕਾਰ ਦਾ ਹੋਮ ਇਸ ਵੇਲੇ ਲਾਕ ਹੈ, ਪਹਿਲਾਂ ਇਸ ਨੂੰ ਲੋਕਲ ਰੂਪ ਵਿੱਚ ਅਣ-ਲਾਕ ਕਰੋ।"
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "ਵਰਤੋਂਕਾਰ ਰਿਕਾਰਡ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਈ ਹੈ, ਪਹੁੰਚ ਤੋਂ ਰੋਕਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ ਕੀਤੀਆਂ, %s ਵਿੱਚ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਲੋੜ ਹੈ।"
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "ਪਾਸਵਰਡ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੈ, ਇਹ ਬਦਲਣ ਦੀ ਲੋੜ ਹੈ।"
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
"ਪਾਸਵਰਡ ਦੀ ਮਿਆਦ ਪੁੱਗੀ, ਪਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਲਾਗਇਨ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "ਪਾਸਵਰਡ ਦੀ ਮਿਆਦ ਛੇਤੀ ਹੀ ਪੁੱਗ ਜਾਵੇਗੀ, ਇਸ ਨੂੰ ਬਦਲ ਲਵੋ।"
@@ -276,7 +307,9 @@ msgid "Set static hostname"
msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -312,29 +345,42 @@ msgid "Authentication is required to get system description."
msgstr "ਸਿਸਟਮ ਜਾਣਕਾਰੀ ਲੈਣ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr ""
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr "'$(unit)' ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr ""
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr "ਸਿਸਟਮ ਟਾਈਮ ਸੈੱਟ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr "systemd ਹਾਲਤ ਲੋਡ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
msgstr ""
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "ਵਰਤੋਂਕਾਰ ਦੇ ਹੋਮ ਖੇਤਰ ਲਈ ਪਾਸਵਰਡ ਨੂੰ ਬਦਲਣ ਲਈ ਪਰਮਾਣਿਕਤਾ ਚਾਹੀਦੀ ਹੈ।"
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "ਸਿਸਟਮ ਲੋਕੇਲ ਸੈੱਟ ਕਰੋ"
@@ -356,7 +402,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr ""
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr ""
#: src/login/org.freedesktop.login1.policy:33
@@ -388,7 +435,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr ""
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr ""
#: src/login/org.freedesktop.login1.policy:75
@@ -396,7 +445,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:86
@@ -404,7 +455,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:97
@@ -412,7 +465,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:107
@@ -420,7 +475,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr ""
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr ""
#: src/login/org.freedesktop.login1.policy:117
@@ -429,7 +486,9 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr "ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਜਾਂ ਹੋਰ ਇਕਾਈਆਂ ਦੇ ਇੰਤਜਾਮ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
#: src/login/org.freedesktop.login1.policy:128
@@ -477,7 +536,9 @@ msgid "Power off the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:191
@@ -485,7 +546,9 @@ msgid "Power off the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:202
@@ -501,7 +564,9 @@ msgid "Reboot the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:224
@@ -509,7 +574,9 @@ msgid "Reboot the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:235
@@ -525,7 +592,9 @@ msgid "Halt the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:257
@@ -533,7 +602,9 @@ msgid "Halt the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:268
@@ -549,7 +620,9 @@ msgid "Suspend the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:289
@@ -557,7 +630,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:300
@@ -573,7 +648,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:321
@@ -581,7 +658,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:332
@@ -613,7 +692,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr ""
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr ""
#: src/login/org.freedesktop.login1.policy:374
@@ -621,7 +702,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr ""
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr ""
#: src/login/org.freedesktop.login1.policy:385
@@ -629,7 +712,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr ""
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr ""
#: src/login/org.freedesktop.login1.policy:396
@@ -685,7 +770,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74
@@ -701,7 +787,8 @@ msgid "Manage local virtual machines and containers"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:95
@@ -709,7 +796,9 @@ msgid "Manage local virtual machine and container images"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr ""
#: src/network/org.freedesktop.network1.policy:22
@@ -861,7 +950,8 @@ msgid "Attach or detach a portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:34
@@ -869,7 +959,8 @@ msgid "Delete or modify portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -917,7 +1008,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -925,41 +1018,48 @@ msgid "Turn network time synchronization on or off"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr ""
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "'$(unit)' ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "'$(unit)' ਨੂੰ ਰੋਕਣ ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "'$(unit)' ਨੂੰ ਮੁੜ-ਲੋਡ (reload) ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "'$(unit)' ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ (restart) ਕਰਨ ਲਈ ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਹੈ।"
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr ""
diff --git a/po/pl.po b/po/pl.po
index a192b4faf0..5ab7fc669e 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -2,28 +2,33 @@
#
# Polish translation for systemd.
#
-# Piotr Drąg <piotrdrag@gmail.com>, 2023.
+# Piotr Drąg <piotrdrag@gmail.com>, 2023, 2024.
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
-"PO-Revision-Date: 2023-07-15 10:56+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
+"PO-Revision-Date: 2024-03-04 16:32+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
-"Language-Team: Polish <https://translate.fedoraproject.org/projects/systemd/master/pl/>\n"
+"Language-Team: Polish <https://translate.fedoraproject.org/projects/systemd/"
+"main/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.18.2\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 5.4\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system"
msgstr "Wysłanie hasła z powrotem do systemu"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Wymagane jest uwierzytelnienie, aby wysłać podane hasło z powrotem do systemu."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wysłać podane hasło z powrotem do "
+"systemu."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -31,7 +36,9 @@ msgstr "Zarządzanie usługami lub innymi jednostkami systemu"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Wymagane jest uwierzytelnienie, aby zarządzać usługami lub innymi jednostkami systemu."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zarządzać usługami lub innymi "
+"jednostkami systemu."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -39,15 +46,22 @@ msgstr "Zarządzanie plikami usług lub jednostek systemu"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Wymagane jest uwierzytelnienie, aby zarządzać plikami usług lub jednostek systemu."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zarządzać plikami usług lub jednostek "
+"systemu."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Ustawienie lub usunięcie zmiennych środowiskowych menedżera systemu i usług"
+msgstr ""
+"Ustawienie lub usunięcie zmiennych środowiskowych menedżera systemu i usług"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Wymagane jest uwierzytelnienie, aby ustawić lub usunąć zmienne środowiskowe menedżera systemu i usług."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić lub usunąć zmienne środowiskowe "
+"menedżera systemu i usług."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -62,8 +76,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Zrzucenie stanu systemd bez ograniczeń częstotliwości"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Wymagane jest uwierzytelnienie, aby zrzucić stan systemd bez ograniczeń częstotliwości."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zrzucić stan systemd bez ograniczeń "
+"częstotliwości."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -71,7 +88,8 @@ msgstr "Utworzenie przestrzeni domowej"
#: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area."
-msgstr "Wymagane jest uwierzytelnienie, aby utworzyć przestrzeń domową użytkownika."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby utworzyć przestrzeń domową użytkownika."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -79,15 +97,19 @@ msgstr "Usunięcie przestrzeni domowej"
#: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area."
-msgstr "Wymagane jest uwierzytelnienie, aby usunąć przestrzeń domową użytkownika."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby usunąć przestrzeń domową użytkownika."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
msgstr "Sprawdzenie danych uwierzytelniających przestrzeni domowej"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Wymagane jest uwierzytelnienie, aby sprawdzić dane uwierzytelniające przestrzeni domowej użytkownika."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby sprawdzić dane uwierzytelniające "
+"przestrzeni domowej użytkownika."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -95,7 +117,9 @@ msgstr "Aktualizacja przestrzeni domowej"
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Wymagane jest uwierzytelnienie, aby zaktualizować przestrzeń domową użytkownika."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zaktualizować przestrzeń domową "
+"użytkownika."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -103,158 +127,211 @@ msgstr "Zmiana rozmiaru przestrzeni domowej"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Wymagane jest uwierzytelnienie, aby zmienić rozmiar przestrzeni domowej użytkownika."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zmienić rozmiar przestrzeni domowej "
+"użytkownika."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Zmiana hasła przestrzeni domowej"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Wymagane jest uwierzytelnienie, aby zmienić hasło przestrzeni domowej użytkownika."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zmienić hasło przestrzeni domowej "
+"użytkownika."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr "Wstrzymanie automatycznej blokady przestrzeni domowej"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wstrzymać automatyczną blokadę "
+"przestrzeni domowej użytkownika."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr "Aktywowanie przestrzeni domowej"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby aktywować przestrzeń domową użytkownika."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "Katalog domowy użytkownika %s jest teraz nieobecny, proszę podłączyć wymagane urządzenie do przechowywania danych lub system plików, na którym się znajduje."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"Katalog domowy użytkownika %s jest teraz nieobecny, proszę podłączyć "
+"wymagane urządzenie do przechowywania danych lub system plików, na którym "
+"się znajduje."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr "Za częste próby logowania użytkownika %s, proszę spróbować później."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Hasło: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Hasło jest niepoprawne lub niewystarczające do uwierzytelnienia użytkownika %s."
+msgstr ""
+"Hasło jest niepoprawne lub niewystarczające do uwierzytelnienia użytkownika "
+"%s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Proszę spróbować ponownie: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Klucz odzyskiwania: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Hasło/klucz odzyskiwania jest niepoprawny lub niewystarczający do uwierzytelnienia użytkownika %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Hasło/klucz odzyskiwania jest niepoprawny lub niewystarczający do "
+"uwierzytelnienia użytkownika %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Proszę ponownie wpisać klucz odzyskiwania: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Nie włożono tokena zabezpieczeń użytkownika %s."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Proszę spróbować ponownie za pomocą hasła: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Hasło jest niepoprawne lub niewystarczające, a skonfigurowany token zabezpieczeń użytkownika %s nie jest włożony."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Hasło jest niepoprawne lub niewystarczające, a skonfigurowany token "
+"zabezpieczeń użytkownika %s nie jest włożony."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "Kod PIN tokena zabezpieczeń: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "Proszę fizycznie uwierzytelnić na tokenie zabezpieczeń użytkownika %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Proszę potwierdzić obecność na tokenie zabezpieczeń użytkownika %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
-msgstr "Proszę zweryfikować użytkownika na tokenie zabezpieczeń użytkownika %s."
+msgstr ""
+"Proszę zweryfikować użytkownika na tokenie zabezpieczeń użytkownika %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "Kod PIN tokena zabezpieczeń jest zablokowany, proszę najpierw go odblokować (wskazówka: wyjęcie i włożenie ponownie może wystarczyć)."
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"Kod PIN tokena zabezpieczeń jest zablokowany, proszę najpierw go odblokować "
+"(wskazówka: wyjęcie i włożenie ponownie może wystarczyć)."
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Niepoprawny kod PIN tokena zabezpieczeń dla użytkownika %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Proszę ponownie wpisać kod PIN tokena zabezpieczeń: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "Niepoprawny kod PIN tokena zabezpieczeń użytkownika %s (pozostało tylko kilka prób)."
+msgstr ""
+"Niepoprawny kod PIN tokena zabezpieczeń użytkownika %s (pozostało tylko "
+"kilka prób)."
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "Niepoprawny kod PIN tokena zabezpieczeń użytkownika %s (pozostała tylko jedna próba)."
+msgstr ""
+"Niepoprawny kod PIN tokena zabezpieczeń użytkownika %s (pozostała tylko "
+"jedna próba)."
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "Katalog domowy użytkownika %s jest teraz nieaktywny, proszę najpierw zalogować się lokalnie."
+msgstr ""
+"Katalog domowy użytkownika %s jest teraz nieaktywny, proszę najpierw "
+"zalogować się lokalnie."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "Katalog domowy użytkownika %s jest teraz zablokowany, proszę najpierw odblokować go lokalnie."
+msgstr ""
+"Katalog domowy użytkownika %s jest teraz zablokowany, proszę najpierw "
+"odblokować go lokalnie."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "Za dużo nieudanych prób logowania użytkownika %s, odmawianie."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Wpis użytkownika jest zablokowany, zabranianie dostępu."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Wpis użytkownika nie jest jeszcze ważny, zabranianie dostępu."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Wpis użytkownika nie jest już ważny, zabranianie dostępu."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Wpis użytkownika jest nieważny, zabranianie dostępu."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Za dużo logowań, proszę spróbować ponownie za %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Wymagana jest zmiana hasła."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Hasło wygasło, wymagana jest zmiana."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "Hasło wygasło, ale nie można go zmienić, odmawianie logowania."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Hasło niedługo wygaśnie, proszę je zmienić."
@@ -271,8 +348,12 @@ msgid "Set static hostname"
msgstr "Ustawienie statycznej nazwy komputera"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Wymagane jest uwierzytelnienie, aby ustawić statycznie skonfigurowaną nazwę lokalnego komputera, a także jego nazwę czytelną dla człowieka."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić statycznie skonfigurowaną nazwę "
+"lokalnego komputera, a także jego nazwę czytelną dla człowieka."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -280,7 +361,8 @@ msgstr "Ustawienie informacji o komputerze"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Wymagane jest uwierzytelnienie, aby ustawić informacje o lokalnym komputerze."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić informacje o lokalnym komputerze."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -307,28 +389,39 @@ msgid "Authentication is required to get system description."
msgstr "Wymagane jest uwierzytelnienie, aby uzyskać opis systemu."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "Import obrazu maszyny wirtualnej lub kontenera"
+msgid "Import a disk image"
+msgstr "Import obrazu dysku"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Wymagane jest uwierzytelnienie, aby zaimportować obraz maszyny wirtualnej lub kontenera"
+msgid "Authentication is required to import an image"
+msgstr "Wymagane jest uwierzytelnienie, aby zaimportować obraz"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "Eksport obrazu maszyny wirtualnej lub kontenera"
+msgid "Export a disk image"
+msgstr "Eksport obrazu dysku"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Wymagane jest uwierzytelnienie, aby wyeksportować obraz maszyny wirtualnej lub kontenera"
+msgid "Authentication is required to export disk image"
+msgstr "Wymagane jest uwierzytelnienie, aby wyeksportować obraz dysku"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "Pobranie obrazu maszyny wirtualnej lub kontenera"
+msgid "Download a disk image"
+msgstr "Pobranie obrazu dysku"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Wymagane jest uwierzytelnienie, aby pobrać obraz maszyny wirtualnej lub kontenera"
+msgid "Authentication is required to download a disk image"
+msgstr "Wymagane jest uwierzytelnienie, aby pobrać obraz dysku"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr "Anulowanie przesyłania obrazu dysku"
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby anulować trwające przesyłanie obrazu "
+"dysku"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -351,7 +444,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Zezwolenie programom na wstrzymywanie wyłączenia systemu"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "Program wymaga uwierzytelnienia, aby wstrzymać wyłączenie systemu."
#: src/login/org.freedesktop.login1.policy:33
@@ -383,48 +477,77 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "Zezwolenie programom na wstrzymanie automatycznego uśpienia systemu"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Program wymaga uwierzytelnienia, aby wstrzymać automatyczne uśpienie systemu."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Program wymaga uwierzytelnienia, aby wstrzymać automatyczne uśpienie systemu."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Zezwolenie programom na wstrzymanie obsługi klawisza zasilania przez system"
+msgstr ""
+"Zezwolenie programom na wstrzymanie obsługi klawisza zasilania przez system"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza zasilania przez system."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza zasilania "
+"przez system."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Zezwolenie programom na wstrzymanie obsługi klawisza uśpienia przez system"
+msgstr ""
+"Zezwolenie programom na wstrzymanie obsługi klawisza uśpienia przez system"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza uśpienia przez system."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza uśpienia "
+"przez system."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Zezwolenie programom na wstrzymanie obsługi klawisza hibernacji przez system"
+msgstr ""
+"Zezwolenie programom na wstrzymanie obsługi klawisza hibernacji przez system"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza hibernacji przez system."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza hibernacji "
+"przez system."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Zezwolenie programom na wstrzymanie obsługi przełącznika pokrywy przez system"
+msgstr ""
+"Zezwolenie programom na wstrzymanie obsługi przełącznika pokrywy przez system"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Program wymaga uwierzytelnienia, aby wstrzymać obsługę przełącznika pokrywy przez system."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Program wymaga uwierzytelnienia, aby wstrzymać obsługę przełącznika pokrywy "
+"przez system."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Zezwolenie programom na wstrzymanie obsługi klawisza ponownego uruchomienia przez system"
+msgstr ""
+"Zezwolenie programom na wstrzymanie obsługi klawisza ponownego uruchomienia "
+"przez system"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza ponownego uruchomienia przez system."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Program wymaga uwierzytelnienia, aby wstrzymać obsługę klawisza ponownego "
+"uruchomienia przez system."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -432,7 +555,9 @@ msgstr "Zezwolenie niezalogowanemu użytkownikowi na uruchamianie programów"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Wymagane jest bezpośrednie żądanie, aby uruchamiać programy jako niezalogowany użytkownik."
+msgstr ""
+"Wymagane jest bezpośrednie żądanie, aby uruchamiać programy jako "
+"niezalogowany użytkownik."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -440,7 +565,9 @@ msgstr "Zezwolenie niezalogowanym użytkownikom na uruchamianie programów"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Wymagane jest uwierzytelnienie, aby uruchamiać programy jako niezalogowany użytkownik."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uruchamiać programy jako niezalogowany "
+"użytkownik."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -448,7 +575,8 @@ msgstr "Zezwolenie na podłączanie urządzeń do stanowisk"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Wymagane jest uwierzytelnienie, aby podłączyć urządzenie do stanowiska."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby podłączyć urządzenie do stanowiska."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -456,7 +584,9 @@ msgstr "Usunięcie podłączenia urządzeń do stanowisk"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Wymagane jest uwierzytelnienie, aby ponownie ustawić sposób podłączenia urządzeń do stanowisk."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ponownie ustawić sposób podłączenia "
+"urządzeń do stanowisk."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -471,16 +601,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Wyłączenie systemu, kiedy są zalogowani inni użytkownicy"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Wymagane jest uwierzytelnienie, aby wyłączyć system, kiedy są zalogowani inni użytkownicy."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wyłączyć system, kiedy są zalogowani "
+"inni użytkownicy."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Wyłączenie systemu, kiedy program je wstrzymuje"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Wymagane jest uwierzytelnienie, aby wyłączyć system, kiedy program to wstrzymuje."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wyłączyć system, kiedy program to "
+"wstrzymuje."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -495,16 +633,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Ponowne uruchomienie systemu, kiedy są zalogowani inni użytkownicy"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Wymagane jest uwierzytelnienie, aby ponownie uruchomić system, kiedy są zalogowani inni użytkownicy."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ponownie uruchomić system, kiedy są "
+"zalogowani inni użytkownicy."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Ponowne uruchomienie systemu, kiedy program je wstrzymuje"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Wymagane jest uwierzytelnienie, aby ponownie uruchomić system, kiedy program to wstrzymuje."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ponownie uruchomić system, kiedy program "
+"to wstrzymuje."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -519,16 +665,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Zatrzymanie systemu, kiedy są zalogowani inni użytkownicy"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Wymagane jest uwierzytelnienie, aby zatrzymać system, kiedy są zalogowani inni użytkownicy."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zatrzymać system, kiedy są zalogowani "
+"inni użytkownicy."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Zatrzymanie systemu, kiedy program je wstrzymuje"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Wymagane jest uwierzytelnienie, aby zatrzymać system, kiedy program to wstrzymuje."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zatrzymać system, kiedy program to "
+"wstrzymuje."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -543,16 +697,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Uśpienie systemu, kiedy są zalogowani inni użytkownicy"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Wymagane jest uwierzytelnienie, aby uśpić system, kiedy są zalogowani inni użytkownicy."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uśpić system, kiedy są zalogowani inni "
+"użytkownicy."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Uśpienie systemu, kiedy program je wstrzymuje"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Wymagane jest uwierzytelnienie, aby uśpić system, kiedy program to wstrzymuje."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uśpić system, kiedy program to "
+"wstrzymuje."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -567,16 +729,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernacja systemu, kiedy są zalogowani inni użytkownicy"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Wymagane jest uwierzytelnienie, aby zahibernować system, kiedy są zalogowani inni użytkownicy."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zahibernować system, kiedy są zalogowani "
+"inni użytkownicy."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernacja systemu, kiedy program ją wstrzymuje"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Wymagane jest uwierzytelnienie, aby zahibernować system, kiedy program to wstrzymuje."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zahibernować system, kiedy program to "
+"wstrzymuje."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -584,7 +754,9 @@ msgstr "Zarządzanie aktywnymi sesjami, użytkownikami i stanowiskami"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Wymagane jest uwierzytelnienie, aby zarządzać aktywnymi sesjami, użytkownikami i stanowiskami."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zarządzać aktywnymi sesjami, "
+"użytkownikami i stanowiskami."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -592,7 +764,8 @@ msgstr "Zablokowanie lub odblokowanie aktywnych sesji"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Wymagane jest uwierzytelnienie, aby zablokować lub odblokować aktywne sesje."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zablokować lub odblokować aktywne sesje."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -600,31 +773,45 @@ msgstr "Ustawienie przyczyny ponownego uruchomienia w jądrze"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Wymagane jest uwierzytelnienie, aby ustawić przyczynę ponownego uruchomienia w jądrze."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić przyczynę ponownego uruchomienia "
+"w jądrze."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Wskazanie oprogramowaniu sprzętowemu, aby uruchomić interfejs ustawień"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Wymagane jest uwierzytelnienie, aby wskazać oprogramowaniu sprzętowemu, że należy uruchomić interfejs ustawień."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wskazać oprogramowaniu sprzętowemu, że "
+"należy uruchomić interfejs ustawień."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Wskazanie programowi startowemu, aby uruchomić jego menu"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Wymagane jest uwierzytelnienie, aby wskazać programowi startowemu, że należy uruchomić jego menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wskazać programowi startowemu, że należy "
+"uruchomić jego menu."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Wskazanie programowi startowemu, aby uruchomić podany wpis"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Wymagane jest uwierzytelnienie, aby wskazać programowi startowemu, że należy uruchomić podany wpis."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wskazać programowi startowemu, że należy "
+"uruchomić podany wpis."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -648,7 +835,8 @@ msgstr "Logowanie do lokalnego kontenera"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Wymagane jest uwierzytelnienie, aby zalogować się do lokalnego kontenera."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zalogować się do lokalnego kontenera."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -656,7 +844,8 @@ msgstr "Logowanie do lokalnego komputera"
#: src/machine/org.freedesktop.machine1.policy:33
msgid "Authentication is required to log into the local host."
-msgstr "Wymagane jest uwierzytelnienie, aby zalogować się do lokalnego komputera."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zalogować się do lokalnego komputera."
#: src/machine/org.freedesktop.machine1.policy:42
msgid "Acquire a shell in a local container"
@@ -664,7 +853,8 @@ msgstr "Uzyskanie powłoki w lokalnym kontenerze"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Wymagane jest uwierzytelnienie, aby uzyskać powłokę w lokalnym kontenerze."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uzyskać powłokę w lokalnym kontenerze."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -672,15 +862,18 @@ msgstr "Uzyskanie powłoki na lokalnym komputerze"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Wymagane jest uwierzytelnienie, aby uzyskać powłokę na lokalnym komputerze."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uzyskać powłokę na lokalnym komputerze."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Uzyskanie pseudo-TTY w lokalnym kontenerze"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY w lokalnym kontenerze."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY w lokalnym kontenerze."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -688,23 +881,32 @@ msgstr "Uzyskanie pseudo-TTY na lokalnym komputerze"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY na lokalnym komputerze."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY na lokalnym "
+"komputerze."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Zarządzanie lokalnymi maszynami wirtualnymi i kontenerami"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi maszynami wirtualnymi i kontenerami."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi maszynami "
+"wirtualnymi i kontenerami."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Zarządzanie lokalnymi obrazami maszyn wirtualnych i kontenerów"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi obrazami maszyn wirtualnych i kontenerów."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi obrazami maszyn "
+"wirtualnych i kontenerów."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -762,7 +964,8 @@ msgstr "Włączenie/wyłączenie multikastowego DNS"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Wymagane jest uwierzytelnienie, aby włączyć lub wyłączyć multikastowe DNS."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby włączyć lub wyłączyć multikastowe DNS."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -772,7 +975,8 @@ msgstr "Włączenie/wyłączenie DNS przez TLS"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Wymagane jest uwierzytelnienie, aby włączyć lub wyłączyć DNS przez TLS."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby włączyć lub wyłączyć DNS przez TLS."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -792,7 +996,9 @@ msgstr "Ustawienie negatywnych kotwic zaufania DNSSEC"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Wymagane jest uwierzytelnienie, aby ustawić negatywne kotwice zaufania DNSSEC."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić negatywne kotwice zaufania "
+"DNSSEC."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -816,7 +1022,8 @@ msgstr "Serwer DHCP wysyła komunikat wymuszonego odnowienia"
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Wymagane jest uwierzytelnienie, aby wysłać komunikat wymuszonego odnowienia."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wysłać komunikat wymuszonego odnowienia."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -840,7 +1047,9 @@ msgstr "Ponowna konfiguracja interfejsu sieciowego"
#: src/network/org.freedesktop.network1.policy:177
msgid "Authentication is required to reconfigure network interface."
-msgstr "Wymagane jest uwierzytelnienie, aby ponownie skonfigurować interfejs sieciowy."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ponownie skonfigurować interfejs "
+"sieciowy."
#: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image"
@@ -855,16 +1064,22 @@ msgid "Attach or detach a portable service image"
msgstr "Podłączenie lub odłączenie obrazu przenośnej usługi"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Wymagane jest uwierzytelnienie, aby podłączyć lub odłączyć obraz przenośnej usługi."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby podłączyć lub odłączyć obraz przenośnej "
+"usługi."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Usunięcie lub modyfikacja obrazu przenośnej usługi"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Wymagane jest uwierzytelnienie, aby usunąć lub zmodyfikować obraz przenośnej usługi."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby usunąć lub zmodyfikować obraz przenośnej "
+"usługi."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -888,7 +1103,8 @@ msgstr "Przywrócenie ustawień rozwiązywania nazw"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Wymagane jest uwierzytelnienie, aby przywrócić ustawienia rozwiązywania nazw."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby przywrócić ustawienia rozwiązywania nazw."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -911,55 +1127,81 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Ustawienie RTC na lokalną strefę czasową lub strefę UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Wymagane jest uwierzytelnienie, aby kontrolować, czy RTC przechowuje czas lokalny lub czas UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby kontrolować, czy RTC przechowuje czas "
+"lokalny lub czas UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Włączenie lub wyłączenie synchronizacji czasu przez sieć"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Wymagane jest uwierzytelnienie, aby kontrolować, czy włączyć synchronizację czasu przez sieć."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby kontrolować, czy włączyć synchronizację "
+"czasu przez sieć."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Wymagane jest uwierzytelnienie, aby uruchomić jednostkę „$(unit)”."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Wymagane jest uwierzytelnienie, aby zatrzymać jednostkę „$(unit)”."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
-msgstr "Wymagane jest uwierzytelnienie, aby ponownie wczytać jednostkę „$(unit)”."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ponownie wczytać jednostkę „$(unit)”."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
-msgstr "Wymagane jest uwierzytelnienie, aby ponownie uruchomić jednostkę „$(unit)”."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ponownie uruchomić jednostkę „$(unit)”."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Wymagane jest uwierzytelnienie, aby wysłać sygnał uniksowy do procesów jednostki „$(unit)”."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby wysłać sygnał uniksowy do procesów "
+"jednostki „$(unit)”."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Wymagane jest uwierzytelnienie, aby przywrócić stan „failed” (niepowodzenia) jednostki „$(unit)”."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby przywrócić stan „failed” (niepowodzenia) "
+"jednostki „$(unit)”."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Wymagane jest uwierzytelnienie, aby ustawić właściwości jednostki „$(unit)”."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby ustawić właściwości jednostki „$(unit)”."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Wymagane jest uwierzytelnienie, aby usunąć pliki i katalogi powiązane z jednostką „$(unit)”."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby usunąć pliki i katalogi powiązane "
+"z jednostką „$(unit)”."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Wymagane jest uwierzytelnienie, aby zamrozić lub odmrozić procesy jednostki „$(unit)”."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Wymagane jest uwierzytelnienie, aby zamrozić lub odmrozić procesy jednostki "
+"„$(unit)”."
#~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
-#~ msgstr "Naciśnięcie klawiszy Ctrl+C anuluje wszystkie trwające procesy sprawdzania systemów plików"
+#~ msgstr ""
+#~ "Naciśnięcie klawiszy Ctrl+C anuluje wszystkie trwające procesy "
+#~ "sprawdzania systemów plików"
#~ msgid "Checking in progress on %d disk (%3.1f%% complete)"
#~ msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
diff --git a/po/pt.po b/po/pt.po
index 1c5716b2d1..20776d2769 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -5,10 +5,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-11-01 02:48+0000\n"
"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
-"Language-Team: Portuguese <https://translate.fedoraproject.org/projects/systemd/master/pt/>\n"
+"Language-Team: Portuguese <https://translate.fedoraproject.org/projects/"
+"systemd/master/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,8 +22,11 @@ msgid "Send passphrase back to system"
msgstr "Enviar a palavra-passe de volta ao sistema"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "É necessária autenticação para enviar a palavra-passe introduzida de volta ao sistema."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"É necessária autenticação para enviar a palavra-passe introduzida de volta "
+"ao sistema."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -30,7 +34,8 @@ msgstr "Gerir serviços do sistema e outras unidades"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "É necessária autenticação para gerir serviços do sistema ou outras unidades."
+msgstr ""
+"É necessária autenticação para gerir serviços do sistema ou outras unidades."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -38,15 +43,23 @@ msgstr "Gerir ficheiros de unidades e serviços do sistema"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "É necessária a autenticação para gerir o serviço do sistema ou ficheiros de unidades."
+msgstr ""
+"É necessária a autenticação para gerir o serviço do sistema ou ficheiros de "
+"unidades."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Definir ou retirar definição de variáveis do ambiente de gestor de serviço e sistema"
+msgstr ""
+"Definir ou retirar definição de variáveis do ambiente de gestor de serviço e "
+"sistema"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "É necessária autenticação para definir ou retirar definição de variáveis do ambiente de gestor de serviço e sistema."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"É necessária autenticação para definir ou retirar definição de variáveis do "
+"ambiente de gestor de serviço e sistema."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -61,8 +74,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Despejar o estado do systemd sem limites de taxa"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "É necessária autenticação para despejar o estado do systemd sem limites de taxa."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"É necessária autenticação para despejar o estado do systemd sem limites de "
+"taxa."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -85,8 +101,11 @@ msgid "Check credentials of a home area"
msgstr "Verificar credenciais de uma área home"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "É necessária autenticação para verificar credenciais da área home de um utilizador."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"É necessária autenticação para verificar credenciais da área home de um "
+"utilizador."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -102,158 +121,214 @@ msgstr "Redimensionar uma área home"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "É necessária autenticação para redimensionar a área home de um utilizador."
+msgstr ""
+"É necessária autenticação para redimensionar a área home de um utilizador."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Alterar palavra-passe de uma área home"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "É necessária autenticação para alterar a palavra-passe da área home de um utilizador."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"É necessária autenticação para alterar a palavra-passe da área home de um "
+"utilizador."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "É necessária autenticação para atualizar a área home de um utilizador."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Criar uma área home"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "É necessária autenticação para criar a área home de um utilizador."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "O diretório home do utilizador %s está ausente, ligue o dispositivo de armazenamento necessário ou o sistema de ficheiros de apoio."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"O diretório home do utilizador %s está ausente, ligue o dispositivo de "
+"armazenamento necessário ou o sistema de ficheiros de apoio."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Tentativas de início de sessão demasiado frequentes para o utilizador %s, tente novamente mais tarde."
+msgstr ""
+"Tentativas de início de sessão demasiado frequentes para o utilizador %s, "
+"tente novamente mais tarde."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Palavra-passe: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Palavra-passe incorreta ou insuficiente para a autenticação do utilizador %s."
+msgstr ""
+"Palavra-passe incorreta ou insuficiente para a autenticação do utilizador %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Tente novamente: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Chave de recuperação: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Palavra-passe/chave de recuperação incorreta ou insuficiente para a autenticação do utilizador %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Palavra-passe/chave de recuperação incorreta ou insuficiente para a "
+"autenticação do utilizador %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Volte a introduzir a chave de recuperação: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "O código de segurança do utilizador %s não foi inserido."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Tente novamente com a palavra-passe: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Palavra-passe incorreta ou insuficiente e token de segurança configurado do utilizador %s não inserido."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Palavra-passe incorreta ou insuficiente e token de segurança configurado do "
+"utilizador %s não inserido."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN do token de segurança: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "Efetue a autenticação física com o código de segurança do utilizador %s."
+msgstr ""
+"Efetue a autenticação física com o código de segurança do utilizador %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Confirme a presença no token de segurança do utilizador %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Verifique o utilizador no código de segurança do utilizador %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "O PIN do cartão de segurança está bloqueado, desbloqueie-o primeiro. (Sugestão: pode ser suficiente remover e voltar a inserir.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"O PIN do cartão de segurança está bloqueado, desbloqueie-o primeiro. "
+"(Sugestão: pode ser suficiente remover e voltar a inserir.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "PIN do código de segurança incorreto para o utilizador %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Tente novamente o PIN do token de segurança: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "PIN do token de segurança do utilizador %s incorreto (só faltam algumas tentativas!)"
+msgstr ""
+"PIN do token de segurança do utilizador %s incorreto (só faltam algumas "
+"tentativas!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "PIN do token de segurança do utilizador %s incorreto (só falta uma tentativa!)"
+msgstr ""
+"PIN do token de segurança do utilizador %s incorreto (só falta uma "
+"tentativa!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "O diretório home do utilizador %s não está ativo, inicie sessão localmente primeiro."
+msgstr ""
+"O diretório home do utilizador %s não está ativo, inicie sessão localmente "
+"primeiro."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "O diretório home do utilizador %s está atualmente bloqueado, desbloqueie-o localmente primeiro."
+msgstr ""
+"O diretório home do utilizador %s está atualmente bloqueado, desbloqueie-o "
+"localmente primeiro."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Demasiadas tentativas de início de sessão sem sucesso para o utilizador %s, recusando."
+msgstr ""
+"Demasiadas tentativas de início de sessão sem sucesso para o utilizador %s, "
+"recusando."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "O registo do utilizador está bloqueado, proibindo o acesso."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "O registo do utilizador ainda não é válido, proibindo o acesso."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "O registo do utilizador já não é válido, proibindo o acesso."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "O registo do utilizador não é válido, proibindo o acesso."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Demasiados inícios de sessão, tente novamente em %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "É necessário alterar a palavra-passe."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "A palavra-passe expirou, é necessário alterá-la."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "A palavra-passe expirou, mas não é possível alterá-la, recusando o início de sessão."
+msgstr ""
+"A palavra-passe expirou, mas não é possível alterá-la, recusando o início de "
+"sessão."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "A palavra-passe irá expirar em breve, por favor altere-a."
@@ -270,8 +345,12 @@ msgid "Set static hostname"
msgstr "Definir nome estático de máquina"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "É necessária autenticação para definir o nome de máquina local configurado estaticamente, assim como o nome apresentável de máquina."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"É necessária autenticação para definir o nome de máquina local configurado "
+"estaticamente, assim como o nome apresentável de máquina."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -306,36 +385,55 @@ msgid "Authentication is required to get system description."
msgstr "É necessária autenticação para obter a descrição do sistema."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importar uma VM ou imagem contentor"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "É necessária autenticação para importar uma VM ou imagem contentor"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exportar uma VM ou imagem contentor"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "É necessária autenticação para exportar uma VM ou imagem contentor"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Baixar uma VM ou imagem contentor"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "É necessária autenticação para transferir uma VM ou imagem contentor"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"É necessária autenticação para alterar a palavra-passe da área home de um "
+"utilizador."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Definir configurações regionais do sistema"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "É necessária autenticação para definir as configurações regionais do sistema."
+msgstr ""
+"É necessária autenticação para definir as configurações regionais do sistema."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -343,15 +441,20 @@ msgstr "Definir configurações de teclado do sistema"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "É necessária autenticação para definir as configurações de teclado do sistema."
+msgstr ""
+"É necessária autenticação para definir as configurações de teclado do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Permitir que aplicações inibam o encerramento do sistema"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "É necessária autenticação para que uma aplicação iniba o encerramento do sistema."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba o encerramento do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -359,7 +462,9 @@ msgstr "Permitir que aplicações atrasem o encerramento do sistema"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "É necessária autenticação para que uma aplicação atrase o encerramento do sistema."
+msgstr ""
+"É necessária autenticação para que uma aplicação atrase o encerramento do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -367,7 +472,9 @@ msgstr "Permitir que aplicações inibam a suspensão do sistema"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "É necessária autenticação para que uma aplicação iniba a suspensão do sistema."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba a suspensão do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -375,71 +482,108 @@ msgstr "Permite que aplicações atrasem a suspensão do sistema"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "É necessária autenticação para que uma aplicação atrase a suspensão do sistema."
+msgstr ""
+"É necessária autenticação para que uma aplicação atrase a suspensão do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Permitir que aplicações inibam a suspensão automática do sistema"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "É necessária autenticação para que uma aplicação iniba a suspensão automática do sistema."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba a suspensão "
+"automática do sistema."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Permitir que aplicações inibam o sistema de gerir o botão de energia"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "É necessária autenticação para que uma aplicação iniba a manipulação do sistema sobre a chave de ligar/desligar."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba a manipulação do "
+"sistema sobre a chave de ligar/desligar."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Permitir que aplicações inibam o sistema de gerir o botão de suspensão"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "É necessária autenticação para que uma aplicação iniba a manipulação do sistema sobre a chave de suspensão."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba a manipulação do "
+"sistema sobre a chave de suspensão."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permitir que aplicações inibam o sistema de gerir o botão de hibernação"
+msgstr ""
+"Permitir que aplicações inibam o sistema de gerir o botão de hibernação"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "É necessária autenticação para que uma aplicação iniba a manipulação do sistema sobre a chave de hibernar."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba a manipulação do "
+"sistema sobre a chave de hibernar."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permitir que aplicações inibam o sistema de gerir a abertura/fecho da tampa do dispositivo portátil"
+msgstr ""
+"Permitir que aplicações inibam o sistema de gerir a abertura/fecho da tampa "
+"do dispositivo portátil"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "É necessária autenticação para que uma aplicação iniba a manipulação do sistema sobre o interruptor da ecrã."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"É necessária autenticação para que uma aplicação iniba a manipulação do "
+"sistema sobre o interruptor da ecrã."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permitir que os aplicações inibam a gestão do sistema da tecla de reiniciar"
+msgstr ""
+"Permitir que os aplicações inibam a gestão do sistema da tecla de reiniciar"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "A autenticação é necessária para uma aplicação para inibir a gestão do sistema da tecla de reiniciar."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"A autenticação é necessária para uma aplicação para inibir a gestão do "
+"sistema da tecla de reiniciar."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
-msgstr "Permitir que programas sejam executados por utilizador que não possui sessão"
+msgstr ""
+"Permitir que programas sejam executados por utilizador que não possui sessão"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "É necessária requisição explícita para executar programas como utilizador sem sessão aberta."
+msgstr ""
+"É necessária requisição explícita para executar programas como utilizador "
+"sem sessão aberta."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
-msgstr "Permitir que programas sejam executados por utilizadores que não possuem sessão"
+msgstr ""
+"Permitir que programas sejam executados por utilizadores que não possuem "
+"sessão"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "É necessária autenticação para executar programas como utilizador sem sessão aberta."
+msgstr ""
+"É necessária autenticação para executar programas como utilizador sem sessão "
+"aberta."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -455,7 +599,9 @@ msgstr "Libertar dispositivo para ligações da estação"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "É necessária autenticação para redefinir a quantidade de dispositivos ligados na estação."
+msgstr ""
+"É necessária autenticação para redefinir a quantidade de dispositivos "
+"ligados na estação."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -470,16 +616,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Desligar o sistema enquanto outros utilizadores estão ligados"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "É necessária autenticação para desligar o sistema enquanto outros utilizadores estão ligados."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"É necessária autenticação para desligar o sistema enquanto outros "
+"utilizadores estão ligados."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Desligar o sistema enquanto uma aplicação solicitou inibição"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "É necessária autenticação para desligar o sistema enquanto uma aplicação solicitou inibição."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para desligar o sistema enquanto uma aplicação "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -494,16 +648,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Reiniciar o sistema enquanto outros utilizadores estiverem ligados"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "É necessária autenticação para reiniciar o sistema enquanto outros utilizadores estiverem ligados."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"É necessária autenticação para reiniciar o sistema enquanto outros "
+"utilizadores estiverem ligados."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Reiniciar o sistema enquanto uma aplicação solicitou inibição"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "É necessária autenticação para reiniciar o sistema enquanto uma aplicação solicitou inibição."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para reiniciar o sistema enquanto uma aplicação "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -518,16 +680,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Parar o sistema enquanto outros utilizadores estão ligados"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "É necessária autenticação para parar o sistema enquanto outros utilizadores estejam ligados."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"É necessária autenticação para parar o sistema enquanto outros utilizadores "
+"estejam ligados."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Parar o sistema enquanto uma aplicação solicitou inibição"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "É necessária autenticação para parar o sistema enquanto uma aplicação solicitou inibição."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para parar o sistema enquanto uma aplicação "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -542,16 +712,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspender o sistema enquanto outros utilizadores estiverem ligados"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "É necessária autenticação para suspender o sistema enquanto outros utilizadores estiverem ligados."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"É necessária autenticação para suspender o sistema enquanto outros "
+"utilizadores estiverem ligados."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Suspender o sistema enquanto uma aplicação solicitou inibição"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "É necessária autenticação para suspender o sistema enquanto uma aplicação solicitou inibição."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para suspender o sistema enquanto uma aplicação "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -566,16 +744,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernar o sistema enquanto outros utilizadores estiverem ligados"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "É necessária autenticação para hibernar o sistema enquanto outros utilizadores estiverem ligados."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"É necessária autenticação para hibernar o sistema enquanto outros "
+"utilizadores estiverem ligados."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernar o sistema enquanto uma aplicação solicitou inibição"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "É necessária autenticação para hibernar o sistema enquanto uma aplicação solicitou inibição."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para hibernar o sistema enquanto uma aplicação "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -583,7 +769,8 @@ msgstr "Gerir estações, utilizadores e sessões ativas"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "É necessária autenticação para gerir estações, utilizadores e sessões ativas."
+msgstr ""
+"É necessária autenticação para gerir estações, utilizadores e sessões ativas."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -599,31 +786,44 @@ msgstr "Definir o “motivo” de reinício no kernel"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "É necessária autenticação para definir o “motivo” de reinício no kernel."
+msgstr ""
+"É necessária autenticação para definir o “motivo” de reinício no kernel."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indicar para o firmware arrancar para a interface de configuração"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "É necessária autenticação para indicar para o firmware arrancar para a interface de configuração."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"É necessária autenticação para indicar para o firmware arrancar para a "
+"interface de configuração."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indicar para o carregador de arranque iniciar o seu menu"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "É necessária autenticação para indicar para o carregador de arranque iniciar o seu menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"É necessária autenticação para indicar para o carregador de arranque iniciar "
+"o seu menu."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indicar para o carregador de arranque iniciar uma entrada específica"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "É necessária autenticação para indicar para o carregador de arranque iniciar uma entrada específica."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"É necessária autenticação para indicar para o carregador de arranque iniciar "
+"uma entrada específica."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -663,7 +863,8 @@ msgstr "Adquirir uma shell em um contentor local"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "É necessária autenticação para adquirir uma shell em um contentor local."
+msgstr ""
+"É necessária autenticação para adquirir uma shell em um contentor local."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -671,15 +872,18 @@ msgstr "Adquirir uma shell na máquina local"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "É necessária autenticação para adquirir uma shell em uma máquina local."
+msgstr ""
+"É necessária autenticação para adquirir uma shell em uma máquina local."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Adquirir um pseudo TTY em um contentor local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "É necessária autenticação para adquirir um pseudo TTY em um contentor local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"É necessária autenticação para adquirir um pseudo TTY em um contentor local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -687,23 +891,30 @@ msgstr "Adquiri um pseudo TTY na máquina local"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "É necessária autenticação para adquirir um pseudo TTY em um máquina local."
+msgstr ""
+"É necessária autenticação para adquirir um pseudo TTY em um máquina local."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Gerir máquinas virtuais locais e contentores"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "É necessária autenticação para gerir máquinas virtuais locais e contentores."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"É necessária autenticação para gerir máquinas virtuais locais e contentores."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Gerir máquinas virtuais locais e imagens contentores"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "É necessária autenticação para gerir máquinas virtuais locais e imagens contentores."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"É necessária autenticação para gerir máquinas virtuais locais e imagens "
+"contentores."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -847,23 +1058,30 @@ msgstr "Inspecionar uma imagem de serviço portátil"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "É necessária autenticação para inspecionar uma imagem de serviço portátil."
+msgstr ""
+"É necessária autenticação para inspecionar uma imagem de serviço portátil."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Ligar ou desligar uma imagem de serviço portátil"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "É necessária autenticação para ligar ou desligar uma imagem de serviço portátil."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"É necessária autenticação para ligar ou desligar uma imagem de serviço "
+"portátil."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Remover ou modificar imagem de serviço portátil"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "É necessária autenticação para remover ou modificar imagem de serviço portátil."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"É necessária autenticação para remover ou modificar imagem de serviço "
+"portátil."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -887,7 +1105,8 @@ msgstr "Reverter definições de resolução de nome"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "É necessária autenticação para redefinir as definições de resolução de nome."
+msgstr ""
+"É necessária autenticação para redefinir as definições de resolução de nome."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -910,49 +1129,69 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Definir RTC para fuso horário local ou UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "É necessária autenticação para controlar se o RTC deve, ou não, armazenar o horário local ou de UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"É necessária autenticação para controlar se o RTC deve, ou não, armazenar o "
+"horário local ou de UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Ligar/desligar a sincronização do horário em rede"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "É necessária autenticação para controlar se deve ser habilitada, ou não, a sincronização de horário através de rede."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"É necessária autenticação para controlar se deve ser habilitada, ou não, a "
+"sincronização de horário através de rede."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "É necessária autenticação para iniciar '$(unit)'."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "É necessária autenticação para parar '$(unit)'."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "É necessária autenticação para recarregar '$(unit)'."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "É necessária autenticação para reiniciar '$(unit)'."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "É necessária autenticação para enviar um sinal UNIX para os processos de '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"É necessária autenticação para enviar um sinal UNIX para os processos de "
+"'$(unit)'."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "É necessária autenticação para reiniciar o estado “failed” de '$(unit)'."
+msgstr ""
+"É necessária autenticação para reiniciar o estado “failed” de '$(unit)'."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "É necessária autenticação para definir propriedades em '$(unit)'."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "É necessária autenticação para eliminar ficheiros e diretórios associados com '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"É necessária autenticação para eliminar ficheiros e diretórios associados "
+"com '$(unit)'."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "É necessária autenticação para congelar ou descongelar os processos da unidade '$(unit)'."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"É necessária autenticação para congelar ou descongelar os processos da "
+"unidade '$(unit)'."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 633931ba43..31c14eb007 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,10 +8,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-08-17 07:04+0000\n"
"Last-Translator: Gustavo Costa <xfgusta@gmail.com>\n"
-"Language-Team: Portuguese (Brazil) <https://translate.fedoraproject.org/projects/systemd/master/pt_BR/>\n"
+"Language-Team: Portuguese (Brazil) <https://translate.fedoraproject.org/"
+"projects/systemd/master/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,8 +25,11 @@ msgid "Send passphrase back to system"
msgstr "Enviar frase secreta de volta ao sistema"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "É necessária autenticação para enviar a frase secreta informada de volta ao sistema."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"É necessária autenticação para enviar a frase secreta informada de volta ao "
+"sistema."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -33,7 +37,9 @@ msgstr "Gerenciar serviços do sistema e outras unidades"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "É necessária autenticação para gerenciar serviços do sistema ou outras unidades."
+msgstr ""
+"É necessária autenticação para gerenciar serviços do sistema ou outras "
+"unidades."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -41,15 +47,23 @@ msgstr "Gerenciar arquivos de unidades e serviços do sistema"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "É necessária autenticação para gerenciar arquivos “unit” e “service” do sistema."
+msgstr ""
+"É necessária autenticação para gerenciar arquivos “unit” e “service” do "
+"sistema."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Definir ou retirar definição de variáveis de ambiente de gerenciador de serviço e sistema"
+msgstr ""
+"Definir ou retirar definição de variáveis de ambiente de gerenciador de "
+"serviço e sistema"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "É necessária autenticação para definir ou retirar definição de variáveis de ambiente de gerenciador de serviço e sistema."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"É necessária autenticação para definir ou retirar definição de variáveis de "
+"ambiente de gerenciador de serviço e sistema."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -65,7 +79,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "É necessária autenticação para recarregar o estado do sistema."
#: src/home/org.freedesktop.home1.policy:13
@@ -89,8 +104,11 @@ msgid "Check credentials of a home area"
msgstr "Verificar credenciais de uma área home"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "É necessária autenticação para verificar credenciais da área home de um usuário."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"É necessária autenticação para verificar credenciais da área home de um "
+"usuário."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -106,158 +124,189 @@ msgstr "Redimensionar uma área home"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "É necessária autenticação para redimensionar a área home de um usuário."
+msgstr ""
+"É necessária autenticação para redimensionar a área home de um usuário."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Alterar senha de uma área home"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "É necessária autenticação para alterar a senha da área home de um usuário."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"É necessária autenticação para alterar a senha da área home de um usuário."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "É necessária autenticação para atualizar a área home de um usuário."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Criar uma área home"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "É necessária autenticação para criar a área home de um usuário."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -274,8 +323,12 @@ msgid "Set static hostname"
msgstr "Definir nome estático de máquina"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "É necessária autenticação para definir o nome de máquina local configurado estaticamente, assim como o nome apresentável de máquina."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"É necessária autenticação para definir o nome de máquina local configurado "
+"estaticamente, assim como o nome apresentável de máquina."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -313,36 +366,54 @@ msgid "Authentication is required to get system description."
msgstr "É necessária autenticação para definir o fuso horário do sistema."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importar uma VM ou imagem contêiner"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "É necessária autenticação para importar uma VM ou imagem contêiner"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exportar uma VM ou imagem contêiner"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "É necessária autenticação para exportar uma VM ou imagem contêiner"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Baixar uma VM ou imagem contêiner"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "É necessária autenticação para baixar uma VM ou imagem contêiner"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"É necessária autenticação para alterar a senha da área home de um usuário."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Definir configurações regionais do sistema"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "É necessária autenticação para definir as configurações regionais do sistema."
+msgstr ""
+"É necessária autenticação para definir as configurações regionais do sistema."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -350,15 +421,20 @@ msgstr "Definir configurações de teclado do sistema"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "É necessária autenticação para definir as configurações de teclado do sistema."
+msgstr ""
+"É necessária autenticação para definir as configurações de teclado do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Permitir que aplicativos inibam o desligamento do sistema"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "É necessária autenticação para que um aplicativo iniba o desligamento do sistema."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba o desligamento do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -366,7 +442,9 @@ msgstr "Permitir que aplicativos atrasem o desligamento do sistema"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "É necessária autenticação para que um aplicativo atrase o desligamento do sistema."
+msgstr ""
+"É necessária autenticação para que um aplicativo atrase o desligamento do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -374,7 +452,9 @@ msgstr "Permitir que aplicativos inibam a suspensão do sistema"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "É necessária autenticação para que um aplicativo iniba a suspensão do sistema."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba a suspensão do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -382,71 +462,110 @@ msgstr "Permite que aplicativos atrasem a suspensão do sistema"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "É necessária autenticação para que um aplicativo atrase a suspensão do sistema."
+msgstr ""
+"É necessária autenticação para que um aplicativo atrase a suspensão do "
+"sistema."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Permitir que aplicativos inibam a suspensão automática do sistema"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "É necessária autenticação para que um aplicativo iniba a suspensão automática do sistema."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba a suspensão "
+"automática do sistema."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Permitir que aplicativos inibam o sistema de gerenciar o botão de energia"
+msgstr ""
+"Permitir que aplicativos inibam o sistema de gerenciar o botão de energia"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "É necessária autenticação para que um aplicativo iniba a manipulação do sistema sobre a chave de ligar/desligar."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba a manipulação do "
+"sistema sobre a chave de ligar/desligar."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Permitir que aplicativos inibam o sistema de gerenciar o botão de suspensão"
+msgstr ""
+"Permitir que aplicativos inibam o sistema de gerenciar o botão de suspensão"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "É necessária autenticação para que um aplicativo iniba a manipulação do sistema sobre a chave de suspensão."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba a manipulação do "
+"sistema sobre a chave de suspensão."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permitir que aplicativos inibam o sistema de gerenciar o botão de hibernação"
+msgstr ""
+"Permitir que aplicativos inibam o sistema de gerenciar o botão de hibernação"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "É necessária autenticação para que um aplicativo iniba a manipulação do sistema sobre a chave de hibernar."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba a manipulação do "
+"sistema sobre a chave de hibernar."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permitir que aplicativos inibam o sistema de gerenciar a abertura/fechamento da tampa do dispositivo portátil"
+msgstr ""
+"Permitir que aplicativos inibam o sistema de gerenciar a abertura/fechamento "
+"da tampa do dispositivo portátil"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "É necessária autenticação para que um aplicativo iniba a manipulação do sistema sobre o interruptor da tela."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"É necessária autenticação para que um aplicativo iniba a manipulação do "
+"sistema sobre o interruptor da tela."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permitir que os aplicativos inibam o gerenciamento do sistema da tecla de reinicialização"
+msgstr ""
+"Permitir que os aplicativos inibam o gerenciamento do sistema da tecla de "
+"reinicialização"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "A autenticação é necessária para um aplicativo para inibir o gerenciamento do sistema da tecla de reinicialização."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"A autenticação é necessária para um aplicativo para inibir o gerenciamento "
+"do sistema da tecla de reinicialização."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
-msgstr "Permitir que programas sejam executados por usuário que não possui sessão"
+msgstr ""
+"Permitir que programas sejam executados por usuário que não possui sessão"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "É necessária requisição explícita para executar programas como usuário sem sessão aberta."
+msgstr ""
+"É necessária requisição explícita para executar programas como usuário sem "
+"sessão aberta."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
-msgstr "Permitir que programas sejam executados por usuários que não possuem sessão"
+msgstr ""
+"Permitir que programas sejam executados por usuários que não possuem sessão"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "É necessária autenticação para executar programas como usuário sem sessão aberta."
+msgstr ""
+"É necessária autenticação para executar programas como usuário sem sessão "
+"aberta."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -462,7 +581,9 @@ msgstr "Liberar dispositivo para conexões da estação"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "É necessária autenticação para redefinir a quantidade de dispositivos conectados na estação."
+msgstr ""
+"É necessária autenticação para redefinir a quantidade de dispositivos "
+"conectados na estação."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -477,16 +598,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Desligar o sistema enquanto outros usuários estão conectados"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "É necessária autenticação para desligar o sistema enquanto outros usuários estão conectados."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"É necessária autenticação para desligar o sistema enquanto outros usuários "
+"estão conectados."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Desligar o sistema enquanto um aplicativo solicitou inibição"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "É necessária autenticação para desligar o sistema enquanto um aplicativo solicitou inibição."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para desligar o sistema enquanto um aplicativo "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -501,16 +630,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Reiniciar o sistema enquanto outros usuários estiverem conectados"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "É necessária autenticação para reiniciar o sistema enquanto outros usuários estiverem conectados."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"É necessária autenticação para reiniciar o sistema enquanto outros usuários "
+"estiverem conectados."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Reiniciar o sistema enquanto um aplicativo solicitou inibição"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "É necessária autenticação para reiniciar o sistema enquanto um aplicativo solicitou inibição."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para reiniciar o sistema enquanto um aplicativo "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -525,16 +662,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Parar o sistema enquanto outros usuários estão logados"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "É necessária autenticação para parar o sistema enquanto outros usuários estejam logados."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"É necessária autenticação para parar o sistema enquanto outros usuários "
+"estejam logados."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Parar o sistema enquanto um aplicativo solicitou inibição"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "É necessária autenticação para parar o sistema enquanto um aplicativo solicitou inibição."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para parar o sistema enquanto um aplicativo "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -549,16 +694,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspender o sistema enquanto outros usuários estiverem conectados"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "É necessária autenticação para suspender o sistema enquanto outros usuários estiverem conectados."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"É necessária autenticação para suspender o sistema enquanto outros usuários "
+"estiverem conectados."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Suspender o sistema enquanto um aplicativo solicitou inibição"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "É necessária autenticação para suspender o sistema enquanto um aplicativo solicitou inibição."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para suspender o sistema enquanto um aplicativo "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -573,16 +726,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hibernar o sistema enquanto outros usuários estiverem conectados"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "É necessária autenticação para hibernar o sistema enquanto outros usuários estiverem conectados."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"É necessária autenticação para hibernar o sistema enquanto outros usuários "
+"estiverem conectados."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernar o sistema enquanto um aplicativo solicitou inibição"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "É necessária autenticação para hibernar o sistema enquanto um aplicativo solicitou inibição."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"É necessária autenticação para hibernar o sistema enquanto um aplicativo "
+"solicitou inibição."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -590,7 +751,8 @@ msgstr "Gerenciar estações, usuários e sessões ativas"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "É necessária autenticação para gerenciar estações, usuários e sessões ativas."
+msgstr ""
+"É necessária autenticação para gerenciar estações, usuários e sessões ativas."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -606,31 +768,46 @@ msgstr "Definir o “motivo” de reinicialização no kernel"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "É necessária autenticação para definir o “motivo” de reinicialização no kernel."
+msgstr ""
+"É necessária autenticação para definir o “motivo” de reinicialização no "
+"kernel."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indicar para o firmware inicializar para a interface de configuração"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "É necessária autenticação para indicar para o firmware inicializar para a interface de configuração."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"É necessária autenticação para indicar para o firmware inicializar para a "
+"interface de configuração."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indicar para o carregador de inicialização iniciar seu menu"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "É necessária autenticação para indicar para o carregador de inicialização iniciar seu menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"É necessária autenticação para indicar para o carregador de inicialização "
+"iniciar seu menu."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
-msgstr "Indicar para o carregador de inicializar iniciar uma entrada específica"
+msgstr ""
+"Indicar para o carregador de inicializar iniciar uma entrada específica"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "É necessária autenticação para indicar para o carregador de inicializar iniciar uma entrada específica."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"É necessária autenticação para indicar para o carregador de inicializar "
+"iniciar uma entrada específica."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -670,7 +847,8 @@ msgstr "Adquirir uma shell em um contêiner local"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "É necessária autenticação para adquirir uma shell em um contêiner local."
+msgstr ""
+"É necessária autenticação para adquirir uma shell em um contêiner local."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -678,15 +856,18 @@ msgstr "Adquirir uma shell na máquina local"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "É necessária autenticação para adquirir uma shell em uma máquina local."
+msgstr ""
+"É necessária autenticação para adquirir uma shell em uma máquina local."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Adquirir um pseudo TTY em um contêiner local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "É necessária autenticação para adquirir um pseudo TTY em um contêiner local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"É necessária autenticação para adquirir um pseudo TTY em um contêiner local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -694,23 +875,31 @@ msgstr "Adquiri um pseudo TTY na máquina local"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "É necessária autenticação para adquirir um pseudo TTY em um máquina local."
+msgstr ""
+"É necessária autenticação para adquirir um pseudo TTY em um máquina local."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Gerenciar máquinas virtuais locais e contêineres"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "É necessária autenticação para gerenciar máquinas virtuais locais e contêineres."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"É necessária autenticação para gerenciar máquinas virtuais locais e "
+"contêineres."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Gerenciar máquinas virtuais locais e imagens contêineres"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "É necessária autenticação para gerenciar máquinas virtuais locais e imagens contêineres."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"É necessária autenticação para gerenciar máquinas virtuais locais e imagens "
+"contêineres."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -854,23 +1043,30 @@ msgstr "Inspecionar uma imagem de serviço portável"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "É necessária autenticação para inspecionar uma imagem de serviço portável."
+msgstr ""
+"É necessária autenticação para inspecionar uma imagem de serviço portável."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Conectar ou desconectar uma imagem de serviço portável"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "É necessária autenticação para conectar ou desconectar uma imagem de serviço portável."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"É necessária autenticação para conectar ou desconectar uma imagem de serviço "
+"portável."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Remover ou modificar imagem de serviço portável"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "É necessária autenticação para remover ou modificar imagem de serviço portável."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"É necessária autenticação para remover ou modificar imagem de serviço "
+"portável."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -894,7 +1090,9 @@ msgstr "Reverter configurações de resolução de nome"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "É necessária autenticação para redefinir as configurações de resolução de nome."
+msgstr ""
+"É necessária autenticação para redefinir as configurações de resolução de "
+"nome."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -917,49 +1115,69 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Definir RTC para fuso horário local ou UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "É necessária autenticação para controlar se o RTC deve, ou não, armazenar o horário local ou de UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"É necessária autenticação para controlar se o RTC deve, ou não, armazenar o "
+"horário local ou de UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Ligar/desligar a sincronização do horário em rede"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "É necessária autenticação para controlar se deve ser habilitada, ou não, a sincronização de horário através de rede."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"É necessária autenticação para controlar se deve ser habilitada, ou não, a "
+"sincronização de horário através de rede."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "É necessária autenticação para iniciar “$(unit)”."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "É necessária autenticação para parar “$(unit)”."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "É necessária autenticação para recarregar “$(unit)”."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "É necessária autenticação para reiniciar “$(unit)”."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "É necessária autenticação para enviar um sinal UNIX para os processos de “$(unit)”."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"É necessária autenticação para enviar um sinal UNIX para os processos de "
+"“$(unit)”."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "É necessária autenticação para reiniciar o estado “failed” de “$(unit)”."
+msgstr ""
+"É necessária autenticação para reiniciar o estado “failed” de “$(unit)”."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "É necessária autenticação para definir propriedades em “$(unit)”."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "É necessária autenticação para excluir arquivos e diretórios associados com “$(unit)”."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"É necessária autenticação para excluir arquivos e diretórios associados com "
+"“$(unit)”."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "É necessária autenticação para congelar ou descongelar os processos da unidade “$(unit)”."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"É necessária autenticação para congelar ou descongelar os processos da "
+"unidade “$(unit)”."
diff --git a/po/ro.po b/po/ro.po
index c503017ab5..048f133ba0 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -7,15 +7,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-01-12 17:36+0000\n"
"Last-Translator: Vlad <milovlad@outlook.com>\n"
-"Language-Team: Romanian <https://translate.fedoraproject.org/projects/systemd/master/ro/>\n"
+"Language-Team: Romanian <https://translate.fedoraproject.org/projects/"
+"systemd/master/ro/>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
"X-Generator: Weblate 4.4\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -23,8 +25,11 @@ msgid "Send passphrase back to system"
msgstr "Trimite fraza secretă înapoi la sistem"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Autentificarea este necesară pentru a trimite fraza secretă introdusă înapoi la sistem."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Autentificarea este necesară pentru a trimite fraza secretă introdusă înapoi "
+"la sistem."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -32,7 +37,9 @@ msgstr "Gestionează serviciile de sistem sau alte module"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Autentificarea este necesară pentru a gestiona serviciile de sistem sau alte module."
+msgstr ""
+"Autentificarea este necesară pentru a gestiona serviciile de sistem sau alte "
+"module."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -40,15 +47,23 @@ msgstr "Gestionează serviciul de sistem sau fișierele modulelor"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Autentificarea este necesară pentru a gestiona serviciul de sistem sau fișierele modulelor."
+msgstr ""
+"Autentificarea este necesară pentru a gestiona serviciul de sistem sau "
+"fișierele modulelor."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Setează sau resetează variabilele de mediu ale managerului de servicii si de sistem"
+msgstr ""
+"Setează sau resetează variabilele de mediu ale managerului de servicii si de "
+"sistem"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Autentificarea este necesară pentru setarea sau resetarea variabilelor de mediu ale managerului de servicii si de sistem."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Autentificarea este necesară pentru setarea sau resetarea variabilelor de "
+"mediu ale managerului de servicii si de sistem."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -64,7 +79,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "Autentificarea este necesară pentru a reîncărca starea lui systemd."
#: src/home/org.freedesktop.home1.policy:13
@@ -73,7 +89,9 @@ msgstr "Crează un spațiu personal"
#: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area."
-msgstr "Autentificarea este necesară pentru a crea spațiul personal al unui utilizator."
+msgstr ""
+"Autentificarea este necesară pentru a crea spațiul personal al unui "
+"utilizator."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -81,15 +99,20 @@ msgstr "Șterge spațiu personal"
#: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area."
-msgstr "Autentificarea este necesară pentru a șterge spațiul personal al unui utilizator."
+msgstr ""
+"Autentificarea este necesară pentru a șterge spațiul personal al unui "
+"utilizator."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
msgstr "Verifică datele de acreditare ale unui spațiu personal"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Autentificarea este necesară pentru verificarea datelor de acreditare ale unui spațiu personal al unui utilizator."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Autentificarea este necesară pentru verificarea datelor de acreditare ale "
+"unui spațiu personal al unui utilizator."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -97,7 +120,9 @@ msgstr "Actualizează un spațiu personal"
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Autentificarea este necesară pentru a actualiza spațiul personal al unui utilizator."
+msgstr ""
+"Autentificarea este necesară pentru a actualiza spațiul personal al unui "
+"utilizator."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -105,158 +130,195 @@ msgstr "Redimensionează un spațiu personal"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Autentificarea este necesară pentru a redimensiona spațiul personal al unui utilizator."
+msgstr ""
+"Autentificarea este necesară pentru a redimensiona spațiul personal al unui "
+"utilizator."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Schimbă parola pentru un spațiu personal"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Autentificarea este necesară pentru schimbarea parolei unui spațiu personal al unui utilizator."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Autentificarea este necesară pentru schimbarea parolei unui spațiu personal "
+"al unui utilizator."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Autentificarea este necesară pentru a actualiza spațiul personal al unui "
+"utilizator."
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Crează un spațiu personal"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Autentificarea este necesară pentru a crea spațiul personal al unui "
+"utilizator."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -273,8 +335,12 @@ msgid "Set static hostname"
msgstr "Seteaza numele static al stației"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Autentificarea este necesară pentru a seta numele static de stație, precum și numele descriptiv de stație."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Autentificarea este necesară pentru a seta numele static de stație, precum "
+"și numele descriptiv de stație."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -282,7 +348,8 @@ msgstr "Setează informațiile despre stație"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Autentificarea este necesară pentru setarea informațiilor despre stație."
+msgstr ""
+"Autentificarea este necesară pentru setarea informațiilor despre stație."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -290,7 +357,9 @@ msgstr "Obține identificatorul unic universal (UUID) al produsului"
#: src/hostname/org.freedesktop.hostname1.policy:52
msgid "Authentication is required to get product UUID."
-msgstr "Autentificarea este necesară pentru a obține identificatorul unic universal (UUID) al produsului."
+msgstr ""
+"Autentificarea este necesară pentru a obține identificatorul unic universal "
+"(UUID) al produsului."
#: src/hostname/org.freedesktop.hostname1.policy:61
msgid "Get hardware serial number"
@@ -312,28 +381,52 @@ msgid "Authentication is required to get system description."
msgstr "Autentificarea este necesară pentru a seta fusul orar al sistemului."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Importă o VM (mașină virtuală) sau o imagine container"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Autentificarea este necesară pentru a importa o VM (mașină virtuală) sau o imagine container"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Autentificarea este necesară pentru a importa o VM (mașină virtuală) sau o "
+"imagine container"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Exportă o VM (mașină virtuală) sau o imagine container"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Autentificarea este necesară pentru a exporta o VM (mașină virtuală) sau o imagine container"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Autentificarea este necesară pentru a exporta o VM (mașină virtuală) sau o "
+"imagine container"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Descarcă o VM (mașină virtuală) sau o imagine container"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Autentificarea este necesară pentru a descărca o VM (mașină virtuală) sau o imagine container"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Autentificarea este necesară pentru a descărca o VM (mașină virtuală) sau o "
+"imagine container"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Autentificarea este necesară pentru schimbarea parolei unui spațiu personal "
+"al unui utilizator."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -341,7 +434,9 @@ msgstr "Configurează setările regionale ale sistemului"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Autentificarea este necesară pentru a configura setările regionale ale sistemului."
+msgstr ""
+"Autentificarea este necesară pentru a configura setările regionale ale "
+"sistemului."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -356,8 +451,11 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Permite aplicațiilor să împiedice închiderea sistemului"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice închiderea sistemului."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice închiderea "
+"sistemului."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -365,7 +463,9 @@ msgstr "Permite aplicațiilor să întârzie închiderea sistemului"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Autentificarea este necesară pentru ca o aplicație să întârzie închiderea sistemului."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să întârzie închiderea "
+"sistemului."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -373,7 +473,9 @@ msgstr "Permite aplicațiilor să împiedice adormirea sistemului"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice adormirea sistemului."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice adormirea "
+"sistemului."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -381,55 +483,91 @@ msgstr "Permite aplicațiilor să întârzie adormirea sistemului"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Autentificarea este necesară pentru ca o aplicație să întârzie adormirea sistemului."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să întârzie adormirea "
+"sistemului."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Permite aplicațiilor să împiedice suspendarea automată a sistemului"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice suspendarea automată a sistemului."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice suspendarea "
+"automată a sistemului."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Permite aplicațiilor să împiedice administrarea butonului de pornire a sistemului"
+msgstr ""
+"Permite aplicațiilor să împiedice administrarea butonului de pornire a "
+"sistemului"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice administrarea butonului de pornire a sistemului."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice "
+"administrarea butonului de pornire a sistemului."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Permite aplicațiilor să împiedice administrarea butonului de suspendare al sistemului"
+msgstr ""
+"Permite aplicațiilor să împiedice administrarea butonului de suspendare al "
+"sistemului"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice manipularea butonului de suspendare al sistemului."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice manipularea "
+"butonului de suspendare al sistemului."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Permite aplicațiilor să împiedice administrarea butonului de hibernare al sistemului"
+msgstr ""
+"Permite aplicațiilor să împiedice administrarea butonului de hibernare al "
+"sistemului"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice administrarea butonului de hibernare al sistemului."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice "
+"administrarea butonului de hibernare al sistemului."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Permite aplicațiilor să împiedice administrarea comutatorului din capacul statiei"
+msgstr ""
+"Permite aplicațiilor să împiedice administrarea comutatorului din capacul "
+"statiei"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice manipularea comutatorului din capacul sistemului."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice manipularea "
+"comutatorului din capacul sistemului."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Permite aplicațiilor să împiedice administrarea butonului de repornire a sistemului"
+msgstr ""
+"Permite aplicațiilor să împiedice administrarea butonului de repornire a "
+"sistemului"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Autentificarea este necesară pentru ca o aplicație să împiedice administrarea butonului de repornire a sistemului."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Autentificarea este necesară pentru ca o aplicație să împiedice "
+"administrarea butonului de repornire a sistemului."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -437,7 +575,9 @@ msgstr "Permite utilizatorilor neautentificați să execute programe"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Este necesară o cerere explicită pentru ca un utilizator neautentificat să ruleze programe."
+msgstr ""
+"Este necesară o cerere explicită pentru ca un utilizator neautentificat să "
+"ruleze programe."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -445,7 +585,9 @@ msgstr "Permite utilizatorilor neautentificați să ruleze programe"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Autentificarea este necesară pentru a rula programe ca utilizator neautentificat."
+msgstr ""
+"Autentificarea este necesară pentru a rula programe ca utilizator "
+"neautentificat."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -461,7 +603,9 @@ msgstr "Înlăturare dispozitiv atașat la stație"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Autentificarea este necesară pentru a înlătura dispozitivele atașate la stații."
+msgstr ""
+"Autentificarea este necesară pentru a înlătura dispozitivele atașate la "
+"stații."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -476,16 +620,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Oprește sistemul în timp ce alți utilizatori sunt conectați"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Autentificarea este necesară pentru oprirea sistemului în timp ce alți utilizatori sunt conectați."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Autentificarea este necesară pentru oprirea sistemului în timp ce alți "
+"utilizatori sunt conectați."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Oprește sistemul în timp ce o aplicație împiedică oprirea"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Autentificarea este necesară pentru oprirea sistemului în timp ce o aplicație împiedică oprirea."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentificarea este necesară pentru oprirea sistemului în timp ce o "
+"aplicație împiedică oprirea."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -500,16 +652,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Repornește sistemul în timp ce alți utilizatori sunt conectați"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Autentificarea este necesară pentru repornirea sistemului în timp ce alți utilizatori sunt conectați."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Autentificarea este necesară pentru repornirea sistemului în timp ce alți "
+"utilizatori sunt conectați."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Repornește sistemul în timp ce o aplicație împiedică repornirea"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Autentificarea este necesară pentru repornirea sistemului în timp ce o aplicație împiedică repornirea."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentificarea este necesară pentru repornirea sistemului în timp ce o "
+"aplicație împiedică repornirea."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -524,16 +684,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Oprește sistemul în timp ce alți utilizatori sunt conectați"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Autentificarea este necesară pentru oprirea sistemului în timp ce alți utilizatori sunt conectați."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Autentificarea este necesară pentru oprirea sistemului în timp ce alți "
+"utilizatori sunt conectați."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Oprește sistemul în timp ce o aplicație împiedică oprirea"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Autentificarea este necesară pentru oprirea sistemului în timp ce o aplicație împiedică oprirea."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentificarea este necesară pentru oprirea sistemului în timp ce o "
+"aplicație împiedică oprirea."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -548,16 +716,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Suspendă sistemul în timp ce alți utilizatori sunt conectați"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Autentificarea este necesară pentru suspendarea sistemului timp ce alți utilizatori sunt conectați."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Autentificarea este necesară pentru suspendarea sistemului timp ce alți "
+"utilizatori sunt conectați."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Suspendă sistemul în timp ce o aplicație împiedică suspendarea"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Autentificarea este necesară pentru suspendarea sistemului în timp ce o aplicație împiedică suspendarea."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentificarea este necesară pentru suspendarea sistemului în timp ce o "
+"aplicație împiedică suspendarea."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -572,16 +748,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Hiberneaza sistemul în timp ce alți utilizatori sunt conectați"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Autentificarea este necesară pentru hibernarea sistemului în timp ce alți utilizatori sunt conectați."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Autentificarea este necesară pentru hibernarea sistemului în timp ce alți "
+"utilizatori sunt conectați."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Hibernează sistemul în timp ce o aplicație împiedică hibernarea"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Autentificarea este necesară pentru hibernarea sistemului în timp ce o aplicație împiedică hibernarea."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentificarea este necesară pentru hibernarea sistemului în timp ce o "
+"aplicație împiedică hibernarea."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -589,7 +773,9 @@ msgstr "Gestionează sesiuni active, utilizatori și stații"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Autentificarea este necesară pentru gestionarea sesiunilor active, utilizatorilor și stațiilor."
+msgstr ""
+"Autentificarea este necesară pentru gestionarea sesiunilor active, "
+"utilizatorilor și stațiilor."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -597,7 +783,8 @@ msgstr "Blochează sau deblochează sesiuni active"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Autentificarea este necesară pentru a bloca sau debloca sesiuni active."
+msgstr ""
+"Autentificarea este necesară pentru a bloca sau debloca sesiuni active."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -605,31 +792,45 @@ msgstr "Setează în kernel \"cauza\" pentru repornire"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Autentificarea este necesară pentru a seta în kernel \"cauza\" pentru repornire."
+msgstr ""
+"Autentificarea este necesară pentru a seta în kernel \"cauza\" pentru "
+"repornire."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indică firmware-ului să pornească în interfața de configurare"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Autentificarea este necesară pentru a indica firmware-ului să pornească în interfața de configurare."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Autentificarea este necesară pentru a indica firmware-ului să pornească în "
+"interfața de configurare."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indică boot loader-ului să pornească cu afișarea propriului meniu"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Autentificarea este necesară pentru a indica boot loader-ului să pornească cu afișarea propriului meniu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Autentificarea este necesară pentru a indica boot loader-ului să pornească "
+"cu afișarea propriului meniu."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indică boot loader-ului să pornească cu o anumită opțiune"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Autentificarea este necesară pentru a indica boot loader-ului să pornească cu o anumită opțiune."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Autentificarea este necesară pentru a indica boot loader-ului să pornească "
+"cu o anumită opțiune."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -653,7 +854,8 @@ msgstr "Conectare la un container local"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Autentificarea este necesară pentru a vă conecta la un container local."
+msgstr ""
+"Autentificarea este necesară pentru a vă conecta la un container local."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -669,7 +871,9 @@ msgstr "Obține un shell într-un container local"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Autentificarea este necesară pentru a obține un shell într-un container local."
+msgstr ""
+"Autentificarea este necesară pentru a obține un shell într-un container "
+"local."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -677,15 +881,19 @@ msgstr "Obține un shell pe o stație locală"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Autentificarea este necesară pentru a obține un shell pe o stație locală."
+msgstr ""
+"Autentificarea este necesară pentru a obține un shell pe o stație locală."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Obține un pseudo-TTY într-un container local"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Autentificarea este necesară pentru a obține un pseudo-TTY într-un container local."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Autentificarea este necesară pentru a obține un pseudo-TTY într-un container "
+"local."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -693,23 +901,33 @@ msgstr "Obține un pseudo-TTY pe o stație locală"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Autentificarea este necesară pentru a obține un pseudo-TTY pe o stație locală."
+msgstr ""
+"Autentificarea este necesară pentru a obține un pseudo-TTY pe o stație "
+"locală."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Gestionează mașini virtuale locale și containere"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Autentificarea este necesară pentru a gestiona mașini virtuale locale și containere."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Autentificarea este necesară pentru a gestiona mașini virtuale locale și "
+"containere."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
-msgstr "Gestionează imaginile pentru mașinile virtuale locale și pentru containere"
+msgstr ""
+"Gestionează imaginile pentru mașinile virtuale locale și pentru containere"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Autentificarea este necesară pentru a gestiona imagini de mașini virtuale locale și de containere."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Autentificarea este necesară pentru a gestiona imagini de mașini virtuale "
+"locale și de containere."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -767,7 +985,9 @@ msgstr "Activare/dezactivare distribuție multiplă DNS"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Autentificarea este necesară pentru a activa sau dezactiva distribuția multiplă DNS."
+msgstr ""
+"Autentificarea este necesară pentru a activa sau dezactiva distribuția "
+"multiplă DNS."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -777,7 +997,8 @@ msgstr "Activare/dezactivare DNS prin TLS"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Autentificarea este necesară pentru a activa sau dezactiva DNS prin TLS."
+msgstr ""
+"Autentificarea este necesară pentru a activa sau dezactiva DNS prin TLS."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -797,7 +1018,9 @@ msgstr "Setare ancore de încredere negative DNSSEC"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Autentificarea este necesară pentru a seta ancore de încredere negative DNSSEC."
+msgstr ""
+"Autentificarea este necesară pentru a seta ancore de încredere negative "
+"DNSSEC."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -821,7 +1044,8 @@ msgstr "Serverul DHCP trimite mesaje de reînnoire forțată"
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Autentificarea este necesară pentru a trimite mesaje de reînnoire forțată."
+msgstr ""
+"Autentificarea este necesară pentru a trimite mesaje de reînnoire forțată."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -853,23 +1077,31 @@ msgstr "Inspectare imagine a unui serviciu portabil"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Autentificarea este necesară pentru a inspecta imaginea unui serviciu portabil."
+msgstr ""
+"Autentificarea este necesară pentru a inspecta imaginea unui serviciu "
+"portabil."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Atașare sau detașare imagine a unui serviciu portabil"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Autentificarea este necesară pentru a atașa sau detașa imaginea unui serviciu portabil."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Autentificarea este necesară pentru a atașa sau detașa imaginea unui "
+"serviciu portabil."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Șterge sau modifică imagine a unui serviciu portabil"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Autentificarea este necesară pentru a șterge sau modifica imaginea unui serviciu portabil."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Autentificarea este necesară pentru a șterge sau modifica imaginea unui "
+"serviciu portabil."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -885,7 +1117,9 @@ msgstr "Anulare înregistrare serviciu DNS-SD"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Autentificarea este necesară pentru a anula înregistrarea unui serviciu DNS-SD"
+msgstr ""
+"Autentificarea este necesară pentru a anula înregistrarea unui serviciu DNS-"
+"SD"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -893,7 +1127,9 @@ msgstr "Revenire setări pentru rezoluția de nume"
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Autentificarea este necesară pentru a reseta setările pentru rezoluția de nume."
+msgstr ""
+"Autentificarea este necesară pentru a reseta setările pentru rezoluția de "
+"nume."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -916,52 +1152,73 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Setează RTC la ora locală sau UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Autentificarea este necesară pentru a controla dacă RTC stochează ora locală sau UTC."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Autentificarea este necesară pentru a controla dacă RTC stochează ora locală "
+"sau UTC."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Activează sau dezactivează sincronizarea cu ora rețelei"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Autentificarea este necesară pentru a controla dacă sincronizarea cu ora rețelei ar trebui activată."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Autentificarea este necesară pentru a controla dacă sincronizarea cu ora "
+"rețelei ar trebui activată."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Autentificarea este necesară pentru a porni „$(unit)”."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Autentificarea este necesară pentru a opri „$(unit)”."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Autentificarea este necesară pentru a reîncărca „$(unit)”."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Autentificarea este necesară pentru a reporni „$(unit)”."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Autentificarea este necesară pentru a trimite un semnal UNIX către procesele unui „$(unit)”."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Autentificarea este necesară pentru a trimite un semnal UNIX către procesele "
+"unui „$(unit)”."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Autentificarea este necesară pentru a reseta starea „eșuată” a „$(unit)”."
+msgstr ""
+"Autentificarea este necesară pentru a reseta starea „eșuată” a „$(unit)”."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Autentificarea este necesară pentru a seta proprietățile lui „$(unit)”."
+msgstr ""
+"Autentificarea este necesară pentru a seta proprietățile lui „$(unit)”."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Autentificarea este necesară pentru a șterge fișierele și directoarele asociate lui „$(unit)”."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Autentificarea este necesară pentru a șterge fișierele și directoarele "
+"asociate lui „$(unit)”."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Autentificarea este necesară pentru a îngheța sau dezgheța procesele corespunzătoare lui „$(unit)”."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Autentificarea este necesară pentru a îngheța sau dezgheța procesele "
+"corespunzătoare lui „$(unit)”."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Autentificarea este necesară pentru a omorî „$(unit)”."
diff --git a/po/ru.po b/po/ru.po
index 90c4ea99f3..3e245dda0e 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -12,15 +12,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-09-12 14:35+0000\n"
"Last-Translator: \"Sergey A.\" <sw@atrus.ru>\n"
-"Language-Team: Russian <https://translate.fedoraproject.org/projects/systemd/master/ru/>\n"
+"Language-Team: Russian <https://translate.fedoraproject.org/projects/systemd/"
+"master/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.0.1\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -28,7 +30,8 @@ msgid "Send passphrase back to system"
msgstr "Отправить пароль системе"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Чтобы отправить пароль системе, необходимо пройти аутентификацию."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -37,7 +40,9 @@ msgstr "Управление системными службами и юнита
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Для управления системными службами и юнитами, необходимо пройти аутентификацию."
+msgstr ""
+"Для управления системными службами и юнитами, необходимо пройти "
+"аутентификацию."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -45,15 +50,21 @@ msgstr "Управление файлами конфигурации систе
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Для управления файлами конфигурации системных служб и юнитов, необходимо пройти аутентификацию."
+msgstr ""
+"Для управления файлами конфигурации системных служб и юнитов, необходимо "
+"пройти аутентификацию."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Настроить переменные окружения для системного менеджера"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Чтобы настроить переменные окружения для системного менеджера, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Чтобы настроить переменные окружения для системного менеджера, необходимо "
+"пройти аутентификацию."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -61,15 +72,20 @@ msgstr "Перечитать конфигурацию systemd"
#: src/core/org.freedesktop.systemd1.policy.in:65
msgid "Authentication is required to reload the systemd state."
-msgstr "Чтобы заставить systemd перечитать конфигурацию, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы заставить systemd перечитать конфигурацию, необходимо пройти "
+"аутентификацию."
#: src/core/org.freedesktop.systemd1.policy.in:74
msgid "Dump the systemd state without rate limits"
msgstr "Создавать дампы состояния systemd без ограничений частоты"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Для создания дампов состояния systemd без ограничения частоты необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Для создания дампов состояния systemd без ограничения частоты необходимо "
+"пройти аутентификацию."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -77,7 +93,9 @@ msgstr "Создать домашнее пространство"
#: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area."
-msgstr "Чтобы создать домашнее пространство пользователя, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы создать домашнее пространство пользователя, необходимо пройти "
+"аутентификацию."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -85,15 +103,20 @@ msgstr "Удалить домашнее пространство"
#: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area."
-msgstr "Чтобы удалить домашнее пространство пользователя, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы удалить домашнее пространство пользователя, необходимо пройти "
+"аутентификацию."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
msgstr "Проверить учётные данные домашнего пространства"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Чтобы проверить учётные данные для домашнего пространства пользователя, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Чтобы проверить учётные данные для домашнего пространства пользователя, "
+"необходимо пройти аутентификацию."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -101,7 +124,9 @@ msgstr "Обновить домашнее пространство"
#: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area."
-msgstr "Чтобы обновить домашнее пространство пользователя, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы обновить домашнее пространство пользователя, необходимо пройти "
+"аутентификацию."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
@@ -109,158 +134,221 @@ msgstr "Изменить размер домашнего пространств
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Чтобы изменить размер домашнего пространства пользователя, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы изменить размер домашнего пространства пользователя, необходимо пройти "
+"аутентификацию."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Изменить пароль для домашнего пространства"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Чтобы изменить пароль для домашнего пространства пользователя, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Чтобы изменить пароль для домашнего пространства пользователя, необходимо "
+"пройти аутентификацию."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Чтобы обновить домашнее пространство пользователя, необходимо пройти "
+"аутентификацию."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "Создать домашнее пространство"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Чтобы создать домашнее пространство пользователя, необходимо пройти "
+"аутентификацию."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "Домашняя папка пользователя %s в настоящее время отсутствует, подключите необходимое устройство хранения данных или резервную файловую систему."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"Домашняя папка пользователя %s в настоящее время отсутствует, подключите "
+"необходимое устройство хранения данных или резервную файловую систему."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Слишком частые попытки войти в систему со стороны пользователя %s, повторите попытку позже."
+msgstr ""
+"Слишком частые попытки войти в систему со стороны пользователя %s, повторите "
+"попытку позже."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Пароль: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Неверно указан пароль или его недостаточно для аутентификации пользователя %s."
+msgstr ""
+"Неверно указан пароль или его недостаточно для аутентификации пользователя "
+"%s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Извините, повторите попытку: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Ключ восстановления: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Пароль/ключ восстановления неверен или его недостаточно для аутентификации пользователя %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Пароль/ключ восстановления неверен или его недостаточно для аутентификации "
+"пользователя %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Извините, ещё раз введите ключ восстановления: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Не вставлен токен безопасности пользователя %s."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Повторите попытку с паролем: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Пароль неверен или его недостаточно, а настроенный токен безопасности пользователя %s не вставлен."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Пароль неверен или его недостаточно, а настроенный токен безопасности "
+"пользователя %s не вставлен."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN-код токена безопасности: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "Пожалуйста, пройдите физическую аутентификацию по токену безопасности пользователя %s."
+msgstr ""
+"Пожалуйста, пройдите физическую аутентификацию по токену безопасности "
+"пользователя %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Пожалуйста, подтвердите наличие токена безопасности пользователя %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Пожалуйста, подтвердите пользователя на токене безопасности %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "PIN-код токена безопасности заблокирован. Пожалуйста, сначала снимите его блокировку. (Подсказка: иногда достаточно вынуть и снова вставить токен.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"PIN-код токена безопасности заблокирован. Пожалуйста, сначала снимите его "
+"блокировку. (Подсказка: иногда достаточно вынуть и снова вставить токен.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Неверный PIN-код токена безопасности для пользователя %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Извините, повторите попытку введения PIN-кода токена безопасности: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "Неверный PIN-код токена безопасности пользователя %s (осталось всего несколько попыток!)"
+msgstr ""
+"Неверный PIN-код токена безопасности пользователя %s (осталось всего "
+"несколько попыток!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "Неверный PIN-код токена безопасности пользователя %s (осталась всего одна попытка!)"
+msgstr ""
+"Неверный PIN-код токена безопасности пользователя %s (осталась всего одна "
+"попытка!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "Домашняя папка пользователя %s в настоящее время неактивна, пожалуйста, сначала войдите в систему локально."
+msgstr ""
+"Домашняя папка пользователя %s в настоящее время неактивна, пожалуйста, "
+"сначала войдите в систему локально."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "Домашняя папка пользователя %s в настоящее время заблокирована, сначала разблокируйте её локально."
+msgstr ""
+"Домашняя папка пользователя %s в настоящее время заблокирована, сначала "
+"разблокируйте её локально."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Слишком много неудачных попыток входа в систему для пользователя %s. В доступе отказано."
+msgstr ""
+"Слишком много неудачных попыток входа в систему для пользователя %s. В "
+"доступе отказано."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Запись пользователя заблокирована. Доступ запрещён."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Запись пользователя ещё не вступила в силу. Доступ запрещён."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Запись пользователя больше не действительна. Доступ запрещён."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Запись пользователя недействительна. Доступ запрещён."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Слишком много попыток войти. Повторите попытку через %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Требуется смена пароля."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Срок действия пароля истёк, требуется его замена."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "Срок действия пароля истёк, но его невозможно изменить. Вход в систему запрещён."
+msgstr ""
+"Срок действия пароля истёк, но его невозможно изменить. Вход в систему "
+"запрещён."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Срок действия пароля скоро истечёт, пожалуйста, измените его."
@@ -277,8 +365,12 @@ msgid "Set static hostname"
msgstr "Настроить статическое имя компьютера"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Чтобы настроить статическое имя компьютера, а также его «красивое» имя, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Чтобы настроить статическое имя компьютера, а также его «красивое» имя, "
+"необходимо пройти аутентификацию."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -286,7 +378,8 @@ msgstr "Настроить информацию о компьютере"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Чтобы настроить информацию о компьютере, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы настроить информацию о компьютере, необходимо пройти аутентификацию."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -313,28 +406,52 @@ msgid "Authentication is required to get system description."
msgstr "Чтобы получить описание системы, необходимо пройти аутентификацию."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Импортировать образ виртуальной машины или контейнера"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Чтобы импортировать образ виртуальной машины или контейнера, необходимо пройти аутентификацию"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Чтобы импортировать образ виртуальной машины или контейнера, необходимо "
+"пройти аутентификацию"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Экспортировать образ виртуальной машины или контейнера"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Чтобы экспортировать образ виртуальной машины или контейнера, необходимо пройти аутентификацию"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Чтобы экспортировать образ виртуальной машины или контейнера, необходимо "
+"пройти аутентификацию"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Загрузить образ виртуальной машины или контейнера"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Чтобы загрузить образ виртуальной машины или контейнера, необходимо пройти аутентификацию"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Чтобы загрузить образ виртуальной машины или контейнера, необходимо пройти "
+"аутентификацию"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Чтобы изменить пароль для домашнего пространства пользователя, необходимо "
+"пройти аутентификацию."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -350,15 +467,19 @@ msgstr "Настроить параметры клавиатуры"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Чтобы настроить параметры клавиатуры, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы настроить параметры клавиатуры, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Разрешить приложениям устанавливать блокировку на выключение системы"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку на выключение системы, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку на выключение системы, "
+"необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -366,7 +487,9 @@ msgstr "Разрешить приложениям устанавливать з
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Чтобы разрешить приложениям устанавливать задержку на выключение системы, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать задержку на выключение системы, "
+"необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -374,7 +497,9 @@ msgstr "Разрешить приложениям устанавливать б
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку на засыпание системы, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку на засыпание системы, "
+"необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -382,55 +507,93 @@ msgstr "Разрешить приложениям устанавливать з
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Чтобы разрешить приложениям устанавливать задержку на засыпание системы, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать задержку на засыпание системы, "
+"необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Разрешить приложениям устанавливать блокировку на автоматический переход системы в ждущий режим"
+msgstr ""
+"Разрешить приложениям устанавливать блокировку на автоматический переход "
+"системы в ждущий режим"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку на автоматический переход системы в ждущий режим, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку на автоматический "
+"переход системы в ждущий режим, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку выключения"
+msgstr ""
+"Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку "
+"выключения"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на кнопку выключения, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на "
+"кнопку выключения, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку перехода в ждущий режим"
+msgstr ""
+"Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку "
+"перехода в ждущий режим"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на кнопку перехода в ждущий режим, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на "
+"кнопку перехода в ждущий режим, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку перехода в спящий режим"
+msgstr ""
+"Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку "
+"перехода в спящий режим"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на кнопку перехода в спящий режим, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на "
+"кнопку перехода в спящий режим, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Разрешить приложениям устанавливать блокировку на обработку закрытия крышки ноутбука"
+msgstr ""
+"Разрешить приложениям устанавливать блокировку на обработку закрытия крышки "
+"ноутбука"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку на обработку закрытия крышки ноутбука, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку на обработку закрытия "
+"крышки ноутбука, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку перезагрузки"
+msgstr ""
+"Разрешить приложениям устанавливать блокировку обработки нажатий на кнопку "
+"перезагрузки"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на кнопку перезагрузки, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Чтобы разрешить приложениям устанавливать блокировку обработки нажатий на "
+"кнопку перезагрузки, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -438,15 +601,21 @@ msgstr "Разрешить работу программ в фоновом ре
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Чтобы разрешить работу программ в фоновом режиме после завершения сеанса, необходимо явное подтверждение."
+msgstr ""
+"Чтобы разрешить работу программ в фоновом режиме после завершения сеанса, "
+"необходимо явное подтверждение."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
-msgstr "Разрешить пользователям оставлять программы в фоновом режиме после завершения сеанса"
+msgstr ""
+"Разрешить пользователям оставлять программы в фоновом режиме после "
+"завершения сеанса"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Чтобы разрешить пользователям оставлять программы в фоновом режиме после завершения сеанса, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы разрешить пользователям оставлять программы в фоновом режиме после "
+"завершения сеанса, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -454,7 +623,9 @@ msgstr "Разрешить подключение устройств к рабо
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Чтобы разрешить подключение устройств к рабочим местам, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы разрешить подключение устройств к рабочим местам, необходимо пройти "
+"аутентификацию."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -462,7 +633,9 @@ msgstr "Сбросить привязки устройств к рабочим
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Чтобы сбросить привязки устройств к рабочим местам, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы сбросить привязки устройств к рабочим местам, необходимо пройти "
+"аутентификацию."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -474,19 +647,30 @@ msgstr "Чтобы выключить систему, необходимо пр
#: src/login/org.freedesktop.login1.policy:180
msgid "Power off the system while other users are logged in"
-msgstr "Выключить систему, несмотря на то, что в ней работают другие пользователи"
+msgstr ""
+"Выключить систему, несмотря на то, что в ней работают другие пользователи"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Чтобы выключить систему, несмотря на то, что в ней работают другие пользователи, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Чтобы выключить систему, несмотря на то, что в ней работают другие "
+"пользователи, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
-msgstr "Выключить систему, несмотря на то, что приложение запросило блокировку выключения"
+msgstr ""
+"Выключить систему, несмотря на то, что приложение запросило блокировку "
+"выключения"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Чтобы выключить систему, несмотря на то, что приложение запросило блокировку выключения, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Чтобы выключить систему, несмотря на то, что приложение запросило блокировку "
+"выключения, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -498,19 +682,30 @@ msgstr "Чтобы перезагрузить систему, необходим
#: src/login/org.freedesktop.login1.policy:213
msgid "Reboot the system while other users are logged in"
-msgstr "Перезагрузить систему, несмотря на то, что в ней работают другие пользователи"
+msgstr ""
+"Перезагрузить систему, несмотря на то, что в ней работают другие пользователи"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Чтобы перезагрузить систему, несмотря на то, что в ней работают другие пользователи, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Чтобы перезагрузить систему, несмотря на то, что в ней работают другие "
+"пользователи, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
-msgstr "Перезагрузить систему, несмотря на то, что приложение запросило блокировку выключения"
+msgstr ""
+"Перезагрузить систему, несмотря на то, что приложение запросило блокировку "
+"выключения"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Чтобы перезагрузить систему, несмотря на то, что приложение запросило блокировку выключения, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Чтобы перезагрузить систему, несмотря на то, что приложение запросило "
+"блокировку выключения, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -522,19 +717,30 @@ msgstr "Чтобы остановить систему, необходимо п
#: src/login/org.freedesktop.login1.policy:246
msgid "Halt the system while other users are logged in"
-msgstr "Остановить систему, несмотря на то, что в ней работают другие пользователи"
+msgstr ""
+"Остановить систему, несмотря на то, что в ней работают другие пользователи"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Чтобы остановить систему, несмотря на то, что в ней работают другие пользователи, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Чтобы остановить систему, несмотря на то, что в ней работают другие "
+"пользователи, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
-msgstr "Остановить систему несмотря на то, что приложение запросило блокировку выключения"
+msgstr ""
+"Остановить систему несмотря на то, что приложение запросило блокировку "
+"выключения"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Чтобы остановить систему несмотря на то, что приложение запросило блокировку выключения, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Чтобы остановить систему несмотря на то, что приложение запросило блокировку "
+"выключения, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -542,23 +748,36 @@ msgstr "Перевести систему в ждущий режим"
#: src/login/org.freedesktop.login1.policy:269
msgid "Authentication is required to suspend the system."
-msgstr "Чтобы перевести систему в ждущий режим, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы перевести систему в ждущий режим, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while other users are logged in"
-msgstr "Перевести систему в ждущий режим, несмотря на то, что в ней работают другие пользователи"
+msgstr ""
+"Перевести систему в ждущий режим, несмотря на то, что в ней работают другие "
+"пользователи"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Чтобы перевести систему в ждущий режим, несмотря на то, что в ней работают другие пользователи, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Чтобы перевести систему в ждущий режим, несмотря на то, что в ней работают "
+"другие пользователи, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
-msgstr "Перевести систему в ждущий режим, несмотря на то, что приложение запросило блокировку"
+msgstr ""
+"Перевести систему в ждущий режим, несмотря на то, что приложение запросило "
+"блокировку"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Чтобы перевести систему в ждущий режим, несмотря на то, что приложение запросило блокировку, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Чтобы перевести систему в ждущий режим, несмотря на то, что приложение "
+"запросило блокировку, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -566,23 +785,36 @@ msgstr "Перевести систему в спящий режим"
#: src/login/org.freedesktop.login1.policy:301
msgid "Authentication is required to hibernate the system."
-msgstr "Чтобы перевести систему в спящий режим, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы перевести систему в спящий режим, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while other users are logged in"
-msgstr "Перевести систему в спящий режим, несмотря на то, что в ней работают другие пользователи"
+msgstr ""
+"Перевести систему в спящий режим, несмотря на то, что в ней работают другие "
+"пользователи"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Чтобы перевести систему в спящий режим, несмотря на то, что в ней работают другие пользователи, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Чтобы перевести систему в спящий режим, несмотря на то, что в ней работают "
+"другие пользователи, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
-msgstr "Перевести систему в спящий режим, несмотря на то, что приложение запросило блокировку"
+msgstr ""
+"Перевести систему в спящий режим, несмотря на то, что приложение запросило "
+"блокировку"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Чтобы перевести систему в спящий режим, несмотря на то, что приложение запросило блокировку, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Чтобы перевести систему в спящий режим, несмотря на то, что приложение "
+"запросило блокировку, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -590,7 +822,9 @@ msgstr "Управление текущими сеансами, пользова
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Для управления текущими сеансами, пользователями и рабочими местами, необходимо пройти аутентификацию."
+msgstr ""
+"Для управления текущими сеансами, пользователями и рабочими местами, "
+"необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -598,7 +832,9 @@ msgstr "Заблокировать или разблокировать теку
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Чтобы заблокировать или разблокировать текущие сеансы, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы заблокировать или разблокировать текущие сеансы, необходимо пройти "
+"аутентификацию."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -606,31 +842,45 @@ msgstr "Установить \"причину\" перезагрузки"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Чтобы установить \"причину\" перезагрузки, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы установить \"причину\" перезагрузки, необходимо пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Запустить режим настройки прошивки материнской платы при следующей загрузке"
+msgstr ""
+"Запустить режим настройки прошивки материнской платы при следующей загрузке"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Чтобы запустить режим настройки прошивки материнской платы, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Чтобы запустить режим настройки прошивки материнской платы, необходимо "
+"пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Отобразить меню загрузчика при следующей загрузке"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Чтобы отобразить меню загрузчика при следующей загрузке, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Чтобы отобразить меню загрузчика при следующей загрузке, необходимо пройти "
+"аутентификацию."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Выбрать определённую загрузочную запись при следующем запуске"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Чтобы установить определённую загрузочную запись для загрузки, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Чтобы установить определённую загрузочную запись для загрузки, необходимо "
+"пройти аутентификацию."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -638,7 +888,8 @@ msgstr "Отправить сообщение на все терминалы"
#: src/login/org.freedesktop.login1.policy:397
msgid "Authentication is required to set a wall message"
-msgstr "Чтобы отправить сообщение на все терминалы, необходимо пройти аутентификацию"
+msgstr ""
+"Чтобы отправить сообщение на все терминалы, необходимо пройти аутентификацию"
#: src/login/org.freedesktop.login1.policy:406
msgid "Change Session"
@@ -670,7 +921,9 @@ msgstr "Получить командную оболочку в локально
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Чтобы получить командную оболочку в локальном контейнере, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы получить командную оболочку в локальном контейнере, необходимо пройти "
+"аутентификацию."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -678,15 +931,20 @@ msgstr "Запустить командную оболочку на этом к
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Чтобы запустить командную оболочку на этом компьютере, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы запустить командную оболочку на этом компьютере, необходимо пройти "
+"аутентификацию."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Получить псевдо-терминал в локальном контейнере"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Чтобы получить псевдо-терминал в локальном контейнере, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Чтобы получить псевдо-терминал в локальном контейнере, необходимо пройти "
+"аутентификацию."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -694,23 +952,32 @@ msgstr "Получить псевдо-терминал на этом компь
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Чтобы получить псевдо-терминал на этом компьютере, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы получить псевдо-терминал на этом компьютере, необходимо пройти "
+"аутентификацию."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Управление виртуальными машинами и контейнерами"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Для управления виртуальными машинами и контейнерами, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Для управления виртуальными машинами и контейнерами, необходимо пройти "
+"аутентификацию."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Управление образами виртуальных машин и контейнеров"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Для управления образами виртуальных машин и контейнеров, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Для управления образами виртуальных машин и контейнеров, необходимо пройти "
+"аутентификацию."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -768,7 +1035,8 @@ msgstr "Включить/отключить multicast DNS"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Чтобы включить или отключить multicast DNS, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы включить или отключить multicast DNS, необходимо пройти аутентификацию."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -778,7 +1046,9 @@ msgstr "Включить/отключить DNS поверх TLS"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "Чтобы включить или отключить DNS поверх TLS, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы включить или отключить DNS поверх TLS, необходимо пройти "
+"аутентификацию."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -798,7 +1068,8 @@ msgstr "Задать DNSSEC Negative Trust Anchors"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Чтобы задать DNSSEC Negative Trust Anchors, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы задать DNSSEC Negative Trust Anchors, необходимо пройти аутентификацию."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -806,7 +1077,8 @@ msgstr "Восстановить настройки NTP по умолчанию"
#: src/network/org.freedesktop.network1.policy:122
msgid "Authentication is required to reset NTP settings."
-msgstr "Чтобы сбросить локальные настройки NTP, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы сбросить локальные настройки NTP, необходимо пройти аутентификацию."
#: src/network/org.freedesktop.network1.policy:132
msgid "Revert DNS settings"
@@ -814,7 +1086,8 @@ msgstr "Восстановить настройки DNS по умолчанию"
#: src/network/org.freedesktop.network1.policy:133
msgid "Authentication is required to reset DNS settings."
-msgstr "Чтобы сбросить локальные настройки DNS, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы сбросить локальные настройки DNS, необходимо пройти аутентификацию."
#: src/network/org.freedesktop.network1.policy:143
msgid "DHCP server sends force renew message"
@@ -822,7 +1095,9 @@ msgstr "Сервер DHCP посылает сообщение о принуди
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Чтобы отправить сообщение о принудительном обновлении, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы отправить сообщение о принудительном обновлении, необходимо пройти "
+"аутентификацию."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -838,7 +1113,9 @@ msgstr "Перечитать настройки сети"
#: src/network/org.freedesktop.network1.policy:166
msgid "Authentication is required to reload network settings."
-msgstr "Чтобы заставить systemd перечитать настройки сети, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы заставить systemd перечитать настройки сети, необходимо пройти "
+"аутентификацию."
#: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface"
@@ -846,7 +1123,9 @@ msgstr "Изменить конфигурацию сетевого интерф
#: src/network/org.freedesktop.network1.policy:177
msgid "Authentication is required to reconfigure network interface."
-msgstr "Чтобы изменить конфигурацию сетевого интерфейса, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы изменить конфигурацию сетевого интерфейса, необходимо пройти "
+"аутентификацию."
#: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image"
@@ -854,23 +1133,30 @@ msgstr "Прочитать образ переносимой службы"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Чтобы прочитать образ переносимой службы, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы прочитать образ переносимой службы, необходимо пройти аутентификацию."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Подключить или отключить образ переносимой службы"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Чтобы подключить или отключить образ переносимой службы, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Чтобы подключить или отключить образ переносимой службы, необходимо пройти "
+"аутентификацию."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Удалить или изменить образ переносимой службы"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Чтобы удалить или изменить образ переносимой службы, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Чтобы удалить или изменить образ переносимой службы, необходимо пройти "
+"аутентификацию."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -878,7 +1164,8 @@ msgstr "Зарегистрировать службу в DNS-SD"
#: src/resolve/org.freedesktop.resolve1.policy:23
msgid "Authentication is required to register a DNS-SD service"
-msgstr "Чтобы зарегистрировать службу в DNS-SD, необходимо пройти аутентификацию"
+msgstr ""
+"Чтобы зарегистрировать службу в DNS-SD, необходимо пройти аутентификацию"
#: src/resolve/org.freedesktop.resolve1.policy:33
msgid "Unregister a DNS-SD service"
@@ -894,7 +1181,8 @@ msgstr "Вернуть настройки разрешения имён по у
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Чтобы сбросить настройки разрешения имён, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы сбросить настройки разрешения имён, необходимо пройти аутентификацию."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -917,49 +1205,73 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Установить аппаратные часы по местному времени или по Гринвичу"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Чтобы контролировать, установлены аппаратные часы по местному времени или по Гринвичу, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Чтобы контролировать, установлены аппаратные часы по местному времени или по "
+"Гринвичу, необходимо пройти аутентификацию."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Включить или отключить синхронизацию времени по сети"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Чтобы включить или отключить синхронизацию времени по сети, необходимо пройти аутентификацию."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Чтобы включить или отключить синхронизацию времени по сети, необходимо "
+"пройти аутентификацию."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Чтобы запустить «$(unit)», необходимо пройти аутентификацию."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Чтобы остановить «$(unit)», необходимо пройти аутентификацию."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
-msgstr "Чтобы заставить «$(unit)» перечитать конфигурацию, необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы заставить «$(unit)» перечитать конфигурацию, необходимо пройти "
+"аутентификацию."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Чтобы перезапустить «$(unit)», необходимо пройти аутентификацию."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Чтобы отправить сигнал UNIX процессам юнита «$(unit)», необходимо пройти аутентификацию."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Чтобы отправить сигнал UNIX процессам юнита «$(unit)», необходимо пройти "
+"аутентификацию."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Чтобы сбросить состояние «failed» у юнита «$(unit)», необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы сбросить состояние «failed» у юнита «$(unit)», необходимо пройти "
+"аутентификацию."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Чтобы изменить параметры юнита «$(unit)», необходимо пройти аутентификацию."
+msgstr ""
+"Чтобы изменить параметры юнита «$(unit)», необходимо пройти аутентификацию."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Чтобы удалить файлы и директории, относящиеся к юниту «$(unit)», необходимо пройти аутентификацию."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Чтобы удалить файлы и директории, относящиеся к юниту «$(unit)», необходимо "
+"пройти аутентификацию."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Чтобы отправить сигнал заморозки или разморозки процессам юнита «$(unit)», необходимо пройти аутентификацию."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Чтобы отправить сигнал заморозки или разморозки процессам юнита «$(unit)», "
+"необходимо пройти аутентификацию."
diff --git a/po/si.po b/po/si.po
index c644cd9336..355f4fb65e 100644
--- a/po/si.po
+++ b/po/si.po
@@ -5,10 +5,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-08-19 07:04+0000\n"
"Last-Translator: Hela Basa <r45xveza@pm.me>\n"
-"Language-Team: Sinhala <https://translate.fedoraproject.org/projects/systemd/master/si/>\n"
+"Language-Team: Sinhala <https://translate.fedoraproject.org/projects/systemd/"
+"master/si/>\n"
"Language: si\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +22,8 @@ msgid "Send passphrase back to system"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -45,7 +47,9 @@ msgid "Set or unset system and service manager environment variables"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -61,7 +65,8 @@ msgid "Dump the systemd state without rate limits"
msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr ""
#: src/home/org.freedesktop.home1.policy:13
@@ -85,7 +90,8 @@ msgid "Check credentials of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr ""
#: src/home/org.freedesktop.home1.policy:43
@@ -109,151 +115,177 @@ msgid "Change password of a home area"
msgstr ""
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
msgstr ""
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -270,7 +302,9 @@ msgid "Set static hostname"
msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -307,27 +341,36 @@ msgid "Authentication is required to get system description."
msgstr ""
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+msgid "Authentication is required to import an image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+msgid "Authentication is required to export disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+msgid "Authentication is required to download a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
msgstr ""
#: src/locale/org.freedesktop.locale1.policy:22
@@ -351,7 +394,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr ""
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr ""
#: src/login/org.freedesktop.login1.policy:33
@@ -383,7 +427,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr ""
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr ""
#: src/login/org.freedesktop.login1.policy:75
@@ -391,7 +437,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:86
@@ -399,7 +447,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:97
@@ -407,7 +457,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:107
@@ -415,7 +467,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr ""
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr ""
#: src/login/org.freedesktop.login1.policy:117
@@ -423,7 +477,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:128
@@ -471,7 +527,9 @@ msgid "Power off the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:191
@@ -479,7 +537,9 @@ msgid "Power off the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:202
@@ -495,7 +555,9 @@ msgid "Reboot the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:224
@@ -503,7 +565,9 @@ msgid "Reboot the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:235
@@ -519,7 +583,9 @@ msgid "Halt the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:257
@@ -527,7 +593,9 @@ msgid "Halt the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:268
@@ -543,7 +611,9 @@ msgid "Suspend the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:289
@@ -551,7 +621,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:300
@@ -567,7 +639,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:321
@@ -575,7 +649,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:332
@@ -607,7 +683,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr ""
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr ""
#: src/login/org.freedesktop.login1.policy:374
@@ -615,7 +693,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr ""
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr ""
#: src/login/org.freedesktop.login1.policy:385
@@ -623,7 +703,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr ""
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr ""
#: src/login/org.freedesktop.login1.policy:396
@@ -679,7 +761,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74
@@ -695,7 +778,8 @@ msgid "Manage local virtual machines and containers"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:95
@@ -703,7 +787,9 @@ msgid "Manage local virtual machine and container images"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr ""
#: src/network/org.freedesktop.network1.policy:22
@@ -855,7 +941,8 @@ msgid "Attach or detach a portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:34
@@ -863,7 +950,8 @@ msgid "Delete or modify portable service image"
msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -911,7 +999,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -919,41 +1009,48 @@ msgid "Turn network time synchronization on or off"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr ""
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr ""
diff --git a/po/sk.po b/po/sk.po
index 802792c68d..017530aca9 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -6,10 +6,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-02-22 20:21+0000\n"
"Last-Translator: Frantisek Sumsal <frantisek@sumsal.cz>\n"
-"Language-Team: Slovak <https://translate.fedoraproject.org/projects/systemd/master/sk/>\n"
+"Language-Team: Slovak <https://translate.fedoraproject.org/projects/systemd/"
+"master/sk/>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,8 +23,10 @@ msgid "Send passphrase back to system"
msgstr "Odoslanie hesla späť do systému"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Vyžaduje sa overenie totožnosti na odoslanie zadaného hesla späť do systému."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na odoslanie zadaného hesla späť do systému."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -31,7 +34,9 @@ msgstr "Správa systémových služieb alebo iných jednotiek"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Vyžaduje sa overenie totožnosti na správu systémových služieb alebo iných jednotiek."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na správu systémových služieb alebo iných "
+"jednotiek."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -39,15 +44,23 @@ msgstr "Správa systémovej služby alebo súborov jednotky"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Vyžaduje sa overenie totožnosti na správu systémovej služby alebo súborov jednotky."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na správu systémovej služby alebo súborov "
+"jednotky."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Nastavenie alebo zrušenie nastavenia premenných prostredia systému a správcu služieb"
+msgstr ""
+"Nastavenie alebo zrušenie nastavenia premenných prostredia systému a správcu "
+"služieb"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie alebo zrušenie nastavenia premenných prostredia systému a správcu služieb."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie alebo zrušenie nastavenia "
+"premenných prostredia systému a správcu služieb."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -55,7 +68,8 @@ msgstr "Znovu načítanie stavu systému systemd"
#: src/core/org.freedesktop.systemd1.policy.in:65
msgid "Authentication is required to reload the systemd state."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
#: src/core/org.freedesktop.systemd1.policy.in:74
msgid "Dump the systemd state without rate limits"
@@ -63,8 +77,10 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -73,7 +89,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:14
#, fuzzy
msgid "Authentication is required to create a user's home area."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -82,7 +99,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:24
#, fuzzy
msgid "Authentication is required to remove a user's home area."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
@@ -90,7 +108,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:34
#, fuzzy
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr "Vyžaduje sa overenie totožnosti na nastavenie názvu hostiteľa."
#: src/home/org.freedesktop.home1.policy:43
@@ -117,151 +136,180 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:64
#, fuzzy
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "Vyžaduje sa overenie totožnosti na nastavenie miestnych nastavení."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Vyžaduje sa overenie totožnosti na uspanie systému."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -278,8 +326,12 @@ msgid "Set static hostname"
msgstr "Nastavenie nemenného názvu hostiteľa"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie pevne určeného názvu miestneho hostiteľa, známeho ako zrozumiteľný názov hostiteľa."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie pevne určeného názvu miestneho "
+"hostiteľa, známeho ako zrozumiteľný názov hostiteľa."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -287,7 +339,8 @@ msgstr "Nastavenie informácií o počítači"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie informácií o miestnom počítači."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie informácií o miestnom počítači."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -318,29 +371,43 @@ msgid "Authentication is required to get system description."
msgstr "Vyžaduje sa overenie totožnosti na nastavenie miestnych nastavení."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr ""
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr "Vyžaduje sa overenie totožnosti na nastavenie názvu hostiteľa."
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr ""
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr "Vyžaduje sa overenie totožnosti na nastavenie názvu hostiteľa."
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
msgstr ""
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Vyžaduje sa overenie totožnosti na nastavenie miestnych nastavení."
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "Nastavenie miestnych nastavení"
@@ -355,14 +422,17 @@ msgstr "Nastavenie nastavení systémovej klávesnice"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej klávesnice."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej "
+"klávesnice."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr ""
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr ""
#: src/login/org.freedesktop.login1.policy:33
@@ -379,7 +449,8 @@ msgstr "Umožnenie aplikáciám odložiť spánok systému"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -387,14 +458,17 @@ msgstr "Umožnenie aplikáciám odložiť spánok systému"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr ""
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr ""
#: src/login/org.freedesktop.login1.policy:75
@@ -402,7 +476,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:86
@@ -410,7 +486,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:97
@@ -418,7 +496,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr ""
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr ""
#: src/login/org.freedesktop.login1.policy:107
@@ -426,7 +506,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr ""
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr ""
#: src/login/org.freedesktop.login1.policy:117
@@ -436,8 +518,11 @@ msgstr "Umožnenie aplikáciám odložiť spánok systému"
#: src/login/org.freedesktop.login1.policy:118
#, fuzzy
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -445,7 +530,9 @@ msgstr "Umožnenie neprihlásenému používateľovi spúšťanie programov"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Vyžaduje sa explicitná požiadavka na spúšťanie programov ako neprihlásený používateľ."
+msgstr ""
+"Vyžaduje sa explicitná požiadavka na spúšťanie programov ako neprihlásený "
+"používateľ."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -453,7 +540,9 @@ msgstr "Umožnenie neprihláseným používateľom spúšťanie programov"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Vyžaduje sa overenie totožnosti na spúšťanie programov ako neprihlásený používateľ."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na spúšťanie programov ako neprihlásený "
+"používateľ."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -484,15 +573,21 @@ msgid "Power off the system while other users are logged in"
msgstr "Vypnutie systému, pokiaľ sú prihlásení iní používatelia"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Vyžaduje sa overenie totožnosti na vypnutie systému, pokiaľ sú prihlásení iní používatelia."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na vypnutie systému, pokiaľ sú prihlásení "
+"iní používatelia."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:202
@@ -508,15 +603,21 @@ msgid "Reboot the system while other users are logged in"
msgstr "Reštart systému, pokiaľ sú prihlásení iní používatelia"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Vyžaduje sa overenie totožnosti na reštartovanie systému, pokiaľ sú prihlásení iní používatelia."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na reštartovanie systému, pokiaľ sú "
+"prihlásení iní používatelia."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:235
@@ -536,8 +637,12 @@ msgstr "Reštart systému, pokiaľ sú prihlásení iní používatelia"
#: src/login/org.freedesktop.login1.policy:247
#, fuzzy
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Vyžaduje sa overenie totožnosti na reštartovanie systému, pokiaľ sú prihlásení iní používatelia."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na reštartovanie systému, pokiaľ sú "
+"prihlásení iní používatelia."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
@@ -545,8 +650,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:258
#, fuzzy
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej klávesnice."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej "
+"klávesnice."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -561,15 +670,21 @@ msgid "Suspend the system while other users are logged in"
msgstr "Uspanie systému, pokiaľ sú prihlásení iní používatelia"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Vyžaduje sa overenie totožnosti na uspanie systému, pokiaľ sú prihlásení iní používatelia."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na uspanie systému, pokiaľ sú prihlásení iní "
+"používatelia."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:300
@@ -585,7 +700,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr ""
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr ""
#: src/login/org.freedesktop.login1.policy:321
@@ -593,7 +710,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr ""
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr ""
#: src/login/org.freedesktop.login1.policy:332
@@ -610,7 +729,9 @@ msgstr "Zamknutie alebo odomknutie aktívnych relácií"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Vyžaduje sa overenie totožnosti na uzamknutie alebo odomknutie aktívnych relácií."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na uzamknutie alebo odomknutie aktívnych "
+"relácií."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -627,8 +748,12 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "Umožnenie indikácie spustenia inštalačného rozhrania pre firmvér"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného rozhrania pre firmvér."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného "
+"rozhrania pre firmvér."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
@@ -636,8 +761,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:375
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného rozhrania pre firmvér."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného "
+"rozhrania pre firmvér."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
@@ -645,8 +774,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:386
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného rozhrania pre firmvér."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného "
+"rozhrania pre firmvér."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -671,7 +804,8 @@ msgstr "Prihlásenie do miestneho kontajneru"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Vyžaduje sa overenie totožnosti na prihlásenie do miestneho kontajneru."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na prihlásenie do miestneho kontajneru."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -702,7 +836,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74
@@ -718,7 +853,8 @@ msgid "Manage local virtual machines and containers"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:95
@@ -726,7 +862,9 @@ msgid "Manage local virtual machine and container images"
msgstr ""
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr ""
#: src/network/org.freedesktop.network1.policy:22
@@ -833,7 +971,9 @@ msgstr ""
#: src/network/org.freedesktop.network1.policy:122
#, fuzzy
msgid "Authentication is required to reset NTP settings."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej klávesnice."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej "
+"klávesnice."
#: src/network/org.freedesktop.network1.policy:132
msgid "Revert DNS settings"
@@ -842,7 +982,9 @@ msgstr ""
#: src/network/org.freedesktop.network1.policy:133
#, fuzzy
msgid "Authentication is required to reset DNS settings."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej klávesnice."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej "
+"klávesnice."
#: src/network/org.freedesktop.network1.policy:143
msgid "DHCP server sends force renew message"
@@ -869,7 +1011,8 @@ msgstr ""
#: src/network/org.freedesktop.network1.policy:166
#, fuzzy
msgid "Authentication is required to reload network settings."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
#: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface"
@@ -895,7 +1038,8 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
#, fuzzy
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr "Vyžaduje sa overenie totožnosti na nastavenie názvu hostiteľa."
#: src/portable/org.freedesktop.portable1.policy:34
@@ -904,7 +1048,8 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
#, fuzzy
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "Vyžaduje sa overenie totožnosti na vypnutie systému."
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -932,7 +1077,9 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:133
#, fuzzy
msgid "Authentication is required to reset name resolution settings."
-msgstr "Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej klávesnice."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej "
+"klávesnice."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -955,7 +1102,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -963,44 +1112,55 @@ msgid "Turn network time synchronization on or off"
msgstr "Zapnutie alebo vypnutie sieťovej synchronizácie času"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Vyžaduje sa overenie totožnosti na ovládanie, či má byť povolená synchronizácia času cez sieť."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na ovládanie, či má byť povolená "
+"synchronizácia času cez sieť."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
#, fuzzy
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "Vyžaduje sa overenie totožnosti na uspanie systému."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
diff --git a/po/sr.po b/po/sr.po
index 905ff6fd67..f7c7b04728 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -5,15 +5,17 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2021-02-23 22:40+0000\n"
"Last-Translator: Frantisek Sumsal <frantisek@sumsal.cz>\n"
-"Language-Team: Serbian <https://translate.fedoraproject.org/projects/systemd/master/sr/>\n"
+"Language-Team: Serbian <https://translate.fedoraproject.org/projects/systemd/"
+"master/sr/>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.4.2\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@@ -21,8 +23,10 @@ msgid "Send passphrase back to system"
msgstr "Пошаљи фразу назад ка систему"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Потребно је да се идентификујете да бисте послали фразу назад у систем."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Потребно је да се идентификујете да бисте послали фразу назад у систем."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -30,7 +34,9 @@ msgstr "Управљај системским услугама и другим
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Потребно је да се идентификујете да бисте управљали системским услугама или другим јединицама."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали системским услугама или "
+"другим јединицама."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -38,15 +44,21 @@ msgstr "Управљај системском услугом или једини
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Потребно је да се идентификујете да бисте управљали системском услугом или јединичним датотекама."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали системском услугом или "
+"јединичним датотекама."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Мењај променљиве окружења на систему и унутар управника услуга"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Потребно је да се идентификујете да бисте мењали променљиве окружења на систему и унутар управника услуга."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Потребно је да се идентификујете да бисте мењали променљиве окружења на "
+"систему и унутар управника услуга."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -54,7 +66,8 @@ msgstr "Поново учитај стање систем-деа"
#: src/core/org.freedesktop.systemd1.policy.in:65
msgid "Authentication is required to reload the systemd state."
-msgstr "Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
#: src/core/org.freedesktop.systemd1.policy.in:74
msgid "Dump the systemd state without rate limits"
@@ -62,8 +75,10 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -72,7 +87,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:14
#, fuzzy
msgid "Authentication is required to create a user's home area."
-msgstr "Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
@@ -81,7 +97,8 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:24
#, fuzzy
msgid "Authentication is required to remove a user's home area."
-msgstr "Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
@@ -89,8 +106,11 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:34
#, fuzzy
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Потребно је да се идентификујете да бисте управљали покренутим сесијама, корисницима и седиштима."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали покренутим сесијама, "
+"корисницима и седиштима."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -116,151 +136,182 @@ msgstr ""
#: src/home/org.freedesktop.home1.policy:64
#, fuzzy
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Потребно је да се идентификујете да бисте управљали покренутим сесијама, корисницима и седиштима."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали покренутим сесијама, "
+"корисницима и седиштима."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "Потребно је да се идентификујете да бисте закачили уређај на седиште."
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -277,8 +328,12 @@ msgid "Set static hostname"
msgstr "Постави статички назив машине"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Потребно је да се идентификујете да бисте поставили статички назив машине и да бисте поставили леп назив машине."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили статички назив машине и "
+"да бисте поставили леп назив машине."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -286,7 +341,9 @@ msgstr "Постави податке о машини"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Потребно је да се идентификујете да бисте поставили податке о локалној машини."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили податке о локалној "
+"машини."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -314,31 +371,56 @@ msgstr "Постави системску временску зону"
#: src/hostname/org.freedesktop.hostname1.policy:72
#, fuzzy
msgid "Authentication is required to get system description."
-msgstr "Потребно је да се идентификујете да бисте поставили системску временску зону."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили системску временску зону."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "Увези ВМ или слику контејнера"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Потребно је да се идентификујете да бисте увезли виртуелну машину или слику контејнера"
+#, fuzzy
+msgid "Authentication is required to import an image"
+msgstr ""
+"Потребно је да се идентификујете да бисте увезли виртуелну машину или слику "
+"контејнера"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "Извези ВМ или слику контејнера"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Потребно је да се идентификујете да бисте извезли виртуелну машину или слику контејнера"
+#, fuzzy
+msgid "Authentication is required to export disk image"
+msgstr ""
+"Потребно је да се идентификујете да бисте извезли виртуелну машину или слику "
+"контејнера"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "Преузми ВМ или слику контејнера"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Потребно је да се идентификујете да бисте преузели виртуелну машину или слику контејнера"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
+msgstr ""
+"Потребно је да се идентификујете да бисте преузели виртуелну машину или "
+"слику контејнера"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали покренутим сесијама, "
+"корисницима и седиштима."
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -346,7 +428,8 @@ msgstr "Постави основни језик система"
#: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale."
-msgstr "Потребно је да се идентификујете да бисте поставили основни језик система."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили основни језик система."
#: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings"
@@ -354,15 +437,20 @@ msgstr "Постави подешавање системске тастатур
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Потребно је да се идентификујете да бисте поставили подешавања системске тастатуре."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили подешавања системске "
+"тастатуре."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Дозволи програмима да спрече гашење система"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи гашење система."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"гашење система."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -370,7 +458,9 @@ msgstr "Дозволи програмима да одложе гашење си
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да одложи гашење система."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да одложи "
+"гашење система."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -378,7 +468,9 @@ msgstr "Дозволи програмима да спрече спавање с
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи спавање система."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"спавање система."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -386,55 +478,84 @@ msgstr "Дозволи програмима да одложе спавање с
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да одложи спавање система."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да одложи "
+"спавање система."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Дозволи програмима да спрече самосталну обуставу система"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи самосталну обуставу система."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"самосталну обуставу система."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Дозволи програмима да спрече систему управљање дугметом за напајање"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи систему управљање дугметом за напајање."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"систему управљање дугметом за напајање."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Дозволи програмима да спрече систему управљање дугметом за обуставу"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи систему управљање дугметом за обуставу."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"систему управљање дугметом за обуставу."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Дозволи програмима да спрече систему управљање дугметом за спавање"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи систему управљање дугметом за спавање."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"систему управљање дугметом за спавање."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Дозволи програмима да спрече систему да уради било шта приликом заклапања екрана"
+msgstr ""
+"Дозволи програмима да спрече систему да уради било шта приликом заклапања "
+"екрана"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи систему да уради било шта приликом заклапања екрана."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"систему да уради било шта приликом заклапања екрана."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Дозволи програмима да спрече систему управљање дугметом за поновно покретање"
+msgstr ""
+"Дозволи програмима да спрече систему управљање дугметом за поновно покретање"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Потребно је да се идентификујете да бисте дозволили програму да спречи систему управљање дугметом за поновно покретање."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Потребно је да се идентификујете да бисте дозволили програму да спречи "
+"систему управљање дугметом за поновно покретање."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -442,7 +563,9 @@ msgstr "Дозволи непријављеним корисницима да п
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Експлицитан захтев је потребан да бисте покретали програме као непријављен корисник."
+msgstr ""
+"Експлицитан захтев је потребан да бисте покретали програме као непријављен "
+"корисник."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -450,7 +573,9 @@ msgstr "Дозволи непријављеним корисницима да п
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Потребно је да се идентификујете да бисте покретали програме као непријављен корисник."
+msgstr ""
+"Потребно је да се идентификујете да бисте покретали програме као непријављен "
+"корисник."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -466,7 +591,9 @@ msgstr "Испери уређај да би уседиштио закачено"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Потребно је да се идентификујете да бисте поново подесили како се уређаји каче на седишта."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново подесили како се уређаји "
+"каче на седишта."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -481,16 +608,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Искључи систем док су други корисници пријављени"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Потребно је да се идентификујете да бисте искључили систем док су други корисници пријављени."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Потребно је да се идентификујете да бисте искључили систем док су други "
+"корисници пријављени."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Искључи систем иако је програм затражио да се спречи гашење"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Потребно је да се идентификујете да бисте искључили систем иако је програм затражио да се спречи гашење система."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Потребно је да се идентификујете да бисте искључили систем иако је програм "
+"затражио да се спречи гашење система."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -505,16 +640,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Поново покрени систем док су други корисници пријављени"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Потребно је да се идентификујете да бисте поново покренули систем док су други корисници пријављени."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново покренули систем док су "
+"други корисници пријављени."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Поново покрени систем иако је програм затражио да се спречи гашење"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Потребно је да се идентификујете да бисте поново покренули систем иако је програм затражио да се спречи гашење система."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново покренули систем иако је "
+"програм затражио да се спречи гашење система."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -529,16 +672,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Заустави систем док су други корисници пријављени"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Потребно је да се идентификујете да бисте зауставили систем док су други корисници пријављени."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Потребно је да се идентификујете да бисте зауставили систем док су други "
+"корисници пријављени."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Заустави систем иако програм тражи да се спречи заустављање"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Потребно је да се идентификујете да бисте обуставили систем иако је програм затражио да се спречи обустављање система."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Потребно је да се идентификујете да бисте обуставили систем иако је програм "
+"затражио да се спречи обустављање система."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -553,16 +704,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Обустави систем док су други корисници пријављени"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Потребно је да се идентификујете да бисте обуставили систем док су други корисници пријављени."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Потребно је да се идентификујете да бисте обуставили систем док су други "
+"корисници пријављени."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Обуставите систем иако програм тражи да се спречи обустава"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Потребно је да се идентификујете да бисте обуставили систем иако је програм затражио да се спречи обустава система."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Потребно је да се идентификујете да бисте обуставили систем иако је програм "
+"затражио да се спречи обустава система."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -577,16 +736,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Успавај систем док су други корисници пријављени"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Потребно је да се идентификујете да бисте успавали систем док су други корисници пријављени."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Потребно је да се идентификујете да бисте успавали систем док су други "
+"корисници пријављени."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Успавај систем иако је програм затражио да се спречи спавање"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Потребно је да се идентификујете да бисте успавали систем иако је програм затражио да се спречи успављивање система."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Потребно је да се идентификујете да бисте успавали систем иако је програм "
+"затражио да се спречи успављивање система."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -594,7 +761,9 @@ msgstr "Управљај покренутим сесијама, корисниц
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Потребно је да се идентификујете да бисте управљали покренутим сесијама, корисницима и седиштима."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали покренутим сесијама, "
+"корисницима и седиштима."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -602,7 +771,9 @@ msgstr "Закључај или откључај покренуте сесије
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Потребно је да се идентификујете да бисте закључавали или откључавали покренуте сесије."
+msgstr ""
+"Потребно је да се идентификујете да бисте закључавали или откључавали "
+"покренуте сесије."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -610,7 +781,9 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Потребно је да се идентификујете да бисте поставили \"разлог\" за поновно поретање унутар језгра."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили \"разлог\" за поновно "
+"поретање унутар језгра."
#: src/login/org.freedesktop.login1.policy:363
#, fuzzy
@@ -618,8 +791,12 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "Напомени фирмверу да се подигне у режиму подешавања интерфејса"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Потребно је да се идентификујете да бисте напоменули фирмверу да се подигне у режиму подешавања интерфејса."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Потребно је да се идентификујете да бисте напоменули фирмверу да се подигне "
+"у режиму подешавања интерфејса."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
@@ -627,8 +804,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:375
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Потребно је да се идентификујете да бисте напоменули фирмверу да се подигне у режиму подешавања интерфејса."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Потребно је да се идентификујете да бисте напоменули фирмверу да се подигне "
+"у режиму подешавања интерфејса."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
@@ -636,8 +817,12 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:386
#, fuzzy
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Потребно је да се идентификујете да бисте напоменули фирмверу да се подигне у режиму подешавања интерфејса."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Потребно је да се идентификујете да бисте напоменули фирмверу да се подигне "
+"у режиму подешавања интерфејса."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -662,7 +847,8 @@ msgstr "Пријави се у локални контејнер"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Потребно је да се идентификујете да бисте се пријавили у локални контејнер."
+msgstr ""
+"Потребно је да се идентификујете да бисте се пријавили у локални контејнер."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -670,7 +856,8 @@ msgstr "Пријави се у локалног домаћина"
#: src/machine/org.freedesktop.machine1.policy:33
msgid "Authentication is required to log into the local host."
-msgstr "Потребно је да се идентификујете да бисте се пријавили у локалног домаћина."
+msgstr ""
+"Потребно је да се идентификујете да бисте се пријавили у локалног домаћина."
#: src/machine/org.freedesktop.machine1.policy:42
msgid "Acquire a shell in a local container"
@@ -678,7 +865,9 @@ msgstr "Добиј приступ шкољци унутар локалног к
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Потребно је да се идентификујете да бисте добили приступ шкољци унутар локалног контејнера."
+msgstr ""
+"Потребно је да се идентификујете да бисте добили приступ шкољци унутар "
+"локалног контејнера."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -686,15 +875,20 @@ msgstr "Добиј приступ шкољци на локалном домаћ
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Потребно је да се идентификујете да бисте добили приступ шкољци на локалном домаћину."
+msgstr ""
+"Потребно је да се идентификујете да бисте добили приступ шкољци на локалном "
+"домаћину."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Добиј приступ псеудо писаћој машини унутар локалног контејнера"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Потребно је да се идентификујете да бисте добили приступ псеудо писаћој машини унутар локалног контејнера."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Потребно је да се идентификујете да бисте добили приступ псеудо писаћој "
+"машини унутар локалног контејнера."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -702,23 +896,32 @@ msgstr "Добиј приступ псеудо писаћој машини на
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Потребно је да се идентификујете да бисте добили приступ псеудо писаћој машини на локалном домаћину."
+msgstr ""
+"Потребно је да се идентификујете да бисте добили приступ псеудо писаћој "
+"машини на локалном домаћину."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Управљај локалним виртуелним машинама и контејнерима"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Потребно је да се идентификујете да бисте управљали локалним виртуелним машинама и контејнерима."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали локалним виртуелним "
+"машинама и контејнерима."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Управљај локалним виртуелним машинама и сликама контејнера"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Потребно је да се идентификујете да бисте управљали локалним виртуелним машинама и сликама контејнера."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Потребно је да се идентификујете да бисте управљали локалним виртуелним "
+"машинама и сликама контејнера."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -783,7 +986,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:89
#, fuzzy
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Потребно је да се идентификујете да бисте се пријавили у локалног домаћина."
+msgstr ""
+"Потребно је да се идентификујете да бисте се пријавили у локалног домаћина."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -816,7 +1020,8 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:122
#, fuzzy
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Потребно је да се идентификујете да бисте поставили основни језик система."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили основни језик система."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -861,7 +1066,8 @@ msgstr ""
#: src/network/org.freedesktop.network1.policy:166
#, fuzzy
msgid "Authentication is required to reload network settings."
-msgstr "Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново учитали стање систем-деа."
#: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface"
@@ -879,7 +1085,9 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:14
#, fuzzy
msgid "Authentication is required to inspect a portable service image."
-msgstr "Потребно је да се идентификујете да бисте увезли виртуелну машину или слику контејнера"
+msgstr ""
+"Потребно је да се идентификујете да бисте увезли виртуелну машину или слику "
+"контејнера"
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
@@ -887,7 +1095,8 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:24
#, fuzzy
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr "Потребно је да се идентификујете да бисте закачили уређај на седиште."
#: src/portable/org.freedesktop.portable1.policy:34
@@ -896,8 +1105,11 @@ msgstr ""
#: src/portable/org.freedesktop.portable1.policy:35
#, fuzzy
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Потребно је да се идентификујете да бисте преузели виртуелну машину или слику контејнера"
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Потребно је да се идентификујете да бисте преузели виртуелну машину или "
+"слику контејнера"
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -913,7 +1125,8 @@ msgstr "Укини регистрацију DNS-SD услуге"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Потребно је да се идентификујете да бисте укинули регистрацију DNS-SD услуге"
+msgstr ""
+"Потребно је да се идентификујете да бисте укинули регистрацију DNS-SD услуге"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -922,7 +1135,9 @@ msgstr ""
#: src/resolve/org.freedesktop.resolve1.policy:133
#, fuzzy
msgid "Authentication is required to reset name resolution settings."
-msgstr "Потребно је да се идентификујете да бисте поставили подешавања системске тастатуре."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили подешавања системске "
+"тастатуре."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -938,71 +1153,99 @@ msgstr "Постави системску временску зону"
#: src/timedate/org.freedesktop.timedate1.policy:34
msgid "Authentication is required to set the system timezone."
-msgstr "Потребно је да се идентификујете да бисте поставили системску временску зону."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили системску временску зону."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
-msgstr "Постави часовник реалног времена на локалну временску зону или UTC зону"
+msgstr ""
+"Постави часовник реалног времена на локалну временску зону или UTC зону"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Потребно је да се идентификујете да бисте подесили да ли RTC чува локално или UTC време."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Потребно је да се идентификујете да бисте подесили да ли RTC чува локално "
+"или UTC време."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Укључи или искључи усклађивање времена са мреже"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Потребно је да се идентификујете да бисте подесили да ли се време усклађује са мреже."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Потребно је да се идентификујете да бисте подесили да ли се време усклађује "
+"са мреже."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Потребно је да се идентификујете да бисте покренули „$(unit)“."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Потребно је да се идентификујете да бисте зауставили „$(unit)“."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Потребно је да се идентификујете да бисте поново учитали „$(unit)“."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Потребно је да се идентификујете да бисте поново покренули „$(unit)“."
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
#, fuzzy
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Потребно је да се идентификујете да бисте поставили својства за „$(unit)“."
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили својства за „$(unit)“."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Потребно је да се идентификујете да бисте поново поставили „неуспешно“ стање за „$(unit)“."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново поставили „неуспешно“ стање "
+"за „$(unit)“."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Потребно је да се идентификујете да бисте поставили својства за „$(unit)“."
+msgstr ""
+"Потребно је да се идентификујете да бисте поставили својства за „$(unit)“."
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
#, fuzzy
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Потребно је да се идентификујете да бисте поново поставили „неуспешно“ стање за „$(unit)“."
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново поставили „неуспешно“ стање "
+"за „$(unit)“."
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
#, fuzzy
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Потребно је да се идентификујете да бисте поново поставили „неуспешно“ стање за „$(unit)“."
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Потребно је да се идентификујете да бисте поново поставили „неуспешно“ стање "
+"за „$(unit)“."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Потребно је да се идентификујете да бисте зауставили систем иако програм тражи да се спречи заустављање система."
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Потребно је да се идентификујете да бисте зауставили систем иако програм "
+#~ "тражи да се спречи заустављање система."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Потребно је да се идентификујете да бисте убили „$(unit)“."
#~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
-#~ msgstr "Притисните Ctrl+C да бисте прекинули све текуће провере система датотека"
+#~ msgstr ""
+#~ "Притисните Ctrl+C да бисте прекинули све текуће провере система датотека"
#~ msgid "Checking in progress on %d disk (%3.1f%% complete)"
#~ msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
diff --git a/po/sv.po b/po/sv.po
index 7ec3abcd60..fe894bc1ad 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -4,31 +4,34 @@
# Sebastian Rasmussen <sebras@gmail.com>, 2015.
# Andreas Henriksson <andreas@fatal.se>, 2016.
# Josef Andersson <l10nl18nsweja@gmail.com>, 2015, 2017.
-# Göran Uddeborg <goeran@uddeborg.se>, 2020, 2021.
+# Göran Uddeborg <goeran@uddeborg.se>, 2020, 2021, 2024.
# Luna Jernberg <bittin@reimu.nl>, 2020, 2023.
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2022, 2024.
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
-"PO-Revision-Date: 2024-02-03 10:36+0000\n"
-"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
+"PO-Revision-Date: 2024-03-05 21:36+0000\n"
+"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <https://translate.fedoraproject.org/projects/systemd/"
-"master/sv/>\n"
+"main/sv/>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.3.1\n"
+"X-Generator: Weblate 5.4\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system"
msgstr "Skicka tillbaka lösenfras till system"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
-msgstr "Autentisering krävs för att skicka tillbaka den angivna lösenfrasen till systemet."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Autentisering krävs för att skicka tillbaka den angivna lösenfrasen till "
+"systemet."
#: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units"
@@ -36,7 +39,8 @@ msgstr "Hantera systemtjänster eller andra enheter"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Autentisering krävs för att hantera systemtjänster eller andra enheter."
+msgstr ""
+"Autentisering krävs för att hantera systemtjänster eller andra enheter."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -51,8 +55,12 @@ msgid "Set or unset system and service manager environment variables"
msgstr "Ställ in eller ta bort miljövariabler för system- och servicehanterare"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Autentisering krävs för att ställa in eller ta bort miljövariabler för system- och servicehanterare."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Autentisering krävs för att ställa in eller ta bort miljövariabler för "
+"system- och servicehanterare."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -67,8 +75,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Dumpa systemets tillstånd utan hastighetsbegränsningar"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Autentisering krävs för att dumpa systemtillståndet utan hastighetsbegränsningar."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Autentisering krävs för att dumpa systemtillståndet utan "
+"hastighetsbegränsningar."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -91,8 +102,10 @@ msgid "Check credentials of a home area"
msgstr "Kontrollera kreditiven för en hemarea"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Autentisering krävs för att kontrollera kreditiven mot en användares hemarea."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Autentisering krävs för att kontrollera kreditiven mot en användares hemarea."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -115,154 +128,195 @@ msgid "Change password of a home area"
msgstr "Ändra lösenord för en hemarea"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Autentisering krävs för att ändra lösenordet för en användares hemarea."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Autentisering krävs för att ändra lösenordet för en användares hemarea."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr "Förhindra automatiskt lås av en hemarea"
+
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Autentisering krävs för att förhindra automatiskt lås av en användares "
+"hemarea."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr "Aktivera en hemarea"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr "Autentisering krävs för att aktivera en användares hemarea."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
"Hem för användaren %s är för närvarande inte tillgängligt, vänligen koppla "
"in nödvändiga lagringsenheter eller säkerhetskopieringsfilsystem."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr "För ofta inloggningsförsök från användare %s, försök igen senare."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Lösenord: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Lösenordet är felaktigt eller inte tillräckligt för autentisering av användare %s."
+msgstr ""
+"Lösenordet är felaktigt eller inte tillräckligt för autentisering av "
+"användare %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Tyvärr, försök igen: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Återställningsnyckel: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Lösenord/återställningsnyckel är felaktig eller inte tillräcklig för autentisering av användare %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Lösenord/återställningsnyckel är felaktig eller inte tillräcklig för "
+"autentisering av användare %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Tyvärr, ange återställningsnyckel igen: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Säkerhetstoken för användare %s har inte kopplats in."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Prova igen med lösenord: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Lösenordet är felaktigt eller inte tillräckligt, och konfigurerad säkerhetstoken för användare %s har inte kopplats in."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Lösenordet är felaktigt eller inte tillräckligt, och konfigurerad "
+"säkerhetstoken för användare %s har inte kopplats in."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "Säkerhetstoken-PIN: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "Vänligen autentisera fysiskt på säkerhetstoken för användare %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Vänligen bekräfta närvaro på säkerhetstoken för användare %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Vänligen verifiera användare på säkerhetstoken för användare %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "PIN-kod för säkerhetstoken är låst. Lås upp den först. (Tips: Det kan räcka med borttagning och återinsättning.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"PIN-kod för säkerhetstoken är låst. Lås upp den först. (Tips: Det kan räcka "
+"med borttagning och återinsättning.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Felaktig PIN-kod för säkerhetstoken för användare %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Tyvärr, försök igen med PIN-kod för säkerhetstoken: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "Säkerhetstoken-PIN för användare %s är felaktig (bara några försök kvar!)"
+msgstr ""
+"Säkerhetstoken-PIN för användare %s är felaktig (bara några försök kvar!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "Säkerhetstoken-PIN för användare %s är felaktig (endast ett försök kvar!)"
+msgstr ""
+"Säkerhetstoken-PIN för användare %s är felaktig (endast ett försök kvar!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "Hem för användare %s är för närvarande inte aktivt, vänligen logga in lokalt först."
+msgstr ""
+"Hem för användare %s är för närvarande inte aktivt, vänligen logga in lokalt "
+"först."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
"Hem för användare %s är för närvarande låst, vänligen lås upp lokalt först."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "För många misslyckade inloggningsförsök för användare %s, vägrar."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Användarposten är blockerad, vilket förbjuder åtkomst."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Användarposten är inte giltig ännu, vilket förbjuder åtkomst."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Användarposten är inte längre giltig, vilket förbjuder åtkomst."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Användarposten är inte giltig, förbjuder åtkomst."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "För många inloggningsförsök, försök igen om %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Lösenordsbyte krävs."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Lösenordet har löpt ut, byte av lösenord krävs."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "Lösenordet har löpt ut, men kan inte ändras, vägrar inloggning."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Lösenordet upphör snart, vänligen byt."
@@ -279,8 +333,12 @@ msgid "Set static hostname"
msgstr "Ange statiskt värdnamn"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Autentisering krävs för att ställa in det statiskt konfigurerade lokala värdnamnet såväl som det stiliga värdnamnet."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Autentisering krävs för att ställa in det statiskt konfigurerade lokala "
+"värdnamnet såväl som det stiliga värdnamnet."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -315,28 +373,38 @@ msgid "Authentication is required to get system description."
msgstr "Autentisering krävs för att hämta systemets beskrivning."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "Importera en VM eller behållaravbildning"
+msgid "Import a disk image"
+msgstr "Importera en diskavbild"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Autentisering krävs för att importera en VM eller behållaravbildning"
+msgid "Authentication is required to import an image"
+msgstr "Autentisering krävs för att importera en avbild"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "Exportera en VM eller behållaravbildning"
+msgid "Export a disk image"
+msgstr "Exportera en diskavbild"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Autentisering krävs för att exportera en VM eller behållaravbildning"
+msgid "Authentication is required to export disk image"
+msgstr "Autentisering krävs för att exportera en diskavbild"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "Hämta ner en VM eller behållaravbildning"
+msgid "Download a disk image"
+msgstr "Hämta en diskavbild"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Autentisering krävs för att hämta ner en VM eller behållaravbildning"
+msgid "Authentication is required to download a disk image"
+msgstr "Autentisering krävs för att hämta en diskavbild"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr "Avbryt överföringen av en diskavbild"
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Autentisering krävs för att avbryta en pågående överföring av en diskavbild"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -352,15 +420,18 @@ msgstr "Ange systeminställningar för tangentbord"
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Autentisering krävs för att ställa in systeminställningar för tangentbord."
+msgstr ""
+"Autentisering krävs för att ställa in systeminställningar för tangentbord."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Tillåt program att hindra systemavstängning"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Autentisering krävs för att tillåta ett program att hindra systemavstängning."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra systemavstängning."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -368,7 +439,9 @@ msgstr "Tillåt program att fördröja systemavstängning"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Autentisering krävs för att tillåta ett program att fördröja systemavstängning."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att fördröja "
+"systemavstängning."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -376,7 +449,9 @@ msgstr "Tillåt program att hindra system att försättas i viloläge"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Autentisering krävs för att tillåta ett program att hindra ett system att försättas i viloläge."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra ett system att "
+"försättas i viloläge."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -384,55 +459,81 @@ msgstr "Tillåt program att fördröja att system försätts i viloläge"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Autentisering krävs för att tillåta ett program att fördröja ett system att försättas i viloläge."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att fördröja ett system att "
+"försättas i viloläge."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
msgstr "Tillåt program att hindra automatiskt systemvänteläge"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Autentisering krävs för att tillåta ett program att hindra automatiskt systemvänteläge."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra automatiskt "
+"systemvänteläge."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Tillåt program att hindra systemhantering av strömknappen"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Autentisering krävs för att tillåta ett program att hindra systemhantering av strömknappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra systemhantering "
+"av strömknappen."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "Tillåt program att hindra systemhantering av väntelägesknappen"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Autentisering krävs för att tillåta ett program att hindra systemhantering av väntelägesknappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra systemhantering "
+"av väntelägesknappen."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "Tillåt program att hindra systemhantering av vilolägesknappen"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Autentisering krävs för att tillåta ett program att hindra systemhantering av vilolägesknappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra systemhantering "
+"av vilolägesknappen."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "Tillåt program att hindra systemhantering av växel för datorhölje"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Autentisering krävs för att tillåta ett program att hindra systemhantering av brytaren för datorhöljet."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra systemhantering "
+"av brytaren för datorhöljet."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "Tillåt program att hindra systemhantering av omstartsknappen"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Autentisering krävs för att tillåta ett program att hindra systemhantering av omstartsknappen."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Autentisering krävs för att tillåta ett program att hindra systemhantering "
+"av omstartsknappen."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -440,7 +541,8 @@ msgstr "Tillåt ej inloggad användare att köra program"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Uttrycklig begäran krävs för att köra program som en icke inloggad användare."
+msgstr ""
+"Uttrycklig begäran krävs för att köra program som en icke inloggad användare."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -448,7 +550,8 @@ msgstr "Tillåt ej inloggade användare att köra program"
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Autentisering krävs för att köra program som en icke inloggad användare."
+msgstr ""
+"Autentisering krävs för att köra program som en icke inloggad användare."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -464,7 +567,8 @@ msgstr "Töm bindningar för enhet-till-plats"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Autentisering krävs för att återställa hur enheter är bundna till platser."
+msgstr ""
+"Autentisering krävs för att återställa hur enheter är bundna till platser."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -479,16 +583,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Stäng av systemet medan andra användare är inloggade"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Autentisering krävs för att stänga av systemet medan andra användare är inloggade."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Autentisering krävs för att stänga av systemet medan andra användare är "
+"inloggade."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Stäng av systemet även då ett program hindrar det"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Autentisering krävs för att stänga av systemet även då ett program hindrar det."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentisering krävs för att stänga av systemet även då ett program hindrar "
+"det."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -503,16 +615,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Starta om systemet medan andra användare är inloggade"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Autentisering krävs för att starta om systemet medan andra användare är inloggade."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Autentisering krävs för att starta om systemet medan andra användare är "
+"inloggade."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Starta om systemet även då ett program hindrar det"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Autentisering krävs för att starta om systemet även då ett program hindrar det."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentisering krävs för att starta om systemet även då ett program hindrar "
+"det."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -527,16 +647,23 @@ msgid "Halt the system while other users are logged in"
msgstr "Stoppa systemet medan andra användare är inloggade"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Autentisering krävs för att stoppa systemet medan andra användare är inloggade."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Autentisering krävs för att stoppa systemet medan andra användare är "
+"inloggade."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Stoppa systemet även då ett program hindrar det"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Autentisering krävs för att stoppa systemet även då ett program hindrar det."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentisering krävs för att stoppa systemet även då ett program hindrar det."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -551,16 +678,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Försätt systemet i vänteläge medan andra användare är inloggade"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Autentisering krävs för att försätta systemet i vänteläge medan andra användare är inloggade."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Autentisering krävs för att försätta systemet i vänteläge medan andra "
+"användare är inloggade."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Försätt systemet i vänteläge även då ett program hindrar det"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Autentisering krävs för att försätta systemet i sovläge även då ett program hindrar det."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentisering krävs för att försätta systemet i sovläge även då ett program "
+"hindrar det."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -575,16 +710,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Försätt systemet i viloläge medan andra användare är inloggade"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Autentisering krävs för att försätta systemet i viloläge medan andra användare är inloggade."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Autentisering krävs för att försätta systemet i viloläge medan andra "
+"användare är inloggade."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Försätt systemet i viloläge även då ett program hindrar det"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Autentisering krävs för att försätta systemet i viloläge även då ett program hindrar det."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Autentisering krävs för att försätta systemet i viloläge även då ett program "
+"hindrar det."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -592,7 +735,8 @@ msgstr "Hantera aktiva sessioner, användare och platser"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Autentisering krävs för att hantera aktiva sessioner, användare och platser."
+msgstr ""
+"Autentisering krävs för att hantera aktiva sessioner, användare och platser."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -612,27 +756,41 @@ msgstr "Autentisering krävs för att ställa in ”orsaken” för omstart i k
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "Indikera till den fasta programvaran att starta upp till inställningsgränssnittet"
+msgstr ""
+"Indikera till den fasta programvaran att starta upp till "
+"inställningsgränssnittet"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Autentisering krävs för att indikera till den fasta programvaran att starta upp till inställningsgränssnitt."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Autentisering krävs för att indikera till den fasta programvaran att starta "
+"upp till inställningsgränssnitt."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indikera till startprogrammet att starta upp i uppstartsladdmenyn"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Autentisering krävs för att indikera till uppstartsladdaren att starta upp uppstartsladdmenyn."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Autentisering krävs för att indikera till uppstartsladdaren att starta upp "
+"uppstartsladdmenyn."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indikera till uppstartsladdaren att starta en specifik post"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Autentisering krävs för att indikera till uppstartsladdaren att starta upp till en specifik uppstartsladdspost."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Autentisering krävs för att indikera till uppstartsladdaren att starta upp "
+"till en specifik uppstartsladdspost."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -672,7 +830,8 @@ msgstr "Förvärva en kommandotolk i en lokal behållare"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Autentisering krävs för att förvärva en kommandotolk i en lokal behållare."
+msgstr ""
+"Autentisering krävs för att förvärva en kommandotolk i en lokal behållare."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -680,15 +839,18 @@ msgstr "Förvärva en kommandotolk på den lokala värden"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Autentisering krävs för att förvärva en kommandotolk på den lokala värden."
+msgstr ""
+"Autentisering krävs för att förvärva en kommandotolk på den lokala värden."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Förvärva en pseudo TTY i en lokal behållare"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Autentisering krävs för att förvärva en pseudo TTY i en lokal behållare."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Autentisering krävs för att förvärva en pseudo TTY i en lokal behållare."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -696,23 +858,30 @@ msgstr "Förvärva en pseudo TTY på den lokala värden"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Autentisering krävs för att förvärva en pseudo TTY på den lokala värden."
+msgstr ""
+"Autentisering krävs för att förvärva en pseudo TTY på den lokala värden."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Hantera lokala virtuella maskiner och behållare"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Autentisering krävs för att hantera lokala virtuella maskiner och behållare."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Autentisering krävs för att hantera lokala virtuella maskiner och behållare."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Hantera lokala virtuella maskin- och behållaravbildningar"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Autentisering krävs för att hantera lokala virtuella maskin- och behållaravbildningar."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Autentisering krävs för att hantera lokala virtuella maskin- och "
+"behållaravbildningar."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -863,16 +1032,21 @@ msgid "Attach or detach a portable service image"
msgstr "Koppla in eller koppla ifrån en portabel tjänsteavbild"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Autentisering krävs för att koppla in eller koppla ifrån en portabel tjänsteavbild."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Autentisering krävs för att koppla in eller koppla ifrån en portabel "
+"tjänsteavbild."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Radera eller modifiera en portabel tjänsteavbild"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Autentisering krävs för att radera eller modifiera en portabel tjänsteavbild."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Autentisering krävs för att radera eller modifiera en portabel tjänsteavbild."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -916,58 +1090,84 @@ msgstr "Autentisering krävs för att ställa in systemets tidszon."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
-msgstr "Sätt realtidsklocka (RTC) till lokal tidszon eller koordinerad universell tid (UTC)"
+msgstr ""
+"Sätt realtidsklocka (RTC) till lokal tidszon eller koordinerad universell "
+"tid (UTC)"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Autentisering krävs för att kunna kontrollera huruvida realtidsklockan (RTC) lagrar den lokala eller koordinerade universella tiden (UTC)."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Autentisering krävs för att kunna kontrollera huruvida realtidsklockan (RTC) "
+"lagrar den lokala eller koordinerade universella tiden (UTC)."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Växla synkronisering av nätverkstid på och av"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Autentisering krävs för att kontrollera huruvida synkronisering av nätverkstid ska vara aktiverat."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Autentisering krävs för att kontrollera huruvida synkronisering av "
+"nätverkstid ska vara aktiverat."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Autentisering krävs för att starta \"$(unit)\"."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Autentisering krävs för att stoppa \"$(unit)\"."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Autentisering krävs för att läsa om \"$(unit)\"."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Autentisering krävs för att starta om \"$(unit)\"."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Autentisering krävs för att skicka en UNIX-signal till processerna i ”$(unit)”."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Autentisering krävs för att skicka en UNIX-signal till processerna i "
+"”$(unit)”."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Autentisering krävs för att återställa det \"fallerade\" tillståndet för \"$(unit)\"."
+msgstr ""
+"Autentisering krävs för att återställa det \"fallerade\" tillståndet för "
+"\"$(unit)\"."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Autentisering krävs för att ställa in egenskaper på \"$(unit)\"."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Autentisering krävs för att radera filer och kataloger associerade med ”$(unit)”."
-
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Autentisering krävs för att frysa eller töa processerna i enheten ”$(unit)”."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Autentisering krävs för att radera filer och kataloger associerade med "
+"”$(unit)”."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Autentisering krävs för att stoppa systemet även då ett program hindrar det."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Autentisering krävs för att frysa eller töa processerna i enheten ”$(unit)”."
+
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Autentisering krävs för att stoppa systemet även då ett program hindrar "
+#~ "det."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "Autentisering krävs för att döda \"$(unit)\"."
diff --git a/po/systemd.pot b/po/systemd.pot
index 367efb68b3..b56ed0b019 100644
--- a/po/systemd.pot
+++ b/po/systemd.pot
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: systemd\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -116,156 +116,173 @@ msgid ""
"Authentication is required to change the password of a user's home area."
msgstr ""
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+
+#: src/home/pam_systemd_home.c:293
#, c-format
msgid ""
"Home of user %s is currently absent, please plug in the necessary storage "
"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr ""
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
msgid ""
"Password/recovery key incorrect or not sufficient for authentication of user "
"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
msgid ""
"Password incorrect or not sufficient, and configured security token of user "
"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
+#: src/home/pam_systemd_home.c:429
msgid ""
"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -320,27 +337,36 @@ msgid "Authentication is required to get system description."
msgstr ""
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+msgid "Import a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+msgid "Authentication is required to import an image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+msgid "Export a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+msgid "Authentication is required to export disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+msgid "Download a disk image"
msgstr ""
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+msgid "Authentication is required to download a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
msgstr ""
#: src/locale/org.freedesktop.locale1.policy:22
@@ -984,43 +1010,43 @@ msgid ""
"shall be enabled."
msgstr ""
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:553
+#: src/core/dbus-unit.c:549
msgid ""
"Authentication is required to send a UNIX signal to the processes of "
"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:716
+#: src/core/dbus-unit.c:704
msgid ""
"Authentication is required to delete files and directories associated with "
"'$(unit)'."
msgstr ""
-#: src/core/dbus-unit.c:764
+#: src/core/dbus-unit.c:743
msgid ""
"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 966e449f5f..44f3009e0f 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -5,28 +5,29 @@
# Gökhan Gurbetoğlu <ggurbet@gmail.com>, 2015.
# Oğuz Ersen <oguzersen@protonmail.com>, 2020.
# Muhammet Kara <muhammetk@gmail.com>, 2015-2020.
-# Oğuz Ersen <oguz@ersen.moe>, 2022, 2023.
+# Oğuz Ersen <oguz@ersen.moe>, 2022, 2023, 2024.
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
-"PO-Revision-Date: 2023-12-11 13:43+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
+"PO-Revision-Date: 2024-03-04 16:32+0000\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
"Language-Team: Turkish <https://translate.fedoraproject.org/projects/systemd/"
-"master/tr/>\n"
+"main/tr/>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.2.1\n"
+"X-Generator: Weblate 5.4\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system"
msgstr "Sisteme parolayı geri gönder"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Sisteme parolayı geri göndermek kimlik doğrulaması gerektiriyor."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -35,7 +36,9 @@ msgstr "Sistem hizmetlerini veya diğer birimlerini yönet"
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Sistem hizmetlerini veya diğer birimlerini yönetmek kimlik doğrulaması gerektiriyor."
+msgstr ""
+"Sistem hizmetlerini veya diğer birimlerini yönetmek kimlik doğrulaması "
+"gerektiriyor."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -43,15 +46,21 @@ msgstr "Sistem hizmetlerini veya birim dosyalarını yönet"
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Sistem hizmetlerini veya birim dosyalarını yönetmek kimlik doğrulaması gerektiriyor."
+msgstr ""
+"Sistem hizmetlerini veya birim dosyalarını yönetmek kimlik doğrulaması "
+"gerektiriyor."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
msgstr "Sistem ve hizmet yöneticisi ortam değişkenlerini ayarla ya da kaldır"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Sistem ve hizmet yöneticisi ortam değişkenlerini ayarlamak ya da kaldırmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Sistem ve hizmet yöneticisi ortam değişkenlerini ayarlamak ya da kaldırmak "
+"kimlik doğrulaması gerektiriyor."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -66,8 +75,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "systemd durumunu hız sınırlamaları olmadan dök"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "systemd durumunu hız sınırlamaları olmadan dökmek kimlik doğrulaması gerektirir."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"systemd durumunu hız sınırlamaları olmadan dökmek kimlik doğrulaması "
+"gerektirir."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -90,8 +102,11 @@ msgid "Check credentials of a home area"
msgstr "Bir ev alanının kimlik bilgilerini denetle"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Bir kullanıcının ev alanının kimlik bilgilerini denetlemek için kimlik doğrulaması gerekir."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Bir kullanıcının ev alanının kimlik bilgilerini denetlemek için kimlik "
+"doğrulaması gerekir."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -107,180 +122,213 @@ msgstr "Ev alanını yeniden boyutlandır"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Bir kullanıcının ev alanını yeniden boyutlandırmak kimlik doğrulaması gerektirir."
+msgstr ""
+"Bir kullanıcının ev alanını yeniden boyutlandırmak kimlik doğrulaması "
+"gerektirir."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Ev alanının parolasını değiştir"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Bir kullanıcının ev alanının parolasını değiştirmek kimlik doğrulaması gerektirir."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Bir kullanıcının ev alanının parolasını değiştirmek kimlik doğrulaması "
+"gerektirir."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr "Bir ev alanının otomatik kilitlenmesini engelle"
+
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Bir kullanıcının ev alanının otomatik kilitlenmesini engellemek kimlik "
+"doğrulaması gerektirir."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr "Bir ev alanını etkinleştir"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr ""
+"Bir kullanıcının ev alanını etkinleştirmek kimlik doğrulaması gerektirir."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
"%s kullanıcısının ev dizini şu anda mevcut değil, lütfen gerekli depolama "
"aygıtını veya içeren dosya sistemini bağlayın."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
"%s kullanıcısı için çok sık oturum açma denemesi, daha sonra tekrar deneyin."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Parola: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
"Parola yanlış veya %s kullanıcısının kimlik doğrulaması için yeterli değil."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Üzgünüm, tekrar deneyin: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Kurtarma anahtarı: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
"Parola/kurtarma anahtarı yanlış veya %s kullanıcısının kimlik doğrulaması "
"için yeterli değil."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Üzgünüm, kurtarma anahtarını yeniden girin: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "%s kullanıcısının güvenlik belirteci girilmedi."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Parola ile tekrar deneyin: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
"Parola yanlış veya yeterli değil ve %s kullanıcısının yapılandırılan "
"güvenlik belirteci girilmedi."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "Güvenlik belirteci PIN kodu: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
"Lütfen %s kullanıcısının güvenlik belirteci ile fiziksel olarak kimlik "
"doğrulaması yapın."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Lütfen %s kullanıcısının güvenlik belirtecinin varlığını doğrulayın."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
"Lütfen %s kullanıcısının güvenlik belirtecindeki kullanıcıyı doğrulayın."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
"Güvenlik belirteci PIN kodu kilitli, lütfen önce kilidini açın. (İpucu: "
"Çıkarma ve yeniden takma yeterli olabilir.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Güvenlik belirteci PIN kodu %s kullanıcısı için yanlış."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Üzgünüm, güvenlik belirteci PIN kodunu yeniden deneyin: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
"%s kullanıcısının güvenlik belirteci PIN kodu yanlış (sadece birkaç deneme "
"kaldı!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
"%s kullanıcısının güvenlik belirteci PIN kodu yanlış (sadece bir deneme "
"kaldı!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
"%s kullanıcısının ev dizini şu anda etkin değil, lütfen önce yerel olarak "
"oturum açın."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
"%s kullanıcısının ev dizini şu anda kilitli, lütfen önce yerel olarak "
"kilidini açın."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
"%s kullanıcısı için çok fazla başarısız oturum açma denemesi, reddediliyor."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Kullanıcı kaydı engellendi, erişim engelleniyor."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Kullanıcı kaydı henüz geçerli değil, erişim engelleniyor."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Kullanıcı kaydı artık geçerli değil, erişim engelleniyor."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Kullanıcı kaydı geçerli değil, erişim engelleniyor."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Çok fazla oturum açıldı, %s içinde tekrar deneyin."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Parola değişikliği gerekli."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Parolanın süresi doldu, değiştirilmesi gerekiyor."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "Parolanın süresi doldu ama değiştirilemiyor, oturum açma reddediliyor."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Parolanın süresi yakında dolacak, lütfen değiştirin."
@@ -297,8 +345,12 @@ msgid "Set static hostname"
msgstr "Statik makine adı ayarla"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Statik olarak yapılandırılmış yerel (ana) makine adını ve okunaklı (ana) makine adını ayarlamak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Statik olarak yapılandırılmış yerel (ana) makine adını ve okunaklı (ana) "
+"makine adını ayarlamak kimlik doğrulaması gerektiriyor."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -333,28 +385,39 @@ msgid "Authentication is required to get system description."
msgstr "Sistem açıklamasını almak kimlik doğrulaması gerektiriyor."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "Bir SM ya da kapsayıcı kalıbını içe aktar"
+msgid "Import a disk image"
+msgstr "Bir disk kalıbını içe aktar"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Bir SM ya da kapsayıcı kalıbını içe aktarmak için kimlik doğrulaması gereklidir"
+msgid "Authentication is required to import an image"
+msgstr "Bir kalıbı içe aktarmak için kimlik doğrulaması gereklidir"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "Bir SM ya da kapsayıcı kalıbını dışa aktar"
+msgid "Export a disk image"
+msgstr "Bir disk kalıbını dışa aktar"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Bir SM ya da kapsayıcı kalıbını dışa aktarmak için kimlik doğrulaması gereklidir"
+msgid "Authentication is required to export disk image"
+msgstr "Bir disk kalıbını dışa aktarmak için kimlik doğrulaması gereklidir"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "Bir SM ya da kapsayıcı kalıbını indir"
+msgid "Download a disk image"
+msgstr "Bir disk kalıbını indir"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Bir SM ya da kapsayıcı kalıbını indirmek için kimlik doğrulaması gereklidir"
+msgid "Authentication is required to download a disk image"
+msgstr "Bir disk kalıbını indirmek için kimlik doğrulaması gereklidir"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr "Bir disk kalıbının aktarımını iptal et"
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr ""
+"Devam eden bir disk kalıbı aktarımını iptal etmek için kimlik doğrulama "
+"gereklidir"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -377,8 +440,11 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "Uygulamaların sistemin kapanmasına engel olmasına izin ver"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Bir uygulamanın sistemin kapanmasına engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Bir uygulamanın sistemin kapanmasına engel olması için kimlik doğrulaması "
+"gereklidir."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -386,7 +452,9 @@ msgstr "Uygulamaların sistemin kapanmasını ertelemesine izin ver"
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Bir uygulamanın sistemin kapanmasını ertelemesi için kimlik doğrulaması gereklidir."
+msgstr ""
+"Bir uygulamanın sistemin kapanmasını ertelemesi için kimlik doğrulaması "
+"gereklidir."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -394,7 +462,9 @@ msgstr "Uygulamaların sistemin uykuya geçmesini engellemesine izin ver"
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Bir uygulamanın sistemin uykuya geçmesine engel olması için kimlik doğrulaması gereklidir."
+msgstr ""
+"Bir uygulamanın sistemin uykuya geçmesine engel olması için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -402,55 +472,89 @@ msgstr "Uygulamaların sistemin uykuya geçmesini ertelemesine izin ver"
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Bir uygulamanın sistemin uykuya geçmesini ertelemesi için kimlik doğrulaması gereklidir."
+msgstr ""
+"Bir uygulamanın sistemin uykuya geçmesini ertelemesi için kimlik doğrulaması "
+"gereklidir."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Uygulamaların sistemin otomatik olarak askıya alınmasını engellemesine izin ver"
+msgstr ""
+"Uygulamaların sistemin otomatik olarak askıya alınmasını engellemesine izin "
+"ver"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Bir uygulamanın sistemin otomatik olarak askıya alınmasına engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Bir uygulamanın sistemin otomatik olarak askıya alınmasına engel olması için "
+"kimlik doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
msgstr "Uygulamaların sistemin güç tuşunun kullanımını engellemesine izin ver"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Bir uygulamanın sistemin güç tuşunu idare etmesine engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Bir uygulamanın sistemin güç tuşunu idare etmesine engel olması için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Uygulamaların sistemin beklet tuşunun kullanımını engellemesine izin ver"
+msgstr ""
+"Uygulamaların sistemin beklet tuşunun kullanımını engellemesine izin ver"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Bir uygulamanın sistemin askıya alma tuşunu idare etmesine engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Bir uygulamanın sistemin askıya alma tuşunu idare etmesine engel olması için "
+"kimlik doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Uygulamaların sistemin hazırda bekletme tuşunun kullanımını engellemesine izin ver"
+msgstr ""
+"Uygulamaların sistemin hazırda bekletme tuşunun kullanımını engellemesine "
+"izin ver"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Bir uygulamanın sistemin hazırda bekletme tuşunu idare etmesine engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Bir uygulamanın sistemin hazırda bekletme tuşunu idare etmesine engel olması "
+"için kimlik doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Uygulamaların sistemin kapak anahtarının kullanımını engellemesine izin ver"
+msgstr ""
+"Uygulamaların sistemin kapak anahtarının kullanımını engellemesine izin ver"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Bir uygulamanın sistemin kapak anahtarını idare etmesine engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Bir uygulamanın sistemin kapak anahtarını idare etmesine engel olması için "
+"kimlik doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Uygulamaların sistemin yeniden başlatma tuşunun kullanımını engellemesine izin ver"
+msgstr ""
+"Uygulamaların sistemin yeniden başlatma tuşunun kullanımını engellemesine "
+"izin ver"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Bir uygulamanın sistemin yeniden başlatma tuşunu idare etmesine engel olması için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Bir uygulamanın sistemin yeniden başlatma tuşunu idare etmesine engel olması "
+"için kimlik doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -458,7 +562,9 @@ msgstr "Oturum açmamış kullanıcının program çalıştırmasına izin ver"
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Oturum açmamış bir kullanıcı olarak program çalıştırmak için açıkça istekte bulunulması gerekir."
+msgstr ""
+"Oturum açmamış bir kullanıcı olarak program çalıştırmak için açıkça istekte "
+"bulunulması gerekir."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -466,7 +572,9 @@ msgstr "Oturum açmamış kullanıcıların program çalıştırmasına izin ver
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Oturum açmamış bir kullanıcı olarak program çalıştırmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"Oturum açmamış bir kullanıcı olarak program çalıştırmak için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -474,7 +582,8 @@ msgstr "Aygıtların yuvaya takılmasına izin ver"
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Bir aygıtın yuvaya takılmasına izin vermek kimlik doğrulaması gerektiriyor."
+msgstr ""
+"Bir aygıtın yuvaya takılmasına izin vermek kimlik doğrulaması gerektiriyor."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -482,7 +591,9 @@ msgstr "Aygıtın yuvaya eklenmesini sıfırla"
#: src/login/org.freedesktop.login1.policy:160
msgid "Authentication is required to reset how devices are attached to seats."
-msgstr "Aygıtların yuvalara nasıl takıldığını sıfırlamak kimlik doğrulama gerektiriyor."
+msgstr ""
+"Aygıtların yuvalara nasıl takıldığını sıfırlamak kimlik doğrulama "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system"
@@ -497,16 +608,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Diğer kullanıcılar oturum açmışken sistemi kapat"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Diğer kullanıcılar oturum açmışken sistemi kapatmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Diğer kullanıcılar oturum açmışken sistemi kapatmak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Bir uygulama engellenmesini isterken sistemi kapat"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Bir uygulama engellenmesini isterken sistemi kapatmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Bir uygulama engellenmesini isterken sistemi kapatmak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -521,16 +640,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Diğer kullanıcılar oturum açmışken sistemi yeniden başlat"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Diğer kullanıcılar oturum açmışken sistemi yeniden başlatmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Diğer kullanıcılar oturum açmışken sistemi yeniden başlatmak kimlik "
+"doğrulaması gerektiriyor."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Bir uygulama engellenmesini isterken sistemi yeniden başlat"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Bir uygulama engellenmesini isterken sistemi yeniden başlatmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Bir uygulama engellenmesini isterken sistemi yeniden başlatmak kimlik "
+"doğrulaması gerektiriyor."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -545,16 +672,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Diğer kullanıcılar oturum açmışken sistemi durdur"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Diğer kullanıcılar oturum açmışken sistemi durdurmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Diğer kullanıcılar oturum açmışken sistemi durdurmak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Bir uygulama engellenmesini isterken sistemi durdur"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Bir uygulama engellenmesini isterken sistemi durdurmak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Bir uygulama engellenmesini isterken sistemi durdurmak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -569,16 +704,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Diğer kullanıcılar oturum açmışken sistemi askıya al"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Diğer kullanıcılar oturum açmışken sistemi askıya almak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Diğer kullanıcılar oturum açmışken sistemi askıya almak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Bir uygulama engellenmesini isterken sistemi askıya al"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Bir uygulama engellenmesini isterken sistemi askıya almak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Bir uygulama engellenmesini isterken sistemi askıya almak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -593,16 +736,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Diğer kullanıcılar oturum açmışken sistemi hazırda beklet"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Diğer kullanıcılar oturum açmışken sistemi hazırda bekletmek kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Diğer kullanıcılar oturum açmışken sistemi hazırda bekletmek kimlik "
+"doğrulaması gerektiriyor."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Bir uygulama engellenmesini isterken sistemi hazırda beklet"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Bir uygulama engellenmesini isterken sistemi hazırda bekletmek kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Bir uygulama engellenmesini isterken sistemi hazırda bekletmek kimlik "
+"doğrulaması gerektiriyor."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -610,7 +761,9 @@ msgstr "Aktif oturumları, kullanıcıları ve yuvaları yönet"
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Aktif oturumları, kullanıcıları ve yuvaları yönetmek için kimlik doğrulaması gereklidir."
+msgstr ""
+"Aktif oturumları, kullanıcıları ve yuvaları yönetmek için kimlik doğrulaması "
+"gereklidir."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -618,7 +771,9 @@ msgstr "Aktif oturumları kilitle ya da kilidini aç"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Aktif oturumları kilitlemek ve bunların kilidini açmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"Aktif oturumları kilitlemek ve bunların kilidini açmak için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -626,31 +781,45 @@ msgstr "Çekirdekte yeniden başlatma \"nedenini\" ayarla"
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Çekirdekte yeniden başlatma \"nedenini\" ayarlamak kimlik doğrulaması gerektiriyor."
+msgstr ""
+"Çekirdekte yeniden başlatma \"nedenini\" ayarlamak kimlik doğrulaması "
+"gerektiriyor."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Ürün yazılımına kurulum arayüzüne önyükleme yapmasını belirt"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Kurulum arayüzünü önyüklemek için ürün yazılımının belirtilmesi için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Kurulum arayüzünü önyüklemek için ürün yazılımının belirtilmesi için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Önyükleyiciye önyükleyici menüsünü başlatmasını belirt"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Önyükleyiciye önyükleyici menüsünü başlatmasını belirtmek için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Önyükleyiciye önyükleyici menüsünü başlatmasını belirtmek için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Önyükleyiciye belirli bir girdiye önyükleme yapmasını belirt"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Önyükleyiciye belirli bir girdiye önyükleme yapmasını belirtmek için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Önyükleyiciye belirli bir girdiye önyükleme yapmasını belirtmek için kimlik "
+"doğrulaması gereklidir."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -690,7 +859,8 @@ msgstr "Yerel kapsayıcıda kabuk (shell) aç"
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Yerel kapsayıcıda kabuk (shell) açmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"Yerel kapsayıcıda kabuk (shell) açmak için kimlik doğrulaması gereklidir."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -698,15 +868,19 @@ msgstr "Yerel (ana) makinede kabuk (shell) aç"
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Yerel (ana) makinede kabuk (shell) açmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"Yerel (ana) makinede kabuk (shell) açmak için kimlik doğrulaması gereklidir."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Yerel kapsayıcıda sözde (pseudo) TTY al"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Yerel kapsayıcıda sözde (pseudo) TTY almak için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Yerel kapsayıcıda sözde (pseudo) TTY almak için kimlik doğrulaması "
+"gereklidir."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -714,23 +888,32 @@ msgstr "Yerel (ana) makinede sözde (pseudo) TTY al"
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Yerel (ana) makinede sözde (pseudo) TTY almak için kimlik doğrulaması gereklidir."
+msgstr ""
+"Yerel (ana) makinede sözde (pseudo) TTY almak için kimlik doğrulaması "
+"gereklidir."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Yerel sanal makineleri ve kapsayıcıları yönet"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Yerel sanal makineleri ve kapsayıcıları yönetmek için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Yerel sanal makineleri ve kapsayıcıları yönetmek için kimlik doğrulaması "
+"gereklidir."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Yerel sanal makine ve kapsayıcı kalıplarını yönet"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Yerel sanal makineler ve kapsayıcı kalıplarını yönetmek için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Yerel sanal makineler ve kapsayıcı kalıplarını yönetmek için kimlik "
+"doğrulaması gereklidir."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -778,7 +961,9 @@ msgstr "LLMNR etkinleştir/devre dışı bırak"
#: src/network/org.freedesktop.network1.policy:67
#: src/resolve/org.freedesktop.resolve1.policy:78
msgid "Authentication is required to enable or disable LLMNR."
-msgstr "LLMNR etkinleştirmek veya devre dışı bırakmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"LLMNR etkinleştirmek veya devre dışı bırakmak için kimlik doğrulaması "
+"gereklidir."
#: src/network/org.freedesktop.network1.policy:77
#: src/resolve/org.freedesktop.resolve1.policy:88
@@ -788,7 +973,9 @@ msgstr "Çoklu yayın DNS'i etkinleştir/devre dışı bırak"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Çoklu yayın DNS'i etkinleştirmek veya devre dışı bırakmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"Çoklu yayın DNS'i etkinleştirmek veya devre dışı bırakmak için kimlik "
+"doğrulaması gereklidir."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -798,7 +985,9 @@ msgstr "TLS üzerinden DNS'i etkinleştir/devre dışı bırak"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "TLS üzerinden DNS'i etkinleştirmek veya devre dışı bırakmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"TLS üzerinden DNS'i etkinleştirmek veya devre dışı bırakmak için kimlik "
+"doğrulaması gereklidir."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
@@ -808,7 +997,9 @@ msgstr "DNSSEC etkinleştir/devre dışı bırak"
#: src/network/org.freedesktop.network1.policy:100
#: src/resolve/org.freedesktop.resolve1.policy:111
msgid "Authentication is required to enable or disable DNSSEC."
-msgstr "DNSSEC etkinleştirmek veya devre dışı bırakmak için kimlik doğrulaması gereklidir."
+msgstr ""
+"DNSSEC etkinleştirmek veya devre dışı bırakmak için kimlik doğrulaması "
+"gereklidir."
#: src/network/org.freedesktop.network1.policy:110
#: src/resolve/org.freedesktop.resolve1.policy:121
@@ -818,7 +1009,9 @@ msgstr "DNSSEC Negatif Güven Bağlantılarını Ayarla"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "DNSSEC Negatif Güven Bağlantılarını ayarlamak için kimlik doğrulaması gereklidir."
+msgstr ""
+"DNSSEC Negatif Güven Bağlantılarını ayarlamak için kimlik doğrulaması "
+"gereklidir."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -874,23 +1067,30 @@ msgstr "Bir taşınabilir hizmet kalıbını incele"
#: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image."
-msgstr "Bir taşınabilir hizmet kalıbını incelemek için kimlik doğrulaması gereklidir."
+msgstr ""
+"Bir taşınabilir hizmet kalıbını incelemek için kimlik doğrulaması gereklidir."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
msgstr "Bir taşınabilir hizmet kalıbını tuttur ya da ayır"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Bir taşınabilir hizmet kalıbını tutturmak ya da ayırmak için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Bir taşınabilir hizmet kalıbını tutturmak ya da ayırmak için kimlik "
+"doğrulaması gereklidir."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Taşınabilir hizmet kalıbını sil ya da değiştir"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Taşınabilir hizmet kalıbını silmek ya da değiştirmek için kimlik doğrulaması gereklidir."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Taşınabilir hizmet kalıbını silmek ya da değiştirmek için kimlik doğrulaması "
+"gereklidir."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -906,7 +1106,8 @@ msgstr "Bir DNS-SD hizmetinin kaydını sil"
#: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "Bir DNS-SD hizmetinin kaydını silmek için kimlik doğrulaması gereklidir"
+msgstr ""
+"Bir DNS-SD hizmetinin kaydını silmek için kimlik doğrulaması gereklidir"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
@@ -937,55 +1138,80 @@ msgid "Set RTC to local timezone or UTC"
msgstr "Gerçek zamanlı saat olarak yerel zaman dilimini veya UTC'yi ayarla"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Gerçek zamanlı saat olarak yerel zaman dilimini veya UTC'yi ayarlamak kimlik doğrulaması gerektiriyor."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Gerçek zamanlı saat olarak yerel zaman dilimini veya UTC'yi ayarlamak kimlik "
+"doğrulaması gerektiriyor."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Ağ zaman eş zamanlamasını aç veya kapat"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "Ağ zaman eş zamanlamasını denetlemek kimlik doğrulaması gerektiriyor."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "'$(unit)' başlatmak için kimlik doğrulaması gereklidir."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "'$(unit)' durdurmak için kimlik doğrulaması gereklidir."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "'$(unit)' yeniden yüklemek için kimlik doğrulaması gereklidir."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "'$(unit)' yeniden başlatmak için kimlik doğrulaması gereklidir."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "'$(unit)' süreçlerine bir UNIX sinyali göndermek için kimlik doğrulaması gereklidir."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"'$(unit)' süreçlerine bir UNIX sinyali göndermek için kimlik doğrulaması "
+"gereklidir."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "'$(unit)'in \"failed\" (başarısız) durumunu sıfırlamak için kimlik doğrulaması gereklidir."
+msgstr ""
+"'$(unit)'in \"failed\" (başarısız) durumunu sıfırlamak için kimlik "
+"doğrulaması gereklidir."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "'$(unit)' üzerindeki özellikleri ayarlamak için kimlik doğrulaması gereklidir."
-
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "'$(unit)' ile ilişkili dosyaları ve dizinleri silmek için kimlik doğrulaması gereklidir."
+msgstr ""
+"'$(unit)' üzerindeki özellikleri ayarlamak için kimlik doğrulaması "
+"gereklidir."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "'$(unit)' biriminin işlemlerini dondurmak veya devam ettirmek için kimlik doğrulaması gereklidir."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"'$(unit)' ile ilişkili dosyaları ve dizinleri silmek için kimlik doğrulaması "
+"gereklidir."
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
-#~ msgstr "Bir uygulama engellenmesini isterken sistemi durdurmak kimlik doğrulaması gerektiriyor."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"'$(unit)' biriminin işlemlerini dondurmak veya devam ettirmek için kimlik "
+"doğrulaması gereklidir."
+
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
+#~ msgstr ""
+#~ "Bir uygulama engellenmesini isterken sistemi durdurmak kimlik doğrulaması "
+#~ "gerektiriyor."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "'$(unit)' sonlandırmak için kimlik doğrulaması gereklidir."
diff --git a/po/uk.po b/po/uk.po
index 2ad708d003..19f18839b8 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -3,27 +3,30 @@
# Ukrainian translation for systemd.
# Eugene Melnik <jeka7js@gmail.com>, 2014.
# Daniel Korostil <ted.korostiled@gmail.com>, 2014, 2016, 2018.
-# Yuri Chornoivan <yurchor@ukr.net>, 2019, 2020, 2021, 2022, 2023.
+# Yuri Chornoivan <yurchor@ukr.net>, 2019, 2020, 2021, 2022, 2023, 2024.
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
-"PO-Revision-Date: 2023-07-14 11:47+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
+"PO-Revision-Date: 2024-03-05 21:36+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
-"Language-Team: Ukrainian <https://translate.fedoraproject.org/projects/systemd/master/uk/>\n"
+"Language-Team: Ukrainian <https://translate.fedoraproject.org/projects/"
+"systemd/main/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.18.2\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 5.4\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system"
msgstr "Надсилання пароля назад у систему"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "Для надсилання введеного пароля до системи слід пройти розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -32,7 +35,9 @@ msgstr "Керування системними службами й іншими
#: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units."
-msgstr "Для керування системними службами й іншими одиницями systemd слід пройти розпізнавання."
+msgstr ""
+"Для керування системними службами й іншими одиницями systemd слід пройти "
+"розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files"
@@ -40,15 +45,23 @@ msgstr "Керування системними службами й одиниц
#: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files."
-msgstr "Для керування системними службами й одиницями systemd слід пройти розпізнавання."
+msgstr ""
+"Для керування системними службами й одиницями systemd слід пройти "
+"розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables"
-msgstr "Встановлення і скасування встановлення змінних середовища для керування службами і системою"
+msgstr ""
+"Встановлення і скасування встановлення змінних середовища для керування "
+"службами і системою"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
-msgstr "Для встановлення або скасовування встановлення змінних середовища для керування службами і системою слід пройти розпізнавання."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Для встановлення або скасовування встановлення змінних середовища для "
+"керування службами і системою слід пройти розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state"
@@ -63,8 +76,11 @@ msgid "Dump the systemd state without rate limits"
msgstr "Створювати дампи стану systemd без обмежень частоти"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
-msgstr "Для створення дампів стану systemd без обмеження частоти слід пройти розпізнавання."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
+msgstr ""
+"Для створення дампів стану systemd без обмеження частоти слід пройти "
+"розпізнавання."
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
@@ -87,8 +103,11 @@ msgid "Check credentials of a home area"
msgstr "Перевірка реєстраційних даних для доступу до домашньої теки"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
-msgstr "Для перевірки реєстраційних даних для доступу до домашньої теки користувача слід пройти розпізнавання."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Для перевірки реєстраційних даних для доступу до домашньої теки користувача "
+"слід пройти розпізнавання."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
@@ -104,158 +123,212 @@ msgstr "Зміна розмірів домашньої теки"
#: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area."
-msgstr "Для зміни розмірів домашньої теки користувача слід пройти розпізнавання."
+msgstr ""
+"Для зміни розмірів домашньої теки користувача слід пройти розпізнавання."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
msgstr "Зміна пароля до домашньої теки"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
-msgstr "Для зміни пароля для доступу до домашньої теки користувача слід пройти розпізнавання."
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Для зміни пароля для доступу до домашньої теки користувача слід пройти "
+"розпізнавання."
+
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr "Заборонити автоматичне блокування області домівки"
+
+#: src/home/org.freedesktop.home1.policy:74
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr ""
+"Для заборони автоматичного блокування області домівки користувача слід "
+"пройти розпізнавання."
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:83
+msgid "Activate a home area"
+msgstr "Активація області домівки"
+
+#: src/home/org.freedesktop.home1.policy:84
+msgid "Authentication is required to activate a user's home area."
+msgstr "Для активації області домівки користувача слід пройти розпізнавання."
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
-msgstr "Доступ до домашнього каталогу користувача %s зараз немає, будь ласка, з'єднайте з комп'ютером відповідний пристрій зберігання даних або резервну файлову систему."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
+msgstr ""
+"Доступ до домашнього каталогу користувача %s зараз немає, будь ласка, "
+"з'єднайте з комп'ютером відповідний пристрій зберігання даних або резервну "
+"файлову систему."
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
-msgstr "Надто часті спроби увійти до системи з боку користувача %s, повторіть спробу пізніше."
+msgstr ""
+"Надто часті спроби увійти до системи з боку користувача %s, повторіть спробу "
+"пізніше."
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "Пароль: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
-msgstr "Неправильно вказано пароль або пароля недостатньо для розпізнавання користувача %s."
+msgstr ""
+"Неправильно вказано пароль або пароля недостатньо для розпізнавання "
+"користувача %s."
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "Вибачте, повторіть спробу: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "Ключ відновлення: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
-msgstr "Неправильно вказано пароль або пароля недостатньо для розпізнавання користувача %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
+msgstr ""
+"Неправильно вказано пароль або пароля недостатньо для розпізнавання "
+"користувача %s."
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "Вибачте, ще раз введіть ключ відновлення: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "Не вставлено жетон безпеки користувача %s."
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "Повторіть спробу з паролем: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
-msgstr "Пароль введено неправильно або пароля недостатньо, а налаштований жетон безпеки користувача %s не вставлено."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
+msgstr ""
+"Пароль введено неправильно або пароля недостатньо, а налаштований жетон "
+"безпеки користувача %s не вставлено."
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "PIN-код жетона безпеки: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
-msgstr "Будь ласка, виконайте фізичне розпізнавання на жетоні безпеки користувача %s."
+msgstr ""
+"Будь ласка, виконайте фізичне розпізнавання на жетоні безпеки користувача %s."
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "Будь ласка, підтвердьте наявність жетона безпеки користувача %s."
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "Будь ласка, перевірте користувача на жетоні безпеки користувача %s."
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "PIN-код жетона захисту заблоковано. Будь ласка, спочатку зніміть його блокування. (Підказка: іноді досить вийняти і знову вставити жетон.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"PIN-код жетона захисту заблоковано. Будь ласка, спочатку зніміть його "
+"блокування. (Підказка: іноді досить вийняти і знову вставити жетон.)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "Помилковий PIN-код жетона захисту для користувача %s."
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "Вибачте, повторіть введення PIN-коду жетона безпеки: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
-msgstr "Помилковий PIN-код жетона безпеки користувача %s (лишилося лише декілька спроб!)"
+msgstr ""
+"Помилковий PIN-код жетона безпеки користувача %s (лишилося лише декілька "
+"спроб!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
-msgstr "Помилковий PIN-код жетона безпеки користувача %s (лишилася одна спроба!)"
+msgstr ""
+"Помилковий PIN-код жетона безпеки користувача %s (лишилася одна спроба!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
-msgstr "Домашня тека користувача %s є неактивною. Будь ласка, виконайте спочатку локальний вхід до системи."
+msgstr ""
+"Домашня тека користувача %s є неактивною. Будь ласка, виконайте спочатку "
+"локальний вхід до системи."
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
-msgstr "Зараз домашню теку користувача %s заблоковано. Будь ласка, спочатку розблокуйте її."
+msgstr ""
+"Зараз домашню теку користувача %s заблоковано. Будь ласка, спочатку "
+"розблокуйте її."
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
-msgstr "Забагато неуспішних спроб увійти з боку користувача %s. У доступі відмовлено."
+msgstr ""
+"Забагато неуспішних спроб увійти з боку користувача %s. У доступі відмовлено."
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "Запис користувача заблоковано. Забороняємо доступ."
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "Запис користувача ще не набув чинності, забороняємо доступ."
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "Запис користувача вже втратив чинність, забороняємо доступ."
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "Запис користувача не є чинним, забороняємо доступ."
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "Забагато спроб увійти. Повторіть спробу за %s."
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "Потрібна зміна пароля."
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "Строк дії пароля вичерпано. Потрібна зміна."
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
-msgstr "Строк дії пароля вичерпано, але його неможливо змінити. Забороняємо вхід."
+msgstr ""
+"Строк дії пароля вичерпано, але його неможливо змінити. Забороняємо вхід."
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "Строк дії пароля невдовзі буде вичерпано. Будь ласка, змініть його."
@@ -272,8 +345,12 @@ msgid "Set static hostname"
msgstr "Встановлення статичної назви вузла"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
-msgstr "Для встановлення статично налаштованої назви локального вузла і форматованої назви слід пройти розпізнавання."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Для встановлення статично налаштованої назви локального вузла і форматованої "
+"назви слід пройти розпізнавання."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
@@ -281,7 +358,8 @@ msgstr "Встановлення даних щодо машини"
#: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information."
-msgstr "Для встановлення даних щодо локальної машини слід пройти розпізнавання."
+msgstr ""
+"Для встановлення даних щодо локальної машини слід пройти розпізнавання."
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
@@ -308,28 +386,37 @@ msgid "Authentication is required to get system description."
msgstr "Для отримання опису системи слід пройти розпізнавання."
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
-msgstr "Імпортування образу контейнера або віртуальної машини"
+msgid "Import a disk image"
+msgstr "Імпортування образу диска"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
-msgstr "Для імпортування образу контейнера або віртуальної машини слід пройти розпізнавання"
+msgid "Authentication is required to import an image"
+msgstr "Для імпортування образу диска слід пройти розпізнавання"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
-msgstr "Експортування образу контейнера або віртуальної машини"
+msgid "Export a disk image"
+msgstr "Експортування образу диска"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
-msgstr "Для експортування образу контейнера або віртуальної машини слід пройти розпізнавання"
+msgid "Authentication is required to export disk image"
+msgstr "Для експортування образу диска слід пройти розпізнавання"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
-msgstr "Отримання образу контейнера або віртуальної машини"
+msgid "Download a disk image"
+msgstr "Отримання образу диска"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
-msgstr "Для отримання образу контейнера або віртуальної машини слід пройти розпізнавання"
+msgid "Authentication is required to download a disk image"
+msgstr "Для отримання образу диска слід пройти розпізнавання"
+
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr "Скасування передавання образу диска"
+
+#: src/import/org.freedesktop.import1.policy:53
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "Для скасування передавання образу диска слід пройти розпізнавання"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
@@ -345,15 +432,20 @@ msgstr "Визначення загальносистемних параметр
#: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings."
-msgstr "Для визначення загальносистемних параметрів клавіатури слід пройти розпізнавання."
+msgstr ""
+"Для визначення загальносистемних параметрів клавіатури слід пройти "
+"розпізнавання."
#: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown"
msgstr "Уможливлення перешкоджання вимкненню системи програмами"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
-msgstr "Для того, щоб уможливити програмам перешкоджання вимкненню системи, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Для того, щоб уможливити програмам перешкоджання вимкненню системи, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown"
@@ -361,7 +453,9 @@ msgstr "Уможливлення затримки вимкнення систе
#: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown."
-msgstr "Для того, щоб уможливити програмам затримання вимкнення системи, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб уможливити програмам затримання вимкнення системи, слід пройти "
+"розпізнавання."
#: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep"
@@ -369,7 +463,9 @@ msgstr "Уможливлення перешкоджання присиплянн
#: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep."
-msgstr "Для того, щоб уможливити програмам перешкоджання присиплянню системи, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб уможливити програмам перешкоджання присиплянню системи, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep"
@@ -377,55 +473,88 @@ msgstr "Уможливлення затримання присипляння с
#: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep."
-msgstr "Для того, щоб уможливити програмам затримання присипляння системи, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб уможливити програмам затримання присипляння системи, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend"
-msgstr "Уможливлення перешкоджання автоматичному призупиненню системи програмами"
+msgstr ""
+"Уможливлення перешкоджання автоматичному призупиненню системи програмами"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
-msgstr "Для того, щоб уможливити програмам перешкоджання автоматичне призупинення роботи системи, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Для того, щоб уможливити програмам перешкоджання автоматичне призупинення "
+"роботи системи, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key"
-msgstr "Уможливлення перешкоджання обробці системою клавіші живлення для програм"
+msgstr ""
+"Уможливлення перешкоджання обробці системою клавіші живлення для програм"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
-msgstr "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші живлення, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
+"живлення, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key"
-msgstr "Уможливлення перешкоджання обробці системою клавіші призупинення для програм"
+msgstr ""
+"Уможливлення перешкоджання обробці системою клавіші призупинення для програм"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
-msgstr "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші призупинення, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
+"призупинення, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key"
-msgstr "Уможливлення перешкоджання обробці системою клавіші присипляння для програм"
+msgstr ""
+"Уможливлення перешкоджання обробці системою клавіші присипляння для програм"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
-msgstr "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші присипляння, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
+"присипляння, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch"
-msgstr "Уможливлення перешкоджання обробці системою перемикання кришки для програм"
+msgstr ""
+"Уможливлення перешкоджання обробці системою перемикання кришки для програм"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
-msgstr "Для того, щоб дозволити програмам перешкоджати обробленню системою перемикання кришки, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Для того, щоб дозволити програмам перешкоджати обробленню системою "
+"перемикання кришки, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "Уможливлення перешкоджання обробці системою клавіші перезавантаження для програм"
+msgstr ""
+"Уможливлення перешкоджання обробці системою клавіші перезавантаження для "
+"програм"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
-msgstr "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші перезавантаження, слід пройти розпізнавання."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
+"перезавантаження, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs"
@@ -433,7 +562,9 @@ msgstr "Дозвіл для незареєстрованого користув
#: src/login/org.freedesktop.login1.policy:129
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "Для того, щоб дозволити незареєстрованому користувачеві запускати програми, потрібен явний запит."
+msgstr ""
+"Для того, щоб дозволити незареєстрованому користувачеві запускати програми, "
+"потрібен явний запит."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
@@ -441,7 +572,9 @@ msgstr "Дозвіл для незареєстрованих користува
#: src/login/org.freedesktop.login1.policy:139
msgid "Authentication is required to run programs as a non-logged-in user."
-msgstr "Для того, щоб дозволити незареєстрованому користувачеві запускати програми, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб дозволити незареєстрованому користувачеві запускати програми, "
+"слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:148
msgid "Allow attaching devices to seats"
@@ -449,7 +582,8 @@ msgstr "Дозвіл на під'єднання пристроїв до місц
#: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to attach a device to a seat."
-msgstr "Для того, щоб під'єднувати пристрої до місць, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб під'єднувати пристрої до місць, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:159
msgid "Flush device to seat attachments"
@@ -472,16 +606,24 @@ msgid "Power off the system while other users are logged in"
msgstr "Вимикання системи, коли інші користувачі ще у ній"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
-msgstr "Для вимикання системи, коли у ній ще працюють інші користувачі, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Для вимикання системи, коли у ній ще працюють інші користувачі, слід пройти "
+"розпізнавання."
#: src/login/org.freedesktop.login1.policy:191
msgid "Power off the system while an application is inhibiting this"
msgstr "Вимикання системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
-msgstr "Для того, щоб вимкнути систему, коли програми намагаються перешкодити цьому, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для того, щоб вимкнути систему, коли програми намагаються перешкодити цьому, "
+"слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system"
@@ -496,16 +638,24 @@ msgid "Reboot the system while other users are logged in"
msgstr "Перезавантаження, якщо інші користувачі в системі"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
-msgstr "Для перезавантаження системи, коли у ній ще працюють інші користувачі, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Для перезавантаження системи, коли у ній ще працюють інші користувачі, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:224
msgid "Reboot the system while an application is inhibiting this"
msgstr "Перезапуск системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
-msgstr "Для того, щоб перезавантажити систему, коли програми намагаються перешкодити цьому, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для того, щоб перезавантажити систему, коли програми намагаються перешкодити "
+"цьому, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system"
@@ -520,16 +670,24 @@ msgid "Halt the system while other users are logged in"
msgstr "Зупинення системи, коли інші користувачі в ній"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
-msgstr "Для зупинення системи, коли у ній ще працюють інші користувачі, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Для зупинення системи, коли у ній ще працюють інші користувачі, слід пройти "
+"розпізнавання."
#: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this"
msgstr "Зупинення системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
-msgstr "Для того, щоб зупинити систему, коли програми намагаються перешкодити цьому, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для того, щоб зупинити систему, коли програми намагаються перешкодити цьому, "
+"слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
@@ -544,16 +702,24 @@ msgid "Suspend the system while other users are logged in"
msgstr "Призупинення системи, коли інші користувачі в ній"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
-msgstr "Для призупинення системи, коли у ній ще працюють інші користувачі, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Для призупинення системи, коли у ній ще працюють інші користувачі, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this"
msgstr "Призупинення системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
-msgstr "Для того, щоб призупинити систему, коли програми намагаються перешкодити цьому, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для того, щоб призупинити систему, коли програми намагаються перешкодити "
+"цьому, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system"
@@ -568,16 +734,24 @@ msgid "Hibernate the system while other users are logged in"
msgstr "Присипляння системи, коли інші користувачі в ній"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
-msgstr "Для присипляння системи, коли у ній ще працюють інші користувачі, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Для присипляння системи, коли у ній ще працюють інші користувачі, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this"
msgstr "Присипляння системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
-msgstr "Для того, щоб приспати систему, коли програми намагаються перешкодити цьому, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Для того, щоб приспати систему, коли програми намагаються перешкодити цьому, "
+"слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats"
@@ -585,7 +759,9 @@ msgstr "Керування сеансами, користувачами і ро
#: src/login/org.freedesktop.login1.policy:333
msgid "Authentication is required to manage active sessions, users and seats."
-msgstr "Для того, щоб керувати сеансами, користувачами і робочими місцями, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб керувати сеансами, користувачами і робочими місцями, слід "
+"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:342
msgid "Lock or unlock active sessions"
@@ -593,7 +769,9 @@ msgstr "Блокування і розблоковування сеансів"
#: src/login/org.freedesktop.login1.policy:343
msgid "Authentication is required to lock or unlock active sessions."
-msgstr "Для того, щоб заблокувати або розблокувати активні сеанси, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб заблокувати або розблокувати активні сеанси, слід пройти "
+"розпізнавання."
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
@@ -601,31 +779,45 @@ msgstr "Встановлення «причини» перезавантажен
#: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "Для того, щоб встановити «причину» перезавантаження у ядрі, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб встановити «причину» перезавантаження у ядрі, слід пройти "
+"розпізнавання."
#: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface"
msgstr "Визначення для мікрокоду завантаження інтерфейсу встановлення"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
-msgstr "Для того, щоб дозволити мікрокоду визначати, чи завантажувати інтерфейс встановлення, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Для того, щоб дозволити мікрокоду визначати, чи завантажувати інтерфейс "
+"встановлення, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Визначення для завантажувача завантаження до меню завантажувача"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
-msgstr "Для того, щоб вказати завантажувачу, що слід завантажитися до меню завантажувача, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Для того, щоб вказати завантажувачу, що слід завантажитися до меню "
+"завантажувача, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Визначення для завантажувача певного пункту для завантаження"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
-msgstr "Для того, щоб вказати завантажувачу, що слід завантажити певний пункт меню завантаження, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Для того, щоб вказати завантажувачу, що слід завантажити певний пункт меню "
+"завантаження, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
@@ -649,7 +841,8 @@ msgstr "Вхід до локального контейнера"
#: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container."
-msgstr "Для того, щоб увійти до локального контейнера, слід пройти розпізнавання."
+msgstr ""
+"Для того, щоб увійти до локального контейнера, слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host"
@@ -665,7 +858,9 @@ msgstr "Отримання командної оболонки у локальн
#: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Для отримання командної оболонки у локальному контейнері слід пройти розпізнавання."
+msgstr ""
+"Для отримання командної оболонки у локальному контейнері слід пройти "
+"розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host"
@@ -673,15 +868,19 @@ msgstr "Отримання командної оболонки на локаль
#: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Для отримання командної оболонки на локальному вузлі слід пройти розпізнавання."
+msgstr ""
+"Для отримання командної оболонки на локальному вузлі слід пройти "
+"розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container"
msgstr "Отримання псевдо-TTY у локальному контейнері"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Для отримання псевдо-TTY в локальному контейнері слід пройти розпізнавання."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Для отримання псевдо-TTY в локальному контейнері слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host"
@@ -689,23 +888,31 @@ msgstr "Отримання псевдо-TTY на локальному вузлі
#: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Для отримання псевдо-TTY на локальному вузлі слід пройти розпізнавання."
+msgstr ""
+"Для отримання псевдо-TTY на локальному вузлі слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers"
msgstr "Керування локальними віртуальними машинами і контейнерами"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
-msgstr "Для доступу до керування локальними віртуальними машинами і контейнерами слід пройти розпізнавання."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Для доступу до керування локальними віртуальними машинами і контейнерами "
+"слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images"
msgstr "Керування локальними образами віртуальних машин і контейнерів"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
-msgstr "Для доступу до керування локальними образами віртуальних машин і контейнерів слід пройти розпізнавання."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Для доступу до керування локальними образами віртуальних машин і контейнерів "
+"слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
@@ -763,7 +970,8 @@ msgstr "Вмикання або вимикання трансляційної DN
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "Для вмикання або вимикання трансляційної DNS слід пройти розпізнавання."
+msgstr ""
+"Для вмикання або вимикання трансляційної DNS слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
@@ -793,7 +1001,8 @@ msgstr "Встановлення прив'язок від'ємної довір
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "Для встановлення прив'язки від'ємної довіри DNSSEC слід пройти розпізнавання."
+msgstr ""
+"Для встановлення прив'язки від'ємної довіри DNSSEC слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
@@ -817,7 +1026,9 @@ msgstr "Сервер DHCP надсилає повідомлення щодо п
#: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message."
-msgstr "Для надсилання повідомлення щодо примусового оновлення слід пройти розпізнавання."
+msgstr ""
+"Для надсилання повідомлення щодо примусового оновлення слід пройти "
+"розпізнавання."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
@@ -856,16 +1067,22 @@ msgid "Attach or detach a portable service image"
msgstr "Долучення або вилучення образу портативної служби"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
-msgstr "Для долучення або вилучення образу портативної служби слід пройти розпізнавання."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Для долучення або вилучення образу портативної служби слід пройти "
+"розпізнавання."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
msgstr "Вилучення або внесення змін до образу портативної служби"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
-msgstr "Для вилучення образу портативної служби або внесення до нього змін слід пройти розпізнавання."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Для вилучення образу портативної служби або внесення до нього змін слід "
+"пройти розпізнавання."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
@@ -889,7 +1106,9 @@ msgstr "Повернення до початкових параметрів ви
#: src/resolve/org.freedesktop.resolve1.policy:133
msgid "Authentication is required to reset name resolution settings."
-msgstr "Для повернення до початкових параметрів визначення назв вузлів за адресами слід пройти розпізнавання."
+msgstr ""
+"Для повернення до початкових параметрів визначення назв вузлів за адресами "
+"слід пройти розпізнавання."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
@@ -905,56 +1124,76 @@ msgstr "Встановлення загальносистемного часов
#: src/timedate/org.freedesktop.timedate1.policy:34
msgid "Authentication is required to set the system timezone."
-msgstr "Для встановлення загальносистемного часового поясу слід пройти розпізнавання."
+msgstr ""
+"Для встановлення загальносистемного часового поясу слід пройти розпізнавання."
#: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC"
msgstr "Встановлення для RTC місцевого часового поясу або UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
-msgstr "Для керування тим, зберігатиме годинник реального часу локальний час чи час UTC, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Для керування тим, зберігатиме годинник реального часу локальний час чи час "
+"UTC, слід пройти розпізнавання."
#: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off"
msgstr "Вмикання або вимикання синхронізації часу за допомогою мережі"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
-msgstr "Для керування тим, чи слід вмикати синхронізацію часу за допомогою мережі, слід пройти розпізнавання."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Для керування тим, чи слід вмикати синхронізацію часу за допомогою мережі, "
+"слід пройти розпізнавання."
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "Для запуску «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "Для зупинення «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "Для перезавантаження «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "Для перезапуску «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
-msgstr "Для надсилання сигналу UNIX до процесів «$(unit)» слід пройти розпізнавання."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Для надсилання сигналу UNIX до процесів «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Для скидання «пошкодженого» стану з «$(unit)» слід пройти розпізнавання."
+msgstr ""
+"Для скидання «пошкодженого» стану з «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Для визначення властивостей на «$(unit)» слід пройти розпізнавання."
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
-msgstr "Для вилучення файлів і каталогів, які пов'язано із «$(unit)», слід пройти розпізнавання."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Для вилучення файлів і каталогів, які пов'язано із «$(unit)», слід пройти "
+"розпізнавання."
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "Для замороження або розмороження процесів модуля «$(unit)» слід пройти розпізнавання."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Для замороження або розмороження процесів модуля «$(unit)» слід пройти "
+"розпізнавання."
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 4197d4e6f5..25eae3ff0c 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -9,7 +9,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-11-18 11:17+0000\n"
"Last-Translator: Charles Lee <lchopn@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.fedoraproject.org/"
@@ -26,7 +26,8 @@ msgid "Send passphrase back to system"
msgstr "将密码发回系统"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "将输入的密码发回系统需要认证。"
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -50,7 +51,9 @@ msgid "Set or unset system and service manager environment variables"
msgstr "设置或清除系统及服务管理器的环境变量"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr "设置或清除系统及服务管理器的环境变量需要认证。"
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -66,7 +69,8 @@ msgid "Dump the systemd state without rate limits"
msgstr "无速率限制地转储 systemd 状态"
#: src/core/org.freedesktop.systemd1.policy.in:75
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "无限制地转储 systemd 状态需要身份验证。"
#: src/home/org.freedesktop.home1.policy:13
@@ -90,7 +94,8 @@ msgid "Check credentials of a home area"
msgstr "检查家区域凭证"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr "根据用户家区域检查凭证需要认证。"
#: src/home/org.freedesktop.home1.policy:43
@@ -117,151 +122,184 @@ msgid "Change password of a home area"
msgstr "更改家区域的密码"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "更改家区域密码需要认证。"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+# Pay attention to the concept of "seat".
+#
+# To fully understand the meaning, please refer to session management in old ConsoleKit and new systemd-logind.
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "更新用户家区域需要认证。"
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "创建一个家区域"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "创建用户家区域需要认证。"
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr "用户 %s 的家目录当前不存在,请插入必要的存储设备或下层文件系统。"
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr "用户 %s 的登录尝试过于频繁,请稍后重试。"
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "密码: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr "用户 %s 的密码不正确或不足以完成认证。"
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr "抱歉,请重试: "
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr "恢复密钥: "
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr "用户 %s 的密码/恢复密钥不正确或不足以完成认证。"
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr "抱歉,请重新输入恢复密钥: "
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr "用户 %s 的安全令牌未插入。"
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr "请使用密码重试: "
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr "密码不正确或无效,且用户 %s 配置的安全令牌未插入。"
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr "安全令牌 PIN: "
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr "请在用户 %s 的安全令牌上进行物理认证。"
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr "请确认安全令牌上存在用户 %s。"
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr "请验证用户 %s 的安全令牌上的用户。"
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
-msgstr "安全令牌 PIN 已经锁定,请先将其解锁。(提示:移除并重新插入可能就行。)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
+msgstr ""
+"安全令牌 PIN 已经锁定,请先将其解锁。(提示:移除并重新插入可能就行。)"
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr "用户 %s 的安全令牌 PIN 不正确。"
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr "抱歉,请重试安全令牌 PIN: "
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr "用户 %s 的安全令牌 PIN 不正确(仅剩几次重试机会!)"
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr "用户 %s 的安全令牌 PIN 不正确(仅剩一次重试机会!)"
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr "用户 %s 的家目录目前未启用,请先在本地登录。"
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr "用户 %s 的家目录目前已锁定,请先在本地解锁。"
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr "用户 %s 有过多不成功的登录尝试,已拒绝登录。"
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr "用户记录已阻止,禁止访问。"
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr "用户记录尚未生效,禁止访问。"
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr "用户记录不再有效,禁止访问。"
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr "用户记录无效,禁止访问。"
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr "过多登录请求,请在 %s 后重试。"
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr "必须更改密码。"
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr "密码已过期,必须更改密码。"
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr "密码已经过期,但无法修改,拒绝登录。"
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr "密码将在不久后过期,请及时修改。"
@@ -281,7 +319,9 @@ msgstr "设置静态主机名"
#
# There were some discussions, like https://lists.fedoraprojects.org/pipermail/trans-zh_cn/2012-December/001347.html
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr "设定静态本地主机名或美观主机名需要认证。"
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -317,29 +357,45 @@ msgid "Authentication is required to get system description."
msgstr "获得系统描述需要认证。"
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "导入虚拟机或容器镜像"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "导入虚拟机或容器镜像需要认证"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "导出虚拟机或容器镜像"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "导出虚拟机或容器镜像需要认证"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "下载虚拟机或容器镜像"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "下载虚拟机或容器镜像需要认证"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "更改家区域密码需要认证。"
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "设置系统区域和语言"
@@ -361,7 +417,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "允许应用程序阻止系统关机"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "允许应用程序阻止系统关机需要认证。"
#: src/login/org.freedesktop.login1.policy:33
@@ -393,7 +450,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "允许应用程序阻止系统自动挂起"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr "允许应用程序阻止系统自动挂起需要认证。"
#: src/login/org.freedesktop.login1.policy:75
@@ -401,7 +460,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr "允许应用程序阻止系统响应电源键"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr "允许应用程序阻止系统响应电源键需要认证。"
#: src/login/org.freedesktop.login1.policy:86
@@ -409,7 +470,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "允许应用程序阻止系统响应挂起键"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr "允许应用程序阻止系统响应挂起键需要认证。"
#: src/login/org.freedesktop.login1.policy:97
@@ -417,7 +480,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "允许应用程序阻止系统响应挂起键"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr "允许应用程序阻止系统响应挂起键需要认证。"
#: src/login/org.freedesktop.login1.policy:107
@@ -425,7 +490,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "允许应用程序阻止系统响应笔记本上盖开关事件"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr "允许应用程序阻止系统响应笔记本上盖开关事件需要认证。"
#: src/login/org.freedesktop.login1.policy:117
@@ -433,7 +500,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "允许应用程序阻止系统响应重启键"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr "允许应用程序阻止系统响应重启键需要认证。"
#: src/login/org.freedesktop.login1.policy:128
@@ -484,7 +553,9 @@ msgid "Power off the system while other users are logged in"
msgstr "存在其他已登录用户时仍然关机"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
msgstr "存在其他已登录用户时关闭系统需要认证。"
#: src/login/org.freedesktop.login1.policy:191
@@ -492,7 +563,9 @@ msgid "Power off the system while an application is inhibiting this"
msgstr "有其它应用程序阻止时仍然关机"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr "在其它应用程序阻止关机时关闭系统需要认证。"
#: src/login/org.freedesktop.login1.policy:202
@@ -508,7 +581,9 @@ msgid "Reboot the system while other users are logged in"
msgstr "存在其他已登录用户时仍然重启"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
msgstr "存在其他已登录用户时重启系统需要认证。"
#: src/login/org.freedesktop.login1.policy:224
@@ -516,7 +591,9 @@ msgid "Reboot the system while an application is inhibiting this"
msgstr "有其它应用程序阻止时仍然重启"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr "在其它应用程序阻止重启时重启系统需要认证。"
#: src/login/org.freedesktop.login1.policy:235
@@ -532,7 +609,9 @@ msgid "Halt the system while other users are logged in"
msgstr "当存在其他已登录用户时仍然停止系统"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
msgstr "当存在其他已登录用户时停止系统需要认证。"
#: src/login/org.freedesktop.login1.policy:257
@@ -540,7 +619,9 @@ msgid "Halt the system while an application is inhibiting this"
msgstr "当存在应用程序阻止时仍然停止系统"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
msgstr "当应用程序阻止停止系统时需要认证。"
#: src/login/org.freedesktop.login1.policy:268
@@ -556,7 +637,9 @@ msgid "Suspend the system while other users are logged in"
msgstr "存在其他已登录用户时仍然挂起系统"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr "存在其他已登录用户时挂起系统需要认证。"
#: src/login/org.freedesktop.login1.policy:289
@@ -564,7 +647,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr "有其它应用程序阻止时仍然挂起系统"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr "在其它应用程序阻止挂起时挂起系统需要认证。"
#: src/login/org.freedesktop.login1.policy:300
@@ -580,7 +665,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr "存在其他已登录用户时仍然休眠"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr "存在其他已登录用户时进行休眠系统需要认证。"
#: src/login/org.freedesktop.login1.policy:321
@@ -588,7 +675,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr "有其它应用程序阻止时仍然休眠"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr "在其它应用程序阻止休眠时进行休眠需要认证。"
#: src/login/org.freedesktop.login1.policy:332
@@ -620,7 +709,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "指示固件以启动至设置界面"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr "向固件发出启动时进入设置界面的指令需要认证。"
#: src/login/org.freedesktop.login1.policy:374
@@ -628,7 +719,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "指示引导加载程序启动至引导加载程序菜单"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr "指示引导加载程序启动至引导加载程序菜单需要认证。"
#: src/login/org.freedesktop.login1.policy:385
@@ -636,7 +729,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr "指示引导加载程序启动指定条目"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr "指示引导加载程序启动入指定引导加载条目需要认证。"
#: src/login/org.freedesktop.login1.policy:396
@@ -692,7 +787,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "在本地容器中获取一个假 TTY"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "在本地容器中获取假 TTY 需要认证。"
#: src/machine/org.freedesktop.machine1.policy:74
@@ -708,7 +804,8 @@ msgid "Manage local virtual machines and containers"
msgstr "管理本地虚拟机和容器"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr "管理本地虚拟机和容器需要认证。"
#: src/machine/org.freedesktop.machine1.policy:95
@@ -716,7 +813,9 @@ msgid "Manage local virtual machine and container images"
msgstr "管理本地虚拟机和容器的镜像"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr "管理本地的虚拟机和容器镜像需要认证。"
#: src/network/org.freedesktop.network1.policy:22
@@ -871,7 +970,8 @@ msgstr "添加或卸载便携式服务映像"
#
# To fully understand the meaning, please refer to session management in old ConsoleKit and new systemd-logind.
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr "添加或卸载便携式服务映像需要认证。"
#: src/portable/org.freedesktop.portable1.policy:34
@@ -879,7 +979,8 @@ msgid "Delete or modify portable service image"
msgstr "删除或修改便携式服务映像"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "删除或修改便携式服务映像需要认证。"
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -927,7 +1028,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr "设置硬件时钟使用本地时间或 UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr "设置硬件时钟使用本地时间或 UTC 需要认证。"
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -935,41 +1038,48 @@ msgid "Turn network time synchronization on or off"
msgstr "打开或关闭网络时间同步"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "打开或关闭网络时间同步需要认证。"
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "启动“$(unit)”需要认证。"
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "停止“$(unit)”需要认证。"
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "重新载入“$(unit)”需要认证。"
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "重新启动“$(unit)”需要认证。"
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "发送 UNIX 信号给 '$(unit)' 进程需要认证。"
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "重置“$(unit)”的失败(\"failed\")状态需要认证。"
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "设置“$(unit)”的属性需要认证。"
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr "删除与 '$(unit)' 关联的文件和目录需要认证。"
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "冻结或解冻 '$(unit)' 单元进程需要认证。"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 0fc200a922..ec8c36c2b4 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -7,10 +7,11 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-11-14 21:25+0000\n"
+"POT-Creation-Date: 2024-03-04 10:09+0100\n"
"PO-Revision-Date: 2023-11-10 11:30+0000\n"
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
-"Language-Team: Chinese (Traditional) <https://translate.fedoraproject.org/projects/systemd/master/zh_TW/>\n"
+"Language-Team: Chinese (Traditional) <https://translate.fedoraproject.org/"
+"projects/systemd/master/zh_TW/>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,7 +24,8 @@ msgid "Send passphrase back to system"
msgstr "將密碼片語傳回系統"
#: src/core/org.freedesktop.systemd1.policy.in:23
-msgid "Authentication is required to send the entered passphrase back to the system."
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
msgstr "將已輸入的密碼片語傳回系統需要驗證。"
#: src/core/org.freedesktop.systemd1.policy.in:33
@@ -47,7 +49,9 @@ msgid "Set or unset system and service manager environment variables"
msgstr "設定或取消設定系統及服務管理員環境變數"
#: src/core/org.freedesktop.systemd1.policy.in:55
-msgid "Authentication is required to set or unset system and service manager environment variables."
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
msgstr "設定或取消設定系統及服務管理員的環境變數需要身份驗證。"
#: src/core/org.freedesktop.systemd1.policy.in:64
@@ -64,7 +68,8 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:75
#, fuzzy
-msgid "Authentication is required to dump the systemd state without rate limits."
+msgid ""
+"Authentication is required to dump the systemd state without rate limits."
msgstr "重新載入 systemd 狀態需要驗證。"
#: src/home/org.freedesktop.home1.policy:13
@@ -88,7 +93,8 @@ msgid "Check credentials of a home area"
msgstr "檢查家區域憑證"
#: src/home/org.freedesktop.home1.policy:34
-msgid "Authentication is required to check credentials against a user's home area."
+msgid ""
+"Authentication is required to check credentials against a user's home area."
msgstr "根據用戶家區域檢查憑證需要認證。"
#: src/home/org.freedesktop.home1.policy:43
@@ -112,151 +118,180 @@ msgid "Change password of a home area"
msgstr "更改家區域的密碼"
#: src/home/org.freedesktop.home1.policy:64
-msgid "Authentication is required to change the password of a user's home area."
+msgid ""
+"Authentication is required to change the password of a user's home area."
msgstr "更改家區域密碼需要認證。"
-#: src/home/pam_systemd_home.c:287
+#: src/home/org.freedesktop.home1.policy:73
+msgid "Inhibit automatic lock of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:74
+#, fuzzy
+msgid ""
+"Authentication is required to inhibit automatic lock of a user's home area."
+msgstr "更新用戶家區域需要認證。"
+
+#: src/home/org.freedesktop.home1.policy:83
+#, fuzzy
+msgid "Activate a home area"
+msgstr "創建一個家區域"
+
+#: src/home/org.freedesktop.home1.policy:84
+#, fuzzy
+msgid "Authentication is required to activate a user's home area."
+msgstr "創建用戶家區域需要身份驗證。"
+
+#: src/home/pam_systemd_home.c:293
#, c-format
-msgid "Home of user %s is currently absent, please plug in the necessary storage device or backing file system."
+msgid ""
+"Home of user %s is currently absent, please plug in the necessary storage "
+"device or backing file system."
msgstr ""
-#: src/home/pam_systemd_home.c:292
+#: src/home/pam_systemd_home.c:298
#, c-format
msgid "Too frequent login attempts for user %s, try again later."
msgstr ""
-#: src/home/pam_systemd_home.c:304
+#: src/home/pam_systemd_home.c:310
msgid "Password: "
msgstr "密碼: "
-#: src/home/pam_systemd_home.c:306
+#: src/home/pam_systemd_home.c:312
#, c-format
msgid "Password incorrect or not sufficient for authentication of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:307
+#: src/home/pam_systemd_home.c:313
msgid "Sorry, try again: "
msgstr ""
-#: src/home/pam_systemd_home.c:329
+#: src/home/pam_systemd_home.c:335
msgid "Recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:331
+#: src/home/pam_systemd_home.c:337
#, c-format
-msgid "Password/recovery key incorrect or not sufficient for authentication of user %s."
+msgid ""
+"Password/recovery key incorrect or not sufficient for authentication of user "
+"%s."
msgstr ""
-#: src/home/pam_systemd_home.c:332
+#: src/home/pam_systemd_home.c:338
msgid "Sorry, reenter recovery key: "
msgstr ""
-#: src/home/pam_systemd_home.c:352
+#: src/home/pam_systemd_home.c:358
#, c-format
msgid "Security token of user %s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:353 src/home/pam_systemd_home.c:356
+#: src/home/pam_systemd_home.c:359 src/home/pam_systemd_home.c:362
msgid "Try again with password: "
msgstr ""
-#: src/home/pam_systemd_home.c:355
+#: src/home/pam_systemd_home.c:361
#, c-format
-msgid "Password incorrect or not sufficient, and configured security token of user %s not inserted."
+msgid ""
+"Password incorrect or not sufficient, and configured security token of user "
+"%s not inserted."
msgstr ""
-#: src/home/pam_systemd_home.c:376
+#: src/home/pam_systemd_home.c:381
msgid "Security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:393
+#: src/home/pam_systemd_home.c:398
#, c-format
msgid "Please authenticate physically on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:404
+#: src/home/pam_systemd_home.c:409
#, c-format
msgid "Please confirm presence on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:415
+#: src/home/pam_systemd_home.c:420
#, c-format
msgid "Please verify user on security token of user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:424
-msgid "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)"
+#: src/home/pam_systemd_home.c:429
+msgid ""
+"Security token PIN is locked, please unlock it first. (Hint: Removal and re-"
+"insertion might suffice.)"
msgstr ""
-#: src/home/pam_systemd_home.c:432
+#: src/home/pam_systemd_home.c:437
#, c-format
msgid "Security token PIN incorrect for user %s."
msgstr ""
-#: src/home/pam_systemd_home.c:433 src/home/pam_systemd_home.c:452
-#: src/home/pam_systemd_home.c:471
+#: src/home/pam_systemd_home.c:438 src/home/pam_systemd_home.c:457
+#: src/home/pam_systemd_home.c:476
msgid "Sorry, retry security token PIN: "
msgstr ""
-#: src/home/pam_systemd_home.c:451
+#: src/home/pam_systemd_home.c:456
#, c-format
msgid "Security token PIN of user %s incorrect (only a few tries left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:470
+#: src/home/pam_systemd_home.c:475
#, c-format
msgid "Security token PIN of user %s incorrect (only one try left!)"
msgstr ""
-#: src/home/pam_systemd_home.c:616
+#: src/home/pam_systemd_home.c:643
#, c-format
msgid "Home of user %s is currently not active, please log in locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:618
+#: src/home/pam_systemd_home.c:645
#, c-format
msgid "Home of user %s is currently locked, please unlock locally first."
msgstr ""
-#: src/home/pam_systemd_home.c:645
+#: src/home/pam_systemd_home.c:677
#, c-format
msgid "Too many unsuccessful login attempts for user %s, refusing."
msgstr ""
-#: src/home/pam_systemd_home.c:868
+#: src/home/pam_systemd_home.c:956
msgid "User record is blocked, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:872
+#: src/home/pam_systemd_home.c:960
msgid "User record is not valid yet, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:876
+#: src/home/pam_systemd_home.c:964
msgid "User record is not valid anymore, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:881 src/home/pam_systemd_home.c:932
+#: src/home/pam_systemd_home.c:969 src/home/pam_systemd_home.c:1020
msgid "User record not valid, prohibiting access."
msgstr ""
-#: src/home/pam_systemd_home.c:893
+#: src/home/pam_systemd_home.c:981
#, c-format
msgid "Too many logins, try again in %s."
msgstr ""
-#: src/home/pam_systemd_home.c:904
+#: src/home/pam_systemd_home.c:992
msgid "Password change required."
msgstr ""
-#: src/home/pam_systemd_home.c:908
+#: src/home/pam_systemd_home.c:996
msgid "Password expired, change required."
msgstr ""
-#: src/home/pam_systemd_home.c:914
+#: src/home/pam_systemd_home.c:1002
msgid "Password is expired, but can't change, refusing login."
msgstr ""
-#: src/home/pam_systemd_home.c:918
+#: src/home/pam_systemd_home.c:1006
msgid "Password will expire soon, please change."
msgstr ""
@@ -273,7 +308,9 @@ msgid "Set static hostname"
msgstr "設定靜態主機名稱"
#: src/hostname/org.freedesktop.hostname1.policy:31
-msgid "Authentication is required to set the statically configured local hostname, as well as the pretty hostname."
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
msgstr "設定靜態預先設定或 pretty 本地主機名稱需要身份驗證。"
#: src/hostname/org.freedesktop.hostname1.policy:41
@@ -312,29 +349,45 @@ msgid "Authentication is required to get system description."
msgstr "設定系統時區需要驗證。"
#: src/import/org.freedesktop.import1.policy:22
-msgid "Import a VM or container image"
+#, fuzzy
+msgid "Import a disk image"
msgstr "匯入虛擬機器或容器映像"
#: src/import/org.freedesktop.import1.policy:23
-msgid "Authentication is required to import a VM or container image"
+#, fuzzy
+msgid "Authentication is required to import an image"
msgstr "匯入虛擬機器或容器映像需要驗證"
#: src/import/org.freedesktop.import1.policy:32
-msgid "Export a VM or container image"
+#, fuzzy
+msgid "Export a disk image"
msgstr "匯出虛擬機器或容器映像"
#: src/import/org.freedesktop.import1.policy:33
-msgid "Authentication is required to export a VM or container image"
+#, fuzzy
+msgid "Authentication is required to export disk image"
msgstr "匯出虛擬機器或容器映像需要驗證"
#: src/import/org.freedesktop.import1.policy:42
-msgid "Download a VM or container image"
+#, fuzzy
+msgid "Download a disk image"
msgstr "下載虛擬機器或容器映像"
#: src/import/org.freedesktop.import1.policy:43
-msgid "Authentication is required to download a VM or container image"
+#, fuzzy
+msgid "Authentication is required to download a disk image"
msgstr "下載虛擬機器或容器映像需要驗證"
+#: src/import/org.freedesktop.import1.policy:52
+msgid "Cancel transfer of a disk image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:53
+#, fuzzy
+msgid ""
+"Authentication is required to cancel the ongoing transfer of a disk image"
+msgstr "更改家區域密碼需要認證。"
+
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
msgstr "設定系統語系"
@@ -356,7 +409,8 @@ msgid "Allow applications to inhibit system shutdown"
msgstr "允許應用程式阻止系統關機"
#: src/login/org.freedesktop.login1.policy:23
-msgid "Authentication is required for an application to inhibit system shutdown."
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
msgstr "要讓應用程式阻止系統關機需要驗證。"
#: src/login/org.freedesktop.login1.policy:33
@@ -388,7 +442,9 @@ msgid "Allow applications to inhibit automatic system suspend"
msgstr "允許應用程式阻止自動系統暫停"
#: src/login/org.freedesktop.login1.policy:66
-msgid "Authentication is required for an application to inhibit automatic system suspend."
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
msgstr "要讓應用程式阻止自動系統暫停需要驗證。"
#: src/login/org.freedesktop.login1.policy:75
@@ -396,7 +452,9 @@ msgid "Allow applications to inhibit system handling of the power key"
msgstr "允許應用程式阻止系統處理電源鍵"
#: src/login/org.freedesktop.login1.policy:76
-msgid "Authentication is required for an application to inhibit system handling of the power key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
msgstr "要讓應用程式阻止系統處理電源鍵需要驗證。"
#: src/login/org.freedesktop.login1.policy:86
@@ -404,7 +462,9 @@ msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "允許應用程式阻止系統處理暫停鍵"
#: src/login/org.freedesktop.login1.policy:87
-msgid "Authentication is required for an application to inhibit system handling of the suspend key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
msgstr "要讓應用程式阻止系統處理暫停鍵需要驗證。"
#: src/login/org.freedesktop.login1.policy:97
@@ -412,7 +472,9 @@ msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "允許應用程式阻止系統處理冬眠鍵"
#: src/login/org.freedesktop.login1.policy:98
-msgid "Authentication is required for an application to inhibit system handling of the hibernate key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
msgstr "要讓應用程式阻止系統處理冬眠鍵需要驗證。"
#: src/login/org.freedesktop.login1.policy:107
@@ -420,7 +482,9 @@ msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "允許應用程式阻止系統處理上蓋開關"
#: src/login/org.freedesktop.login1.policy:108
-msgid "Authentication is required for an application to inhibit system handling of the lid switch."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
msgstr "要讓應用程式阻止系統處理上蓋開關需要驗證。"
#: src/login/org.freedesktop.login1.policy:117
@@ -428,7 +492,9 @@ msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "允許應用程式阻止系統處理重啓鍵"
#: src/login/org.freedesktop.login1.policy:118
-msgid "Authentication is required for an application to inhibit system handling of the reboot key."
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
msgstr "要讓應用程式阻止系統處理重啓鍵需要驗證。"
#: src/login/org.freedesktop.login1.policy:128
@@ -476,7 +542,9 @@ msgid "Power off the system while other users are logged in"
msgstr "在有其他使用者登入時關閉系統電源"
#: src/login/org.freedesktop.login1.policy:181
-msgid "Authentication is required to power off the system while other users are logged in."
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
msgstr "在有其他使用者登入時關閉系統電源需要驗證。"
#: src/login/org.freedesktop.login1.policy:191
@@ -484,7 +552,9 @@ msgid "Power off the system while an application is inhibiting this"
msgstr "當應用程式阻止系統電源關閉時將其關閉"
#: src/login/org.freedesktop.login1.policy:192
-msgid "Authentication is required to power off the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
msgstr "當應用程式阻止系統電源關閉時將系統電源關閉需要驗證。"
#: src/login/org.freedesktop.login1.policy:202
@@ -500,7 +570,9 @@ msgid "Reboot the system while other users are logged in"
msgstr "在有其他使用者登入時重新啟動系統"
#: src/login/org.freedesktop.login1.policy:214
-msgid "Authentication is required to reboot the system while other users are logged in."
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
msgstr "在有其他使用者登入時重新啟動系統需要驗證。"
#: src/login/org.freedesktop.login1.policy:224
@@ -508,7 +580,9 @@ msgid "Reboot the system while an application is inhibiting this"
msgstr "當應用程式阻止重新啟動系統時將系統重新啟動"
#: src/login/org.freedesktop.login1.policy:225
-msgid "Authentication is required to reboot the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
msgstr "當應用程式阻止系統重新啟動時將系統重新啟動需要驗證。"
#: src/login/org.freedesktop.login1.policy:235
@@ -524,7 +598,9 @@ msgid "Halt the system while other users are logged in"
msgstr "在其他使用者登入時停止系統"
#: src/login/org.freedesktop.login1.policy:247
-msgid "Authentication is required to halt the system while other users are logged in."
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
msgstr "在其他使用者登入時停止系統需要身份驗證。"
#: src/login/org.freedesktop.login1.policy:257
@@ -532,7 +608,9 @@ msgid "Halt the system while an application is inhibiting this"
msgstr "在應用程式阻止時停止系統"
#: src/login/org.freedesktop.login1.policy:258
-msgid "Authentication is required to halt the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
msgstr "當應用程式阻止停止系統時需要驗證。"
#: src/login/org.freedesktop.login1.policy:268
@@ -548,7 +626,9 @@ msgid "Suspend the system while other users are logged in"
msgstr "在有其他使用者登入時暫停系統"
#: src/login/org.freedesktop.login1.policy:279
-msgid "Authentication is required to suspend the system while other users are logged in."
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
msgstr "在有其他使用者登入時暫停系統需要驗證。"
#: src/login/org.freedesktop.login1.policy:289
@@ -556,7 +636,9 @@ msgid "Suspend the system while an application is inhibiting this"
msgstr "當應用程式阻止暫停系統時將系統暫停"
#: src/login/org.freedesktop.login1.policy:290
-msgid "Authentication is required to suspend the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
msgstr "當應用程式阻止系統暫停時將系統暫停需要驗證。"
#: src/login/org.freedesktop.login1.policy:300
@@ -572,7 +654,9 @@ msgid "Hibernate the system while other users are logged in"
msgstr "在有其他使用者登入時冬眠系統"
#: src/login/org.freedesktop.login1.policy:311
-msgid "Authentication is required to hibernate the system while other users are logged in."
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
msgstr "在有其他使用者登入時冬眠系統需要驗證。"
#: src/login/org.freedesktop.login1.policy:321
@@ -580,7 +664,9 @@ msgid "Hibernate the system while an application is inhibiting this"
msgstr "當應用程式阻止冬眠系統時將系統冬眠"
#: src/login/org.freedesktop.login1.policy:322
-msgid "Authentication is required to hibernate the system while an application is inhibiting this."
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
msgstr "當應用程式阻止系統冬眠時將系統冬眠需要驗證。"
#: src/login/org.freedesktop.login1.policy:332
@@ -612,7 +698,9 @@ msgid "Indicate to the firmware to boot to setup interface"
msgstr "引導韌體啟動設定畫面"
#: src/login/org.freedesktop.login1.policy:364
-msgid "Authentication is required to indicate to the firmware to boot to setup interface."
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
msgstr "對韌體的指示以開始設定介面需要驗證。"
#: src/login/org.freedesktop.login1.policy:374
@@ -620,7 +708,9 @@ msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "引導開機載入器啟動開機載入選單"
#: src/login/org.freedesktop.login1.policy:375
-msgid "Authentication is required to indicate to the boot loader to boot to the boot loader menu."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
msgstr "引導開機載入器啟動開機載入器選單需要身份驗證。"
#: src/login/org.freedesktop.login1.policy:385
@@ -628,7 +718,9 @@ msgid "Indicate to the boot loader to boot a specific entry"
msgstr "引導開機載入器啟動指定項目"
#: src/login/org.freedesktop.login1.policy:386
-msgid "Authentication is required to indicate to the boot loader to boot into a specific boot loader entry."
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
msgstr "引導開機載入器啟動指定的開機載入器項目需要身份驗證。"
#: src/login/org.freedesktop.login1.policy:396
@@ -684,7 +776,8 @@ msgid "Acquire a pseudo TTY in a local container"
msgstr "取得在本機容器中的偽 TTY"
#: src/machine/org.freedesktop.machine1.policy:65
-msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
msgstr "取得在本機容器中的偽 TTY 需要驗證。"
#: src/machine/org.freedesktop.machine1.policy:74
@@ -700,7 +793,8 @@ msgid "Manage local virtual machines and containers"
msgstr "管理本機虛擬機器及容器"
#: src/machine/org.freedesktop.machine1.policy:85
-msgid "Authentication is required to manage local virtual machines and containers."
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
msgstr "管理本機虛擬機器及容器需要驗證。"
#: src/machine/org.freedesktop.machine1.policy:95
@@ -708,7 +802,9 @@ msgid "Manage local virtual machine and container images"
msgstr "管理本機虛擬機器及容器映像"
#: src/machine/org.freedesktop.machine1.policy:96
-msgid "Authentication is required to manage local virtual machine and container images."
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
msgstr "管理本機虛擬機器及容器映像需要驗證。"
#: src/network/org.freedesktop.network1.policy:22
@@ -860,7 +956,8 @@ msgid "Attach or detach a portable service image"
msgstr "連結或取消連結可攜式服務映像"
#: src/portable/org.freedesktop.portable1.policy:24
-msgid "Authentication is required to attach or detach a portable service image."
+msgid ""
+"Authentication is required to attach or detach a portable service image."
msgstr "連結或取消連結可攜式服務映像需要身份驗證。"
#: src/portable/org.freedesktop.portable1.policy:34
@@ -868,7 +965,8 @@ msgid "Delete or modify portable service image"
msgstr "刪除或修改可攜式服務映像"
#: src/portable/org.freedesktop.portable1.policy:35
-msgid "Authentication is required to delete or modify a portable service image."
+msgid ""
+"Authentication is required to delete or modify a portable service image."
msgstr "刪除或修改可攜式服務映像需要身份驗證。"
#: src/resolve/org.freedesktop.resolve1.policy:22
@@ -916,7 +1014,9 @@ msgid "Set RTC to local timezone or UTC"
msgstr "將 RTC 設定為本地時區或 UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44
-msgid "Authentication is required to control whether the RTC stores the local or UTC time."
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
msgstr "控制 RTC 儲存本地或 UTC 時間需要驗證。"
#: src/timedate/org.freedesktop.timedate1.policy:53
@@ -924,46 +1024,55 @@ msgid "Turn network time synchronization on or off"
msgstr "打開或關閉網路時間同步"
#: src/timedate/org.freedesktop.timedate1.policy:54
-msgid "Authentication is required to control whether network time synchronization shall be enabled."
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
msgstr "控制網路時間同步是否啟用需要驗證。"
-#: src/core/dbus-unit.c:352
+#: src/core/dbus-unit.c:353
msgid "Authentication is required to start '$(unit)'."
msgstr "啟動 '$(unit)' 需要驗證。"
-#: src/core/dbus-unit.c:353
+#: src/core/dbus-unit.c:354
msgid "Authentication is required to stop '$(unit)'."
msgstr "停止 '$(unit)' 需要驗證。"
-#: src/core/dbus-unit.c:354
+#: src/core/dbus-unit.c:355
msgid "Authentication is required to reload '$(unit)'."
msgstr "重新載入 '$(unit)' 需要驗證。"
-#: src/core/dbus-unit.c:355 src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:356 src/core/dbus-unit.c:357
msgid "Authentication is required to restart '$(unit)'."
msgstr "重新啟動 '$(unit)' 需要驗證。"
-#: src/core/dbus-unit.c:553
-msgid "Authentication is required to send a UNIX signal to the processes of '$(unit)'."
+#: src/core/dbus-unit.c:549
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
msgstr "傳送 UNIX 信號至「$(unit)」的程序需要身份驗證。"
-#: src/core/dbus-unit.c:583
+#: src/core/dbus-unit.c:577
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "重置 '$(unit)' 的「失敗」狀態需要驗證。"
-#: src/core/dbus-unit.c:615
+#: src/core/dbus-unit.c:607
msgid "Authentication is required to set properties on '$(unit)'."
msgstr "在 '$(unit)' 上設定屬性需要驗證。"
-#: src/core/dbus-unit.c:716
-msgid "Authentication is required to delete files and directories associated with '$(unit)'."
+#: src/core/dbus-unit.c:704
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
msgstr "刪除與 '$(unit)' 相關的檔案及目錄需要身份驗證。"
-#: src/core/dbus-unit.c:764
-msgid "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+#: src/core/dbus-unit.c:743
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "凍結或解凍「$(unit)」的程序需要身份驗證。"
-#~ msgid "Authentication is required to halt the system while an application asked to inhibit it."
+#~ msgid ""
+#~ "Authentication is required to halt the system while an application asked "
+#~ "to inhibit it."
#~ msgstr "在應用程式阻止時停止系統需要身份驗證。"
#~ msgid "Authentication is required to kill '$(unit)'."
diff --git a/rules.d/60-persistent-media-controller.rules b/rules.d/60-persistent-media-controller.rules
new file mode 100644
index 0000000000..bf614d9783
--- /dev/null
+++ b/rules.d/60-persistent-media-controller.rules
@@ -0,0 +1,12 @@
+# do not edit this file, it will be overwritten on update
+
+# Media controller rules
+
+ACTION=="remove", GOTO="persistent_media_ctl_end"
+SUBSYSTEM!="media", GOTO="persistent_media_ctl_end"
+ENV{MAJOR}=="", GOTO="persistent_media_ctl_end"
+
+IMPORT{builtin}="path_id"
+ENV{ID_PATH}=="?*", KERNEL=="media*", SYMLINK+="media/by-path/$env{ID_PATH}-media-controller"
+
+LABEL="persistent_media_ctl_end"
diff --git a/shell-completion/bash/bootctl b/shell-completion/bash/bootctl
index 8d8b507ea9..45fcd502de 100644
--- a/shell-completion/bash/bootctl
+++ b/shell-completion/bash/bootctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# bootctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/busctl b/shell-completion/bash/busctl
index 5464225b15..bb80c17683 100644
--- a/shell-completion/bash/busctl
+++ b/shell-completion/bash/busctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# busctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/coredumpctl b/shell-completion/bash/coredumpctl
index b5719905f9..ebab3607e4 100644
--- a/shell-completion/bash/coredumpctl
+++ b/shell-completion/bash/coredumpctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# coredumpctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/homectl b/shell-completion/bash/homectl
index 3bb84fedb2..5e2235bc3b 100644
--- a/shell-completion/bash/homectl
+++ b/shell-completion/bash/homectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# homectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
@@ -109,7 +110,9 @@ _homectl() {
--auto-login
-b --blob
--avatar
- --login-background'
+ --login-background
+ --session-launcher
+ --session-type'
)
if __contains_word "$prev" ${OPTS[ARG]}; then
@@ -152,6 +155,12 @@ _homectl() {
--language)
comps=$(localectl list-locales 2>/dev/null)
;;
+ --session-launcher)
+ comps=$(find /usr/share/{x,wayland-}sessions/ -type f -name '*.desktop' -exec basename {} .desktop \; 2>/dev/null | sort -u)
+ ;;
+ --session-type)
+ comps='wayland x11 tty'
+ ;;
esac
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
diff --git a/shell-completion/bash/hostnamectl b/shell-completion/bash/hostnamectl
index 27a2fe63d2..d8256a9fed 100644
--- a/shell-completion/bash/hostnamectl
+++ b/shell-completion/bash/hostnamectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# hostnamectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/journalctl b/shell-completion/bash/journalctl
index c7f6a05a6e..c79a38c352 100644
--- a/shell-completion/bash/journalctl
+++ b/shell-completion/bash/journalctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# journalctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/kernel-install b/shell-completion/bash/kernel-install
index 4708777507..d3a9d9bbd8 100644
--- a/shell-completion/bash/kernel-install
+++ b/shell-completion/bash/kernel-install
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# kernel-install(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/localectl b/shell-completion/bash/localectl
index b601343a6b..1717842648 100644
--- a/shell-completion/bash/localectl
+++ b/shell-completion/bash/localectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# localectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/loginctl b/shell-completion/bash/loginctl
index e6c476742b..7dbd9c04ea 100644
--- a/shell-completion/bash/loginctl
+++ b/shell-completion/bash/loginctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# loginctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/machinectl b/shell-completion/bash/machinectl
index b28769b0b6..f4d46c9511 100644
--- a/shell-completion/bash/machinectl
+++ b/shell-completion/bash/machinectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# machinectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/networkctl b/shell-completion/bash/networkctl
index db59a9ce34..6126984ef8 100644
--- a/shell-completion/bash/networkctl
+++ b/shell-completion/bash/networkctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# networkctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/oomctl b/shell-completion/bash/oomctl
index dc45ba58c0..e1ad197bf5 100644
--- a/shell-completion/bash/oomctl
+++ b/shell-completion/bash/oomctl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# oomctl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/portablectl b/shell-completion/bash/portablectl
index 30e5da4aa2..b22bbd95d6 100644
--- a/shell-completion/bash/portablectl
+++ b/shell-completion/bash/portablectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# portablectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/resolvectl b/shell-completion/bash/resolvectl
index bd3e8bf939..1a5febe1e3 100644
--- a/shell-completion/bash/resolvectl
+++ b/shell-completion/bash/resolvectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# resolvectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemctl.in b/shell-completion/bash/systemctl.in
index 5c444b7fa4..7f85e70d40 100644
--- a/shell-completion/bash/systemctl.in
+++ b/shell-completion/bash/systemctl.in
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemctl(1) completion -*- shell-script -*-
# vi: ft=sh
# SPDX-License-Identifier: LGPL-2.1-or-later
diff --git a/shell-completion/bash/systemd-analyze b/shell-completion/bash/systemd-analyze
index 00cb478688..eb1061f787 100644
--- a/shell-completion/bash/systemd-analyze
+++ b/shell-completion/bash/systemd-analyze
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-analyze(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-cat b/shell-completion/bash/systemd-cat
index e1e6002172..6ccc7bf000 100644
--- a/shell-completion/bash/systemd-cat
+++ b/shell-completion/bash/systemd-cat
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-cat(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-cgls b/shell-completion/bash/systemd-cgls
index f80bea7353..49739bd0c6 100644
--- a/shell-completion/bash/systemd-cgls
+++ b/shell-completion/bash/systemd-cgls
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-cgls(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-cgtop b/shell-completion/bash/systemd-cgtop
index 731d9c924b..6a33cb227f 100644
--- a/shell-completion/bash/systemd-cgtop
+++ b/shell-completion/bash/systemd-cgtop
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-cgtop(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-confext b/shell-completion/bash/systemd-confext
index 09d114611c..d36f70fa09 100644
--- a/shell-completion/bash/systemd-confext
+++ b/shell-completion/bash/systemd-confext
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-confext(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-cryptenroll b/shell-completion/bash/systemd-cryptenroll
index f40a33bee6..6b13e58789 100644
--- a/shell-completion/bash/systemd-cryptenroll
+++ b/shell-completion/bash/systemd-cryptenroll
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-cryptenroll(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-delta b/shell-completion/bash/systemd-delta
index b148755d08..ac7f5e9709 100644
--- a/shell-completion/bash/systemd-delta
+++ b/shell-completion/bash/systemd-delta
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-delta(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-detect-virt b/shell-completion/bash/systemd-detect-virt
index 9ade2af220..edc861b20b 100644
--- a/shell-completion/bash/systemd-detect-virt
+++ b/shell-completion/bash/systemd-detect-virt
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-detect-virt(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-dissect b/shell-completion/bash/systemd-dissect
index 17fb6420de..8d2b43423c 100644
--- a/shell-completion/bash/systemd-dissect
+++ b/shell-completion/bash/systemd-dissect
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-dissect(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-id128 b/shell-completion/bash/systemd-id128
index 74ea1016a9..54d4ec8f7a 100644
--- a/shell-completion/bash/systemd-id128
+++ b/shell-completion/bash/systemd-id128
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-id128(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-nspawn b/shell-completion/bash/systemd-nspawn
index b12711be80..085e6a4d18 100644
--- a/shell-completion/bash/systemd-nspawn
+++ b/shell-completion/bash/systemd-nspawn
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-nspawn(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-path b/shell-completion/bash/systemd-path
index 40e2f7ec48..59d6597d06 100644
--- a/shell-completion/bash/systemd-path
+++ b/shell-completion/bash/systemd-path
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-path(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-resolve b/shell-completion/bash/systemd-resolve
index 20d904aedf..17890a9a09 100644
--- a/shell-completion/bash/systemd-resolve
+++ b/shell-completion/bash/systemd-resolve
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-resolve(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-run b/shell-completion/bash/systemd-run
index c18228d00f..3a26a65d4e 100644
--- a/shell-completion/bash/systemd-run
+++ b/shell-completion/bash/systemd-run
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-run(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/systemd-sysext b/shell-completion/bash/systemd-sysext
index b3f9f32fd5..5c15f076a8 100644
--- a/shell-completion/bash/systemd-sysext
+++ b/shell-completion/bash/systemd-sysext
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# systemd-sysext(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/timedatectl b/shell-completion/bash/timedatectl
index 768b4a5e82..f22cde282b 100644
--- a/shell-completion/bash/timedatectl
+++ b/shell-completion/bash/timedatectl
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# timedatectl(1) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/bash/udevadm b/shell-completion/bash/udevadm
index 0606160c66..fbbaed001c 100644
--- a/shell-completion/bash/udevadm
+++ b/shell-completion/bash/udevadm
@@ -1,3 +1,4 @@
+# shellcheck shell=bash
# udevadm(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
diff --git a/shell-completion/zsh/_journalctl b/shell-completion/zsh/_journalctl
index 9c132b8731..7138615cdd 100644
--- a/shell-completion/zsh/_journalctl
+++ b/shell-completion/zsh/_journalctl
@@ -59,7 +59,7 @@ _journalctl_boots() {
(( $+functions[_journalctl_facilities] )) ||
_journalctl_facilities() {
local -a _journalctl_facilities
- _journalctl_facilities=(kern user mail daemon auth syslog lpr news uucp cron authpriv ftp local0 local1 local2 local3 local4 local5 local6 local7)
+ _journalctl_facilities=(help kern user mail daemon auth syslog lpr news uucp cron authpriv ftp local0 local1 local2 local3 local4 local5 local6 local7)
_describe 'possible values' _journalctl_facilities
}
@@ -120,10 +120,12 @@ _arguments -s \
'--facility=[Filter messages by facility]:facility:_journalctl_facilities' \
{-t+,--identifier=}'[Filter messages by syslog identifier]:identifier:_journalctl_field_values SYSLOG_IDENTIFIER' \
{-c+,--cursor=}'[Start showing entries from the specified cursor]:cursors:_journalctl_field_values __CURSORS' \
- '--cursor-file=[Show entries using cursor store in file]:file:_files' \
+ '--cursor-file=[Show entries using cursor stored in file]:file:_files' \
'--after-cursor=[Start showing entries from after the specified cursor]:cursors:_journalctl_field_values __CURSORS' \
'--since=[Start showing entries on or newer than the specified date]:YYYY-MM-DD HH\:MM\:SS' \
'--until=[Stop showing entries on or older than the specified date]:YYYY-MM-DD HH\:MM\:SS' \
+ {-g+,--grep=}'[Show entries with MESSAGE field matching PCRE pattern]' \
+ '--case-sensitive=[Force case sensitive or insensitive matching]:boolean:(true false)' \
{-F,--field=}'[List all values a certain field takes]:Fields:_journalctl_fields' \
'--system[Show system and kernel messages]' \
'--user[Show messages from user services]' \
diff --git a/src/analyze/analyze-unit-files.c b/src/analyze/analyze-unit-files.c
index d9b3313be4..e0c4867c78 100644
--- a/src/analyze/analyze-unit-files.c
+++ b/src/analyze/analyze-unit-files.c
@@ -15,7 +15,7 @@ static bool strv_fnmatch_strv_or_empty(char* const* patterns, char **strv, int f
int verb_unit_files(int argc, char *argv[], void *userdata) {
_cleanup_hashmap_free_ Hashmap *unit_ids = NULL, *unit_names = NULL;
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
char **patterns = strv_skip(argv, 1);
const char *k, *dst;
char **v;
diff --git a/src/analyze/analyze-unit-paths.c b/src/analyze/analyze-unit-paths.c
index bb00a4fcd2..17f18e0ab6 100644
--- a/src/analyze/analyze-unit-paths.c
+++ b/src/analyze/analyze-unit-paths.c
@@ -6,7 +6,7 @@
#include "strv.h"
int verb_unit_paths(int argc, char *argv[], void *userdata) {
- _cleanup_(lookup_paths_free) LookupPaths paths = {};
+ _cleanup_(lookup_paths_done) LookupPaths paths = {};
int r;
r = lookup_paths_init_or_warn(&paths, arg_runtime_scope, 0, NULL);
diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c
index ea906c7bfe..b449e538f3 100644
--- a/src/analyze/analyze.c
+++ b/src/analyze/analyze.c
@@ -681,7 +681,8 @@ static int run(int argc, char *argv[]) {
arg_image_policy,
DISSECT_IMAGE_GENERIC_ROOT |
DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_READ_ONLY,
+ DISSECT_IMAGE_READ_ONLY |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/basic/build-path.c b/src/basic/build-path.c
new file mode 100644
index 0000000000..8ddef7b2dd
--- /dev/null
+++ b/src/basic/build-path.c
@@ -0,0 +1,267 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <elf.h>
+#include <link.h>
+#include <sys/auxv.h>
+
+#include "build-path.h"
+#include "errno-list.h"
+#include "errno-util.h"
+#include "macro.h"
+#include "path-util.h"
+#include "process-util.h"
+#include "unistd.h"
+
+static int get_runpath_from_dynamic(const ElfW(Dyn) *d, const char **ret) {
+ size_t runpath_index = SIZE_MAX, rpath_index = SIZE_MAX;
+ const char *strtab = NULL;
+
+ assert(d);
+
+ /* Iterates through the PT_DYNAMIC section to find the DT_RUNPATH/DT_RPATH entries */
+
+ for (; d->d_tag != DT_NULL; d++) {
+
+ switch (d->d_tag) {
+
+ case DT_RUNPATH:
+ runpath_index = (size_t) d->d_un.d_val;
+ break;
+
+ case DT_RPATH:
+ rpath_index = (size_t) d->d_un.d_val;
+ break;
+
+ case DT_STRTAB:
+ strtab = (const char *) d->d_un.d_val;
+ break;
+ }
+
+ /* runpath wins, hence if we have the table and runpath we can exit the loop early */
+ if (strtab && runpath_index != SIZE_MAX)
+ break;
+ }
+
+ if (!strtab)
+ return -ENOTRECOVERABLE;
+
+ /* According to dl.so runpath wins of both runpath and rpath are defined. */
+ if (runpath_index != SIZE_MAX) {
+ if (ret)
+ *ret = strtab + runpath_index;
+ return 1;
+ }
+
+ if (rpath_index != SIZE_MAX) {
+ if (ret)
+ *ret = strtab + rpath_index;
+ return 1;
+ }
+
+ if (ret)
+ *ret = NULL;
+
+ return 0;
+}
+
+static int get_runpath(const char **ret) {
+ unsigned long phdr, phent, phnum;
+
+ /* Finds the rpath/runpath in the program headers of the main executable we are running in */
+
+ phdr = getauxval(AT_PHDR); /* Start offset of phdr */
+ if (phdr == 0)
+ return -ENOTRECOVERABLE;
+
+ phnum = getauxval(AT_PHNUM); /* Number of entries in phdr */
+ if (phnum == 0)
+ return -ENOTRECOVERABLE;
+
+ phent = getauxval(AT_PHENT); /* Size of entries in phdr */
+ if (phent < sizeof(ElfW(Phdr))) /* Safety check, that our idea of the structure matches the file */
+ return -ENOTRECOVERABLE;
+
+ ElfW(Addr) bias = 0, dyn = 0;
+ bool found_bias = false, found_dyn = false;
+
+ /* Iterate through the Phdr structures to find the PT_PHDR and PT_DYNAMIC sections */
+ for (unsigned long i = 0; i < phnum; i++) {
+ const ElfW(Phdr) *p = (const ElfW(Phdr)*) (phdr + (i * phent));
+
+ switch (p->p_type) {
+
+ case PT_PHDR:
+ if (p->p_vaddr > phdr) /* safety overflow check */
+ return -ENOTRECOVERABLE;
+
+ bias = (ElfW(Addr)) phdr - p->p_vaddr;
+ found_bias = true;
+ break;
+
+ case PT_DYNAMIC:
+ dyn = p->p_vaddr;
+ found_dyn = true;
+ break;
+ }
+
+ if (found_bias && found_dyn)
+ break;
+ }
+
+ if (!found_dyn)
+ return -ENOTRECOVERABLE;
+
+ return get_runpath_from_dynamic((const ElfW(Dyn)*) (bias + dyn), ret);
+}
+
+int get_build_exec_dir(char **ret) {
+ int r;
+
+ /* Returns the build execution directory if we are invoked in a build environment. Specifically, this
+ * checks if the main program binary has an rpath/runpath set (i.e. an explicit directory where to
+ * look for shared libraries) to $ORIGIN. If so we know that this is not a regular installed binary,
+ * but one which shall acquire its libraries from below a directory it is located in, i.e. a build
+ * directory or similar. In that case it typically makes sense to also search for our auxiliary
+ * executables we fork() off in a directory close to our main program binary, rather than in the
+ * system.
+ *
+ * This function is supposed to be used when looking for "callout" binaries that are closely related
+ * to the main program (i.e. speak a specific protocol between each other). And where it's generally
+ * a good idea to use the binary from the build tree (if there is one) instead of the system.
+ *
+ * Note that this does *not* actually return the rpath/runpath but the instead the directory the main
+ * executable was found in. This follows the logic that the result is supposed to be used for
+ * executable binaries (i.e. stuff in bindir), not for shared libraries (i.e. stuff in libdir), and
+ * hence the literal shared library path would just be wrong.
+ *
+ * TLDR: if we look for callouts in this dir first, running binaries from the meson build tree
+ * automatically uses the right callout.
+ *
+ * Returns:
+ * -ENOEXEC → We are not running in an rpath/runpath $ORIGIN environment
+ * -ENOENT → We don't know our own binary path
+ * -NOTRECOVERABLE → Dynamic binary information missing?
+ */
+
+ static int runpath_cached = -ERRNO_MAX-1;
+ if (runpath_cached == -ERRNO_MAX-1) {
+ const char *runpath = NULL;
+
+ runpath_cached = get_runpath(&runpath);
+
+ /* We only care if the runpath starts with $ORIGIN/ */
+ if (runpath_cached > 0 && !startswith(runpath, "$ORIGIN/"))
+ runpath_cached = 0;
+ }
+ if (runpath_cached < 0)
+ return runpath_cached;
+ if (runpath_cached == 0)
+ return -ENOEXEC;
+
+ _cleanup_free_ char *exe = NULL;
+ r = get_process_exe(0, &exe);
+ if (r < 0)
+ return runpath_cached = r;
+
+ return path_extract_directory(exe, ret);
+}
+
+static int find_build_dir_binary(const char *fn, char **ret) {
+ int r;
+
+ assert(fn);
+ assert(ret);
+
+ _cleanup_free_ char *build_dir = NULL;
+ r = get_build_exec_dir(&build_dir);
+ if (r < 0)
+ return r;
+
+ _cleanup_free_ char *np = path_join(build_dir, fn);
+ if (!np)
+ return -ENOMEM;
+
+ *ret = TAKE_PTR(np);
+ return 0;
+}
+
+static int find_environment_binary(const char *fn, const char **ret) {
+
+ /* If a path such as /usr/lib/systemd/systemd-foobar is specified, then this will check for an
+ * environment variable SYSTEMD_FOOBAR_PATH and return it if set. */
+
+ _cleanup_free_ char *s = strdup(fn);
+ if (!s)
+ return -ENOMEM;
+
+ ascii_strupper(s);
+ string_replace_char(s, '-', '_');
+
+ if (!strextend(&s, "_PATH"))
+ return -ENOMEM;
+
+ const char *e;
+ e = secure_getenv(s);
+ if (!e)
+ return -ENXIO;
+
+ *ret = e;
+ return 0;
+}
+
+int invoke_callout_binary(const char *path, char *const argv[]) {
+ int r;
+
+ assert(path);
+
+ /* Just like execv(), but tries to execute the specified binary in the build dir instead, if known */
+
+ _cleanup_free_ char *fn = NULL;
+ r = path_extract_filename(path, &fn);
+ if (r < 0)
+ return r;
+ if (r == O_DIRECTORY) /* Uh? */
+ return -EISDIR;
+
+ const char *e;
+ if (find_environment_binary(fn, &e) >= 0) {
+ /* If there's an explicit environment variable set for this binary, prefer it */
+ execv(e, argv);
+ return -errno; /* The environment variable counts, let's fail otherwise */
+ }
+
+ _cleanup_free_ char *np = NULL;
+ if (find_build_dir_binary(fn, &np) >= 0)
+ execv(np, argv);
+
+ execv(path, argv);
+ return -errno;
+}
+
+int pin_callout_binary(const char *path) {
+ int r;
+
+ assert(path);
+
+ /* Similar to invoke_callout_binary(), but pins (i.e. O_PATH opens) the binary instead of executing it. */
+
+ _cleanup_free_ char *fn = NULL;
+ r = path_extract_filename(path, &fn);
+ if (r < 0)
+ return r;
+ if (r == O_DIRECTORY) /* Uh? */
+ return -EISDIR;
+
+ const char *e;
+ if (find_environment_binary(fn, &e) >= 0)
+ return RET_NERRNO(open(e, O_CLOEXEC|O_PATH));
+
+ _cleanup_free_ char *np = NULL;
+ if (find_build_dir_binary(fn, &np) >= 0) {
+ r = RET_NERRNO(open(np, O_CLOEXEC|O_PATH));
+ if (r >= 0)
+ return r;
+ }
+
+ return RET_NERRNO(open(path, O_CLOEXEC|O_PATH));
+}
diff --git a/src/basic/build-path.h b/src/basic/build-path.h
new file mode 100644
index 0000000000..6c38a4a3bb
--- /dev/null
+++ b/src/basic/build-path.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+int get_build_exec_dir(char **ret);
+
+int invoke_callout_binary(const char *path, char *const argv[]);
+
+int pin_callout_binary(const char *path);
diff --git a/src/basic/build.c b/src/basic/build.c
index 7d6fbf43da..3ab25f72a7 100644
--- a/src/basic/build.c
+++ b/src/basic/build.c
@@ -244,7 +244,6 @@ const char* const systemd_features =
" -LIBARCHIVE"
#endif
- " default-hierarchy=" DEFAULT_HIERARCHY_NAME
;
static char *systemd_features_with_color(void) {
diff --git a/src/basic/compress.c b/src/basic/compress.c
index ac0bfdfcd5..5a4293fa81 100644
--- a/src/basic/compress.c
+++ b/src/basic/compress.c
@@ -12,11 +12,6 @@
#include <lzma.h>
#endif
-#if HAVE_LZ4
-#include <lz4.h>
-#include <lz4frame.h>
-#endif
-
#if HAVE_ZSTD
#include <zstd.h>
#include <zstd_errors.h>
@@ -34,16 +29,52 @@
#include "unaligned.h"
#if HAVE_LZ4
-DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(LZ4F_compressionContext_t, LZ4F_freeCompressionContext, NULL);
-DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(LZ4F_decompressionContext_t, LZ4F_freeDecompressionContext, NULL);
+static void *lz4_dl = NULL;
+
+static DLSYM_FUNCTION(LZ4F_compressBegin);
+static DLSYM_FUNCTION(LZ4F_compressBound);
+static DLSYM_FUNCTION(LZ4F_compressEnd);
+static DLSYM_FUNCTION(LZ4F_compressUpdate);
+static DLSYM_FUNCTION(LZ4F_createCompressionContext);
+static DLSYM_FUNCTION(LZ4F_createDecompressionContext);
+static DLSYM_FUNCTION(LZ4F_decompress);
+static DLSYM_FUNCTION(LZ4F_freeCompressionContext);
+static DLSYM_FUNCTION(LZ4F_freeDecompressionContext);
+static DLSYM_FUNCTION(LZ4F_isError);
+DLSYM_FUNCTION(LZ4_compress_default);
+DLSYM_FUNCTION(LZ4_decompress_safe);
+DLSYM_FUNCTION(LZ4_decompress_safe_partial);
+DLSYM_FUNCTION(LZ4_versionNumber);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(LZ4F_compressionContext_t, sym_LZ4F_freeCompressionContext, NULL);
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(LZ4F_decompressionContext_t, sym_LZ4F_freeDecompressionContext, NULL);
#endif
#if HAVE_ZSTD
-DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ZSTD_CCtx*, ZSTD_freeCCtx, NULL);
-DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ZSTD_DCtx*, ZSTD_freeDCtx, NULL);
+static void *zstd_dl = NULL;
+
+static DLSYM_FUNCTION(ZSTD_CCtx_setParameter);
+static DLSYM_FUNCTION(ZSTD_compress);
+static DLSYM_FUNCTION(ZSTD_compressStream2);
+static DLSYM_FUNCTION(ZSTD_createCCtx);
+static DLSYM_FUNCTION(ZSTD_createDCtx);
+static DLSYM_FUNCTION(ZSTD_CStreamInSize);
+static DLSYM_FUNCTION(ZSTD_CStreamOutSize);
+static DLSYM_FUNCTION(ZSTD_decompressStream);
+static DLSYM_FUNCTION(ZSTD_DStreamInSize);
+static DLSYM_FUNCTION(ZSTD_DStreamOutSize);
+static DLSYM_FUNCTION(ZSTD_freeCCtx);
+static DLSYM_FUNCTION(ZSTD_freeDCtx);
+static DLSYM_FUNCTION(ZSTD_getErrorCode);
+static DLSYM_FUNCTION(ZSTD_getErrorName);
+static DLSYM_FUNCTION(ZSTD_getFrameContentSize);
+static DLSYM_FUNCTION(ZSTD_isError);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ZSTD_CCtx*, sym_ZSTD_freeCCtx, NULL);
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ZSTD_DCtx*, sym_ZSTD_freeDCtx, NULL);
static int zstd_ret_to_errno(size_t ret) {
- switch (ZSTD_getErrorCode(ret)) {
+ switch (sym_ZSTD_getErrorCode(ret)) {
case ZSTD_error_dstSize_tooSmall:
return -ENOBUFS;
case ZSTD_error_memory_allocation:
@@ -54,6 +85,27 @@ static int zstd_ret_to_errno(size_t ret) {
}
#endif
+#if HAVE_XZ
+static void *lzma_dl = NULL;
+
+static DLSYM_FUNCTION(lzma_code);
+static DLSYM_FUNCTION(lzma_easy_encoder);
+static DLSYM_FUNCTION(lzma_end);
+static DLSYM_FUNCTION(lzma_stream_buffer_encode);
+static DLSYM_FUNCTION(lzma_stream_decoder);
+
+/* We can't just do _cleanup_(sym_lzma_end) because a compiler bug makes
+ * this fail with:
+ * ../src/basic/compress.c: In function ‘decompress_blob_xz’:
+ * ../src/basic/compress.c:304:9: error: cleanup argument not a function
+ * 304 | _cleanup_(sym_lzma_end) lzma_stream s = LZMA_STREAM_INIT;
+ * | ^~~~~~~~~
+ */
+static inline void lzma_end_wrapper(lzma_stream *ls) {
+ sym_lzma_end(ls);
+}
+#endif
+
#define ALIGN_8(l) ALIGN_TO(l, sizeof(size_t))
static const char* const compression_table[_COMPRESSION_MAX] = {
@@ -75,8 +127,28 @@ bool compression_supported(Compression c) {
return c >= 0 && c < _COMPRESSION_MAX && FLAGS_SET(supported, 1U << c);
}
+#if HAVE_XZ
+int dlopen_lzma(void) {
+ return dlopen_many_sym_or_warn(
+ &lzma_dl,
+ "liblzma.so.5", LOG_DEBUG,
+ DLSYM_ARG(lzma_code),
+ DLSYM_ARG(lzma_easy_encoder),
+ DLSYM_ARG(lzma_end),
+ DLSYM_ARG(lzma_stream_buffer_encode),
+ DLSYM_ARG(lzma_stream_decoder));
+}
+#endif
+
int compress_blob_xz(const void *src, uint64_t src_size,
void *dst, size_t dst_alloc_size, size_t *dst_size) {
+
+ assert(src);
+ assert(src_size > 0);
+ assert(dst);
+ assert(dst_alloc_size > 0);
+ assert(dst_size);
+
#if HAVE_XZ
static const lzma_options_lzma opt = {
1u << 20u, NULL, 0, LZMA_LC_DEFAULT, LZMA_LP_DEFAULT,
@@ -88,12 +160,11 @@ int compress_blob_xz(const void *src, uint64_t src_size,
};
lzma_ret ret;
size_t out_pos = 0;
+ int r;
- assert(src);
- assert(src_size > 0);
- assert(dst);
- assert(dst_alloc_size > 0);
- assert(dst_size);
+ r = dlopen_lzma();
+ if (r < 0)
+ return r;
/* Returns < 0 if we couldn't compress the data or the
* compressed result is longer than the original */
@@ -101,7 +172,7 @@ int compress_blob_xz(const void *src, uint64_t src_size,
if (src_size < 80)
return -ENOBUFS;
- ret = lzma_stream_buffer_encode((lzma_filter*) filters, LZMA_CHECK_NONE, NULL,
+ ret = sym_lzma_stream_buffer_encode((lzma_filter*) filters, LZMA_CHECK_NONE, NULL,
src, src_size, dst, &out_pos, dst_alloc_size);
if (ret != LZMA_OK)
return -ENOBUFS;
@@ -113,10 +184,30 @@ int compress_blob_xz(const void *src, uint64_t src_size,
#endif
}
+#if HAVE_LZ4
+int dlopen_lz4(void) {
+ return dlopen_many_sym_or_warn(
+ &lz4_dl,
+ "liblz4.so.1", LOG_DEBUG,
+ DLSYM_ARG(LZ4F_compressBegin),
+ DLSYM_ARG(LZ4F_compressBound),
+ DLSYM_ARG(LZ4F_compressEnd),
+ DLSYM_ARG(LZ4F_compressUpdate),
+ DLSYM_ARG(LZ4F_createCompressionContext),
+ DLSYM_ARG(LZ4F_createDecompressionContext),
+ DLSYM_ARG(LZ4F_decompress),
+ DLSYM_ARG(LZ4F_freeCompressionContext),
+ DLSYM_ARG(LZ4F_freeDecompressionContext),
+ DLSYM_ARG(LZ4F_isError),
+ DLSYM_ARG(LZ4_compress_default),
+ DLSYM_ARG(LZ4_decompress_safe),
+ DLSYM_ARG(LZ4_decompress_safe_partial),
+ DLSYM_ARG(LZ4_versionNumber));
+}
+#endif
+
int compress_blob_lz4(const void *src, uint64_t src_size,
void *dst, size_t dst_alloc_size, size_t *dst_size) {
-#if HAVE_LZ4
- int r;
assert(src);
assert(src_size > 0);
@@ -124,13 +215,19 @@ int compress_blob_lz4(const void *src, uint64_t src_size,
assert(dst_alloc_size > 0);
assert(dst_size);
+#if HAVE_LZ4
+ int r;
+
+ r = dlopen_lz4();
+ if (r < 0)
+ return r;
/* Returns < 0 if we couldn't compress the data or the
* compressed result is longer than the original */
if (src_size < 9)
return -ENOBUFS;
- r = LZ4_compress_default(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8);
+ r = sym_LZ4_compress_default(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8);
if (r <= 0)
return -ENOBUFS;
@@ -143,11 +240,33 @@ int compress_blob_lz4(const void *src, uint64_t src_size,
#endif
}
+#if HAVE_ZSTD
+int dlopen_zstd(void) {
+ return dlopen_many_sym_or_warn(
+ &zstd_dl,
+ "libzstd.so.1", LOG_DEBUG,
+ DLSYM_ARG(ZSTD_getErrorCode),
+ DLSYM_ARG(ZSTD_compress),
+ DLSYM_ARG(ZSTD_getFrameContentSize),
+ DLSYM_ARG(ZSTD_decompressStream),
+ DLSYM_ARG(ZSTD_getErrorName),
+ DLSYM_ARG(ZSTD_DStreamOutSize),
+ DLSYM_ARG(ZSTD_CStreamInSize),
+ DLSYM_ARG(ZSTD_CStreamOutSize),
+ DLSYM_ARG(ZSTD_CCtx_setParameter),
+ DLSYM_ARG(ZSTD_compressStream2),
+ DLSYM_ARG(ZSTD_DStreamInSize),
+ DLSYM_ARG(ZSTD_freeCCtx),
+ DLSYM_ARG(ZSTD_freeDCtx),
+ DLSYM_ARG(ZSTD_isError),
+ DLSYM_ARG(ZSTD_createDCtx),
+ DLSYM_ARG(ZSTD_createCCtx));
+}
+#endif
+
int compress_blob_zstd(
const void *src, uint64_t src_size,
void *dst, size_t dst_alloc_size, size_t *dst_size) {
-#if HAVE_ZSTD
- size_t k;
assert(src);
assert(src_size > 0);
@@ -155,8 +274,16 @@ int compress_blob_zstd(
assert(dst_alloc_size > 0);
assert(dst_size);
- k = ZSTD_compress(dst, dst_alloc_size, src, src_size, 0);
- if (ZSTD_isError(k))
+#if HAVE_ZSTD
+ size_t k;
+ int r;
+
+ r = dlopen_zstd();
+ if (r < 0)
+ return r;
+
+ k = sym_ZSTD_compress(dst, dst_alloc_size, src, src_size, 0);
+ if (sym_ZSTD_isError(k))
return zstd_ret_to_errno(k);
*dst_size = k;
@@ -173,17 +300,22 @@ int decompress_blob_xz(
size_t* dst_size,
size_t dst_max) {
-#if HAVE_XZ
- _cleanup_(lzma_end) lzma_stream s = LZMA_STREAM_INIT;
- lzma_ret ret;
- size_t space;
-
assert(src);
assert(src_size > 0);
assert(dst);
assert(dst_size);
- ret = lzma_stream_decoder(&s, UINT64_MAX, 0);
+#if HAVE_XZ
+ _cleanup_(lzma_end_wrapper) lzma_stream s = LZMA_STREAM_INIT;
+ lzma_ret ret;
+ size_t space;
+ int r;
+
+ r = dlopen_lzma();
+ if (r < 0)
+ return r;
+
+ ret = sym_lzma_stream_decoder(&s, UINT64_MAX, 0);
if (ret != LZMA_OK)
return -ENOMEM;
@@ -200,7 +332,7 @@ int decompress_blob_xz(
for (;;) {
size_t used;
- ret = lzma_code(&s, LZMA_FINISH);
+ ret = sym_lzma_code(&s, LZMA_FINISH);
if (ret == LZMA_STREAM_END)
break;
@@ -235,15 +367,19 @@ int decompress_blob_lz4(
size_t* dst_size,
size_t dst_max) {
-#if HAVE_LZ4
- char* out;
- int r, size; /* LZ4 uses int for size */
-
assert(src);
assert(src_size > 0);
assert(dst);
assert(dst_size);
+#if HAVE_LZ4
+ char* out;
+ int r, size; /* LZ4 uses int for size */
+
+ r = dlopen_lz4();
+ if (r < 0)
+ return r;
+
if (src_size <= 8)
return -EBADMSG;
@@ -254,7 +390,7 @@ int decompress_blob_lz4(
if (!out)
return -ENOMEM;
- r = LZ4_decompress_safe((char*)src + 8, out, src_size - 8, size);
+ r = sym_LZ4_decompress_safe((char*)src + 8, out, src_size - 8, size);
if (r < 0 || r != size)
return -EBADMSG;
@@ -272,15 +408,20 @@ int decompress_blob_zstd(
size_t *dst_size,
size_t dst_max) {
-#if HAVE_ZSTD
- uint64_t size;
-
assert(src);
assert(src_size > 0);
assert(dst);
assert(dst_size);
- size = ZSTD_getFrameContentSize(src, src_size);
+#if HAVE_ZSTD
+ uint64_t size;
+ int r;
+
+ r = dlopen_zstd();
+ if (r < 0)
+ return r;
+
+ size = sym_ZSTD_getFrameContentSize(src, src_size);
if (IN_SET(size, ZSTD_CONTENTSIZE_ERROR, ZSTD_CONTENTSIZE_UNKNOWN))
return -EBADMSG;
@@ -289,10 +430,10 @@ int decompress_blob_zstd(
if (size > SIZE_MAX)
return -E2BIG;
- if (!(greedy_realloc(dst, MAX(ZSTD_DStreamOutSize(), size), 1)))
+ if (!(greedy_realloc(dst, MAX(sym_ZSTD_DStreamOutSize(), size), 1)))
return -ENOMEM;
- _cleanup_(ZSTD_freeDCtxp) ZSTD_DCtx *dctx = ZSTD_createDCtx();
+ _cleanup_(sym_ZSTD_freeDCtxp) ZSTD_DCtx *dctx = sym_ZSTD_createDCtx();
if (!dctx)
return -ENOMEM;
@@ -305,9 +446,9 @@ int decompress_blob_zstd(
.size = MALLOC_SIZEOF_SAFE(*dst),
};
- size_t k = ZSTD_decompressStream(dctx, &output, &input);
- if (ZSTD_isError(k)) {
- log_debug("ZSTD decoder failed: %s", ZSTD_getErrorName(k));
+ size_t k = sym_ZSTD_decompressStream(dctx, &output, &input);
+ if (sym_ZSTD_isError(k)) {
+ log_debug("ZSTD decoder failed: %s", sym_ZSTD_getErrorName(k));
return zstd_ret_to_errno(k);
}
assert(output.pos >= size);
@@ -351,11 +492,6 @@ int decompress_startswith_xz(
size_t prefix_len,
uint8_t extra) {
-#if HAVE_XZ
- _cleanup_(lzma_end) lzma_stream s = LZMA_STREAM_INIT;
- size_t allocated;
- lzma_ret ret;
-
/* Checks whether the decompressed blob starts with the mentioned prefix. The byte extra needs to
* follow the prefix */
@@ -364,7 +500,17 @@ int decompress_startswith_xz(
assert(buffer);
assert(prefix);
- ret = lzma_stream_decoder(&s, UINT64_MAX, 0);
+#if HAVE_XZ
+ _cleanup_(lzma_end_wrapper) lzma_stream s = LZMA_STREAM_INIT;
+ size_t allocated;
+ lzma_ret ret;
+ int r;
+
+ r = dlopen_lzma();
+ if (r < 0)
+ return r;
+
+ ret = sym_lzma_stream_decoder(&s, UINT64_MAX, 0);
if (ret != LZMA_OK)
return -EBADMSG;
@@ -380,7 +526,7 @@ int decompress_startswith_xz(
s.avail_out = allocated;
for (;;) {
- ret = lzma_code(&s, LZMA_FINISH);
+ ret = sym_lzma_code(&s, LZMA_FINISH);
if (!IN_SET(ret, LZMA_OK, LZMA_STREAM_END))
return -EBADMSG;
@@ -414,18 +560,22 @@ int decompress_startswith_lz4(
size_t prefix_len,
uint8_t extra) {
-#if HAVE_LZ4
/* Checks whether the decompressed blob starts with the mentioned prefix. The byte extra needs to
* follow the prefix */
- size_t allocated;
- int r;
-
assert(src);
assert(src_size > 0);
assert(buffer);
assert(prefix);
+#if HAVE_LZ4
+ size_t allocated;
+ int r;
+
+ r = dlopen_lz4();
+ if (r < 0)
+ return r;
+
if (src_size <= 8)
return -EBADMSG;
@@ -433,7 +583,7 @@ int decompress_startswith_lz4(
return -ENOMEM;
allocated = MALLOC_SIZEOF_SAFE(*buffer);
- r = LZ4_decompress_safe_partial(
+ r = sym_LZ4_decompress_safe_partial(
(char*)src + 8,
*buffer,
src_size - 8,
@@ -447,7 +597,7 @@ int decompress_startswith_lz4(
if (r < 0 || (size_t) r < prefix_len + 1) {
size_t size;
- if (LZ4_versionNumber() >= 10803)
+ if (sym_LZ4_versionNumber() >= 10803)
/* We trust that the newer lz4 decompresses the number of bytes we
* requested if available in the compressed string. */
return 0;
@@ -482,24 +632,31 @@ int decompress_startswith_zstd(
const void *prefix,
size_t prefix_len,
uint8_t extra) {
-#if HAVE_ZSTD
+
assert(src);
assert(src_size > 0);
assert(buffer);
assert(prefix);
- uint64_t size = ZSTD_getFrameContentSize(src, src_size);
+#if HAVE_ZSTD
+ int r;
+
+ r = dlopen_zstd();
+ if (r < 0)
+ return r;
+
+ uint64_t size = sym_ZSTD_getFrameContentSize(src, src_size);
if (IN_SET(size, ZSTD_CONTENTSIZE_ERROR, ZSTD_CONTENTSIZE_UNKNOWN))
return -EBADMSG;
if (size < prefix_len + 1)
return 0; /* Decompressed text too short to match the prefix and extra */
- _cleanup_(ZSTD_freeDCtxp) ZSTD_DCtx *dctx = ZSTD_createDCtx();
+ _cleanup_(sym_ZSTD_freeDCtxp) ZSTD_DCtx *dctx = sym_ZSTD_createDCtx();
if (!dctx)
return -ENOMEM;
- if (!(greedy_realloc(buffer, MAX(ZSTD_DStreamOutSize(), prefix_len + 1), 1)))
+ if (!(greedy_realloc(buffer, MAX(sym_ZSTD_DStreamOutSize(), prefix_len + 1), 1)))
return -ENOMEM;
ZSTD_inBuffer input = {
@@ -512,9 +669,9 @@ int decompress_startswith_zstd(
};
size_t k;
- k = ZSTD_decompressStream(dctx, &output, &input);
- if (ZSTD_isError(k)) {
- log_debug("ZSTD decoder failed: %s", ZSTD_getErrorName(k));
+ k = sym_ZSTD_decompressStream(dctx, &output, &input);
+ if (sym_ZSTD_isError(k)) {
+ log_debug("ZSTD decoder failed: %s", sym_ZSTD_getErrorName(k));
return zstd_ret_to_errno(k);
}
assert(output.pos >= prefix_len + 1);
@@ -559,16 +716,21 @@ int decompress_startswith(
}
int compress_stream_xz(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size) {
+ assert(fdf >= 0);
+ assert(fdt >= 0);
+
#if HAVE_XZ
- _cleanup_(lzma_end) lzma_stream s = LZMA_STREAM_INIT;
+ _cleanup_(lzma_end_wrapper) lzma_stream s = LZMA_STREAM_INIT;
lzma_ret ret;
uint8_t buf[BUFSIZ], out[BUFSIZ];
lzma_action action = LZMA_RUN;
+ int r;
- assert(fdf >= 0);
- assert(fdt >= 0);
+ r = dlopen_lzma();
+ if (r < 0)
+ return r;
- ret = lzma_easy_encoder(&s, LZMA_PRESET_DEFAULT, LZMA_CHECK_CRC64);
+ ret = sym_lzma_easy_encoder(&s, LZMA_PRESET_DEFAULT, LZMA_CHECK_CRC64);
if (ret != LZMA_OK)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Failed to initialize XZ encoder: code %u",
@@ -603,7 +765,7 @@ int compress_stream_xz(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncom
s.avail_out = sizeof(out);
}
- ret = lzma_code(&s, action);
+ ret = sym_lzma_code(&s, action);
if (!IN_SET(ret, LZMA_OK, LZMA_STREAM_END))
return log_error_errno(SYNTHETIC_ERRNO(EBADMSG),
"Compression failed: code %u",
@@ -641,7 +803,7 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unco
#if HAVE_LZ4
LZ4F_errorCode_t c;
- _cleanup_(LZ4F_freeCompressionContextp) LZ4F_compressionContext_t ctx = NULL;
+ _cleanup_(sym_LZ4F_freeCompressionContextp) LZ4F_compressionContext_t ctx = NULL;
_cleanup_free_ void *in_buff = NULL;
_cleanup_free_ char *out_buff = NULL;
size_t out_allocsize, n, offset = 0, frame_size;
@@ -651,11 +813,15 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unco
.frameInfo.blockSizeID = 5,
};
- c = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
- if (LZ4F_isError(c))
+ r = dlopen_lz4();
+ if (r < 0)
+ return r;
+
+ c = sym_LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
+ if (sym_LZ4F_isError(c))
return -ENOMEM;
- frame_size = LZ4F_compressBound(LZ4_BUFSIZE, &preferences);
+ frame_size = sym_LZ4F_compressBound(LZ4_BUFSIZE, &preferences);
out_allocsize = frame_size + 64*1024; /* add some space for header and trailer */
out_buff = malloc(out_allocsize);
if (!out_buff)
@@ -665,8 +831,8 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unco
if (!in_buff)
return -ENOMEM;
- n = offset = total_out = LZ4F_compressBegin(ctx, out_buff, out_allocsize, &preferences);
- if (LZ4F_isError(n))
+ n = offset = total_out = sym_LZ4F_compressBegin(ctx, out_buff, out_allocsize, &preferences);
+ if (sym_LZ4F_isError(n))
return -EINVAL;
log_debug("Buffer size is %zu bytes, header size %zu bytes.", out_allocsize, n);
@@ -679,9 +845,9 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unco
return k;
if (k == 0)
break;
- n = LZ4F_compressUpdate(ctx, out_buff + offset, out_allocsize - offset,
+ n = sym_LZ4F_compressUpdate(ctx, out_buff + offset, out_allocsize - offset,
in_buff, k, NULL);
- if (LZ4F_isError(n))
+ if (sym_LZ4F_isError(n))
return -ENOTRECOVERABLE;
total_in += k;
@@ -700,8 +866,8 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unco
}
}
- n = LZ4F_compressEnd(ctx, out_buff + offset, out_allocsize - offset, NULL);
- if (LZ4F_isError(n))
+ n = sym_LZ4F_compressEnd(ctx, out_buff + offset, out_allocsize - offset, NULL);
+ if (sym_LZ4F_isError(n))
return -ENOTRECOVERABLE;
offset += n;
@@ -724,18 +890,22 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unco
}
int decompress_stream_xz(int fdf, int fdt, uint64_t max_bytes) {
+ assert(fdf >= 0);
+ assert(fdt >= 0);
#if HAVE_XZ
- _cleanup_(lzma_end) lzma_stream s = LZMA_STREAM_INIT;
+ _cleanup_(lzma_end_wrapper) lzma_stream s = LZMA_STREAM_INIT;
lzma_ret ret;
uint8_t buf[BUFSIZ], out[BUFSIZ];
lzma_action action = LZMA_RUN;
+ int r;
- assert(fdf >= 0);
- assert(fdt >= 0);
+ r = dlopen_lzma();
+ if (r < 0)
+ return r;
- ret = lzma_stream_decoder(&s, UINT64_MAX, 0);
+ ret = sym_lzma_stream_decoder(&s, UINT64_MAX, 0);
if (ret != LZMA_OK)
return log_debug_errno(SYNTHETIC_ERRNO(ENOMEM),
"Failed to initialize XZ decoder: code %u",
@@ -761,7 +931,7 @@ int decompress_stream_xz(int fdf, int fdt, uint64_t max_bytes) {
s.avail_out = sizeof(out);
}
- ret = lzma_code(&s, action);
+ ret = sym_lzma_code(&s, action);
if (!IN_SET(ret, LZMA_OK, LZMA_STREAM_END))
return log_debug_errno(SYNTHETIC_ERRNO(EBADMSG),
"Decompression failed: code %u",
@@ -801,15 +971,19 @@ int decompress_stream_xz(int fdf, int fdt, uint64_t max_bytes) {
int decompress_stream_lz4(int in, int out, uint64_t max_bytes) {
#if HAVE_LZ4
size_t c;
- _cleanup_(LZ4F_freeDecompressionContextp) LZ4F_decompressionContext_t ctx = NULL;
+ _cleanup_(sym_LZ4F_freeDecompressionContextp) LZ4F_decompressionContext_t ctx = NULL;
_cleanup_free_ char *buf = NULL;
char *src;
struct stat st;
- int r = 0;
+ int r;
size_t total_in = 0, total_out = 0;
- c = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
- if (LZ4F_isError(c))
+ r = dlopen_lz4();
+ if (r < 0)
+ return r;
+
+ c = sym_LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
+ if (sym_LZ4F_isError(c))
return -ENOMEM;
if (fstat(in, &st) < 0)
@@ -830,8 +1004,8 @@ int decompress_stream_lz4(int in, int out, uint64_t max_bytes) {
size_t produced = LZ4_BUFSIZE;
size_t used = st.st_size - total_in;
- c = LZ4F_decompress(ctx, buf, &produced, src + total_in, &used, NULL);
- if (LZ4F_isError(c)) {
+ c = sym_LZ4F_decompress(ctx, buf, &produced, src + total_in, &used, NULL);
+ if (sym_LZ4F_isError(c)) {
r = -EBADMSG;
goto cleanup;
}
@@ -853,6 +1027,7 @@ int decompress_stream_lz4(int in, int out, uint64_t max_bytes) {
log_debug("LZ4 decompression finished (%zu -> %zu bytes, %.1f%%)",
total_in, total_out,
total_in > 0 ? (double) total_out / total_in * 100 : 0.0);
+ r = 0;
cleanup:
munmap(src, st.st_size);
return r;
@@ -863,28 +1038,33 @@ int decompress_stream_lz4(int in, int out, uint64_t max_bytes) {
}
int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size) {
+ assert(fdf >= 0);
+ assert(fdt >= 0);
+
#if HAVE_ZSTD
- _cleanup_(ZSTD_freeCCtxp) ZSTD_CCtx *cctx = NULL;
+ _cleanup_(sym_ZSTD_freeCCtxp) ZSTD_CCtx *cctx = NULL;
_cleanup_free_ void *in_buff = NULL, *out_buff = NULL;
size_t in_allocsize, out_allocsize;
size_t z;
uint64_t left = max_bytes, in_bytes = 0;
+ int r;
- assert(fdf >= 0);
- assert(fdt >= 0);
+ r = dlopen_zstd();
+ if (r < 0)
+ return r;
/* Create the context and buffers */
- in_allocsize = ZSTD_CStreamInSize();
- out_allocsize = ZSTD_CStreamOutSize();
+ in_allocsize = sym_ZSTD_CStreamInSize();
+ out_allocsize = sym_ZSTD_CStreamOutSize();
in_buff = malloc(in_allocsize);
out_buff = malloc(out_allocsize);
- cctx = ZSTD_createCCtx();
+ cctx = sym_ZSTD_createCCtx();
if (!cctx || !out_buff || !in_buff)
return -ENOMEM;
- z = ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1);
- if (ZSTD_isError(z))
- log_debug("Failed to enable ZSTD checksum, ignoring: %s", ZSTD_getErrorName(z));
+ z = sym_ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1);
+ if (sym_ZSTD_isError(z))
+ log_debug("Failed to enable ZSTD checksum, ignoring: %s", sym_ZSTD_getErrorName(z));
/* This loop read from the input file, compresses that entire chunk,
* and writes all output produced to the output file.
@@ -919,12 +1099,12 @@ int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unc
* output to the file so we can reuse the buffer next
* iteration.
*/
- remaining = ZSTD_compressStream2(
+ remaining = sym_ZSTD_compressStream2(
cctx, &output, &input,
is_last_chunk ? ZSTD_e_end : ZSTD_e_continue);
- if (ZSTD_isError(remaining)) {
- log_debug("ZSTD encoder failed: %s", ZSTD_getErrorName(remaining));
+ if (sym_ZSTD_isError(remaining)) {
+ log_debug("ZSTD encoder failed: %s", sym_ZSTD_getErrorName(remaining));
return zstd_ret_to_errno(remaining);
}
@@ -968,22 +1148,26 @@ int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_unc
}
int decompress_stream_zstd(int fdf, int fdt, uint64_t max_bytes) {
+ assert(fdf >= 0);
+ assert(fdt >= 0);
+
#if HAVE_ZSTD
- _cleanup_(ZSTD_freeDCtxp) ZSTD_DCtx *dctx = NULL;
+ _cleanup_(sym_ZSTD_freeDCtxp) ZSTD_DCtx *dctx = NULL;
_cleanup_free_ void *in_buff = NULL, *out_buff = NULL;
size_t in_allocsize, out_allocsize;
size_t last_result = 0;
uint64_t left = max_bytes, in_bytes = 0;
+ int r;
- assert(fdf >= 0);
- assert(fdt >= 0);
-
+ r = dlopen_zstd();
+ if (r < 0)
+ return r;
/* Create the context and buffers */
- in_allocsize = ZSTD_DStreamInSize();
- out_allocsize = ZSTD_DStreamOutSize();
+ in_allocsize = sym_ZSTD_DStreamInSize();
+ out_allocsize = sym_ZSTD_DStreamOutSize();
in_buff = malloc(in_allocsize);
out_buff = malloc(out_allocsize);
- dctx = ZSTD_createDCtx();
+ dctx = sym_ZSTD_createDCtx();
if (!dctx || !out_buff || !in_buff)
return -ENOMEM;
@@ -1032,8 +1216,8 @@ int decompress_stream_zstd(int fdf, int fdt, uint64_t max_bytes) {
* for instance if the last decompression call returned
* an error.
*/
- last_result = ZSTD_decompressStream(dctx, &output, &input);
- if (ZSTD_isError(last_result)) {
+ last_result = sym_ZSTD_decompressStream(dctx, &output, &input);
+ if (sym_ZSTD_isError(last_result)) {
has_error = true;
break;
}
@@ -1059,7 +1243,7 @@ int decompress_stream_zstd(int fdf, int fdt, uint64_t max_bytes) {
* on a frame, but we reached the end of the file! We assume
* this is an error, and the input was truncated.
*/
- log_debug("ZSTD decoder failed: %s", ZSTD_getErrorName(last_result));
+ log_debug("ZSTD decoder failed: %s", sym_ZSTD_getErrorName(last_result));
return zstd_ret_to_errno(last_result);
}
diff --git a/src/basic/compress.h b/src/basic/compress.h
index 1b5c645e32..d15c189f85 100644
--- a/src/basic/compress.h
+++ b/src/basic/compress.h
@@ -6,6 +6,13 @@
#include <stdint.h>
#include <unistd.h>
+#if HAVE_LZ4
+#include <lz4.h>
+#include <lz4frame.h>
+#endif
+
+#include "dlfcn-util.h"
+
typedef enum Compression {
COMPRESSION_NONE,
COMPRESSION_XZ,
@@ -63,6 +70,23 @@ int decompress_stream_xz(int fdf, int fdt, uint64_t max_size);
int decompress_stream_lz4(int fdf, int fdt, uint64_t max_size);
int decompress_stream_zstd(int fdf, int fdt, uint64_t max_size);
+#if HAVE_LZ4
+DLSYM_PROTOTYPE(LZ4_compress_default);
+DLSYM_PROTOTYPE(LZ4_decompress_safe);
+DLSYM_PROTOTYPE(LZ4_decompress_safe_partial);
+DLSYM_PROTOTYPE(LZ4_versionNumber);
+
+int dlopen_lz4(void);
+#endif
+
+#if HAVE_ZSTD
+int dlopen_zstd(void);
+#endif
+
+#if HAVE_XZ
+int dlopen_lzma(void);
+#endif
+
static inline int compress_blob(
Compression compression,
const void *src, uint64_t src_size,
diff --git a/src/basic/constants.h b/src/basic/constants.h
index b86337405c..e70817c51f 100644
--- a/src/basic/constants.h
+++ b/src/basic/constants.h
@@ -42,9 +42,6 @@
#define DEFAULT_START_LIMIT_INTERVAL (10*USEC_PER_SEC)
#define DEFAULT_START_LIMIT_BURST 5
-/* Wait for 1.5 seconds at maximum for freeze operation */
-#define FREEZE_TIMEOUT (1500 * USEC_PER_MSEC)
-
/* The default time after which exit-on-idle services exit. This
* should be kept lower than the watchdog timeout, because otherwise
* the watchdog pings will keep the loop busy. */
diff --git a/src/shared/dlfcn-util.c b/src/basic/dlfcn-util.c
index a321df3c67..a321df3c67 100644
--- a/src/shared/dlfcn-util.c
+++ b/src/basic/dlfcn-util.c
diff --git a/src/shared/dlfcn-util.h b/src/basic/dlfcn-util.h
index 7d8cb4c9ab..050f1e2da7 100644
--- a/src/shared/dlfcn-util.h
+++ b/src/basic/dlfcn-util.h
@@ -5,7 +5,17 @@
#include "macro.h"
-DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(void*, dlclose, NULL);
+static inline void* safe_dlclose(void *dl) {
+ if (!dl)
+ return NULL;
+
+ assert_se(dlclose(dl) == 0);
+ return NULL;
+}
+
+static inline void dlclosep(void **dlp) {
+ safe_dlclose(*dlp);
+}
int dlsym_many_or_warn_sentinel(void *dl, int log_level, ...) _sentinel_;
int dlopen_many_sym_or_warn_sentinel(void **dlp, const char *filename, int log_level, ...) _sentinel_;
@@ -29,11 +39,3 @@ int dlopen_many_sym_or_warn_sentinel(void **dlp, const char *filename, int log_l
/* libbpf is a bit confused about type-safety and API compatibility. Provide a macro that can tape over that mess. Sad. */
#define DLSYM_ARG_FORCE(arg) \
&sym_##arg, STRINGIFY(arg)
-
-static inline void *safe_dlclose(void *p) {
- if (!p)
- return NULL;
-
- assert_se(dlclose(p) == 0);
- return NULL;
-}
diff --git a/src/basic/env-util.c b/src/basic/env-util.c
index 3bb2654657..7608f90a4a 100644
--- a/src/basic/env-util.c
+++ b/src/basic/env-util.c
@@ -963,7 +963,7 @@ int getenv_bool(const char *p) {
return parse_boolean(e);
}
-int getenv_bool_secure(const char *p) {
+int secure_getenv_bool(const char *p) {
const char *e;
e = secure_getenv(p);
@@ -973,7 +973,7 @@ int getenv_bool_secure(const char *p) {
return parse_boolean(e);
}
-int getenv_uint64_secure(const char *p, uint64_t *ret) {
+int secure_getenv_uint64(const char *p, uint64_t *ret) {
const char *e;
assert(p);
diff --git a/src/basic/env-util.h b/src/basic/env-util.h
index 15d867a3d9..6610ca8ca1 100644
--- a/src/basic/env-util.h
+++ b/src/basic/env-util.h
@@ -62,9 +62,9 @@ static inline char* strv_env_get(char * const *x, const char *n) {
char *strv_env_pairs_get(char **l, const char *name) _pure_;
int getenv_bool(const char *p);
-int getenv_bool_secure(const char *p);
+int secure_getenv_bool(const char *p);
-int getenv_uint64_secure(const char *p, uint64_t *ret);
+int secure_getenv_uint64(const char *p, uint64_t *ret);
/* Like setenv, but calls unsetenv if value == NULL. */
int set_unset_env(const char *name, const char *value, bool overwrite);
diff --git a/src/basic/escape.c b/src/basic/escape.c
index d95f35e798..2067be4092 100644
--- a/src/basic/escape.c
+++ b/src/basic/escape.c
@@ -451,6 +451,12 @@ char* octescape(const char *s, size_t len) {
assert(s || len == 0);
+ if (len == SIZE_MAX)
+ len = strlen(s);
+
+ if (len > (SIZE_MAX - 1) / 4)
+ return NULL;
+
t = buf = new(char, len * 4 + 1);
if (!buf)
return NULL;
diff --git a/src/basic/extract-word.c b/src/basic/extract-word.c
index 160f771b22..012cee6e75 100644
--- a/src/basic/extract-word.c
+++ b/src/basic/extract-word.c
@@ -244,52 +244,43 @@ int extract_first_word_and_warn(
* Let's make sure that ExtractFlags fits into an unsigned int. */
assert_cc(sizeof(enum ExtractFlags) <= sizeof(unsigned));
-int extract_many_words(const char **p, const char *separators, unsigned flags, ...) {
+int extract_many_words_internal(const char **p, const char *separators, unsigned flags, ...) {
va_list ap;
- char **l;
- int n = 0, i, c, r;
+ unsigned n = 0;
+ int r;
- /* Parses a number of words from a string, stripping any
- * quotes if necessary. */
+ /* Parses a number of words from a string, stripping any quotes if necessary. */
assert(p);
/* Count how many words are expected */
va_start(ap, flags);
- for (;;) {
- if (!va_arg(ap, char **))
- break;
+ while (va_arg(ap, char**))
n++;
- }
va_end(ap);
- if (n <= 0)
+ if (n == 0)
return 0;
/* Read all words into a temporary array */
- l = newa0(char*, n);
- for (c = 0; c < n; c++) {
+ char **l = newa0(char*, n);
+ unsigned c;
+ for (c = 0; c < n; c++) {
r = extract_first_word(p, &l[c], separators, flags);
if (r < 0) {
free_many_charp(l, c);
return r;
}
-
if (r == 0)
break;
}
- /* If we managed to parse all words, return them in the passed
- * in parameters */
+ /* If we managed to parse all words, return them in the passed in parameters */
va_start(ap, flags);
- for (i = 0; i < n; i++) {
- char **v;
-
- v = va_arg(ap, char **);
- assert(v);
-
- *v = l[i];
+ FOREACH_ARRAY(i, l, n) {
+ char **v = ASSERT_PTR(va_arg(ap, char**));
+ *v = *i;
}
va_end(ap);
diff --git a/src/basic/extract-word.h b/src/basic/extract-word.h
index c82ad761ef..da4f6ae674 100644
--- a/src/basic/extract-word.h
+++ b/src/basic/extract-word.h
@@ -19,4 +19,7 @@ typedef enum ExtractFlags {
int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags);
int extract_first_word_and_warn(const char **p, char **ret, const char *separators, ExtractFlags flags, const char *unit, const char *filename, unsigned line, const char *rvalue);
-int extract_many_words(const char **p, const char *separators, unsigned flags, ...) _sentinel_;
+
+int extract_many_words_internal(const char **p, const char *separators, unsigned flags, ...) _sentinel_;
+#define extract_many_words(p, separators, flags, ...) \
+ extract_many_words_internal(p, separators, flags, ##__VA_ARGS__, NULL)
diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c
index fa78284100..c16a2ab658 100644
--- a/src/basic/fd-util.c
+++ b/src/basic/fd-util.c
@@ -913,6 +913,38 @@ int fd_is_opath(int fd) {
return FLAGS_SET(r, O_PATH);
}
+int fd_verify_safe_flags(int fd) {
+ int flags, unexpected_flags;
+
+ /* Check if an extrinsic fd is safe to work on (by a privileged service). This ensures that clients
+ * can't trick a privileged service into giving access to a file the client doesn't already have
+ * access to (especially via something like O_PATH).
+ *
+ * O_NOFOLLOW: For some reason the kernel will return this flag from fcntl; it doesn't go away
+ * immediately after open(). It should have no effect whatsoever to an already-opened FD,
+ * and since we refuse O_PATH it should be safe.
+ *
+ * RAW_O_LARGEFILE: glibc secretly sets this and neglects to hide it from us if we call fcntl.
+ * See comment in missing_fcntl.h for more details about this.
+ *
+ * O_DIRECTORY: this is set for directories, which are totally fine
+ */
+
+ assert(fd >= 0);
+
+ flags = fcntl(fd, F_GETFL);
+ if (flags < 0)
+ return -errno;
+
+ unexpected_flags = flags & ~(O_ACCMODE|O_NOFOLLOW|RAW_O_LARGEFILE|O_DIRECTORY);
+ if (unexpected_flags != 0)
+ return log_debug_errno(SYNTHETIC_ERRNO(EREMOTEIO),
+ "Unexpected flags set for extrinsic fd: 0%o",
+ (unsigned) unexpected_flags);
+
+ return 0;
+}
+
int read_nr_open(void) {
_cleanup_free_ char *nr_open = NULL;
int r;
diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h
index 044811443b..f549831090 100644
--- a/src/basic/fd-util.h
+++ b/src/basic/fd-util.h
@@ -22,20 +22,6 @@
#define EBADF_PAIR { -EBADF, -EBADF }
#define EBADF_TRIPLET { -EBADF, -EBADF, -EBADF }
-/* Flags that are safe to have set on an FD given to a privileged service to operate on.
- * This ensures that clients can't trick a privileged service into giving access to a file the client
- * doesn't already have access to (especially via something like O_PATH).
- *
- * O_NOFOLLOW: For some reason the kernel will return this flag from fcntl; it doesn't go away immediately
- * after open(). It should have no effect whatsoever to an already-opened FD, but if it does
- * it's decreasing the risk to a privileged service since it disables symlink following.
- *
- * RAW_O_LARGEFILE: glibc secretly sets this and neglects to hide it from us if we call fcntl. See comment
- * in missing_fcntl.h for more details about this.
- */
-#define SAFE_FD_FLAGS (O_ACCMODE|O_NOFOLLOW|RAW_O_LARGEFILE)
-#define UNSAFE_FD_FLAGS(flags) ((unsigned)(flags) & ~SAFE_FD_FLAGS)
-
int close_nointr(int fd);
int safe_close(int fd);
void safe_close_pair(int p[static 2]);
@@ -126,7 +112,10 @@ static inline int make_null_stdio(void) {
int fd_reopen(int fd, int flags);
int fd_reopen_condition(int fd, int flags, int mask, int *ret_new_fd);
+
int fd_is_opath(int fd);
+int fd_verify_safe_flags(int fd);
+
int read_nr_open(void);
int fd_get_diskseq(int fd, uint64_t *ret);
diff --git a/src/basic/glyph-util.c b/src/basic/glyph-util.c
index 2cec3d82cf..d37be3234a 100644
--- a/src/basic/glyph-util.c
+++ b/src/basic/glyph-util.c
@@ -41,6 +41,8 @@ const char *special_glyph_full(SpecialGlyph code, bool force_utf) {
[SPECIAL_GLYPH_TREE_SPACE] = " ",
[SPECIAL_GLYPH_TREE_TOP] = ",-",
[SPECIAL_GLYPH_VERTICAL_DOTTED] = ":",
+ [SPECIAL_GLYPH_HORIZONTAL_DOTTED] = "-",
+ [SPECIAL_GLYPH_HORIZONTAL_FAT] = "=",
[SPECIAL_GLYPH_TRIANGULAR_BULLET] = ">",
[SPECIAL_GLYPH_BLACK_CIRCLE] = "*",
[SPECIAL_GLYPH_WHITE_CIRCLE] = "*",
@@ -77,6 +79,7 @@ const char *special_glyph_full(SpecialGlyph code, bool force_utf) {
[SPECIAL_GLYPH_RED_CIRCLE] = "o",
[SPECIAL_GLYPH_YELLOW_CIRCLE] = "o",
[SPECIAL_GLYPH_BLUE_CIRCLE] = "o",
+ [SPECIAL_GLYPH_GREEN_CIRCLE] = "o",
},
/* UTF-8 */
@@ -90,6 +93,8 @@ const char *special_glyph_full(SpecialGlyph code, bool force_utf) {
/* Single glyphs in both cases */
[SPECIAL_GLYPH_VERTICAL_DOTTED] = u8"┆",
+ [SPECIAL_GLYPH_HORIZONTAL_DOTTED] = u8"┄",
+ [SPECIAL_GLYPH_HORIZONTAL_FAT] = u8"━",
[SPECIAL_GLYPH_TRIANGULAR_BULLET] = u8"‣",
[SPECIAL_GLYPH_BLACK_CIRCLE] = u8"●",
[SPECIAL_GLYPH_WHITE_CIRCLE] = u8"○",
@@ -143,6 +148,7 @@ const char *special_glyph_full(SpecialGlyph code, bool force_utf) {
[SPECIAL_GLYPH_RED_CIRCLE] = u8"🔴",
[SPECIAL_GLYPH_YELLOW_CIRCLE] = u8"🟡",
[SPECIAL_GLYPH_BLUE_CIRCLE] = u8"🔵",
+ [SPECIAL_GLYPH_GREEN_CIRCLE] = u8"🟢",
},
};
diff --git a/src/basic/glyph-util.h b/src/basic/glyph-util.h
index e476fefe94..db8dbbff26 100644
--- a/src/basic/glyph-util.h
+++ b/src/basic/glyph-util.h
@@ -13,6 +13,8 @@ typedef enum SpecialGlyph {
SPECIAL_GLYPH_TREE_SPACE,
SPECIAL_GLYPH_TREE_TOP,
SPECIAL_GLYPH_VERTICAL_DOTTED,
+ SPECIAL_GLYPH_HORIZONTAL_DOTTED,
+ SPECIAL_GLYPH_HORIZONTAL_FAT,
SPECIAL_GLYPH_TRIANGULAR_BULLET,
SPECIAL_GLYPH_BLACK_CIRCLE,
SPECIAL_GLYPH_WHITE_CIRCLE,
@@ -52,6 +54,7 @@ typedef enum SpecialGlyph {
SPECIAL_GLYPH_RED_CIRCLE,
SPECIAL_GLYPH_YELLOW_CIRCLE,
SPECIAL_GLYPH_BLUE_CIRCLE,
+ SPECIAL_GLYPH_GREEN_CIRCLE,
_SPECIAL_GLYPH_MAX,
_SPECIAL_GLYPH_INVALID = -EINVAL,
} SpecialGlyph;
diff --git a/src/basic/hashmap.h b/src/basic/hashmap.h
index 28929843c8..49d9d118cc 100644
--- a/src/basic/hashmap.h
+++ b/src/basic/hashmap.h
@@ -39,8 +39,8 @@ typedef struct IteratedCache IteratedCache; /* Caches the iterated order of on
* by hashmap users, so the definition has to be here. Do not use its fields
* directly. */
typedef struct {
- unsigned idx; /* index of an entry to be iterated next */
const void *next_key; /* expected value of that entry's key pointer */
+ unsigned idx; /* index of an entry to be iterated next */
#if ENABLE_DEBUG_HASHMAP
unsigned put_count; /* hashmap's put_count recorded at start of iteration */
unsigned rem_count; /* hashmap's rem_count in previous iteration */
diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c
index 8bd9c75d59..82c8ff9a2d 100644
--- a/src/basic/in-addr-util.c
+++ b/src/basic/in-addr-util.c
@@ -91,14 +91,26 @@ bool in6_addr_is_link_local_all_nodes(const struct in6_addr *a) {
be32toh(a->s6_addr32[3]) == UINT32_C(0x00000001);
}
+bool in4_addr_is_multicast(const struct in_addr *a) {
+ assert(a);
+
+ return IN_MULTICAST(be32toh(a->s_addr));
+}
+
+bool in6_addr_is_multicast(const struct in6_addr *a) {
+ assert(a);
+
+ return IN6_IS_ADDR_MULTICAST(a);
+}
+
int in_addr_is_multicast(int family, const union in_addr_union *u) {
assert(u);
if (family == AF_INET)
- return IN_MULTICAST(be32toh(u->in.s_addr));
+ return in4_addr_is_multicast(&u->in);
if (family == AF_INET6)
- return IN6_IS_ADDR_MULTICAST(&u->in6);
+ return in6_addr_is_multicast(&u->in6);
return -EAFNOSUPPORT;
}
diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h
index 9fae3cae45..5c820c6ec6 100644
--- a/src/basic/in-addr-util.h
+++ b/src/basic/in-addr-util.h
@@ -40,6 +40,8 @@ static inline bool in_addr_data_is_set(const struct in_addr_data *a) {
return in_addr_data_is_null(a);
}
+bool in4_addr_is_multicast(const struct in_addr *a);
+bool in6_addr_is_multicast(const struct in6_addr *a);
int in_addr_is_multicast(int family, const union in_addr_union *u);
bool in4_addr_is_link_local(const struct in_addr *a);
diff --git a/src/basic/initrd-util.c b/src/basic/initrd-util.c
index 03ccfbe483..d3aa933977 100644
--- a/src/basic/initrd-util.c
+++ b/src/basic/initrd-util.c
@@ -21,7 +21,7 @@ bool in_initrd(void) {
* This can be overridden by setting SYSTEMD_IN_INITRD=0|1.
*/
- r = getenv_bool_secure("SYSTEMD_IN_INITRD");
+ r = secure_getenv_bool("SYSTEMD_IN_INITRD");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_IN_INITRD, ignoring: %m");
diff --git a/src/basic/linux/btrfs.h b/src/basic/linux/btrfs.h
index 74ed9088bd..0e05d47df3 100644
--- a/src/basic/linux/btrfs.h
+++ b/src/basic/linux/btrfs.h
@@ -189,6 +189,7 @@ struct btrfs_scrub_progress {
};
#define BTRFS_SCRUB_READONLY 1
+#define BTRFS_SCRUB_SUPPORTED_FLAGS (BTRFS_SCRUB_READONLY)
struct btrfs_ioctl_scrub_args {
__u64 devid; /* in */
__u64 start; /* in */
@@ -247,7 +248,17 @@ struct btrfs_ioctl_dev_info_args {
__u8 uuid[BTRFS_UUID_SIZE]; /* in/out */
__u64 bytes_used; /* out */
__u64 total_bytes; /* out */
- __u64 unused[379]; /* pad to 4k */
+ /*
+ * Optional, out.
+ *
+ * Showing the fsid of the device, allowing user space to check if this
+ * device is a seeding one.
+ *
+ * Introduced in v6.3, thus user space still needs to check if kernel
+ * changed this value. Older kernel will not touch the values here.
+ */
+ __u8 fsid[BTRFS_UUID_SIZE];
+ __u64 unused[377]; /* pad to 4k */
__u8 path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */
};
@@ -324,6 +335,8 @@ struct btrfs_ioctl_fs_info_args {
#define BTRFS_FEATURE_INCOMPAT_RAID1C34 (1ULL << 11)
#define BTRFS_FEATURE_INCOMPAT_ZONED (1ULL << 12)
#define BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2 (1ULL << 13)
+#define BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE (1ULL << 14)
+#define BTRFS_FEATURE_INCOMPAT_SIMPLE_QUOTA (1ULL << 16)
struct btrfs_ioctl_feature_flags {
__u64 compat_flags;
@@ -603,6 +616,9 @@ struct btrfs_ioctl_clone_range_args {
*/
#define BTRFS_DEFRAG_RANGE_COMPRESS 1
#define BTRFS_DEFRAG_RANGE_START_IO 2
+#define BTRFS_DEFRAG_RANGE_FLAGS_SUPP (BTRFS_DEFRAG_RANGE_COMPRESS | \
+ BTRFS_DEFRAG_RANGE_START_IO)
+
struct btrfs_ioctl_defrag_range_args {
/* start of the defrag operation */
__u64 start;
@@ -744,6 +760,7 @@ struct btrfs_ioctl_get_dev_stats {
#define BTRFS_QUOTA_CTL_ENABLE 1
#define BTRFS_QUOTA_CTL_DISABLE 2
#define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3
+#define BTRFS_QUOTA_CTL_ENABLE_SIMPLE_QUOTA 4
struct btrfs_ioctl_quota_ctl_args {
__u64 cmd;
__u64 status;
diff --git a/src/basic/linux/btrfs_tree.h b/src/basic/linux/btrfs_tree.h
index ab38d0f411..d24e8e1215 100644
--- a/src/basic/linux/btrfs_tree.h
+++ b/src/basic/linux/btrfs_tree.h
@@ -73,6 +73,9 @@
/* Holds the block group items for extent tree v2. */
#define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL
+/* Tracks RAID stripes in block groups. */
+#define BTRFS_RAID_STRIPE_TREE_OBJECTID 12ULL
+
/* device stats in the device tree */
#define BTRFS_DEV_STATS_OBJECTID 0ULL
@@ -216,11 +219,31 @@
*/
#define BTRFS_METADATA_ITEM_KEY 169
+/*
+ * Special inline ref key which stores the id of the subvolume which originally
+ * created the extent. This subvolume owns the extent permanently from the
+ * perspective of simple quotas. Needed to know which subvolume to free quota
+ * usage from when the extent is deleted.
+ *
+ * Stored as an inline ref rather to avoid wasting space on a separate item on
+ * top of the existing extent item. However, unlike the other inline refs,
+ * there is one one owner ref per extent rather than one per extent.
+ *
+ * Because of this, it goes at the front of the list of inline refs, and thus
+ * must have a lower type value than any other inline ref type (to satisfy the
+ * disk format rule that inline refs have non-decreasing type).
+ */
+#define BTRFS_EXTENT_OWNER_REF_KEY 172
+
#define BTRFS_TREE_BLOCK_REF_KEY 176
#define BTRFS_EXTENT_DATA_REF_KEY 178
-#define BTRFS_EXTENT_REF_V0_KEY 180
+/*
+ * Obsolete key. Defintion removed in 6.6, value may be reused in the future.
+ *
+ * #define BTRFS_EXTENT_REF_V0_KEY 180
+ */
#define BTRFS_SHARED_BLOCK_REF_KEY 182
@@ -257,6 +280,8 @@
#define BTRFS_DEV_ITEM_KEY 216
#define BTRFS_CHUNK_ITEM_KEY 228
+#define BTRFS_RAID_STRIPE_KEY 230
+
/*
* Records the overall state of the qgroups.
* There's only one instance of this key present,
@@ -715,6 +740,30 @@ struct btrfs_free_space_header {
__le64 num_bitmaps;
} __attribute__ ((__packed__));
+struct btrfs_raid_stride {
+ /* The id of device this raid extent lives on. */
+ __le64 devid;
+ /* The physical location on disk. */
+ __le64 physical;
+} __attribute__ ((__packed__));
+
+/* The stripe_extent::encoding, 1:1 mapping of enum btrfs_raid_types. */
+#define BTRFS_STRIPE_RAID0 1
+#define BTRFS_STRIPE_RAID1 2
+#define BTRFS_STRIPE_DUP 3
+#define BTRFS_STRIPE_RAID10 4
+#define BTRFS_STRIPE_RAID5 5
+#define BTRFS_STRIPE_RAID6 6
+#define BTRFS_STRIPE_RAID1C3 7
+#define BTRFS_STRIPE_RAID1C4 8
+
+struct btrfs_stripe_extent {
+ __u8 encoding;
+ __u8 reserved[7];
+ /* An array of raid strides this stripe is composed of. */
+ struct btrfs_raid_stride strides[];
+} __attribute__ ((__packed__));
+
#define BTRFS_HEADER_FLAG_WRITTEN (1ULL << 0)
#define BTRFS_HEADER_FLAG_RELOC (1ULL << 1)
@@ -783,6 +832,10 @@ struct btrfs_shared_data_ref {
__le32 count;
} __attribute__ ((__packed__));
+struct btrfs_extent_owner_ref {
+ __le64 root_id;
+} __attribute__ ((__packed__));
+
struct btrfs_extent_inline_ref {
__u8 type;
__le64 offset;
@@ -1200,9 +1253,17 @@ static inline __u16 btrfs_qgroup_level(__u64 qgroupid)
*/
#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT (1ULL << 2)
+/*
+ * Whether or not this filesystem is using simple quotas. Not exactly the
+ * incompat bit, because we support using simple quotas, disabling it, then
+ * going back to full qgroup quotas.
+ */
+#define BTRFS_QGROUP_STATUS_FLAG_SIMPLE_MODE (1ULL << 3)
+
#define BTRFS_QGROUP_STATUS_FLAGS_MASK (BTRFS_QGROUP_STATUS_FLAG_ON | \
BTRFS_QGROUP_STATUS_FLAG_RESCAN | \
- BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT)
+ BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT | \
+ BTRFS_QGROUP_STATUS_FLAG_SIMPLE_MODE)
#define BTRFS_QGROUP_STATUS_VERSION 1
@@ -1224,6 +1285,15 @@ struct btrfs_qgroup_status_item {
* of the scan. It contains a logical address
*/
__le64 rescan;
+
+ /*
+ * The generation when quotas were last enabled. Used by simple quotas to
+ * avoid decrementing when freeing an extent that was written before
+ * enable.
+ *
+ * Set only if flags contain BTRFS_QGROUP_STATUS_FLAG_SIMPLE_MODE.
+ */
+ __le64 enable_gen;
} __attribute__ ((__packed__));
struct btrfs_qgroup_info_item {
diff --git a/src/basic/linux/fou.h b/src/basic/linux/fou.h
index 87c2c9f088..b5cd3e7b37 100644
--- a/src/basic/linux/fou.h
+++ b/src/basic/linux/fou.h
@@ -1,32 +1,37 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-/* fou.h - FOU Interface */
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/* Do not edit directly, auto-generated from: */
+/* Documentation/netlink/specs/fou.yaml */
+/* YNL-GEN uapi header */
#ifndef _UAPI_LINUX_FOU_H
#define _UAPI_LINUX_FOU_H
-/* NETLINK_GENERIC related info
- */
#define FOU_GENL_NAME "fou"
-#define FOU_GENL_VERSION 0x1
+#define FOU_GENL_VERSION 1
enum {
- FOU_ATTR_UNSPEC,
- FOU_ATTR_PORT, /* u16 */
- FOU_ATTR_AF, /* u8 */
- FOU_ATTR_IPPROTO, /* u8 */
- FOU_ATTR_TYPE, /* u8 */
- FOU_ATTR_REMCSUM_NOPARTIAL, /* flag */
- FOU_ATTR_LOCAL_V4, /* u32 */
- FOU_ATTR_LOCAL_V6, /* in6_addr */
- FOU_ATTR_PEER_V4, /* u32 */
- FOU_ATTR_PEER_V6, /* in6_addr */
- FOU_ATTR_PEER_PORT, /* u16 */
- FOU_ATTR_IFINDEX, /* s32 */
-
- __FOU_ATTR_MAX,
+ FOU_ENCAP_UNSPEC,
+ FOU_ENCAP_DIRECT,
+ FOU_ENCAP_GUE,
};
-#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1)
+enum {
+ FOU_ATTR_UNSPEC,
+ FOU_ATTR_PORT,
+ FOU_ATTR_AF,
+ FOU_ATTR_IPPROTO,
+ FOU_ATTR_TYPE,
+ FOU_ATTR_REMCSUM_NOPARTIAL,
+ FOU_ATTR_LOCAL_V4,
+ FOU_ATTR_LOCAL_V6,
+ FOU_ATTR_PEER_V4,
+ FOU_ATTR_PEER_V6,
+ FOU_ATTR_PEER_PORT,
+ FOU_ATTR_IFINDEX,
+
+ __FOU_ATTR_MAX
+};
+#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1)
enum {
FOU_CMD_UNSPEC,
@@ -34,15 +39,8 @@ enum {
FOU_CMD_DEL,
FOU_CMD_GET,
- __FOU_CMD_MAX,
+ __FOU_CMD_MAX
};
-
-enum {
- FOU_ENCAP_UNSPEC,
- FOU_ENCAP_DIRECT,
- FOU_ENCAP_GUE,
-};
-
-#define FOU_CMD_MAX (__FOU_CMD_MAX - 1)
+#define FOU_CMD_MAX (__FOU_CMD_MAX - 1)
#endif /* _UAPI_LINUX_FOU_H */
diff --git a/src/basic/linux/if_bridge.h b/src/basic/linux/if_bridge.h
index d9de241d90..a5b743a2f7 100644
--- a/src/basic/linux/if_bridge.h
+++ b/src/basic/linux/if_bridge.h
@@ -523,6 +523,9 @@ enum {
BRIDGE_VLANDB_ENTRY_TUNNEL_INFO,
BRIDGE_VLANDB_ENTRY_STATS,
BRIDGE_VLANDB_ENTRY_MCAST_ROUTER,
+ BRIDGE_VLANDB_ENTRY_MCAST_N_GROUPS,
+ BRIDGE_VLANDB_ENTRY_MCAST_MAX_GROUPS,
+ BRIDGE_VLANDB_ENTRY_NEIGH_SUPPRESS,
__BRIDGE_VLANDB_ENTRY_MAX,
};
#define BRIDGE_VLANDB_ENTRY_MAX (__BRIDGE_VLANDB_ENTRY_MAX - 1)
@@ -631,6 +634,11 @@ enum {
MDBA_MDB_EATTR_GROUP_MODE,
MDBA_MDB_EATTR_SOURCE,
MDBA_MDB_EATTR_RTPROT,
+ MDBA_MDB_EATTR_DST,
+ MDBA_MDB_EATTR_DST_PORT,
+ MDBA_MDB_EATTR_VNI,
+ MDBA_MDB_EATTR_IFINDEX,
+ MDBA_MDB_EATTR_SRC_VNI,
__MDBA_MDB_EATTR_MAX
};
#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1)
@@ -715,6 +723,24 @@ enum {
};
#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
+/* [MDBA_GET_ENTRY] = {
+ * struct br_mdb_entry
+ * [MDBA_GET_ENTRY_ATTRS] = {
+ * [MDBE_ATTR_SOURCE]
+ * struct in_addr / struct in6_addr
+ * [MDBE_ATTR_SRC_VNI]
+ * u32
+ * }
+ * }
+ */
+enum {
+ MDBA_GET_ENTRY_UNSPEC,
+ MDBA_GET_ENTRY,
+ MDBA_GET_ENTRY_ATTRS,
+ __MDBA_GET_ENTRY_MAX,
+};
+#define MDBA_GET_ENTRY_MAX (__MDBA_GET_ENTRY_MAX - 1)
+
/* [MDBA_SET_ENTRY_ATTRS] = {
* [MDBE_ATTR_xxx]
* ...
@@ -726,6 +752,12 @@ enum {
MDBE_ATTR_SRC_LIST,
MDBE_ATTR_GROUP_MODE,
MDBE_ATTR_RTPROT,
+ MDBE_ATTR_DST,
+ MDBE_ATTR_DST_PORT,
+ MDBE_ATTR_VNI,
+ MDBE_ATTR_IFINDEX,
+ MDBE_ATTR_SRC_VNI,
+ MDBE_ATTR_STATE_MASK,
__MDBE_ATTR_MAX,
};
#define MDBE_ATTR_MAX (__MDBE_ATTR_MAX - 1)
diff --git a/src/basic/linux/if_link.h b/src/basic/linux/if_link.h
index 1021a7e47a..ab9bcff96e 100644
--- a/src/basic/linux/if_link.h
+++ b/src/basic/linux/if_link.h
@@ -374,6 +374,9 @@ enum {
IFLA_DEVLINK_PORT,
+ IFLA_GSO_IPV4_MAX_SIZE,
+ IFLA_GRO_IPV4_MAX_SIZE,
+ IFLA_DPLL_PIN,
__IFLA_MAX
};
@@ -458,6 +461,286 @@ enum in6_addr_gen_mode {
/* Bridge section */
+/**
+ * DOC: Bridge enum definition
+ *
+ * Please *note* that the timer values in the following section are expected
+ * in clock_t format, which is seconds multiplied by USER_HZ (generally
+ * defined as 100).
+ *
+ * @IFLA_BR_FORWARD_DELAY
+ * The bridge forwarding delay is the time spent in LISTENING state
+ * (before moving to LEARNING) and in LEARNING state (before moving
+ * to FORWARDING). Only relevant if STP is enabled.
+ *
+ * The valid values are between (2 * USER_HZ) and (30 * USER_HZ).
+ * The default value is (15 * USER_HZ).
+ *
+ * @IFLA_BR_HELLO_TIME
+ * The time between hello packets sent by the bridge, when it is a root
+ * bridge or a designated bridge. Only relevant if STP is enabled.
+ *
+ * The valid values are between (1 * USER_HZ) and (10 * USER_HZ).
+ * The default value is (2 * USER_HZ).
+ *
+ * @IFLA_BR_MAX_AGE
+ * The hello packet timeout is the time until another bridge in the
+ * spanning tree is assumed to be dead, after reception of its last hello
+ * message. Only relevant if STP is enabled.
+ *
+ * The valid values are between (6 * USER_HZ) and (40 * USER_HZ).
+ * The default value is (20 * USER_HZ).
+ *
+ * @IFLA_BR_AGEING_TIME
+ * Configure the bridge's FDB entries aging time. It is the time a MAC
+ * address will be kept in the FDB after a packet has been received from
+ * that address. After this time has passed, entries are cleaned up.
+ * Allow values outside the 802.1 standard specification for special cases:
+ *
+ * * 0 - entry never ages (all permanent)
+ * * 1 - entry disappears (no persistence)
+ *
+ * The default value is (300 * USER_HZ).
+ *
+ * @IFLA_BR_STP_STATE
+ * Turn spanning tree protocol on (*IFLA_BR_STP_STATE* > 0) or off
+ * (*IFLA_BR_STP_STATE* == 0) for this bridge.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_PRIORITY
+ * Set this bridge's spanning tree priority, used during STP root bridge
+ * election.
+ *
+ * The valid values are between 0 and 65535.
+ *
+ * @IFLA_BR_VLAN_FILTERING
+ * Turn VLAN filtering on (*IFLA_BR_VLAN_FILTERING* > 0) or off
+ * (*IFLA_BR_VLAN_FILTERING* == 0). When disabled, the bridge will not
+ * consider the VLAN tag when handling packets.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_VLAN_PROTOCOL
+ * Set the protocol used for VLAN filtering.
+ *
+ * The valid values are 0x8100(802.1Q) or 0x88A8(802.1AD). The default value
+ * is 0x8100(802.1Q).
+ *
+ * @IFLA_BR_GROUP_FWD_MASK
+ * The group forwarding mask. This is the bitmask that is applied to
+ * decide whether to forward incoming frames destined to link-local
+ * addresses (of the form 01:80:C2:00:00:0X).
+ *
+ * The default value is 0, which means the bridge does not forward any
+ * link-local frames coming on this port.
+ *
+ * @IFLA_BR_ROOT_ID
+ * The bridge root id, read only.
+ *
+ * @IFLA_BR_BRIDGE_ID
+ * The bridge id, read only.
+ *
+ * @IFLA_BR_ROOT_PORT
+ * The bridge root port, read only.
+ *
+ * @IFLA_BR_ROOT_PATH_COST
+ * The bridge root path cost, read only.
+ *
+ * @IFLA_BR_TOPOLOGY_CHANGE
+ * The bridge topology change, read only.
+ *
+ * @IFLA_BR_TOPOLOGY_CHANGE_DETECTED
+ * The bridge topology change detected, read only.
+ *
+ * @IFLA_BR_HELLO_TIMER
+ * The bridge hello timer, read only.
+ *
+ * @IFLA_BR_TCN_TIMER
+ * The bridge tcn timer, read only.
+ *
+ * @IFLA_BR_TOPOLOGY_CHANGE_TIMER
+ * The bridge topology change timer, read only.
+ *
+ * @IFLA_BR_GC_TIMER
+ * The bridge gc timer, read only.
+ *
+ * @IFLA_BR_GROUP_ADDR
+ * Set the MAC address of the multicast group this bridge uses for STP.
+ * The address must be a link-local address in standard Ethernet MAC address
+ * format. It is an address of the form 01:80:C2:00:00:0X, with X in [0, 4..f].
+ *
+ * The default value is 0.
+ *
+ * @IFLA_BR_FDB_FLUSH
+ * Flush bridge's fdb dynamic entries.
+ *
+ * @IFLA_BR_MCAST_ROUTER
+ * Set bridge's multicast router if IGMP snooping is enabled.
+ * The valid values are:
+ *
+ * * 0 - disabled.
+ * * 1 - automatic (queried).
+ * * 2 - permanently enabled.
+ *
+ * The default value is 1.
+ *
+ * @IFLA_BR_MCAST_SNOOPING
+ * Turn multicast snooping on (*IFLA_BR_MCAST_SNOOPING* > 0) or off
+ * (*IFLA_BR_MCAST_SNOOPING* == 0).
+ *
+ * The default value is 1.
+ *
+ * @IFLA_BR_MCAST_QUERY_USE_IFADDR
+ * If enabled use the bridge's own IP address as source address for IGMP
+ * queries (*IFLA_BR_MCAST_QUERY_USE_IFADDR* > 0) or the default of 0.0.0.0
+ * (*IFLA_BR_MCAST_QUERY_USE_IFADDR* == 0).
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_MCAST_QUERIER
+ * Enable (*IFLA_BR_MULTICAST_QUERIER* > 0) or disable
+ * (*IFLA_BR_MULTICAST_QUERIER* == 0) IGMP querier, ie sending of multicast
+ * queries by the bridge.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_MCAST_HASH_ELASTICITY
+ * Set multicast database hash elasticity, It is the maximum chain length in
+ * the multicast hash table. This attribute is *deprecated* and the value
+ * is always 16.
+ *
+ * @IFLA_BR_MCAST_HASH_MAX
+ * Set maximum size of the multicast hash table
+ *
+ * The default value is 4096, the value must be a power of 2.
+ *
+ * @IFLA_BR_MCAST_LAST_MEMBER_CNT
+ * The Last Member Query Count is the number of Group-Specific Queries
+ * sent before the router assumes there are no local members. The Last
+ * Member Query Count is also the number of Group-and-Source-Specific
+ * Queries sent before the router assumes there are no listeners for a
+ * particular source.
+ *
+ * The default value is 2.
+ *
+ * @IFLA_BR_MCAST_STARTUP_QUERY_CNT
+ * The Startup Query Count is the number of Queries sent out on startup,
+ * separated by the Startup Query Interval.
+ *
+ * The default value is 2.
+ *
+ * @IFLA_BR_MCAST_LAST_MEMBER_INTVL
+ * The Last Member Query Interval is the Max Response Time inserted into
+ * Group-Specific Queries sent in response to Leave Group messages, and
+ * is also the amount of time between Group-Specific Query messages.
+ *
+ * The default value is (1 * USER_HZ).
+ *
+ * @IFLA_BR_MCAST_MEMBERSHIP_INTVL
+ * The interval after which the bridge will leave a group, if no membership
+ * reports for this group are received.
+ *
+ * The default value is (260 * USER_HZ).
+ *
+ * @IFLA_BR_MCAST_QUERIER_INTVL
+ * The interval between queries sent by other routers. if no queries are
+ * seen after this delay has passed, the bridge will start to send its own
+ * queries (as if *IFLA_BR_MCAST_QUERIER_INTVL* was enabled).
+ *
+ * The default value is (255 * USER_HZ).
+ *
+ * @IFLA_BR_MCAST_QUERY_INTVL
+ * The Query Interval is the interval between General Queries sent by
+ * the Querier.
+ *
+ * The default value is (125 * USER_HZ). The minimum value is (1 * USER_HZ).
+ *
+ * @IFLA_BR_MCAST_QUERY_RESPONSE_INTVL
+ * The Max Response Time used to calculate the Max Resp Code inserted
+ * into the periodic General Queries.
+ *
+ * The default value is (10 * USER_HZ).
+ *
+ * @IFLA_BR_MCAST_STARTUP_QUERY_INTVL
+ * The interval between queries in the startup phase.
+ *
+ * The default value is (125 * USER_HZ) / 4. The minimum value is (1 * USER_HZ).
+ *
+ * @IFLA_BR_NF_CALL_IPTABLES
+ * Enable (*NF_CALL_IPTABLES* > 0) or disable (*NF_CALL_IPTABLES* == 0)
+ * iptables hooks on the bridge.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_NF_CALL_IP6TABLES
+ * Enable (*NF_CALL_IP6TABLES* > 0) or disable (*NF_CALL_IP6TABLES* == 0)
+ * ip6tables hooks on the bridge.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_NF_CALL_ARPTABLES
+ * Enable (*NF_CALL_ARPTABLES* > 0) or disable (*NF_CALL_ARPTABLES* == 0)
+ * arptables hooks on the bridge.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_VLAN_DEFAULT_PVID
+ * VLAN ID applied to untagged and priority-tagged incoming packets.
+ *
+ * The default value is 1. Setting to the special value 0 makes all ports of
+ * this bridge not have a PVID by default, which means that they will
+ * not accept VLAN-untagged traffic.
+ *
+ * @IFLA_BR_PAD
+ * Bridge attribute padding type for netlink message.
+ *
+ * @IFLA_BR_VLAN_STATS_ENABLED
+ * Enable (*IFLA_BR_VLAN_STATS_ENABLED* == 1) or disable
+ * (*IFLA_BR_VLAN_STATS_ENABLED* == 0) per-VLAN stats accounting.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_MCAST_STATS_ENABLED
+ * Enable (*IFLA_BR_MCAST_STATS_ENABLED* > 0) or disable
+ * (*IFLA_BR_MCAST_STATS_ENABLED* == 0) multicast (IGMP/MLD) stats
+ * accounting.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_MCAST_IGMP_VERSION
+ * Set the IGMP version.
+ *
+ * The valid values are 2 and 3. The default value is 2.
+ *
+ * @IFLA_BR_MCAST_MLD_VERSION
+ * Set the MLD version.
+ *
+ * The valid values are 1 and 2. The default value is 1.
+ *
+ * @IFLA_BR_VLAN_STATS_PER_PORT
+ * Enable (*IFLA_BR_VLAN_STATS_PER_PORT* == 1) or disable
+ * (*IFLA_BR_VLAN_STATS_PER_PORT* == 0) per-VLAN per-port stats accounting.
+ * Can be changed only when there are no port VLANs configured.
+ *
+ * The default value is 0 (disabled).
+ *
+ * @IFLA_BR_MULTI_BOOLOPT
+ * The multi_boolopt is used to control new boolean options to avoid adding
+ * new netlink attributes. You can look at ``enum br_boolopt_id`` for those
+ * options.
+ *
+ * @IFLA_BR_MCAST_QUERIER_STATE
+ * Bridge mcast querier states, read only.
+ *
+ * @IFLA_BR_FDB_N_LEARNED
+ * The number of dynamically learned FDB entries for the current bridge,
+ * read only.
+ *
+ * @IFLA_BR_FDB_MAX_LEARNED
+ * Set the number of max dynamically learned FDB entries for the current
+ * bridge.
+ */
enum {
IFLA_BR_UNSPEC,
IFLA_BR_FORWARD_DELAY,
@@ -507,6 +790,8 @@ enum {
IFLA_BR_VLAN_STATS_PER_PORT,
IFLA_BR_MULTI_BOOLOPT,
IFLA_BR_MCAST_QUERIER_STATE,
+ IFLA_BR_FDB_N_LEARNED,
+ IFLA_BR_FDB_MAX_LEARNED,
__IFLA_BR_MAX,
};
@@ -517,11 +802,252 @@ struct ifla_bridge_id {
__u8 addr[6]; /* ETH_ALEN */
};
+/**
+ * DOC: Bridge mode enum definition
+ *
+ * @BRIDGE_MODE_HAIRPIN
+ * Controls whether traffic may be sent back out of the port on which it
+ * was received. This option is also called reflective relay mode, and is
+ * used to support basic VEPA (Virtual Ethernet Port Aggregator)
+ * capabilities. By default, this flag is turned off and the bridge will
+ * not forward traffic back out of the receiving port.
+ */
enum {
BRIDGE_MODE_UNSPEC,
BRIDGE_MODE_HAIRPIN,
};
+/**
+ * DOC: Bridge port enum definition
+ *
+ * @IFLA_BRPORT_STATE
+ * The operation state of the port. Here are the valid values.
+ *
+ * * 0 - port is in STP *DISABLED* state. Make this port completely
+ * inactive for STP. This is also called BPDU filter and could be used
+ * to disable STP on an untrusted port, like a leaf virtual device.
+ * The traffic forwarding is also stopped on this port.
+ * * 1 - port is in STP *LISTENING* state. Only valid if STP is enabled
+ * on the bridge. In this state the port listens for STP BPDUs and
+ * drops all other traffic frames.
+ * * 2 - port is in STP *LEARNING* state. Only valid if STP is enabled on
+ * the bridge. In this state the port will accept traffic only for the
+ * purpose of updating MAC address tables.
+ * * 3 - port is in STP *FORWARDING* state. Port is fully active.
+ * * 4 - port is in STP *BLOCKING* state. Only valid if STP is enabled on
+ * the bridge. This state is used during the STP election process.
+ * In this state, port will only process STP BPDUs.
+ *
+ * @IFLA_BRPORT_PRIORITY
+ * The STP port priority. The valid values are between 0 and 255.
+ *
+ * @IFLA_BRPORT_COST
+ * The STP path cost of the port. The valid values are between 1 and 65535.
+ *
+ * @IFLA_BRPORT_MODE
+ * Set the bridge port mode. See *BRIDGE_MODE_HAIRPIN* for more details.
+ *
+ * @IFLA_BRPORT_GUARD
+ * Controls whether STP BPDUs will be processed by the bridge port. By
+ * default, the flag is turned off to allow BPDU processing. Turning this
+ * flag on will disable the bridge port if a STP BPDU packet is received.
+ *
+ * If the bridge has Spanning Tree enabled, hostile devices on the network
+ * may send BPDU on a port and cause network failure. Setting *guard on*
+ * will detect and stop this by disabling the port. The port will be
+ * restarted if the link is brought down, or removed and reattached.
+ *
+ * @IFLA_BRPORT_PROTECT
+ * Controls whether a given port is allowed to become a root port or not.
+ * Only used when STP is enabled on the bridge. By default the flag is off.
+ *
+ * This feature is also called root port guard. If BPDU is received from a
+ * leaf (edge) port, it should not be elected as root port. This could
+ * be used if using STP on a bridge and the downstream bridges are not fully
+ * trusted; this prevents a hostile guest from rerouting traffic.
+ *
+ * @IFLA_BRPORT_FAST_LEAVE
+ * This flag allows the bridge to immediately stop multicast traffic
+ * forwarding on a port that receives an IGMP Leave message. It is only used
+ * when IGMP snooping is enabled on the bridge. By default the flag is off.
+ *
+ * @IFLA_BRPORT_LEARNING
+ * Controls whether a given port will learn *source* MAC addresses from
+ * received traffic or not. Also controls whether dynamic FDB entries
+ * (which can also be added by software) will be refreshed by incoming
+ * traffic. By default this flag is on.
+ *
+ * @IFLA_BRPORT_UNICAST_FLOOD
+ * Controls whether unicast traffic for which there is no FDB entry will
+ * be flooded towards this port. By default this flag is on.
+ *
+ * @IFLA_BRPORT_PROXYARP
+ * Enable proxy ARP on this port.
+ *
+ * @IFLA_BRPORT_LEARNING_SYNC
+ * Controls whether a given port will sync MAC addresses learned on device
+ * port to bridge FDB.
+ *
+ * @IFLA_BRPORT_PROXYARP_WIFI
+ * Enable proxy ARP on this port which meets extended requirements by
+ * IEEE 802.11 and Hotspot 2.0 specifications.
+ *
+ * @IFLA_BRPORT_ROOT_ID
+ *
+ * @IFLA_BRPORT_BRIDGE_ID
+ *
+ * @IFLA_BRPORT_DESIGNATED_PORT
+ *
+ * @IFLA_BRPORT_DESIGNATED_COST
+ *
+ * @IFLA_BRPORT_ID
+ *
+ * @IFLA_BRPORT_NO
+ *
+ * @IFLA_BRPORT_TOPOLOGY_CHANGE_ACK
+ *
+ * @IFLA_BRPORT_CONFIG_PENDING
+ *
+ * @IFLA_BRPORT_MESSAGE_AGE_TIMER
+ *
+ * @IFLA_BRPORT_FORWARD_DELAY_TIMER
+ *
+ * @IFLA_BRPORT_HOLD_TIMER
+ *
+ * @IFLA_BRPORT_FLUSH
+ * Flush bridge ports' fdb dynamic entries.
+ *
+ * @IFLA_BRPORT_MULTICAST_ROUTER
+ * Configure the port's multicast router presence. A port with
+ * a multicast router will receive all multicast traffic.
+ * The valid values are:
+ *
+ * * 0 disable multicast routers on this port
+ * * 1 let the system detect the presence of routers (default)
+ * * 2 permanently enable multicast traffic forwarding on this port
+ * * 3 enable multicast routers temporarily on this port, not depending
+ * on incoming queries.
+ *
+ * @IFLA_BRPORT_PAD
+ *
+ * @IFLA_BRPORT_MCAST_FLOOD
+ * Controls whether a given port will flood multicast traffic for which
+ * there is no MDB entry. By default this flag is on.
+ *
+ * @IFLA_BRPORT_MCAST_TO_UCAST
+ * Controls whether a given port will replicate packets using unicast
+ * instead of multicast. By default this flag is off.
+ *
+ * This is done by copying the packet per host and changing the multicast
+ * destination MAC to a unicast one accordingly.
+ *
+ * *mcast_to_unicast* works on top of the multicast snooping feature of the
+ * bridge. Which means unicast copies are only delivered to hosts which
+ * are interested in unicast and signaled this via IGMP/MLD reports previously.
+ *
+ * This feature is intended for interface types which have a more reliable
+ * and/or efficient way to deliver unicast packets than broadcast ones
+ * (e.g. WiFi).
+ *
+ * However, it should only be enabled on interfaces where no IGMPv2/MLDv1
+ * report suppression takes place. IGMP/MLD report suppression issue is
+ * usually overcome by the network daemon (supplicant) enabling AP isolation
+ * and by that separating all STAs.
+ *
+ * Delivery of STA-to-STA IP multicast is made possible again by enabling
+ * and utilizing the bridge hairpin mode, which considers the incoming port
+ * as a potential outgoing port, too (see *BRIDGE_MODE_HAIRPIN* option).
+ * Hairpin mode is performed after multicast snooping, therefore leading
+ * to only deliver reports to STAs running a multicast router.
+ *
+ * @IFLA_BRPORT_VLAN_TUNNEL
+ * Controls whether vlan to tunnel mapping is enabled on the port.
+ * By default this flag is off.
+ *
+ * @IFLA_BRPORT_BCAST_FLOOD
+ * Controls flooding of broadcast traffic on the given port. By default
+ * this flag is on.
+ *
+ * @IFLA_BRPORT_GROUP_FWD_MASK
+ * Set the group forward mask. This is a bitmask that is applied to
+ * decide whether to forward incoming frames destined to link-local
+ * addresses. The addresses of the form are 01:80:C2:00:00:0X (defaults
+ * to 0, which means the bridge does not forward any link-local frames
+ * coming on this port).
+ *
+ * @IFLA_BRPORT_NEIGH_SUPPRESS
+ * Controls whether neighbor discovery (arp and nd) proxy and suppression
+ * is enabled on the port. By default this flag is off.
+ *
+ * @IFLA_BRPORT_ISOLATED
+ * Controls whether a given port will be isolated, which means it will be
+ * able to communicate with non-isolated ports only. By default this
+ * flag is off.
+ *
+ * @IFLA_BRPORT_BACKUP_PORT
+ * Set a backup port. If the port loses carrier all traffic will be
+ * redirected to the configured backup port. Set the value to 0 to disable
+ * it.
+ *
+ * @IFLA_BRPORT_MRP_RING_OPEN
+ *
+ * @IFLA_BRPORT_MRP_IN_OPEN
+ *
+ * @IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT
+ * The number of per-port EHT hosts limit. The default value is 512.
+ * Setting to 0 is not allowed.
+ *
+ * @IFLA_BRPORT_MCAST_EHT_HOSTS_CNT
+ * The current number of tracked hosts, read only.
+ *
+ * @IFLA_BRPORT_LOCKED
+ * Controls whether a port will be locked, meaning that hosts behind the
+ * port will not be able to communicate through the port unless an FDB
+ * entry with the unit's MAC address is in the FDB. The common use case is
+ * that hosts are allowed access through authentication with the IEEE 802.1X
+ * protocol or based on whitelists. By default this flag is off.
+ *
+ * Please note that secure 802.1X deployments should always use the
+ * *BR_BOOLOPT_NO_LL_LEARN* flag, to not permit the bridge to populate its
+ * FDB based on link-local (EAPOL) traffic received on the port.
+ *
+ * @IFLA_BRPORT_MAB
+ * Controls whether a port will use MAC Authentication Bypass (MAB), a
+ * technique through which select MAC addresses may be allowed on a locked
+ * port, without using 802.1X authentication. Packets with an unknown source
+ * MAC address generates a "locked" FDB entry on the incoming bridge port.
+ * The common use case is for user space to react to these bridge FDB
+ * notifications and optionally replace the locked FDB entry with a normal
+ * one, allowing traffic to pass for whitelisted MAC addresses.
+ *
+ * Setting this flag also requires *IFLA_BRPORT_LOCKED* and
+ * *IFLA_BRPORT_LEARNING*. *IFLA_BRPORT_LOCKED* ensures that unauthorized
+ * data packets are dropped, and *IFLA_BRPORT_LEARNING* allows the dynamic
+ * FDB entries installed by user space (as replacements for the locked FDB
+ * entries) to be refreshed and/or aged out.
+ *
+ * @IFLA_BRPORT_MCAST_N_GROUPS
+ *
+ * @IFLA_BRPORT_MCAST_MAX_GROUPS
+ * Sets the maximum number of MDB entries that can be registered for a
+ * given port. Attempts to register more MDB entries at the port than this
+ * limit allows will be rejected, whether they are done through netlink
+ * (e.g. the bridge tool), or IGMP or MLD membership reports. Setting a
+ * limit of 0 disables the limit. The default value is 0.
+ *
+ * @IFLA_BRPORT_NEIGH_VLAN_SUPPRESS
+ * Controls whether neighbor discovery (arp and nd) proxy and suppression is
+ * enabled for a given port. By default this flag is off.
+ *
+ * Note that this option only takes effect when *IFLA_BRPORT_NEIGH_SUPPRESS*
+ * is enabled for a given port.
+ *
+ * @IFLA_BRPORT_BACKUP_NHID
+ * The FDB nexthop object ID to attach to packets being redirected to a
+ * backup port that has VLAN tunnel mapping enabled (via the
+ * *IFLA_BRPORT_VLAN_TUNNEL* option). Setting a value of 0 (default) has
+ * the effect of not attaching any ID.
+ */
enum {
IFLA_BRPORT_UNSPEC,
IFLA_BRPORT_STATE, /* Spanning tree state */
@@ -564,6 +1090,10 @@ enum {
IFLA_BRPORT_MCAST_EHT_HOSTS_CNT,
IFLA_BRPORT_LOCKED,
IFLA_BRPORT_MAB,
+ IFLA_BRPORT_MCAST_N_GROUPS,
+ IFLA_BRPORT_MCAST_MAX_GROUPS,
+ IFLA_BRPORT_NEIGH_VLAN_SUPPRESS,
+ IFLA_BRPORT_BACKUP_NHID,
__IFLA_BRPORT_MAX
};
#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
@@ -630,6 +1160,7 @@ enum {
IFLA_MACVLAN_MACADDR_COUNT,
IFLA_MACVLAN_BC_QUEUE_LEN,
IFLA_MACVLAN_BC_QUEUE_LEN_USED,
+ IFLA_MACVLAN_BC_CUTOFF,
__IFLA_MACVLAN_MAX,
};
@@ -748,6 +1279,30 @@ struct tunnel_msg {
__u32 ifindex;
};
+/* netkit section */
+enum netkit_action {
+ NETKIT_NEXT = -1,
+ NETKIT_PASS = 0,
+ NETKIT_DROP = 2,
+ NETKIT_REDIRECT = 7,
+};
+
+enum netkit_mode {
+ NETKIT_L2,
+ NETKIT_L3,
+};
+
+enum {
+ IFLA_NETKIT_UNSPEC,
+ IFLA_NETKIT_PEER_INFO,
+ IFLA_NETKIT_PRIMARY,
+ IFLA_NETKIT_POLICY,
+ IFLA_NETKIT_PEER_POLICY,
+ IFLA_NETKIT_MODE,
+ __IFLA_NETKIT_MAX,
+};
+#define IFLA_NETKIT_MAX (__IFLA_NETKIT_MAX - 1)
+
/* VXLAN section */
/* include statistics in the dump */
@@ -821,6 +1376,8 @@ enum {
IFLA_VXLAN_TTL_INHERIT,
IFLA_VXLAN_DF,
IFLA_VXLAN_VNIFILTER, /* only applicable with COLLECT_METADATA mode */
+ IFLA_VXLAN_LOCALBYPASS,
+ IFLA_VXLAN_LABEL_POLICY, /* IPv6 flow label policy; ifla_vxlan_label_policy */
__IFLA_VXLAN_MAX
};
#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)
@@ -838,6 +1395,13 @@ enum ifla_vxlan_df {
VXLAN_DF_MAX = __VXLAN_DF_END - 1,
};
+enum ifla_vxlan_label_policy {
+ VXLAN_LABEL_FIXED = 0,
+ VXLAN_LABEL_INHERIT = 1,
+ __VXLAN_LABEL_END,
+ VXLAN_LABEL_MAX = __VXLAN_LABEL_END - 1,
+};
+
/* GENEVE section */
enum {
IFLA_GENEVE_UNSPEC,
@@ -1383,7 +1947,9 @@ enum {
enum {
IFLA_DSA_UNSPEC,
- IFLA_DSA_MASTER,
+ IFLA_DSA_CONDUIT,
+ /* Deprecated, use IFLA_DSA_CONDUIT instead */
+ IFLA_DSA_MASTER = IFLA_DSA_CONDUIT,
__IFLA_DSA_MAX,
};
diff --git a/src/basic/linux/in.h b/src/basic/linux/in.h
index 07a4cb1493..e682ab628d 100644
--- a/src/basic/linux/in.h
+++ b/src/basic/linux/in.h
@@ -162,6 +162,8 @@ struct in_addr {
#define MCAST_MSFILTER 48
#define IP_MULTICAST_ALL 49
#define IP_UNICAST_IF 50
+#define IP_LOCAL_PORT_RANGE 51
+#define IP_PROTOCOL 52
#define MCAST_EXCLUDE 0
#define MCAST_INCLUDE 1
diff --git a/src/basic/linux/netfilter/nf_tables.h b/src/basic/linux/netfilter/nf_tables.h
index cfa844da1c..117c6a9b84 100644
--- a/src/basic/linux/netfilter/nf_tables.h
+++ b/src/basic/linux/netfilter/nf_tables.h
@@ -98,6 +98,14 @@ enum nft_verdicts {
* @NFT_MSG_GETFLOWTABLE: get flow table (enum nft_flowtable_attributes)
* @NFT_MSG_DELFLOWTABLE: delete flow table (enum nft_flowtable_attributes)
* @NFT_MSG_GETRULE_RESET: get rules and reset stateful expressions (enum nft_obj_attributes)
+ * @NFT_MSG_DESTROYTABLE: destroy a table (enum nft_table_attributes)
+ * @NFT_MSG_DESTROYCHAIN: destroy a chain (enum nft_chain_attributes)
+ * @NFT_MSG_DESTROYRULE: destroy a rule (enum nft_rule_attributes)
+ * @NFT_MSG_DESTROYSET: destroy a set (enum nft_set_attributes)
+ * @NFT_MSG_DESTROYSETELEM: destroy a set element (enum nft_set_elem_attributes)
+ * @NFT_MSG_DESTROYOBJ: destroy a stateful object (enum nft_object_attributes)
+ * @NFT_MSG_DESTROYFLOWTABLE: destroy flow table (enum nft_flowtable_attributes)
+ * @NFT_MSG_GETSETELEM_RESET: get set elements and reset attached stateful expressions (enum nft_set_elem_attributes)
*/
enum nf_tables_msg_types {
NFT_MSG_NEWTABLE,
@@ -126,6 +134,14 @@ enum nf_tables_msg_types {
NFT_MSG_GETFLOWTABLE,
NFT_MSG_DELFLOWTABLE,
NFT_MSG_GETRULE_RESET,
+ NFT_MSG_DESTROYTABLE,
+ NFT_MSG_DESTROYCHAIN,
+ NFT_MSG_DESTROYRULE,
+ NFT_MSG_DESTROYSET,
+ NFT_MSG_DESTROYSETELEM,
+ NFT_MSG_DESTROYOBJ,
+ NFT_MSG_DESTROYFLOWTABLE,
+ NFT_MSG_GETSETELEM_RESET,
NFT_MSG_MAX,
};
@@ -247,6 +263,7 @@ enum nft_chain_attributes {
* @NFTA_RULE_USERDATA: user data (NLA_BINARY, NFT_USERDATA_MAXLEN)
* @NFTA_RULE_ID: uniquely identifies a rule in a transaction (NLA_U32)
* @NFTA_RULE_POSITION_ID: transaction unique identifier of the previous rule (NLA_U32)
+ * @NFTA_RULE_CHAIN_ID: add the rule to chain by ID, alternative to @NFTA_RULE_CHAIN (NLA_U32)
*/
enum nft_rule_attributes {
NFTA_RULE_UNSPEC,
@@ -268,9 +285,11 @@ enum nft_rule_attributes {
/**
* enum nft_rule_compat_flags - nf_tables rule compat flags
*
+ * @NFT_RULE_COMPAT_F_UNUSED: unused
* @NFT_RULE_COMPAT_F_INV: invert the check result
*/
enum nft_rule_compat_flags {
+ NFT_RULE_COMPAT_F_UNUSED = (1 << 0),
NFT_RULE_COMPAT_F_INV = (1 << 1),
NFT_RULE_COMPAT_F_MASK = NFT_RULE_COMPAT_F_INV,
};
@@ -671,7 +690,7 @@ enum nft_range_ops {
* enum nft_range_attributes - nf_tables range expression netlink attributes
*
* @NFTA_RANGE_SREG: source register of data to compare (NLA_U32: nft_registers)
- * @NFTA_RANGE_OP: cmp operation (NLA_U32: nft_cmp_ops)
+ * @NFTA_RANGE_OP: cmp operation (NLA_U32: nft_range_ops)
* @NFTA_RANGE_FROM_DATA: data range from (NLA_NESTED: nft_data_attributes)
* @NFTA_RANGE_TO_DATA: data range to (NLA_NESTED: nft_data_attributes)
*/
@@ -845,12 +864,14 @@ enum nft_exthdr_flags {
* @NFT_EXTHDR_OP_TCP: match against tcp options
* @NFT_EXTHDR_OP_IPV4: match against ipv4 options
* @NFT_EXTHDR_OP_SCTP: match against sctp chunks
+ * @NFT_EXTHDR_OP_DCCP: match against dccp otions
*/
enum nft_exthdr_op {
NFT_EXTHDR_OP_IPV6,
NFT_EXTHDR_OP_TCPOPT,
NFT_EXTHDR_OP_IPV4,
NFT_EXTHDR_OP_SCTP,
+ NFT_EXTHDR_OP_DCCP,
__NFT_EXTHDR_OP_MAX
};
#define NFT_EXTHDR_OP_MAX (__NFT_EXTHDR_OP_MAX - 1)
@@ -864,7 +885,7 @@ enum nft_exthdr_op {
* @NFTA_EXTHDR_LEN: extension header length (NLA_U32)
* @NFTA_EXTHDR_FLAGS: extension header flags (NLA_U32)
* @NFTA_EXTHDR_OP: option match type (NLA_U32)
- * @NFTA_EXTHDR_SREG: option match type (NLA_U32)
+ * @NFTA_EXTHDR_SREG: source register (NLA_U32: nft_registers)
*/
enum nft_exthdr_attributes {
NFTA_EXTHDR_UNSPEC,
@@ -917,6 +938,7 @@ enum nft_exthdr_attributes {
* @NFT_META_TIME_HOUR: hour of day (in seconds)
* @NFT_META_SDIF: slave device interface index
* @NFT_META_SDIFNAME: slave device interface name
+ * @NFT_META_BRI_BROUTE: packet br_netfilter_broute bit
*/
enum nft_meta_keys {
NFT_META_LEN,
@@ -955,6 +977,7 @@ enum nft_meta_keys {
NFT_META_TIME_HOUR,
NFT_META_SDIF,
NFT_META_SDIFNAME,
+ NFT_META_BRI_BROUTE,
__NFT_META_IIFTYPE,
};
@@ -1246,10 +1269,10 @@ enum nft_last_attributes {
/**
* enum nft_log_attributes - nf_tables log expression netlink attributes
*
- * @NFTA_LOG_GROUP: netlink group to send messages to (NLA_U32)
+ * @NFTA_LOG_GROUP: netlink group to send messages to (NLA_U16)
* @NFTA_LOG_PREFIX: prefix to prepend to log messages (NLA_STRING)
* @NFTA_LOG_SNAPLEN: length of payload to include in netlink message (NLA_U32)
- * @NFTA_LOG_QTHRESHOLD: queue threshold (NLA_U32)
+ * @NFTA_LOG_QTHRESHOLD: queue threshold (NLA_U16)
* @NFTA_LOG_LEVEL: log level (NLA_U32)
* @NFTA_LOG_FLAGS: logging flags (NLA_U32)
*/
diff --git a/src/basic/linux/netlink.h b/src/basic/linux/netlink.h
index e2ae82e3f9..f87aaf28a6 100644
--- a/src/basic/linux/netlink.h
+++ b/src/basic/linux/netlink.h
@@ -298,6 +298,8 @@ struct nla_bitfield32 {
* entry has attributes again, the policy for those inner ones
* and the corresponding maxtype may be specified.
* @NL_ATTR_TYPE_BITFIELD32: &struct nla_bitfield32 attribute
+ * @NL_ATTR_TYPE_SINT: 32-bit or 64-bit signed attribute, aligned to 4B
+ * @NL_ATTR_TYPE_UINT: 32-bit or 64-bit unsigned attribute, aligned to 4B
*/
enum netlink_attribute_type {
NL_ATTR_TYPE_INVALID,
@@ -322,6 +324,9 @@ enum netlink_attribute_type {
NL_ATTR_TYPE_NESTED_ARRAY,
NL_ATTR_TYPE_BITFIELD32,
+
+ NL_ATTR_TYPE_SINT,
+ NL_ATTR_TYPE_UINT,
};
/**
diff --git a/src/basic/linux/nl80211.h b/src/basic/linux/nl80211.h
index c14a91bbca..1ccdcae243 100644
--- a/src/basic/linux/nl80211.h
+++ b/src/basic/linux/nl80211.h
@@ -11,7 +11,7 @@
* Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
* Copyright 2008 Colin McCabe <colin@cozybit.com>
* Copyright 2015-2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2022 Intel Corporation
+ * Copyright (C) 2018-2023 Intel Corporation
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -72,7 +72,7 @@
* For drivers supporting TDLS with external setup (WIPHY_FLAG_SUPPORTS_TDLS
* and WIPHY_FLAG_TDLS_EXTERNAL_SETUP), the station lifetime is as follows:
* - a setup station entry is added, not yet authorized, without any rate
- * or capability information, this just exists to avoid race conditions
+ * or capability information; this just exists to avoid race conditions
* - when the TDLS setup is done, a single NL80211_CMD_SET_STATION is valid
* to add rate and capability information to the station and at the same
* time mark it authorized.
@@ -87,7 +87,7 @@
* DOC: Frame transmission/registration support
*
* Frame transmission and registration support exists to allow userspace
- * management entities such as wpa_supplicant react to management frames
+ * management entities such as wpa_supplicant to react to management frames
* that are not being handled by the kernel. This includes, for example,
* certain classes of action frames that cannot be handled in the kernel
* for various reasons.
@@ -113,7 +113,7 @@
*
* Frame transmission allows userspace to send for example the required
* responses to action frames. It is subject to some sanity checking,
- * but many frames can be transmitted. When a frame was transmitted, its
+ * but many frames can be transmitted. When a frame is transmitted, its
* status is indicated to the sending socket.
*
* For more technical details, see the corresponding command descriptions
@@ -123,7 +123,7 @@
/**
* DOC: Virtual interface / concurrency capabilities
*
- * Some devices are able to operate with virtual MACs, they can have
+ * Some devices are able to operate with virtual MACs; they can have
* more than one virtual interface. The capability handling for this
* is a bit complex though, as there may be a number of restrictions
* on the types of concurrency that are supported.
@@ -135,7 +135,7 @@
* Once concurrency is desired, more attributes must be observed:
* To start with, since some interface types are purely managed in
* software, like the AP-VLAN type in mac80211 for example, there's
- * an additional list of these, they can be added at any time and
+ * an additional list of these; they can be added at any time and
* are only restricted by some semantic restrictions (e.g. AP-VLAN
* cannot be added without a corresponding AP interface). This list
* is exported in the %NL80211_ATTR_SOFTWARE_IFTYPES attribute.
@@ -164,17 +164,17 @@
* Packet coalesce feature helps to reduce number of received interrupts
* to host by buffering these packets in firmware/hardware for some
* predefined time. Received interrupt will be generated when one of the
- * following events occur.
+ * following events occurs.
* a) Expiration of hardware timer whose expiration time is set to maximum
* coalescing delay of matching coalesce rule.
- * b) Coalescing buffer in hardware reaches it's limit.
+ * b) Coalescing buffer in hardware reaches its limit.
* c) Packet doesn't match any of the configured coalesce rules.
*
* User needs to configure following parameters for creating a coalesce
* rule.
* a) Maximum coalescing delay
* b) List of packet patterns which needs to be matched
- * c) Condition for coalescence. pattern 'match' or 'no match'
+ * c) Condition for coalescence: pattern 'match' or 'no match'
* Multiple such rules can be created.
*/
@@ -213,7 +213,7 @@
/**
* DOC: FILS shared key authentication offload
*
- * FILS shared key authentication offload can be advertized by drivers by
+ * FILS shared key authentication offload can be advertised by drivers by
* setting @NL80211_EXT_FEATURE_FILS_SK_OFFLOAD flag. The drivers that support
* FILS shared key authentication offload should be able to construct the
* authentication and association frames for FILS shared key authentication and
@@ -239,7 +239,7 @@
* The PMKSA can be maintained in userspace persistently so that it can be used
* later after reboots or wifi turn off/on also.
*
- * %NL80211_ATTR_FILS_CACHE_ID is the cache identifier advertized by a FILS
+ * %NL80211_ATTR_FILS_CACHE_ID is the cache identifier advertised by a FILS
* capable AP supporting PMK caching. It specifies the scope within which the
* PMKSAs are cached in an ESS. %NL80211_CMD_SET_PMKSA and
* %NL80211_CMD_DEL_PMKSA are enhanced to allow support for PMKSA caching based
@@ -290,12 +290,12 @@
* If the configuration needs to be applied for specific peer then the MAC
* address of the peer needs to be passed in %NL80211_ATTR_MAC, otherwise the
* configuration will be applied for all the connected peers in the vif except
- * any peers that have peer specific configuration for the TID by default; if
- * the %NL80211_TID_CONFIG_ATTR_OVERRIDE flag is set, peer specific values
+ * any peers that have peer-specific configuration for the TID by default; if
+ * the %NL80211_TID_CONFIG_ATTR_OVERRIDE flag is set, peer-specific values
* will be overwritten.
*
- * All this configuration is valid only for STA's current connection
- * i.e. the configuration will be reset to default when the STA connects back
+ * All this configuration is valid only for STA's current connection,
+ * i.e., the configuration will be reset to default when the STA connects back
* after disconnection/roaming, and this configuration will be cleared when
* the interface goes down.
*/
@@ -326,7 +326,7 @@
/**
* DOC: Multi-Link Operation
*
- * In Multi-Link Operation, a connection between to MLDs utilizes multiple
+ * In Multi-Link Operation, a connection between two MLDs utilizes multiple
* links. To use this in nl80211, various commands and responses now need
* to or will include the new %NL80211_ATTR_MLO_LINKS attribute.
* Additionally, various commands that need to operate on a specific link
@@ -335,6 +335,15 @@
*/
/**
+ * DOC: OWE DH IE handling offload
+ *
+ * By setting @NL80211_EXT_FEATURE_OWE_OFFLOAD flag, drivers can indicate
+ * kernel/application space to avoid DH IE handling. When this flag is
+ * advertised, the driver/device will take care of DH IE inclusion and
+ * processing of peer DH IE to generate PMK.
+ */
+
+/**
* enum nl80211_commands - supported nl80211 commands
*
* @NL80211_CMD_UNSPEC: unspecified command to catch errors
@@ -424,7 +433,8 @@
* interface identified by %NL80211_ATTR_IFINDEX.
* @NL80211_CMD_DEL_STATION: Remove a station identified by %NL80211_ATTR_MAC
* or, if no MAC address given, all stations, on the interface identified
- * by %NL80211_ATTR_IFINDEX. %NL80211_ATTR_MGMT_SUBTYPE and
+ * by %NL80211_ATTR_IFINDEX. For MLD station, MLD address is used in
+ * %NL80211_ATTR_MAC. %NL80211_ATTR_MGMT_SUBTYPE and
* %NL80211_ATTR_REASON_CODE can optionally be used to specify which type
* of disconnection indication should be sent to the station
* (Deauthentication or Disassociation frame and reason code for that
@@ -511,7 +521,7 @@
* %NL80211_ATTR_SCHED_SCAN_PLANS. If %NL80211_ATTR_SCHED_SCAN_PLANS is
* not specified and only %NL80211_ATTR_SCHED_SCAN_INTERVAL is specified,
* scheduled scan will run in an infinite loop with the specified interval.
- * These attributes are mutually exculsive,
+ * These attributes are mutually exclusive,
* i.e. NL80211_ATTR_SCHED_SCAN_INTERVAL must not be passed if
* NL80211_ATTR_SCHED_SCAN_PLANS is defined.
* If for some reason scheduled scan is aborted by the driver, all scan
@@ -542,7 +552,7 @@
* %NL80211_CMD_STOP_SCHED_SCAN command is received or when the interface
* is brought down while a scheduled scan was running.
*
- * @NL80211_CMD_GET_SURVEY: get survey resuls, e.g. channel occupation
+ * @NL80211_CMD_GET_SURVEY: get survey results, e.g. channel occupation
* or noise level
* @NL80211_CMD_NEW_SURVEY_RESULTS: survey data notification (as a reply to
* NL80211_CMD_GET_SURVEY and on the "scan" multicast group)
@@ -553,12 +563,13 @@
* using %NL80211_ATTR_SSID, %NL80211_ATTR_FILS_CACHE_ID,
* %NL80211_ATTR_PMKID, and %NL80211_ATTR_PMK in case of FILS
* authentication where %NL80211_ATTR_FILS_CACHE_ID is the identifier
- * advertized by a FILS capable AP identifying the scope of PMKSA in an
+ * advertised by a FILS capable AP identifying the scope of PMKSA in an
* ESS.
* @NL80211_CMD_DEL_PMKSA: Delete a PMKSA cache entry, using %NL80211_ATTR_MAC
* (for the BSSID) and %NL80211_ATTR_PMKID or using %NL80211_ATTR_SSID,
* %NL80211_ATTR_FILS_CACHE_ID, and %NL80211_ATTR_PMKID in case of FILS
- * authentication.
+ * authentication. Additionally in case of SAE offload and OWE offloads
+ * PMKSA entry can be deleted using %NL80211_ATTR_SSID.
* @NL80211_CMD_FLUSH_PMKSA: Flush all PMKSA cache entries.
*
* @NL80211_CMD_REG_CHANGE: indicates to userspace the regulatory domain
@@ -597,7 +608,7 @@
* BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify
* the SSID (mainly for association, but is included in authentication
* request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ +
- * %NL80211_ATTR_WIPHY_FREQ_OFFSET is used to specify the frequence of the
+ * %NL80211_ATTR_WIPHY_FREQ_OFFSET is used to specify the frequency of the
* channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the
* authentication type. %NL80211_ATTR_IE is used to define IEs
* (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added
@@ -806,7 +817,7 @@
* reached.
* @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ
* and the attributes determining channel width) the given interface
- * (identifed by %NL80211_ATTR_IFINDEX) shall operate on.
+ * (identified by %NL80211_ATTR_IFINDEX) shall operate on.
* In case multiple channels are supported by the device, the mechanism
* with which it switches channels is implementation-defined.
* When a monitor interface is given, it can only switch channel while
@@ -878,7 +889,7 @@
* inform userspace of the new replay counter.
*
* @NL80211_CMD_PMKSA_CANDIDATE: This is used as an event to inform userspace
- * of PMKSA caching dandidates.
+ * of PMKSA caching candidates.
*
* @NL80211_CMD_TDLS_OPER: Perform a high-level TDLS command (e.g. link setup).
* In addition, this can be used as an event to request userspace to take
@@ -914,7 +925,7 @@
*
* @NL80211_CMD_PROBE_CLIENT: Probe an associated station on an AP interface
* by sending a null data frame to it and reporting when the frame is
- * acknowleged. This is used to allow timing out inactive clients. Uses
+ * acknowledged. This is used to allow timing out inactive clients. Uses
* %NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a
* direct reply with an %NL80211_ATTR_COOKIE that is later used to match
* up the event with the request. The event includes the same data and
@@ -1125,11 +1136,15 @@
* @NL80211_CMD_DEL_PMK: For offloaded 4-Way handshake, delete the previously
* configured PMK for the authenticator address identified by
* %NL80211_ATTR_MAC.
- * @NL80211_CMD_PORT_AUTHORIZED: An event that indicates an 802.1X FT roam was
- * completed successfully. Drivers that support 4 way handshake offload
- * should send this event after indicating 802.1X FT assocation with
- * %NL80211_CMD_ROAM. If the 4 way handshake failed %NL80211_CMD_DISCONNECT
- * should be indicated instead.
+ * @NL80211_CMD_PORT_AUTHORIZED: An event that indicates port is authorized and
+ * open for regular data traffic. For STA/P2P-client, this event is sent
+ * with AP MAC address and for AP/P2P-GO, the event carries the STA/P2P-
+ * client MAC address.
+ * Drivers that support 4 way handshake offload should send this event for
+ * STA/P2P-client after successful 4-way HS or after 802.1X FT following
+ * NL80211_CMD_CONNECT or NL80211_CMD_ROAM. Drivers using AP/P2P-GO 4-way
+ * handshake offload should send this event on successful completion of
+ * 4-way handshake with the peer (STA/P2P-client).
* @NL80211_CMD_CONTROL_PORT_FRAME: Control Port (e.g. PAE) frame TX request
* and RX notification. This command is used both as a request to transmit
* a control port frame and as a notification that a control port frame
@@ -1166,6 +1181,23 @@
* %NL80211_ATTR_STATUS_CODE attribute in %NL80211_CMD_EXTERNAL_AUTH
* command interface.
*
+ * Host driver sends MLD address of the AP with %NL80211_ATTR_MLD_ADDR in
+ * %NL80211_CMD_EXTERNAL_AUTH event to indicate user space to enable MLO
+ * during the authentication offload in STA mode while connecting to MLD
+ * APs. Host driver should check %NL80211_ATTR_MLO_SUPPORT flag capability
+ * in %NL80211_CMD_CONNECT to know whether the user space supports enabling
+ * MLO during the authentication offload or not.
+ * User space should enable MLO during the authentication only when it
+ * receives the AP MLD address in authentication offload request. User
+ * space shouldn't enable MLO when the authentication offload request
+ * doesn't indicate the AP MLD address even if the AP is MLO capable.
+ * User space should use %NL80211_ATTR_MLD_ADDR as peer's MLD address and
+ * interface address identified by %NL80211_ATTR_IFINDEX as self MLD
+ * address. User space and host driver to use MLD addresses in RA, TA and
+ * BSSID fields of the frames between them, and host driver translates the
+ * MLD addresses to/from link addresses based on the link chosen for the
+ * authentication.
+ *
* Host driver reports this status on an authentication failure to the
* user space through the connect result as the user space would have
* initiated the connection through the connect request.
@@ -1281,6 +1313,26 @@
* @NL80211_CMD_MODIFY_LINK_STA: Modify a link of an MLD station
* @NL80211_CMD_REMOVE_LINK_STA: Remove a link of an MLD station
*
+ * @NL80211_CMD_SET_HW_TIMESTAMP: Enable/disable HW timestamping of Timing
+ * measurement and Fine timing measurement frames. If %NL80211_ATTR_MAC
+ * is included, enable/disable HW timestamping only for frames to/from the
+ * specified MAC address. Otherwise enable/disable HW timestamping for
+ * all TM/FTM frames (including ones that were enabled with specific MAC
+ * address). If %NL80211_ATTR_HW_TIMESTAMP_ENABLED is not included, disable
+ * HW timestamping.
+ * The number of peers that HW timestamping can be enabled for concurrently
+ * is indicated by %NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS.
+ *
+ * @NL80211_CMD_LINKS_REMOVED: Notify userspace about the removal of STA MLD
+ * setup links due to AP MLD removing the corresponding affiliated APs with
+ * Multi-Link reconfiguration. %NL80211_ATTR_MLO_LINKS is used to provide
+ * information about the removed STA MLD setup links.
+ *
+ * @NL80211_CMD_SET_TID_TO_LINK_MAPPING: Set the TID to Link Mapping for a
+ * non-AP MLD station. The %NL80211_ATTR_MLO_TTLM_DLINK and
+ * %NL80211_ATTR_MLO_TTLM_ULINK attributes are used to specify the
+ * TID to Link mapping for downlink/uplink traffic.
+ *
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
*/
@@ -1532,6 +1584,12 @@ enum nl80211_commands {
NL80211_CMD_MODIFY_LINK_STA,
NL80211_CMD_REMOVE_LINK_STA,
+ NL80211_CMD_SET_HW_TIMESTAMP,
+
+ NL80211_CMD_LINKS_REMOVED,
+
+ NL80211_CMD_SET_TID_TO_LINK_MAPPING,
+
/* add new commands above here */
/* used to define NL80211_CMD_MAX below */
@@ -1789,7 +1847,7 @@ enum nl80211_commands {
* using %CMD_CONTROL_PORT_FRAME. If control port routing over NL80211 is
* to be used then userspace must also use the %NL80211_ATTR_SOCKET_OWNER
* flag. When used with %NL80211_ATTR_CONTROL_PORT_NO_PREAUTH, pre-auth
- * frames are not forwared over the control port.
+ * frames are not forwarded over the control port.
*
* @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver.
* We recommend using nested, driver-specific attributes within this.
@@ -1926,10 +1984,10 @@ enum nl80211_commands {
* bit. Depending on which antennas are selected in the bitmap, 802.11n
* drivers can derive which chainmasks to use (if all antennas belonging to
* a particular chain are disabled this chain should be disabled) and if
- * a chain has diversity antennas wether diversity should be used or not.
+ * a chain has diversity antennas whether diversity should be used or not.
* HT capabilities (STBC, TX Beamforming, Antenna selection) can be
* derived from the available chains after applying the antenna mask.
- * Non-802.11n drivers can derive wether to use diversity or not.
+ * Non-802.11n drivers can derive whether to use diversity or not.
* Drivers may reject configurations or RX/TX mask combinations they cannot
* support by returning -EINVAL.
*
@@ -2499,7 +2557,7 @@ enum nl80211_commands {
* from successful FILS authentication and is used with
* %NL80211_CMD_CONNECT.
*
- * @NL80211_ATTR_FILS_CACHE_ID: A 2-octet identifier advertized by a FILS AP
+ * @NL80211_ATTR_FILS_CACHE_ID: A 2-octet identifier advertised by a FILS AP
* identifying the scope of PMKSAs. This is used with
* @NL80211_CMD_SET_PMKSA and @NL80211_CMD_DEL_PMKSA.
*
@@ -2653,11 +2711,13 @@ enum nl80211_commands {
*
* @NL80211_ATTR_FILS_DISCOVERY: Optional parameter to configure FILS
* discovery. It is a nested attribute, see
- * &enum nl80211_fils_discovery_attributes.
+ * &enum nl80211_fils_discovery_attributes. Userspace should pass an empty
+ * nested attribute to disable this feature and delete the templates.
*
* @NL80211_ATTR_UNSOL_BCAST_PROBE_RESP: Optional parameter to configure
* unsolicited broadcast probe response. It is a nested attribute, see
- * &enum nl80211_unsol_bcast_probe_resp_attributes.
+ * &enum nl80211_unsol_bcast_probe_resp_attributes. Userspace should pass an empty
+ * nested attribute to disable this feature and delete the templates.
*
* @NL80211_ATTR_S1G_CAPABILITY: S1G Capability information element (from
* association request when used with NL80211_CMD_NEW_STATION)
@@ -2751,6 +2811,46 @@ enum nl80211_commands {
* the incoming frame RX timestamp.
* @NL80211_ATTR_TD_BITMAP: Transition Disable bitmap, for subsequent
* (re)associations.
+ *
+ * @NL80211_ATTR_PUNCT_BITMAP: (u32) Preamble puncturing bitmap, lowest
+ * bit corresponds to the lowest 20 MHz channel. Each bit set to 1
+ * indicates that the sub-channel is punctured. Higher 16 bits are
+ * reserved.
+ *
+ * @NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS: Maximum number of peers that HW
+ * timestamping can be enabled for concurrently (u16), a wiphy attribute.
+ * A value of 0xffff indicates setting for all peers (i.e. not specifying
+ * an address with %NL80211_CMD_SET_HW_TIMESTAMP) is supported.
+ * @NL80211_ATTR_HW_TIMESTAMP_ENABLED: Indicates whether HW timestamping should
+ * be enabled or not (flag attribute).
+ *
+ * @NL80211_ATTR_EMA_RNR_ELEMS: Optional nested attribute for
+ * reduced neighbor report (RNR) elements. This attribute can be used
+ * only when NL80211_MBSSID_CONFIG_ATTR_EMA is enabled.
+ * Userspace is responsible for splitting the RNR into multiple
+ * elements such that each element excludes the non-transmitting
+ * profiles already included in the MBSSID element
+ * (%NL80211_ATTR_MBSSID_ELEMS) at the same index. Each EMA beacon
+ * will be generated by adding MBSSID and RNR elements at the same
+ * index. If the userspace includes more RNR elements than number of
+ * MBSSID elements then these will be added in every EMA beacon.
+ *
+ * @NL80211_ATTR_MLO_LINK_DISABLED: Flag attribute indicating that the link is
+ * disabled.
+ *
+ * @NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA: Include BSS usage data, i.e.
+ * include BSSes that can only be used in restricted scenarios and/or
+ * cannot be used at all.
+ *
+ * @NL80211_ATTR_MLO_TTLM_DLINK: Binary attribute specifying the downlink TID to
+ * link mapping. The length is 8 * sizeof(u16). For each TID the link
+ * mapping is as defined in section 9.4.2.314 (TID-To-Link Mapping element)
+ * in Draft P802.11be_D4.0.
+ * @NL80211_ATTR_MLO_TTLM_ULINK: Binary attribute specifying the uplink TID to
+ * link mapping. The length is 8 * sizeof(u16). For each TID the link
+ * mapping is as defined in section 9.4.2.314 (TID-To-Link Mapping element)
+ * in Draft P802.11be_D4.0.
+ *
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
@@ -3280,6 +3380,20 @@ enum nl80211_attrs {
NL80211_ATTR_RX_HW_TIMESTAMP,
NL80211_ATTR_TD_BITMAP,
+ NL80211_ATTR_PUNCT_BITMAP,
+
+ NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS,
+ NL80211_ATTR_HW_TIMESTAMP_ENABLED,
+
+ NL80211_ATTR_EMA_RNR_ELEMS,
+
+ NL80211_ATTR_MLO_LINK_DISABLED,
+
+ NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA,
+
+ NL80211_ATTR_MLO_TTLM_DLINK,
+ NL80211_ATTR_MLO_TTLM_ULINK,
+
/* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST,
@@ -3606,6 +3720,13 @@ enum nl80211_eht_ru_alloc {
* (u8, see &enum nl80211_eht_gi)
* @NL80211_RATE_INFO_EHT_RU_ALLOC: EHT RU allocation, if not present then
* non-OFDMA was used (u8, see &enum nl80211_eht_ru_alloc)
+ * @NL80211_RATE_INFO_S1G_MCS: S1G MCS index (u8, 0-10)
+ * @NL80211_RATE_INFO_S1G_NSS: S1G NSS value (u8, 1-4)
+ * @NL80211_RATE_INFO_1_MHZ_WIDTH: 1 MHz S1G rate
+ * @NL80211_RATE_INFO_2_MHZ_WIDTH: 2 MHz S1G rate
+ * @NL80211_RATE_INFO_4_MHZ_WIDTH: 4 MHz S1G rate
+ * @NL80211_RATE_INFO_8_MHZ_WIDTH: 8 MHz S1G rate
+ * @NL80211_RATE_INFO_16_MHZ_WIDTH: 16 MHz S1G rate
* @__NL80211_RATE_INFO_AFTER_LAST: internal use
*/
enum nl80211_rate_info {
@@ -3632,6 +3753,13 @@ enum nl80211_rate_info {
NL80211_RATE_INFO_EHT_NSS,
NL80211_RATE_INFO_EHT_GI,
NL80211_RATE_INFO_EHT_RU_ALLOC,
+ NL80211_RATE_INFO_S1G_MCS,
+ NL80211_RATE_INFO_S1G_NSS,
+ NL80211_RATE_INFO_1_MHZ_WIDTH,
+ NL80211_RATE_INFO_2_MHZ_WIDTH,
+ NL80211_RATE_INFO_4_MHZ_WIDTH,
+ NL80211_RATE_INFO_8_MHZ_WIDTH,
+ NL80211_RATE_INFO_16_MHZ_WIDTH,
/* keep last */
__NL80211_RATE_INFO_AFTER_LAST,
@@ -4000,6 +4128,10 @@ enum nl80211_band_iftype_attr {
* @NL80211_BAND_ATTR_EDMG_BW_CONFIG: Channel BW Configuration subfield encodes
* the allowed channel bandwidth configurations.
* Defined by IEEE P802.11ay/D4.0 section 9.4.2.251, Table 13.
+ * @NL80211_BAND_ATTR_S1G_MCS_NSS_SET: S1G capabilities, supported S1G-MCS and NSS
+ * set subfield, as in the S1G information IE, 5 bytes
+ * @NL80211_BAND_ATTR_S1G_CAPA: S1G capabilities information subfield as in the
+ * S1G information IE, 10 bytes
* @NL80211_BAND_ATTR_MAX: highest band attribute currently defined
* @__NL80211_BAND_ATTR_AFTER_LAST: internal use
*/
@@ -4020,6 +4152,9 @@ enum nl80211_band_attr {
NL80211_BAND_ATTR_EDMG_CHANNELS,
NL80211_BAND_ATTR_EDMG_BW_CONFIG,
+ NL80211_BAND_ATTR_S1G_MCS_NSS_SET,
+ NL80211_BAND_ATTR_S1G_CAPA,
+
/* keep last */
__NL80211_BAND_ATTR_AFTER_LAST,
NL80211_BAND_ATTR_MAX = __NL80211_BAND_ATTR_AFTER_LAST - 1
@@ -4065,7 +4200,7 @@ enum nl80211_wmm_rule {
* (100 * dBm).
* @NL80211_FREQUENCY_ATTR_DFS_STATE: current state for DFS
* (enum nl80211_dfs_state)
- * @NL80211_FREQUENCY_ATTR_DFS_TIME: time in miliseconds for how long
+ * @NL80211_FREQUENCY_ATTR_DFS_TIME: time in milliseconds for how long
* this channel is in this DFS state.
* @NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: HT40- isn't possible with this
* channel as the control channel
@@ -4119,6 +4254,16 @@ enum nl80211_wmm_rule {
* as the primary or any of the secondary channels isn't possible
* @NL80211_FREQUENCY_ATTR_NO_EHT: EHT operation is not allowed on this channel
* in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_PSD: Power spectral density (in dBm) that
+ * is allowed on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_DFS_CONCURRENT: Operation on this channel is
+ * allowed for peer-to-peer or adhoc communication under the control
+ * of a DFS master which operates on the same channel (FCC-594280 D01
+ * Section B.3). Should be used together with %NL80211_RRF_DFS only.
+ * @NL80211_FREQUENCY_ATTR_NO_UHB_VLP_CLIENT: Client connection to VLP AP
+ * not allowed using this channel
+ * @NL80211_FREQUENCY_ATTR_NO_UHB_AFC_CLIENT: Client connection to AFC AP
+ * not allowed using this channel
* @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
* currently defined
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
@@ -4157,6 +4302,10 @@ enum nl80211_frequency_attr {
NL80211_FREQUENCY_ATTR_16MHZ,
NL80211_FREQUENCY_ATTR_NO_320MHZ,
NL80211_FREQUENCY_ATTR_NO_EHT,
+ NL80211_FREQUENCY_ATTR_PSD,
+ NL80211_FREQUENCY_ATTR_DFS_CONCURRENT,
+ NL80211_FREQUENCY_ATTR_NO_UHB_VLP_CLIENT,
+ NL80211_FREQUENCY_ATTR_NO_UHB_AFC_CLIENT,
/* keep last */
__NL80211_FREQUENCY_ATTR_AFTER_LAST,
@@ -4257,6 +4406,8 @@ enum nl80211_reg_type {
* a given frequency range. The value is in mBm (100 * dBm).
* @NL80211_ATTR_DFS_CAC_TIME: DFS CAC time in milliseconds.
* If not present or 0 default CAC time will be used.
+ * @NL80211_ATTR_POWER_RULE_PSD: power spectral density (in dBm).
+ * This could be negative.
* @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number
* currently defined
* @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use
@@ -4274,6 +4425,8 @@ enum nl80211_reg_rule_attr {
NL80211_ATTR_DFS_CAC_TIME,
+ NL80211_ATTR_POWER_RULE_PSD,
+
/* keep last */
__NL80211_REG_RULE_ATTR_AFTER_LAST,
NL80211_REG_RULE_ATTR_MAX = __NL80211_REG_RULE_ATTR_AFTER_LAST - 1
@@ -4356,6 +4509,14 @@ enum nl80211_sched_scan_match_attr {
* @NL80211_RRF_NO_160MHZ: 160MHz operation not allowed
* @NL80211_RRF_NO_HE: HE operation not allowed
* @NL80211_RRF_NO_320MHZ: 320MHz operation not allowed
+ * @NL80211_RRF_NO_EHT: EHT operation not allowed
+ * @NL80211_RRF_PSD: Ruleset has power spectral density value
+ * @NL80211_RRF_DFS_CONCURRENT: Operation on this channel is allowed for
+ peer-to-peer or adhoc communication under the control of a DFS master
+ which operates on the same channel (FCC-594280 D01 Section B.3).
+ Should be used together with %NL80211_RRF_DFS only.
+ * @NL80211_RRF_NO_UHB_VLP_CLIENT: Client connection to VLP AP not allowed
+ * @NL80211_RRF_NO_UHB_AFC_CLIENT: Client connection to AFC AP not allowed
*/
enum nl80211_reg_rule_flags {
NL80211_RRF_NO_OFDM = 1<<0,
@@ -4375,6 +4536,11 @@ enum nl80211_reg_rule_flags {
NL80211_RRF_NO_160MHZ = 1<<16,
NL80211_RRF_NO_HE = 1<<17,
NL80211_RRF_NO_320MHZ = 1<<18,
+ NL80211_RRF_NO_EHT = 1<<19,
+ NL80211_RRF_PSD = 1<<20,
+ NL80211_RRF_DFS_CONCURRENT = 1<<21,
+ NL80211_RRF_NO_UHB_VLP_CLIENT = 1<<22,
+ NL80211_RRF_NO_UHB_AFC_CLIENT = 1<<23,
};
#define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR
@@ -4912,6 +5078,33 @@ enum nl80211_bss_scan_width {
};
/**
+ * enum nl80211_bss_use_for - bitmap indicating possible BSS use
+ * @NL80211_BSS_USE_FOR_NORMAL: Use this BSS for normal "connection",
+ * including IBSS/MBSS depending on the type.
+ * @NL80211_BSS_USE_FOR_MLD_LINK: This BSS can be used as a link in an
+ * MLO connection. Note that for an MLO connection, all links including
+ * the assoc link must have this flag set, and the assoc link must
+ * additionally have %NL80211_BSS_USE_FOR_NORMAL set.
+ */
+enum nl80211_bss_use_for {
+ NL80211_BSS_USE_FOR_NORMAL = 1 << 0,
+ NL80211_BSS_USE_FOR_MLD_LINK = 1 << 1,
+};
+
+/**
+ * enum nl80211_bss_cannot_use_reasons - reason(s) connection to a
+ * BSS isn't possible
+ * @NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY: NSTR nonprimary links aren't
+ * supported by the device, and this BSS entry represents one.
+ * @NL80211_BSS_CANNOT_USE_UHB_PWR_MISMATCH: STA is not supporting
+ * the AP power type (SP, VLP, AP) that the AP uses.
+ */
+enum nl80211_bss_cannot_use_reasons {
+ NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY = 1 << 0,
+ NL80211_BSS_CANNOT_USE_UHB_PWR_MISMATCH = 1 << 1,
+};
+
+/**
* enum nl80211_bss - netlink attributes for a BSS
*
* @__NL80211_BSS_INVALID: invalid
@@ -4942,7 +5135,7 @@ enum nl80211_bss_scan_width {
* elements from a Beacon frame (bin); not present if no Beacon frame has
* yet been received
* @NL80211_BSS_CHAN_WIDTH: channel width of the control channel
- * (u32, enum nl80211_bss_scan_width)
+ * (u32, enum nl80211_bss_scan_width) - No longer used!
* @NL80211_BSS_BEACON_TSF: TSF of the last received beacon (u64)
* (not present if no beacon frame has been received yet)
* @NL80211_BSS_PRESP_DATA: the data in @NL80211_BSS_INFORMATION_ELEMENTS and
@@ -4963,6 +5156,14 @@ enum nl80211_bss_scan_width {
* @NL80211_BSS_FREQUENCY_OFFSET: frequency offset in KHz
* @NL80211_BSS_MLO_LINK_ID: MLO link ID of the BSS (u8).
* @NL80211_BSS_MLD_ADDR: MLD address of this BSS if connected to it.
+ * @NL80211_BSS_USE_FOR: u32 bitmap attribute indicating what the BSS can be
+ * used for, see &enum nl80211_bss_use_for.
+ * @NL80211_BSS_CANNOT_USE_REASONS: Indicates the reason that this BSS cannot
+ * be used for all or some of the possible uses by the device reporting it,
+ * even though its presence was detected.
+ * This is a u64 attribute containing a bitmap of values from
+ * &enum nl80211_cannot_use_reasons, note that the attribute may be missing
+ * if no reasons are specified.
* @__NL80211_BSS_AFTER_LAST: internal
* @NL80211_BSS_MAX: highest BSS attribute
*/
@@ -4990,6 +5191,8 @@ enum nl80211_bss {
NL80211_BSS_FREQUENCY_OFFSET,
NL80211_BSS_MLO_LINK_ID,
NL80211_BSS_MLD_ADDR,
+ NL80211_BSS_USE_FOR,
+ NL80211_BSS_CANNOT_USE_REASONS,
/* keep last */
__NL80211_BSS_AFTER_LAST,
@@ -5338,7 +5541,7 @@ enum nl80211_tx_rate_setting {
* (%NL80211_TID_CONFIG_ATTR_TIDS, %NL80211_TID_CONFIG_ATTR_OVERRIDE).
* @NL80211_TID_CONFIG_ATTR_PEER_SUPP: same as the previous per-vif one, but
* per peer instead.
- * @NL80211_TID_CONFIG_ATTR_OVERRIDE: flag attribue, if set indicates
+ * @NL80211_TID_CONFIG_ATTR_OVERRIDE: flag attribute, if set indicates
* that the new configuration overrides all previous peer
* configurations, otherwise previous peer specific configurations
* should be left untouched.
@@ -5721,7 +5924,7 @@ enum nl80211_attr_coalesce_rule {
/**
* enum nl80211_coalesce_condition - coalesce rule conditions
- * @NL80211_COALESCE_CONDITION_MATCH: coalaesce Rx packets when patterns
+ * @NL80211_COALESCE_CONDITION_MATCH: coalesce Rx packets when patterns
* in a rule are matched.
* @NL80211_COALESCE_CONDITION_NO_MATCH: coalesce Rx packets when patterns
* in a rule are not matched.
@@ -5820,7 +6023,7 @@ enum nl80211_if_combination_attrs {
* enum nl80211_plink_state - state of a mesh peer link finite state machine
*
* @NL80211_PLINK_LISTEN: initial state, considered the implicit
- * state of non existent mesh peer links
+ * state of non-existent mesh peer links
* @NL80211_PLINK_OPN_SNT: mesh plink open frame has been sent to
* this mesh peer
* @NL80211_PLINK_OPN_RCVD: mesh plink open frame has been received
@@ -5869,6 +6072,7 @@ enum plink_actions {
#define NL80211_KEK_LEN 16
#define NL80211_KCK_EXT_LEN 24
#define NL80211_KEK_EXT_LEN 32
+#define NL80211_KCK_EXT_LEN_32 32
#define NL80211_REPLAY_CTR_LEN 8
/**
@@ -6112,7 +6316,7 @@ enum nl80211_feature_flags {
* request to use RRM (see %NL80211_ATTR_USE_RRM) with
* %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests, which will set
* the ASSOC_REQ_USE_RRM flag in the association request even if
- * NL80211_FEATURE_QUIET is not advertized.
+ * NL80211_FEATURE_QUIET is not advertised.
* @NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER: This device supports MU-MIMO air
* sniffer which means that it can be configured to hear packets from
* certain groups which can be configured by the
@@ -6124,13 +6328,15 @@ enum nl80211_feature_flags {
* the BSS that the interface that requested the scan is connected to
* (if available).
* @NL80211_EXT_FEATURE_BSS_PARENT_TSF: Per BSS, this driver reports the
- * time the last beacon/probe was received. The time is the TSF of the
- * BSS that the interface that requested the scan is connected to
- * (if available).
+ * time the last beacon/probe was received. For a non-MLO connection, the
+ * time is the TSF of the BSS that the interface that requested the scan is
+ * connected to (if available). For an MLO connection, the time is the TSF
+ * of the BSS corresponding with link ID specified in the scan request (if
+ * specified).
* @NL80211_EXT_FEATURE_SET_SCAN_DWELL: This driver supports configuration of
* channel dwell time.
* @NL80211_EXT_FEATURE_BEACON_RATE_LEGACY: Driver supports beacon rate
- * configuration (AP/mesh), supporting a legacy (non HT/VHT) rate.
+ * configuration (AP/mesh), supporting a legacy (non-HT/VHT) rate.
* @NL80211_EXT_FEATURE_BEACON_RATE_HT: Driver supports beacon rate
* configuration (AP/mesh) with HT rates.
* @NL80211_EXT_FEATURE_BEACON_RATE_VHT: Driver supports beacon rate
@@ -6294,6 +6500,26 @@ enum nl80211_feature_flags {
* might apply, e.g. no scans in progress, no offchannel operations
* in progress, and no active connections.
*
+ * @NL80211_EXT_FEATURE_PUNCT: Driver supports preamble puncturing in AP mode.
+ *
+ * @NL80211_EXT_FEATURE_SECURE_NAN: Device supports NAN Pairing which enables
+ * authentication, data encryption and message integrity.
+ *
+ * @NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA: Device supports randomized TA
+ * in authentication and deauthentication frames sent to unassociated peer
+ * using @NL80211_CMD_FRAME.
+ *
+ * @NL80211_EXT_FEATURE_OWE_OFFLOAD: Driver/Device wants to do OWE DH IE
+ * handling in station mode.
+ *
+ * @NL80211_EXT_FEATURE_OWE_OFFLOAD_AP: Driver/Device wants to do OWE DH IE
+ * handling in AP mode.
+ *
+ * @NL80211_EXT_FEATURE_DFS_CONCURRENT: The device supports peer-to-peer or
+ * ad hoc operation on DFS channels under the control of a concurrent
+ * DFS master on the same channel as described in FCC-594280 D01
+ * (Section B.3). This, for example, allows P2P GO and P2P clients to
+ * operate on DFS channels as long as there's a concurrent BSS connection.
* @NUM_NL80211_EXT_FEATURES: number of extended features.
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
*/
@@ -6362,6 +6588,12 @@ enum nl80211_ext_feature_index {
NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD,
NL80211_EXT_FEATURE_RADAR_BACKGROUND,
NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE,
+ NL80211_EXT_FEATURE_PUNCT,
+ NL80211_EXT_FEATURE_SECURE_NAN,
+ NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA,
+ NL80211_EXT_FEATURE_OWE_OFFLOAD,
+ NL80211_EXT_FEATURE_OWE_OFFLOAD_AP,
+ NL80211_EXT_FEATURE_DFS_CONCURRENT,
/* add new features before the definition below */
NUM_NL80211_EXT_FEATURES,
@@ -6446,7 +6678,7 @@ enum nl80211_timeout_reason {
* request parameters IE in the probe request
* @NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP: accept broadcast probe responses
* @NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE: send probe request frames at
- * rate of at least 5.5M. In case non OCE AP is discovered in the channel,
+ * rate of at least 5.5M. In case non-OCE AP is discovered in the channel,
* only the first probe req in the channel will be sent in high rate.
* @NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION: allow probe request
* tx deferral (dot11FILSProbeDelay shall be set to 15ms)
@@ -6476,8 +6708,16 @@ enum nl80211_timeout_reason {
* @NL80211_SCAN_FLAG_FREQ_KHZ: report scan results with
* %NL80211_ATTR_SCAN_FREQ_KHZ. This also means
* %NL80211_ATTR_SCAN_FREQUENCIES will not be included.
- * @NL80211_SCAN_FLAG_COLOCATED_6GHZ: scan for colocated APs reported by
- * 2.4/5 GHz APs
+ * @NL80211_SCAN_FLAG_COLOCATED_6GHZ: scan for collocated APs reported by
+ * 2.4/5 GHz APs. When the flag is set, the scan logic will use the
+ * information from the RNR element found in beacons/probe responses
+ * received on the 2.4/5 GHz channels to actively scan only the 6GHz
+ * channels on which APs are expected to be found. Note that when not set,
+ * the scan logic would scan all 6GHz channels, but since transmission of
+ * probe requests on non-PSC channels is limited, it is highly likely that
+ * these channels would passively be scanned. Also note that when the flag
+ * is set, in addition to the colocated APs, PSC channels would also be
+ * scanned if the user space has asked for it.
*/
enum nl80211_scan_flags {
NL80211_SCAN_FLAG_LOW_PRIORITY = 1<<0,
@@ -6806,7 +7046,7 @@ enum nl80211_nan_func_term_reason {
* The instance ID for the follow up Service Discovery Frame. This is u8.
* @NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID: relevant if the function's type
* is follow up. This is a u8.
- * The requestor instance ID for the follow up Service Discovery Frame.
+ * The requester instance ID for the follow up Service Discovery Frame.
* @NL80211_NAN_FUNC_FOLLOW_UP_DEST: the MAC address of the recipient of the
* follow up Service Discovery Frame. This is a binary attribute.
* @NL80211_NAN_FUNC_CLOSE_RANGE: is this function limited for devices in a
@@ -7196,7 +7436,7 @@ enum nl80211_peer_measurement_attrs {
* @NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED: flag attribute indicating if
* trigger based ranging measurement is supported
* @NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED: flag attribute indicating
- * if non trigger based ranging measurement is supported
+ * if non-trigger-based ranging measurement is supported
*
* @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal
* @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number
@@ -7250,7 +7490,7 @@ enum nl80211_peer_measurement_ftm_capa {
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
* ranging will be used.
- * @NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED: request non trigger based
+ * @NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED: request non-trigger-based
* ranging measurement (flag)
* This attribute and %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED are
* mutually exclusive.
@@ -7328,7 +7568,7 @@ enum nl80211_peer_measurement_ftm_failure_reasons {
* @NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS: number of FTM Request frames
* transmitted (u32, optional)
* @NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES: number of FTM Request frames
- * that were acknowleged (u32, optional)
+ * that were acknowledged (u32, optional)
* @NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME: retry time received from the
* busy peer (u32, seconds)
* @NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP: actual number of bursts exponent
@@ -7489,7 +7729,7 @@ enum nl80211_iftype_akm_attributes {
* @NL80211_FILS_DISCOVERY_ATTR_INT_MIN: Minimum packet interval (u32, TU).
* Allowed range: 0..10000 (TU = Time Unit)
* @NL80211_FILS_DISCOVERY_ATTR_INT_MAX: Maximum packet interval (u32, TU).
- * Allowed range: 0..10000 (TU = Time Unit)
+ * Allowed range: 0..10000 (TU = Time Unit). If set to 0, the feature is disabled.
* @NL80211_FILS_DISCOVERY_ATTR_TMPL: Template data for FILS discovery action
* frame including the headers.
*
@@ -7522,7 +7762,8 @@ enum nl80211_fils_discovery_attributes {
*
* @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT: Maximum packet interval (u32, TU).
* Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
- * 26.17.2.3.2 (AP behavior for fast passive scanning).
+ * 26.17.2.3.2 (AP behavior for fast passive scanning). If set to 0, the feature is
+ * disabled.
* @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL: Unsolicited broadcast probe response
* frame template (binary).
*
diff --git a/src/basic/linux/pkt_sched.h b/src/basic/linux/pkt_sched.h
index 000eec1068..a3cd0c2dc9 100644
--- a/src/basic/linux/pkt_sched.h
+++ b/src/basic/linux/pkt_sched.h
@@ -477,115 +477,6 @@ enum {
#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
-
-/* CBQ section */
-
-#define TC_CBQ_MAXPRIO 8
-#define TC_CBQ_MAXLEVEL 8
-#define TC_CBQ_DEF_EWMA 5
-
-struct tc_cbq_lssopt {
- unsigned char change;
- unsigned char flags;
-#define TCF_CBQ_LSS_BOUNDED 1
-#define TCF_CBQ_LSS_ISOLATED 2
- unsigned char ewma_log;
- unsigned char level;
-#define TCF_CBQ_LSS_FLAGS 1
-#define TCF_CBQ_LSS_EWMA 2
-#define TCF_CBQ_LSS_MAXIDLE 4
-#define TCF_CBQ_LSS_MINIDLE 8
-#define TCF_CBQ_LSS_OFFTIME 0x10
-#define TCF_CBQ_LSS_AVPKT 0x20
- __u32 maxidle;
- __u32 minidle;
- __u32 offtime;
- __u32 avpkt;
-};
-
-struct tc_cbq_wrropt {
- unsigned char flags;
- unsigned char priority;
- unsigned char cpriority;
- unsigned char __reserved;
- __u32 allot;
- __u32 weight;
-};
-
-struct tc_cbq_ovl {
- unsigned char strategy;
-#define TC_CBQ_OVL_CLASSIC 0
-#define TC_CBQ_OVL_DELAY 1
-#define TC_CBQ_OVL_LOWPRIO 2
-#define TC_CBQ_OVL_DROP 3
-#define TC_CBQ_OVL_RCLASSIC 4
- unsigned char priority2;
- __u16 pad;
- __u32 penalty;
-};
-
-struct tc_cbq_police {
- unsigned char police;
- unsigned char __res1;
- unsigned short __res2;
-};
-
-struct tc_cbq_fopt {
- __u32 split;
- __u32 defmap;
- __u32 defchange;
-};
-
-struct tc_cbq_xstats {
- __u32 borrows;
- __u32 overactions;
- __s32 avgidle;
- __s32 undertime;
-};
-
-enum {
- TCA_CBQ_UNSPEC,
- TCA_CBQ_LSSOPT,
- TCA_CBQ_WRROPT,
- TCA_CBQ_FOPT,
- TCA_CBQ_OVL_STRATEGY,
- TCA_CBQ_RATE,
- TCA_CBQ_RTAB,
- TCA_CBQ_POLICE,
- __TCA_CBQ_MAX,
-};
-
-#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1)
-
-/* dsmark section */
-
-enum {
- TCA_DSMARK_UNSPEC,
- TCA_DSMARK_INDICES,
- TCA_DSMARK_DEFAULT_INDEX,
- TCA_DSMARK_SET_TC_INDEX,
- TCA_DSMARK_MASK,
- TCA_DSMARK_VALUE,
- __TCA_DSMARK_MAX,
-};
-
-#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
-
-/* ATM section */
-
-enum {
- TCA_ATM_UNSPEC,
- TCA_ATM_FD, /* file/socket descriptor */
- TCA_ATM_PTR, /* pointer to descriptor - later */
- TCA_ATM_HDR, /* LL header */
- TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */
- TCA_ATM_ADDR, /* PVC address (for output only) */
- TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */
- __TCA_ATM_MAX,
-};
-
-#define TCA_ATM_MAX (__TCA_ATM_MAX - 1)
-
/* Network emulator */
enum {
@@ -603,6 +494,7 @@ enum {
TCA_NETEM_JITTER64,
TCA_NETEM_SLOT,
TCA_NETEM_SLOT_DIST,
+ TCA_NETEM_PRNG_SEED,
__TCA_NETEM_MAX,
};
@@ -719,6 +611,11 @@ enum {
#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1)
+enum {
+ TC_FP_EXPRESS = 1,
+ TC_FP_PREEMPTIBLE = 2,
+};
+
struct tc_mqprio_qopt {
__u8 num_tc;
__u8 prio_tc_map[TC_QOPT_BITMASK + 1];
@@ -733,11 +630,22 @@ struct tc_mqprio_qopt {
#define TC_MQPRIO_F_MAX_RATE 0x8
enum {
+ TCA_MQPRIO_TC_ENTRY_UNSPEC,
+ TCA_MQPRIO_TC_ENTRY_INDEX, /* u32 */
+ TCA_MQPRIO_TC_ENTRY_FP, /* u32 */
+
+ /* add new constants above here */
+ __TCA_MQPRIO_TC_ENTRY_CNT,
+ TCA_MQPRIO_TC_ENTRY_MAX = (__TCA_MQPRIO_TC_ENTRY_CNT - 1)
+};
+
+enum {
TCA_MQPRIO_UNSPEC,
TCA_MQPRIO_MODE,
TCA_MQPRIO_SHAPER,
TCA_MQPRIO_MIN_RATE64,
TCA_MQPRIO_MAX_RATE64,
+ TCA_MQPRIO_TC_ENTRY,
__TCA_MQPRIO_MAX,
};
@@ -924,15 +832,22 @@ enum {
TCA_FQ_HORIZON_DROP, /* drop packets beyond horizon, or cap their EDT */
+ TCA_FQ_PRIOMAP, /* prio2band */
+
+ TCA_FQ_WEIGHTS, /* Weights for each band */
+
__TCA_FQ_MAX
};
#define TCA_FQ_MAX (__TCA_FQ_MAX - 1)
+#define FQ_BANDS 3
+#define FQ_MIN_WEIGHT 16384
+
struct tc_fq_qd_stats {
__u64 gc_flows;
- __u64 highprio_packets;
- __u64 tcp_retrans;
+ __u64 highprio_packets; /* obsolete */
+ __u64 tcp_retrans; /* obsolete */
__u64 throttled;
__u64 flows_plimit;
__u64 pkts_too_long;
@@ -945,6 +860,10 @@ struct tc_fq_qd_stats {
__u64 ce_mark; /* packets above ce_threshold */
__u64 horizon_drops;
__u64 horizon_caps;
+ __u64 fastpath_packets;
+ __u64 band_drops[FQ_BANDS];
+ __u32 band_pkt_count[FQ_BANDS];
+ __u32 pad;
};
/* Heavy-Hitter Filter */
@@ -1236,6 +1155,7 @@ enum {
TCA_TAPRIO_TC_ENTRY_UNSPEC,
TCA_TAPRIO_TC_ENTRY_INDEX, /* u32 */
TCA_TAPRIO_TC_ENTRY_MAX_SDU, /* u32 */
+ TCA_TAPRIO_TC_ENTRY_FP, /* u32 */
/* add new constants above here */
__TCA_TAPRIO_TC_ENTRY_CNT,
@@ -1243,6 +1163,16 @@ enum {
};
enum {
+ TCA_TAPRIO_OFFLOAD_STATS_PAD = 1, /* u64 */
+ TCA_TAPRIO_OFFLOAD_STATS_WINDOW_DROPS, /* u64 */
+ TCA_TAPRIO_OFFLOAD_STATS_TX_OVERRUNS, /* u64 */
+
+ /* add new constants above here */
+ __TCA_TAPRIO_OFFLOAD_STATS_CNT,
+ TCA_TAPRIO_OFFLOAD_STATS_MAX = (__TCA_TAPRIO_OFFLOAD_STATS_CNT - 1)
+};
+
+enum {
TCA_TAPRIO_ATTR_UNSPEC,
TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */
TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */
diff --git a/src/basic/linux/rtnetlink.h b/src/basic/linux/rtnetlink.h
index eb2747d58a..3b687d20c9 100644
--- a/src/basic/linux/rtnetlink.h
+++ b/src/basic/linux/rtnetlink.h
@@ -502,13 +502,17 @@ enum {
#define RTAX_MAX (__RTAX_MAX - 1)
-#define RTAX_FEATURE_ECN (1 << 0)
-#define RTAX_FEATURE_SACK (1 << 1)
-#define RTAX_FEATURE_TIMESTAMP (1 << 2)
-#define RTAX_FEATURE_ALLFRAG (1 << 3)
-
-#define RTAX_FEATURE_MASK (RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \
- RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG)
+#define RTAX_FEATURE_ECN (1 << 0)
+#define RTAX_FEATURE_SACK (1 << 1) /* unused */
+#define RTAX_FEATURE_TIMESTAMP (1 << 2) /* unused */
+#define RTAX_FEATURE_ALLFRAG (1 << 3) /* unused */
+#define RTAX_FEATURE_TCP_USEC_TS (1 << 4)
+
+#define RTAX_FEATURE_MASK (RTAX_FEATURE_ECN | \
+ RTAX_FEATURE_SACK | \
+ RTAX_FEATURE_TIMESTAMP | \
+ RTAX_FEATURE_ALLFRAG | \
+ RTAX_FEATURE_TCP_USEC_TS)
struct rta_session {
__u8 proto;
@@ -635,6 +639,7 @@ enum {
TCA_INGRESS_BLOCK,
TCA_EGRESS_BLOCK,
TCA_DUMP_FLAGS,
+ TCA_EXT_WARN_MSG,
__TCA_MAX
};
@@ -788,6 +793,7 @@ enum {
TCA_ROOT_FLAGS,
TCA_ROOT_COUNT,
TCA_ROOT_TIME_DELTA, /* in msecs */
+ TCA_ROOT_EXT_WARN_MSG,
__TCA_ROOT_MAX,
#define TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)
};
diff --git a/src/basic/linux/stddef.h b/src/basic/linux/stddef.h
index 1a739631b9..b888a83a10 100644
--- a/src/basic/linux/stddef.h
+++ b/src/basic/linux/stddef.h
@@ -26,8 +26,13 @@
union { \
struct { MEMBERS } ATTRS; \
struct TAG { MEMBERS } ATTRS NAME; \
- }
+ } ATTRS
+#ifdef __cplusplus
+/* sizeof(struct{}) is 1 in C++, not 0, can't use C version of the macro. */
+#define __DECLARE_FLEX_ARRAY(T, member) \
+ T member[0]
+#else
/**
* __DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union
*
@@ -44,3 +49,9 @@
TYPE NAME[]; \
}
#endif
+
+#ifndef __counted_by
+#define __counted_by(m)
+#endif
+
+#endif /* _UAPI_LINUX_STDDEF_H */
diff --git a/src/basic/locale-util.c b/src/basic/locale-util.c
index e6da5dbc63..23565273dd 100644
--- a/src/basic/locale-util.c
+++ b/src/basic/locale-util.c
@@ -295,7 +295,7 @@ bool is_locale_utf8(void) {
if (cached_answer >= 0)
goto out;
- r = getenv_bool_secure("SYSTEMD_UTF8");
+ r = secure_getenv_bool("SYSTEMD_UTF8");
if (r >= 0) {
cached_answer = r;
goto out;
diff --git a/src/basic/log.c b/src/basic/log.c
index 7ddca92afa..172a2c8ada 100644
--- a/src/basic/log.c
+++ b/src/basic/log.c
@@ -1674,7 +1674,7 @@ bool log_context_enabled(void) {
if (saved_log_context_enabled >= 0)
return saved_log_context_enabled;
- r = getenv_bool_secure("SYSTEMD_ENABLE_LOG_CONTEXT");
+ r = secure_getenv_bool("SYSTEMD_ENABLE_LOG_CONTEXT");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_ENABLE_LOG_CONTEXT, ignoring: %m");
diff --git a/src/basic/meson.build b/src/basic/meson.build
index 6b30908ce1..ced027ba83 100644
--- a/src/basic/meson.build
+++ b/src/basic/meson.build
@@ -10,16 +10,19 @@ basic_sources = files(
'audit-util.c',
'btrfs.c',
'build.c',
+ 'build-path.c',
'bus-label.c',
'cap-list.c',
'capability-util.c',
'cgroup-util.c',
'chase.c',
'chattr-util.c',
+ 'compress.c',
'conf-files.c',
'confidential-virt.c',
'devnum-util.c',
'dirent-util.c',
+ 'dlfcn-util.c',
'efivars.c',
'env-file.c',
'env-util.c',
@@ -273,8 +276,12 @@ libbasic = static_library(
fundamental_sources,
include_directories : basic_includes,
dependencies : [libcap,
+ libdl,
+ liblz4_cflags,
libm,
librt,
+ libxz_cflags,
+ libzstd_cflags,
threads,
userspace],
c_args : ['-fvisibility=default'],
@@ -296,22 +303,3 @@ libbasic_gcrypt = static_library(
userspace],
c_args : ['-fvisibility=default'],
build_by_default : false)
-
-############################################################
-
-basic_compress_sources = files(
- 'compress.c',
-)
-
-# A convenience library that is separate from libbasic to avoid unnecessary
-# linking to the compression libraries.
-libbasic_compress = static_library(
- 'basic-compress',
- basic_compress_sources,
- include_directories : basic_includes,
- dependencies : [liblz4,
- libxz,
- libzstd,
- userspace],
- c_args : ['-fvisibility=default'],
- build_by_default : false)
diff --git a/src/basic/mkdir.c b/src/basic/mkdir.c
index 5dd56c89a4..7c1ad7dd64 100644
--- a/src/basic/mkdir.c
+++ b/src/basic/mkdir.c
@@ -112,7 +112,7 @@ int mkdirat_parents_internal(int dir_fd, const char *path, mode_t mode, uid_t ui
/* drop the last component */
path = strndupa_safe(path, e - path);
- r = is_dir_full(dir_fd, path, true);
+ r = is_dir_at(dir_fd, path, /* follow = */ true);
if (r > 0)
return 0;
if (r == 0)
diff --git a/src/basic/path-lookup.c b/src/basic/path-lookup.c
index 8a03e29f65..e7fc4a7f06 100644
--- a/src/basic/path-lookup.c
+++ b/src/basic/path-lookup.c
@@ -776,9 +776,8 @@ int lookup_paths_init_or_warn(LookupPaths *lp, RuntimeScope scope, LookupPathsFl
return r;
}
-void lookup_paths_free(LookupPaths *lp) {
- if (!lp)
- return;
+void lookup_paths_done(LookupPaths *lp) {
+ assert(lp);
lp->search_path = strv_free(lp->search_path);
diff --git a/src/basic/path-lookup.h b/src/basic/path-lookup.h
index 11db264c01..0db2c5a98c 100644
--- a/src/basic/path-lookup.h
+++ b/src/basic/path-lookup.h
@@ -65,7 +65,7 @@ bool path_is_user_data_dir(const char *path);
bool path_is_user_config_dir(const char *path);
void lookup_paths_log(LookupPaths *p);
-void lookup_paths_free(LookupPaths *p);
+void lookup_paths_done(LookupPaths *p);
char **generator_binary_paths(RuntimeScope scope);
char **env_generator_binary_paths(RuntimeScope scope);
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index fb8f4ef06e..69635e65f8 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -510,7 +510,7 @@ static int get_process_link_contents(pid_t pid, const char *proc_file, char **re
p = procfs_file_alloca(pid, proc_file);
r = readlink_malloc(p, ret);
- return r == -ENOENT ? -ESRCH : r;
+ return (r == -ENOENT && proc_mounted() > 0) ? -ESRCH : r;
}
int get_process_exe(pid_t pid, char **ret) {
diff --git a/src/basic/signal-util.c b/src/basic/signal-util.c
index f8f4e509ad..661ad00b11 100644
--- a/src/basic/signal-util.c
+++ b/src/basic/signal-util.c
@@ -18,7 +18,7 @@ int reset_all_signal_handlers(void) {
.sa_handler = SIG_DFL,
.sa_flags = SA_RESTART,
};
- int r = 0;
+ int ret = 0, r;
for (int sig = 1; sig < _NSIG; sig++) {
@@ -26,14 +26,14 @@ int reset_all_signal_handlers(void) {
if (IN_SET(sig, SIGKILL, SIGSTOP))
continue;
- /* On Linux the first two RT signals are reserved by
- * glibc, and sigaction() will return EINVAL for them. */
- if (sigaction(sig, &sa, NULL) < 0)
- if (errno != EINVAL && r >= 0)
- r = -errno;
+ /* On Linux the first two RT signals are reserved by glibc, and sigaction() will return
+ * EINVAL for them. */
+ r = RET_NERRNO(sigaction(sig, &sa, NULL));
+ if (r != -EINVAL)
+ RET_GATHER(ret, r);
}
- return r;
+ return ret;
}
int reset_signal_mask(void) {
@@ -57,10 +57,7 @@ int sigaction_many_internal(const struct sigaction *sa, ...) {
if (sig == 0)
continue;
- if (sigaction(sig, sa, NULL) < 0) {
- if (r >= 0)
- r = -errno;
- }
+ RET_GATHER(r, RET_NERRNO(sigaction(sig, sa, NULL)));
}
va_end(ap);
@@ -87,7 +84,7 @@ static int sigset_add_many_ap(sigset_t *ss, va_list ap) {
return r;
}
-int sigset_add_many(sigset_t *ss, ...) {
+int sigset_add_many_internal(sigset_t *ss, ...) {
va_list ap;
int r;
@@ -98,7 +95,7 @@ int sigset_add_many(sigset_t *ss, ...) {
return r;
}
-int sigprocmask_many(int how, sigset_t *old, ...) {
+int sigprocmask_many_internal(int how, sigset_t *old, ...) {
va_list ap;
sigset_t ss;
int r;
@@ -113,10 +110,7 @@ int sigprocmask_many(int how, sigset_t *old, ...) {
if (r < 0)
return r;
- if (sigprocmask(how, &ss, old) < 0)
- return -errno;
-
- return 0;
+ return RET_NERRNO(sigprocmask(how, &ss, old));
}
static const char *const static_signal_table[] = {
diff --git a/src/basic/signal-util.h b/src/basic/signal-util.h
index ad2ba841c6..8826fbeb7b 100644
--- a/src/basic/signal-util.h
+++ b/src/basic/signal-util.h
@@ -31,8 +31,11 @@ int sigaction_many_internal(const struct sigaction *sa, ...);
#define sigaction_many(sa, ...) \
sigaction_many_internal(sa, __VA_ARGS__, -1)
-int sigset_add_many(sigset_t *ss, ...);
-int sigprocmask_many(int how, sigset_t *old, ...);
+int sigset_add_many_internal(sigset_t *ss, ...);
+#define sigset_add_many(...) sigset_add_many_internal(__VA_ARGS__, -1)
+
+int sigprocmask_many_internal(int how, sigset_t *old, ...);
+#define sigprocmask_many(...) sigprocmask_many_internal(__VA_ARGS__, -1)
const char *signal_to_string(int i) _const_;
int signal_from_string(const char *s) _pure_;
@@ -46,7 +49,7 @@ static inline void block_signals_reset(sigset_t *ss) {
#define BLOCK_SIGNALS(...) \
_cleanup_(block_signals_reset) _unused_ sigset_t _saved_sigset = ({ \
sigset_t _t; \
- assert_se(sigprocmask_many(SIG_BLOCK, &_t, __VA_ARGS__, -1) >= 0); \
+ assert_se(sigprocmask_many(SIG_BLOCK, &_t, __VA_ARGS__) >= 0); \
_t; \
})
diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c
index 6a8ec1ba2a..ec6273c7d0 100644
--- a/src/basic/stat-util.c
+++ b/src/basic/stat-util.c
@@ -25,43 +25,130 @@
#include "stat-util.h"
#include "string-util.h"
-int is_symlink(const char *path) {
- struct stat info;
+static int verify_stat_at(
+ int fd,
+ const char *path,
+ bool follow,
+ int (*verify_func)(const struct stat *st),
+ bool verify) {
- assert(path);
+ struct stat st;
+ int r;
+
+ assert(fd >= 0 || fd == AT_FDCWD);
+ assert(!isempty(path) || !follow);
+ assert(verify_func);
- if (lstat(path, &info) < 0)
+ if (fstatat(fd, strempty(path), &st,
+ (isempty(path) ? AT_EMPTY_PATH : 0) | (follow ? 0 : AT_SYMLINK_NOFOLLOW)) < 0)
return -errno;
- return !!S_ISLNK(info.st_mode);
+ r = verify_func(&st);
+ return verify ? r : r >= 0;
}
-int is_dir_full(int atfd, const char* path, bool follow) {
- struct stat st;
- int r;
+int stat_verify_regular(const struct stat *st) {
+ assert(st);
- assert(atfd >= 0 || atfd == AT_FDCWD);
- assert(atfd >= 0 || path);
+ /* Checks whether the specified stat() structure refers to a regular file. If not returns an
+ * appropriate error code. */
- if (path)
- r = fstatat(atfd, path, &st, follow ? 0 : AT_SYMLINK_NOFOLLOW);
- else
- r = fstat(atfd, &st);
- if (r < 0)
- return -errno;
+ if (S_ISDIR(st->st_mode))
+ return -EISDIR;
+
+ if (S_ISLNK(st->st_mode))
+ return -ELOOP;
+
+ if (!S_ISREG(st->st_mode))
+ return -EBADFD;
- return !!S_ISDIR(st.st_mode);
+ return 0;
}
-int is_device_node(const char *path) {
- struct stat info;
+int verify_regular_at(int fd, const char *path, bool follow) {
+ return verify_stat_at(fd, path, follow, stat_verify_regular, true);
+}
- assert(path);
+int fd_verify_regular(int fd) {
+ assert(fd >= 0);
+ return verify_regular_at(fd, NULL, false);
+}
- if (lstat(path, &info) < 0)
- return -errno;
+int stat_verify_directory(const struct stat *st) {
+ assert(st);
- return !!(S_ISBLK(info.st_mode) || S_ISCHR(info.st_mode));
+ if (S_ISLNK(st->st_mode))
+ return -ELOOP;
+
+ if (!S_ISDIR(st->st_mode))
+ return -ENOTDIR;
+
+ return 0;
+}
+
+int fd_verify_directory(int fd) {
+ assert(fd >= 0);
+ return verify_stat_at(fd, NULL, false, stat_verify_directory, true);
+}
+
+int is_dir_at(int fd, const char *path, bool follow) {
+ return verify_stat_at(fd, path, follow, stat_verify_directory, false);
+}
+
+int is_dir(const char *path, bool follow) {
+ assert(!isempty(path));
+ return is_dir_at(AT_FDCWD, path, follow);
+}
+
+int stat_verify_symlink(const struct stat *st) {
+ assert(st);
+
+ if (S_ISDIR(st->st_mode))
+ return -EISDIR;
+
+ if (!S_ISLNK(st->st_mode))
+ return -ENOLINK;
+
+ return 0;
+}
+
+int is_symlink(const char *path) {
+ assert(!isempty(path));
+ return verify_stat_at(AT_FDCWD, path, false, stat_verify_symlink, false);
+}
+
+int stat_verify_linked(const struct stat *st) {
+ assert(st);
+
+ if (st->st_nlink <= 0)
+ return -EIDRM; /* recognizable error. */
+
+ return 0;
+}
+
+int fd_verify_linked(int fd) {
+ assert(fd >= 0);
+ return verify_stat_at(fd, NULL, false, stat_verify_linked, true);
+}
+
+int stat_verify_device_node(const struct stat *st) {
+ assert(st);
+
+ if (S_ISLNK(st->st_mode))
+ return -ELOOP;
+
+ if (S_ISDIR(st->st_mode))
+ return -EISDIR;
+
+ if (!S_ISBLK(st->st_mode) && !S_ISCHR(st->st_mode))
+ return -ENOTTY;
+
+ return 0;
+}
+
+int is_device_node(const char *path) {
+ assert(!isempty(path));
+ return verify_stat_at(AT_FDCWD, path, false, stat_verify_device_node, false);
}
int dir_is_empty_at(int dir_fd, const char *path, bool ignore_hidden_or_backup) {
@@ -260,90 +347,6 @@ int path_is_network_fs(const char *path) {
return is_network_fs(&s);
}
-int stat_verify_linked(const struct stat *st) {
- assert(st);
-
- if (st->st_nlink <= 0)
- return -EIDRM; /* recognizable error. */
-
- return 0;
-}
-
-int fd_verify_linked(int fd) {
- struct stat st;
-
- assert(fd >= 0);
-
- if (fstat(fd, &st) < 0)
- return -errno;
-
- return stat_verify_linked(&st);
-}
-
-int stat_verify_regular(const struct stat *st) {
- assert(st);
-
- /* Checks whether the specified stat() structure refers to a regular file. If not returns an
- * appropriate error code. */
-
- if (S_ISDIR(st->st_mode))
- return -EISDIR;
-
- if (S_ISLNK(st->st_mode))
- return -ELOOP;
-
- if (!S_ISREG(st->st_mode))
- return -EBADFD;
-
- return 0;
-}
-
-int fd_verify_regular(int fd) {
- struct stat st;
-
- assert(fd >= 0);
-
- if (fstat(fd, &st) < 0)
- return -errno;
-
- return stat_verify_regular(&st);
-}
-
-int verify_regular_at(int dir_fd, const char *path, bool follow) {
- struct stat st;
-
- assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
- assert(path);
-
- if (fstatat(dir_fd, path, &st, (isempty(path) ? AT_EMPTY_PATH : 0) | (follow ? 0 : AT_SYMLINK_NOFOLLOW)) < 0)
- return -errno;
-
- return stat_verify_regular(&st);
-}
-
-int stat_verify_directory(const struct stat *st) {
- assert(st);
-
- if (S_ISLNK(st->st_mode))
- return -ELOOP;
-
- if (!S_ISDIR(st->st_mode))
- return -ENOTDIR;
-
- return 0;
-}
-
-int fd_verify_directory(int fd) {
- struct stat st;
-
- assert(fd >= 0);
-
- if (fstat(fd, &st) < 0)
- return -errno;
-
- return stat_verify_directory(&st);
-}
-
int proc_mounted(void) {
int r;
diff --git a/src/basic/stat-util.h b/src/basic/stat-util.h
index bab5415357..47445d852a 100644
--- a/src/basic/stat-util.h
+++ b/src/basic/stat-util.h
@@ -14,14 +14,22 @@
#include "siphash24.h"
#include "time-util.h"
+int stat_verify_regular(const struct stat *st);
+int verify_regular_at(int fd, const char *path, bool follow);
+int fd_verify_regular(int fd);
+
+int stat_verify_directory(const struct stat *st);
+int fd_verify_directory(int fd);
+int is_dir_at(int fd, const char *path, bool follow);
+int is_dir(const char *path, bool follow);
+
+int stat_verify_symlink(const struct stat *st);
int is_symlink(const char *path);
-int is_dir_full(int atfd, const char *fname, bool follow);
-static inline int is_dir(const char *path, bool follow) {
- return is_dir_full(AT_FDCWD, path, follow);
-}
-static inline int is_dir_fd(int fd) {
- return is_dir_full(fd, NULL, false);
-}
+
+int stat_verify_linked(const struct stat *st);
+int fd_verify_linked(int fd);
+
+int stat_verify_device_node(const struct stat *st);
int is_device_node(const char *path);
int dir_is_empty_at(int dir_fd, const char *path, bool ignore_hidden_or_backup);
@@ -72,16 +80,6 @@ int path_is_network_fs(const char *path);
*/
#define F_TYPE_EQUAL(a, b) (a == (typeof(a)) b)
-int stat_verify_linked(const struct stat *st);
-int fd_verify_linked(int fd);
-
-int stat_verify_regular(const struct stat *st);
-int fd_verify_regular(int fd);
-int verify_regular_at(int dir_fd, const char *path, bool follow);
-
-int stat_verify_directory(const struct stat *st);
-int fd_verify_directory(int fd);
-
int proc_mounted(void);
bool stat_inode_same(const struct stat *a, const struct stat *b);
diff --git a/src/basic/string-util.c b/src/basic/string-util.c
index 2aac588118..c1e7e6e622 100644
--- a/src/basic/string-util.c
+++ b/src/basic/string-util.c
@@ -620,6 +620,9 @@ char *cellescape(char *buf, size_t len, const char *s) {
char* strshorten(char *s, size_t l) {
assert(s);
+ if (l >= SIZE_MAX-1) /* Would not change anything */
+ return s;
+
if (strnlen(s, l+1) > l)
s[l] = 0;
diff --git a/src/basic/strv.c b/src/basic/strv.c
index b7946c8ba2..d081821a86 100644
--- a/src/basic/strv.c
+++ b/src/basic/strv.c
@@ -356,7 +356,7 @@ int strv_split_colon_pairs(char ***t, const char *s) {
const char *p = tuple;
r = extract_many_words(&p, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS,
- &first, &second, NULL);
+ &first, &second);
if (r < 0)
return r;
if (r == 0)
diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c
index 4c1824bc83..8b5a9fa8c6 100644
--- a/src/basic/terminal-util.c
+++ b/src/basic/terminal-util.c
@@ -1581,6 +1581,7 @@ typedef enum BackgroundColorState {
BACKGROUND_RED,
BACKGROUND_GREEN,
BACKGROUND_BLUE,
+ BACKGROUND_STRING_TERMINATOR,
} BackgroundColorState;
typedef struct BackgroundColorContext {
@@ -1672,7 +1673,9 @@ static int scan_background_color_response(
return 1; /* success! */
context->state = BACKGROUND_TEXT;
- } else {
+ } else if (c == '\x1b')
+ context->state = context->blue_bits > 0 ? BACKGROUND_STRING_TERMINATOR : BACKGROUND_TEXT;
+ else {
int d = unhexchar(c);
if (d < 0 || context->blue_bits >= sizeof(context->blue)*8)
context->state = BACKGROUND_TEXT;
@@ -1682,10 +1685,18 @@ static int scan_background_color_response(
}
}
break;
+
+ case BACKGROUND_STRING_TERMINATOR:
+ if (c == '\\')
+ return 1; /* success! */
+
+ context->state = c == ']' ? BACKGROUND_ESCAPE : BACKGROUND_TEXT;
+ break;
+
}
/* Reset any colors we might have picked up */
- if (context->state == BACKGROUND_TEXT) {
+ if (IN_SET(context->state, BACKGROUND_TEXT, BACKGROUND_ESCAPE)) {
/* reset color */
context->red = context->green = context->blue = 0;
context->red_bits = context->green_bits = context->blue_bits = 0;
@@ -1744,6 +1755,10 @@ int get_default_background_color(double *ret_red, double *ret_green, double *ret
r = fd_wait_for_event(STDIN_FILENO, POLLIN, usec_sub_unsigned(end, n));
if (r < 0)
goto finish;
+ if (r == 0) {
+ r = -EOPNOTSUPP;
+ goto finish;
+ }
ssize_t l;
l = read(STDIN_FILENO, buf, sizeof(buf) - buf_full);
diff --git a/src/basic/time-util.c b/src/basic/time-util.c
index 02123dc591..3601be25fb 100644
--- a/src/basic/time-util.c
+++ b/src/basic/time-util.c
@@ -1429,7 +1429,7 @@ static int get_timezones_from_zone1970_tab(char ***ret) {
/* Line format is:
* 'country codes' 'coordinates' 'timezone' 'comments' */
- r = extract_many_words(&p, NULL, 0, &cc, &co, &tz, NULL);
+ r = extract_many_words(&p, NULL, 0, &cc, &co, &tz);
if (r < 0)
continue;
@@ -1474,7 +1474,7 @@ static int get_timezones_from_tzdata_zi(char ***ret) {
* Link line format is:
* 'Link' 'target' 'alias'
* See 'man zic' for more detail. */
- r = extract_many_words(&p, NULL, 0, &type, &f1, &f2, NULL);
+ r = extract_many_words(&p, NULL, 0, &type, &f1, &f2);
if (r < 0)
continue;
@@ -1573,7 +1573,7 @@ int verify_timezone(const char *name, int log_level) {
r = fd_verify_regular(fd);
if (r < 0)
- return log_full_errno(log_level, r, "Timezone file '%s' is not a regular file: %m", t);
+ return log_full_errno(log_level, r, "Timezone file '%s' is not a regular file: %m", t);
r = loop_read_exact(fd, buf, 4, false);
if (r < 0)
diff --git a/src/basic/virt.c b/src/basic/virt.c
index 375ef28216..b976d2af14 100644
--- a/src/basic/virt.c
+++ b/src/basic/virt.c
@@ -98,7 +98,7 @@ static Virtualization detect_vm_cpuid(void) {
}
static Virtualization detect_vm_device_tree(void) {
-#if defined(__arm__) || defined(__aarch64__) || defined(__powerpc__) || defined(__powerpc64__)
+#if defined(__arm__) || defined(__aarch64__) || defined(__powerpc__) || defined(__powerpc64__) || defined(__riscv)
_cleanup_free_ char *hvtype = NULL;
int r;
@@ -155,7 +155,7 @@ static Virtualization detect_vm_device_tree(void) {
#endif
}
-#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) || defined(__loongarch_lp64)
+#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) || defined(__loongarch_lp64) || defined(__riscv)
static Virtualization detect_vm_dmi_vendor(void) {
static const char* const dmi_vendors[] = {
"/sys/class/dmi/id/product_name", /* Test this before sys_vendor to detect KVM over QEMU */
@@ -455,12 +455,12 @@ Virtualization detect_vm(void) {
/* We have to use the correct order here:
*
- * → First, try to detect Oracle Virtualbox, Amazon EC2 Nitro, Parallels, and Google Compute Engine, even if they use KVM,
- * as well as Xen even if it cloaks as Microsoft Hyper-V. Attempt to detect uml at this stage also
- * since it runs as a user-process nested inside other VMs. Also check for Xen now, because Xen PV
- * mode does not override CPUID when nested inside another hypervisor.
+ * → First, try to detect Oracle Virtualbox, Amazon EC2 Nitro, Parallels, and Google Compute Engine,
+ * even if they use KVM, as well as Xen, even if it cloaks as Microsoft Hyper-V. Attempt to detect
+ * UML at this stage too, since it runs as a user-process nested inside other VMs. Also check for
+ * Xen now, because Xen PV mode does not override CPUID when nested inside another hypervisor.
*
- * → Second, try to detect from CPUID, this will report KVM for whatever software is used even if
+ * → Second, try to detect from CPUID. This will report KVM for whatever software is used even if
* info in DMI is overwritten.
*
* → Third, try to detect from DMI. */
diff --git a/src/battery-check/battery-check.c b/src/battery-check/battery-check.c
index 03628c8b92..1563147b7b 100644
--- a/src/battery-check/battery-check.c
+++ b/src/battery-check/battery-check.c
@@ -123,9 +123,9 @@ static int run(int argc, char *argv[]) {
log_setup();
- r = proc_cmdline_get_bool("systemd.battery-check", PROC_CMDLINE_STRIP_RD_PREFIX|PROC_CMDLINE_TRUE_WHEN_MISSING, &arg_doit);
+ r = proc_cmdline_get_bool("systemd.battery_check", PROC_CMDLINE_STRIP_RD_PREFIX|PROC_CMDLINE_TRUE_WHEN_MISSING, &arg_doit);
if (r < 0)
- log_warning_errno(r, "Failed to parse systemd.battery-check= kernel command line option, ignoring: %m");
+ log_warning_errno(r, "Failed to parse systemd.battery_check= kernel command line option, ignoring: %m");
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c
index bd10c08b82..b883159dcf 100644
--- a/src/boot/bootctl.c
+++ b/src/boot/bootctl.c
@@ -537,7 +537,8 @@ static int run(int argc, char *argv[]) {
arg_image,
arg_image_policy,
DISSECT_IMAGE_GENERIC_ROOT |
- DISSECT_IMAGE_RELAX_VAR_CHECK,
+ DISSECT_IMAGE_RELAX_VAR_CHECK |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/boot/efi/UEFI_SECURITY.md b/src/boot/efi/UEFI_SECURITY.md
index 9f750d8e6b..55e66dbcc9 100644
--- a/src/boot/efi/UEFI_SECURITY.md
+++ b/src/boot/efi/UEFI_SECURITY.md
@@ -9,28 +9,28 @@ stub's role is that of the fundamental entrypoint to kernel execution from UEFI
modern Linux boot protocol. `systemd-stub` on the other hand loads various resources, including the kernel
image, via the EFI LoadImage/StartImage protocol (although it does support the legacy Linux boot protocol,
as a fallback for older kernels on x86). The purpose of `systemd-stub` is to provide additional features and
-functionality for either or both `systemd-boot` and `systemd` (userspace).
+functionality for `systemd-boot` and `systemd` (in userspace).
## Fundamental Security Design Goals
-The fundamental security design goals for these components are separation of security policy logic from the
-rest of the functionality, achieved by offloading security-critical tasks to the firmware or earlier stages
-of the boot process (e.g.: `Shim`).
+The fundamental security design goal for these components is the separation of security policy logic from the
+rest of the functionality. This is achieved by offloading security-critical tasks to the firmware or earlier stages
+of the boot process (in particular `Shim`).
-When SecureBoot is enabled, these components are designed to avoid executing, loading or using
+When SecureBoot is enabled, these components are designed to avoid loading, executing, or using
unauthenticated payloads that could compromise the boot process, with special care taken for anything that
could affect the system before `ExitBootServices()` has been called. For example, when additional resources
are loaded, if running with SecureBoot enabled, they will be validated before use. The only exceptions are
-the bootloader's own textual configuration files, and parsing metadata out of images for displaying purposes
+the bootloader's own textual configuration files, and metadata parsed out of kernel images for display purposes
only. There are no build time or runtime configuration options that can be set to weaken the security model
of these components when SecureBoot is enabled.
The role of `systemd-boot` is to discover next stage components in the ESP (and XBOOTLDR if present), via
-filesystem enumeration or explicit configuration files, and present a menu to the user, to choose the next
-step. This auto discovery mechanism is described in details in the [BLS (Boot Loader
+filesystem enumeration or explicit configuration files, and present a menu to the user to choose the next
+step. This auto discovery mechanism is described in detail in the [BLS (Boot Loader
Specification)](https://uapi-group.org/specifications/specs/boot_loader_specification/).
The role of `systemd-stub` is to load and measure in the TPM the post-bootloader stages, such as the kernel,
-initrd and kernel command line, and implement optional features such as augmenting the initrd with
+initrd, and kernel command line, and implement optional features such as augmenting the initrd with
additional content such as configuration or optional services. [Unified Kernel
Images](https://uapi-group.org/specifications/specs/unified_kernel_image/) embed `systemd-stub`, a kernel
and other optional components as sections in a PE signed binary, that can thus be executed in UEFI
@@ -42,19 +42,19 @@ the image, given that the payload kernel was already authenticated and verified
SecureBoot authentication is re-enabled immediately after the kernel image has been loaded.
Various EFI variables, under the vendor UUID `4a67b082-0a4c-41cf-b6c7-440b29bb8c4f`, are set and read by
-these components, to pass metadata and configuration between different stages of the boot process, as
+these components. This is used to pass metadata and configuration between different stages of the boot process, as
defined in the [Boot Loader Interface](https://systemd.io/BOOT_LOADER_INTERFACE/).
## Dependencies
-Neither of these components implements cryptographic primitives, cryptographic checks or drivers. File
+Neither of these components implements cryptographic primitives, cryptographic checks, or drivers. File
access to the ESP is implemented solely via the appropriate UEFI file protocols. Verification of next stage
-payloads is implementend solely via the appropriate UEFI image load protocols, which means authenticode
+payloads is implementend solely via the appropriate UEFI image load protocols, which means `authenticode`
signature checks are again done by the firmware or `Shim`. As a consequence, no external security-critical
-libraries (such as OpenSSL or gnu-efi) are used, linked or embedded.
+libraries (such as OpenSSL or gnu-efi) are linked, embedded, or used.
## Additional Resources
BLS Type #1 entries allow the user to load two types of additional resources that can affect the system
-before `ExitBootServices()` has been called, kernel command line arguments and Devicetree blobs, that are
+before `ExitBootServices()` has been called — kernel command line arguments and Devicetree blobs — that are
not validated before use, as they do not carry signatures. For this reason, when SecureBoot is enabled,
loading these resources is automatically disabled. There is no override for this security mechanism, neither
at build time nor at runtime. Note that initrds are also not verified in BLS Type #1 configurations, for
@@ -62,8 +62,9 @@ compatibility with how SecureBoot has been traditionally handled on Linux-based
only load them after `ExitBootServices()` has been called.
Another mechanism is supported by `systemd-boot` and `systemd-stub` to add additional payloads to the boot
-process: `addons`. Addons are PE signed binaries that can carry kernel command line arguments or Devicetree
-blobs (more might be added in the future). In contrast to the user-specified additions in the Type #1 case
+process: "addons". Addons are PE signed binaries that can carry kernel command line arguments or Devicetree
+blobs (more payload types might be added in the future).
+In contrast to the user-specified additions in the Type #1 case
described above, these addons are loaded through the UEFI image loading protocol, and thus are subject to
signature validation, and will be rejected if not signed or if the signature is invalid, following the
standard SecureBoot model. They are also measured in the TPM.
@@ -72,22 +73,22 @@ standard SecureBoot model. They are also measured in the TPM.
firmware's capabilities. These are again PE signed binaries and will be verified using the appropriate
UEFI protocol.
-A random seed will be loaded and passed to the kernel for early-boot entropy pool filling if found in the
-ESP. It is mixed with various other sources of entropy available in the UEFI environment, such as the RNG
+A random seed will be loaded and passed to the kernel for early-boot entropy if found in the ESP.
+It is mixed with various other sources of entropy available in the UEFI environment, such as the RNG
protocol, the boot counter and the clock. Moreover, the seed is updated before the kernel is invoked, as
well as after the kernel is invoked (from userspace), with a new seed derived from the Linux kernel entropy
pool.
When operating as a virtual machine payload, the loaded payloads can be customized via `SMBIOS Type 11
-Strings`, if the hypervisor specifies them. This is automatically disabled if running inside a confidential
-computing VM.
+Strings`. Those settings are specified by the hypervisor and trusted.
+They are automatically disabled if running inside a confidential computing VM.
## Certificates Enrollment
-When SecureBoot is supported but in `setup` mode, `systemd-boot` can enroll user certificates if a set of
-`PK`, `KEK` and `db` certificates is found in the ESP, after which SecureBoot is enabled and a firmware
-reset is performed. When running on bare metal, the certificate(s) will be shown to the user on the console,
-and manual confirmation will be asked before proceeding. When running as a virtual machine payload,
-enrollment is fully automated, without user interaction, unless disabled via a configuration file in the
+When SecureBoot is supported, but in `setup` mode, `systemd-boot` can enroll user certificates if a set of
+`PK`, `KEK` and `db` certificates is found in the ESP. Afterwards, SecureBoot is enabled and a firmware
+reset is performed. When running on bare metal, the certificates will be shown to the user on the console,
+and manual confirmation is required before proceeding. When running as a virtual machine payload,
+enrollment is fully automated without user interaction, unless disabled via a configuration file in the
ESP. The configuration file can also be used to disable enrollment completely.
## Compiler Hardening
@@ -111,10 +112,10 @@ allow customizations of the metadata included in the section, that can be used b
The `systemd` project will participate in the coordinated `SBAT` disclosure and metadata revision process as
deemed necessary, in coordination with the Shim Review group.
-The upstream project name used to be unified (`systemd`) for both components, but since version v255 has
+The upstream project name used to be unified (`systemd`) for both components, but since version 255 has
been split into separate `systemd-boot` and `systemd-stub` project names, so that each component can be
-revisioned independently. Most of the code tend to be shared between these two components, but there is no
-complete overlap, so it is possible for a vulnerability to affect only one component but not the other.
+revisioned independently. Most of the code tends to be shared between these two components, but the
+overlap is not complete, so a future vulnerability may affect only one of the components.
## Known Vulnerabilities
There is currently one known (and fixed) security vulnerability affecting `systemd-boot` on arm64 and
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index 1e1c6a433e..eba8b40e2f 100644
--- a/src/boot/efi/boot.c
+++ b/src/boot/efi/boot.c
@@ -741,23 +741,25 @@ static bool menu_run(
lines = xnew(char16_t *, config->n_entries + 1);
for (size_t i = 0; i < config->n_entries; i++) {
- size_t j, padding;
-
- lines[i] = xnew(char16_t, line_width + 1);
- padding = (line_width - MIN(strlen16(config->entries[i]->title_show), line_width)) / 2;
+ size_t width = line_width - MIN(strlen16(config->entries[i]->title_show), line_width);
+ size_t padding = width / 2;
+ bool odd = width % 2;
/* Make sure there is space for => */
padding = MAX((size_t) 2, padding);
- for (j = 0; j < padding; j++)
- lines[i][j] = ' ';
+ size_t print_width = MIN(
+ strlen16(config->entries[i]->title_show),
+ line_width - padding * 2);
- for (size_t k = 0; config->entries[i]->title_show[k] != '\0' && j < line_width; j++, k++)
- lines[i][j] = config->entries[i]->title_show[k];
+ assert((padding + 1) <= INT_MAX);
+ assert(print_width <= INT_MAX);
- for (; j < line_width; j++)
- lines[i][j] = ' ';
- lines[i][line_width] = '\0';
+ lines[i] = xasprintf(
+ "%*ls%.*ls%*ls",
+ (int) padding, u"",
+ (int) print_width, config->entries[i]->title_show,
+ odd ? (int) (padding + 1) : (int) padding, u"");
}
lines[config->n_entries] = NULL;
diff --git a/src/boot/efi/measure.c b/src/boot/efi/measure.c
index 7e440b714e..2591c52f22 100644
--- a/src/boot/efi/measure.c
+++ b/src/boot/efi/measure.c
@@ -10,39 +10,6 @@
#include "tpm2-pcr.h"
#include "util.h"
-static EFI_STATUS tpm1_measure_to_pcr_and_event_log(
- const EFI_TCG_PROTOCOL *tcg,
- uint32_t pcrindex,
- EFI_PHYSICAL_ADDRESS buffer,
- size_t buffer_size,
- const char16_t *description) {
-
- _cleanup_free_ TCG_PCR_EVENT *tcg_event = NULL;
- EFI_PHYSICAL_ADDRESS event_log_last;
- uint32_t event_number = 1;
- size_t desc_len;
-
- assert(tcg);
- assert(description);
-
- desc_len = strsize16(description);
- tcg_event = xmalloc(offsetof(TCG_PCR_EVENT, Event) + desc_len);
- *tcg_event = (TCG_PCR_EVENT) {
- .EventSize = desc_len,
- .PCRIndex = pcrindex,
- .EventType = EV_IPL,
- };
- memcpy(tcg_event->Event, description, desc_len);
-
- return tcg->HashLogExtendEvent(
- (EFI_TCG_PROTOCOL *) tcg,
- buffer, buffer_size,
- TCG_ALG_SHA,
- tcg_event,
- &event_number,
- &event_log_last);
-}
-
static EFI_STATUS tpm2_measure_to_pcr_and_tagged_event_log(
EFI_TCG2_PROTOCOL *tcg,
uint32_t pcrindex,
@@ -187,37 +154,6 @@ static EFI_CC_MEASUREMENT_PROTOCOL *cc_interface_check(void) {
return cc;
}
-static EFI_TCG_PROTOCOL *tcg1_interface_check(void) {
- EFI_PHYSICAL_ADDRESS event_log_location, event_log_last_entry;
- EFI_TCG_BOOT_SERVICE_CAPABILITY capability = {
- .Size = sizeof(capability),
- };
- EFI_STATUS err;
- uint32_t features;
- EFI_TCG_PROTOCOL *tcg;
-
- err = BS->LocateProtocol(MAKE_GUID_PTR(EFI_TCG_PROTOCOL), NULL, (void **) &tcg);
- if (err != EFI_SUCCESS)
- return NULL;
-
- err = tcg->StatusCheck(
- tcg,
- &capability,
- &features,
- &event_log_location,
- &event_log_last_entry);
- if (err != EFI_SUCCESS)
- return NULL;
-
- if (capability.TPMDeactivatedFlag)
- return NULL;
-
- if (!capability.TPMPresentFlag)
- return NULL;
-
- return tcg;
-}
-
static EFI_TCG2_PROTOCOL *tcg2_interface_check(void) {
EFI_TCG2_BOOT_SERVICE_CAPABILITY capability = {
.Size = sizeof(capability),
@@ -248,7 +184,7 @@ static EFI_TCG2_PROTOCOL *tcg2_interface_check(void) {
}
bool tpm_present(void) {
- return tcg2_interface_check() || tcg1_interface_check();
+ return tcg2_interface_check();
}
EFI_STATUS tpm_log_event(uint32_t pcrindex, EFI_PHYSICAL_ADDRESS buffer, size_t buffer_size, const char16_t *description, bool *ret_measured) {
@@ -271,25 +207,18 @@ EFI_STATUS tpm_log_event(uint32_t pcrindex, EFI_PHYSICAL_ADDRESS buffer, size_t
if (tpm2)
err = tpm2_measure_to_pcr_and_event_log(tpm2, pcrindex, buffer, buffer_size, description);
else {
- EFI_TCG_PROTOCOL *tpm1;
+ EFI_CC_MEASUREMENT_PROTOCOL *cc;
- tpm1 = tcg1_interface_check();
- if (tpm1)
- err = tpm1_measure_to_pcr_and_event_log(tpm1, pcrindex, buffer, buffer_size, description);
+ cc = cc_interface_check();
+ if (cc)
+ err = cc_measure_to_mr_and_event_log(cc, pcrindex, buffer, buffer_size, description);
else {
- EFI_CC_MEASUREMENT_PROTOCOL *cc;
-
- cc = cc_interface_check();
- if (cc)
- err = cc_measure_to_mr_and_event_log(cc, pcrindex, buffer, buffer_size, description);
- else {
- /* No active TPM found, so don't return an error */
+ /* No active TPM found, so don't return an error */
- if (ret_measured)
- *ret_measured = false;
+ if (ret_measured)
+ *ret_measured = false;
- return EFI_SUCCESS;
- }
+ return EFI_SUCCESS;
}
}
diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build
index 2e22bdf57f..483e0ade0c 100644
--- a/src/boot/efi/meson.build
+++ b/src/boot/efi/meson.build
@@ -28,7 +28,7 @@ efi_fuzz_template = fuzz_template + efitest_base
executables += [
efi_test_template + {
'sources' : files('test-bcd.c'),
- 'dependencies' : libzstd,
+ 'dependencies' : libzstd_cflags,
'conditions' : ['ENABLE_BOOTLOADER', 'HAVE_ZSTD'],
},
efi_test_template + {
@@ -68,6 +68,7 @@ if meson.is_cross_build() and get_option('sbat-distro') == 'auto'
elif get_option('sbat-distro') != ''
efi_conf.set_quoted('SBAT_PROJECT', meson.project_name())
efi_conf.set_quoted('PROJECT_VERSION', meson.project_version().split('~')[0])
+ efi_conf.set_quoted('VERSION_TAG', version_tag)
efi_conf.set('PROJECT_URL', conf.get('PROJECT_URL'))
if get_option('sbat-distro-generation') < 1
error('SBAT Distro Generation must be a positive integer')
@@ -209,11 +210,13 @@ if cc.get_id() == 'clang'
endif
efi_arch_c_args = {
- 'aarch64' : ['-mgeneral-regs-only'],
- 'arm' : ['-mgeneral-regs-only'],
+ 'aarch64' : ['-mgeneral-regs-only'],
+ 'arm' : ['-mgeneral-regs-only'],
+ # Until -mgeneral-regs-only is supported in LoongArch, use the following option instead:
+ 'loongarch64' : ['-mno-lsx', '-mno-lasx'],
# Pass -m64/32 explicitly to make building on x32 work.
- 'x86_64' : ['-m64', '-march=x86-64', '-mno-red-zone', '-mgeneral-regs-only'],
- 'x86' : ['-m32', '-march=i686', '-mgeneral-regs-only', '-malign-double'],
+ 'x86_64' : ['-m64', '-march=x86-64', '-mno-red-zone', '-mgeneral-regs-only'],
+ 'x86' : ['-m32', '-march=i686', '-mgeneral-regs-only', '-malign-double'],
}
efi_arch_c_ld_args = {
# libgcc is not compiled with -fshort-wchar, but it does not use it anyways,
diff --git a/src/boot/efi/proto/tcg.h b/src/boot/efi/proto/tcg.h
index b4b82962ef..e243bf8b72 100644
--- a/src/boot/efi/proto/tcg.h
+++ b/src/boot/efi/proto/tcg.h
@@ -3,12 +3,9 @@
#include "efi.h"
-#define EFI_TCG_PROTOCOL_GUID \
- GUID_DEF(0xf541796d, 0xa62e, 0x4954, 0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd)
#define EFI_TCG2_PROTOCOL_GUID \
GUID_DEF(0x607f766c, 0x7455, 0x42be, 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
-#define TCG_ALG_SHA 0x4
#define EFI_TCG2_EVENT_HEADER_VERSION 1
#define EV_IPL 13
#define EV_EVENT_TAG UINT32_C(6)
@@ -49,16 +46,6 @@ typedef struct {
} EFI_TCG2_BOOT_SERVICE_CAPABILITY;
typedef struct {
- uint32_t PCRIndex;
- uint32_t EventType;
- struct {
- uint8_t Digest[20];
- } Digest;
- uint32_t EventSize;
- uint8_t Event[];
-} _packed_ TCG_PCR_EVENT;
-
-typedef struct {
uint32_t HeaderSize;
uint16_t HeaderVersion;
uint32_t PCRIndex;
@@ -77,27 +64,6 @@ typedef struct {
uint8_t Event[];
} _packed_ EFI_TCG2_TAGGED_EVENT;
-typedef struct EFI_TCG_PROTOCOL EFI_TCG_PROTOCOL;
-struct EFI_TCG_PROTOCOL {
- EFI_STATUS (EFIAPI *StatusCheck)(
- EFI_TCG_PROTOCOL *This,
- EFI_TCG_BOOT_SERVICE_CAPABILITY *ProtocolCapability,
- uint32_t *TCGFeatureFlags,
- EFI_PHYSICAL_ADDRESS *EventLogLocation,
- EFI_PHYSICAL_ADDRESS *EventLogLastEntry);
- void *HashAll;
- void *LogEvent;
- void *PassThroughToTpm;
- EFI_STATUS (EFIAPI *HashLogExtendEvent)(
- EFI_TCG_PROTOCOL *This,
- EFI_PHYSICAL_ADDRESS HashData,
- uint64_t HashDataLen,
- uint32_t AlgorithmId,
- TCG_PCR_EVENT *TCGLogData,
- uint32_t *EventNumber,
- EFI_PHYSICAL_ADDRESS *EventLogLastEntry);
-};
-
typedef struct EFI_TCG2_PROTOCOL EFI_TCG2_PROTOCOL;
struct EFI_TCG2_PROTOCOL {
EFI_STATUS (EFIAPI *GetCapability)(
diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c
index 9cedc15d6a..b5c8c6306e 100644
--- a/src/boot/efi/util.c
+++ b/src/boot/efi/util.c
@@ -697,3 +697,9 @@ char16_t *get_extra_dir(const EFI_DEVICE_PATH *file_path) {
remove_boot_count(file_path_str);
return xasprintf("%ls.extra.d", file_path_str);
}
+
+void *xmalloc(size_t size) {
+ void *p = NULL;
+ assert_se(BS->AllocatePool(EfiLoaderData, size, &p) == EFI_SUCCESS);
+ return p;
+}
diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h
index f01cb30b8e..44614593ee 100644
--- a/src/boot/efi/util.h
+++ b/src/boot/efi/util.h
@@ -29,11 +29,7 @@ static inline void freep(void *p) {
#define _cleanup_free_ _cleanup_(freep)
_malloc_ _alloc_(1) _returns_nonnull_ _warn_unused_result_
-static inline void *xmalloc(size_t size) {
- void *p;
- assert_se(BS->AllocatePool(EfiLoaderData, size, &p) == EFI_SUCCESS);
- return p;
-}
+void *xmalloc(size_t size);
_malloc_ _alloc_(1, 2) _returns_nonnull_ _warn_unused_result_
static inline void *xmalloc_multiply(size_t n, size_t size) {
diff --git a/src/boot/measure.c b/src/boot/measure.c
index dea112add0..789a3deb8c 100644
--- a/src/boot/measure.c
+++ b/src/boot/measure.c
@@ -30,7 +30,10 @@ static char *arg_sections[_UNIFIED_SECTION_MAX] = {};
static char **arg_banks = NULL;
static char *arg_tpm2_device = NULL;
static char *arg_private_key = NULL;
+static KeySourceType arg_private_key_source_type = OPENSSL_KEY_SOURCE_FILE;
+static char *arg_private_key_source = NULL;
static char *arg_public_key = NULL;
+static char *arg_certificate = NULL;
static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_PRETTY_AUTO|JSON_FORMAT_COLOR_AUTO|JSON_FORMAT_OFF;
static PagerFlags arg_pager_flags = 0;
static bool arg_current = false;
@@ -40,7 +43,9 @@ static char *arg_append = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_banks, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_tpm2_device, freep);
STATIC_DESTRUCTOR_REGISTER(arg_private_key, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_private_key_source, freep);
STATIC_DESTRUCTOR_REGISTER(arg_public_key, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_certificate, freep);
STATIC_DESTRUCTOR_REGISTER(arg_phase, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_append, freep);
@@ -74,7 +79,11 @@ static int help(int argc, char *argv[], void *userdata) {
" --bank=DIGEST Select TPM bank (SHA1, SHA256, SHA384, SHA512)\n"
" --tpm2-device=PATH Use specified TPM2 device\n"
" --private-key=KEY Private key (PEM) to sign with\n"
+ " --private-key-source=file|provider:PROVIDER|engine:ENGINE\n"
+ " Specify how to use the --private-key=. Allows to use\n"
+ " an OpenSSL engine/provider when signing\n"
" --public-key=KEY Public key (PEM) to validate against\n"
+ " --certificate=PATH PEM certificate to use when signing with a URI\n"
" --json=MODE Output as JSON\n"
" -j Same as --json=pretty on tty, --json=short otherwise\n"
" --append=PATH Load specified JSON signature, and append new signature to it\n"
@@ -133,7 +142,9 @@ static int parse_argv(int argc, char *argv[]) {
ARG_PCRPKEY = _ARG_SECTION_LAST,
ARG_BANK,
ARG_PRIVATE_KEY,
+ ARG_PRIVATE_KEY_SOURCE,
ARG_PUBLIC_KEY,
+ ARG_CERTIFICATE,
ARG_TPM2_DEVICE,
ARG_JSON,
ARG_PHASE,
@@ -141,26 +152,28 @@ static int parse_argv(int argc, char *argv[]) {
};
static const struct option options[] = {
- { "help", no_argument, NULL, 'h' },
- { "no-pager", no_argument, NULL, ARG_NO_PAGER },
- { "version", no_argument, NULL, ARG_VERSION },
- { "linux", required_argument, NULL, ARG_LINUX },
- { "osrel", required_argument, NULL, ARG_OSREL },
- { "cmdline", required_argument, NULL, ARG_CMDLINE },
- { "initrd", required_argument, NULL, ARG_INITRD },
- { "splash", required_argument, NULL, ARG_SPLASH },
- { "dtb", required_argument, NULL, ARG_DTB },
- { "uname", required_argument, NULL, ARG_UNAME },
- { "sbat", required_argument, NULL, ARG_SBAT },
- { "pcrpkey", required_argument, NULL, ARG_PCRPKEY },
- { "current", no_argument, NULL, 'c' },
- { "bank", required_argument, NULL, ARG_BANK },
- { "tpm2-device", required_argument, NULL, ARG_TPM2_DEVICE },
- { "private-key", required_argument, NULL, ARG_PRIVATE_KEY },
- { "public-key", required_argument, NULL, ARG_PUBLIC_KEY },
- { "json", required_argument, NULL, ARG_JSON },
- { "phase", required_argument, NULL, ARG_PHASE },
- { "append", required_argument, NULL, ARG_APPEND },
+ { "help", no_argument, NULL, 'h' },
+ { "no-pager", no_argument, NULL, ARG_NO_PAGER },
+ { "version", no_argument, NULL, ARG_VERSION },
+ { "linux", required_argument, NULL, ARG_LINUX },
+ { "osrel", required_argument, NULL, ARG_OSREL },
+ { "cmdline", required_argument, NULL, ARG_CMDLINE },
+ { "initrd", required_argument, NULL, ARG_INITRD },
+ { "splash", required_argument, NULL, ARG_SPLASH },
+ { "dtb", required_argument, NULL, ARG_DTB },
+ { "uname", required_argument, NULL, ARG_UNAME },
+ { "sbat", required_argument, NULL, ARG_SBAT },
+ { "pcrpkey", required_argument, NULL, ARG_PCRPKEY },
+ { "current", no_argument, NULL, 'c' },
+ { "bank", required_argument, NULL, ARG_BANK },
+ { "tpm2-device", required_argument, NULL, ARG_TPM2_DEVICE },
+ { "private-key", required_argument, NULL, ARG_PRIVATE_KEY },
+ { "private-key-source", required_argument, NULL, ARG_PRIVATE_KEY_SOURCE },
+ { "public-key", required_argument, NULL, ARG_PUBLIC_KEY },
+ { "certificate", required_argument, NULL, ARG_CERTIFICATE },
+ { "json", required_argument, NULL, ARG_JSON },
+ { "phase", required_argument, NULL, ARG_PHASE },
+ { "append", required_argument, NULL, ARG_APPEND },
{}
};
@@ -213,7 +226,17 @@ static int parse_argv(int argc, char *argv[]) {
}
case ARG_PRIVATE_KEY:
- r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_private_key);
+ r = free_and_strdup_warn(&arg_private_key, optarg);
+ if (r < 0)
+ return r;
+
+ break;
+
+ case ARG_PRIVATE_KEY_SOURCE:
+ r = parse_openssl_key_source_argument(
+ optarg,
+ &arg_private_key_source,
+ &arg_private_key_source_type);
if (r < 0)
return r;
@@ -226,6 +249,13 @@ static int parse_argv(int argc, char *argv[]) {
break;
+ case ARG_CERTIFICATE:
+ r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_certificate);
+ if (r < 0)
+ return r;
+
+ break;
+
case ARG_TPM2_DEVICE: {
_cleanup_free_ char *device = NULL;
@@ -281,6 +311,12 @@ static int parse_argv(int argc, char *argv[]) {
assert_not_reached();
}
+ if (arg_public_key && arg_certificate)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Both --public-key= and --certificate= specified, refusing.");
+
+ if (arg_private_key_source && !arg_certificate)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "When using --private-key-source=, --certificate= must be specified.");
+
if (strv_isempty(arg_banks)) {
/* If no banks are specifically selected, pick all known banks */
arg_banks = strv_new("SHA1", "SHA256", "SHA384", "SHA512");
@@ -731,7 +767,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
_cleanup_(pcr_state_free_all) PcrState *pcr_states = NULL;
_cleanup_(EVP_PKEY_freep) EVP_PKEY *privkey = NULL, *pubkey = NULL;
- _cleanup_fclose_ FILE *privkeyf = NULL;
+ _cleanup_(X509_freep) X509 *certificate = NULL;
size_t n;
int r;
@@ -759,13 +795,57 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
/* When signing we only support JSON output */
arg_json_format_flags &= ~JSON_FORMAT_OFF;
- privkeyf = fopen(arg_private_key, "re");
- if (!privkeyf)
- return log_error_errno(errno, "Failed to open private key file '%s': %m", arg_private_key);
+ /* This must be done before openssl_load_key_from_token() otherwise it will get stuck */
+ if (arg_certificate) {
+ _cleanup_(BIO_freep) BIO *cb = NULL;
+ _cleanup_free_ char *crt = NULL;
- privkey = PEM_read_PrivateKey(privkeyf, NULL, NULL, NULL);
- if (!privkey)
- return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to parse private key '%s'.", arg_private_key);
+ r = read_full_file_full(
+ AT_FDCWD, arg_certificate, UINT64_MAX, SIZE_MAX,
+ READ_FULL_FILE_CONNECT_SOCKET,
+ /* bind_name= */ NULL,
+ &crt, &n);
+ if (r < 0)
+ return log_error_errno(r, "Failed to read certificate file '%s': %m", arg_certificate);
+
+ cb = BIO_new_mem_buf(crt, n);
+ if (!cb)
+ return log_oom();
+
+ certificate = PEM_read_bio_X509(cb, NULL, NULL, NULL);
+ if (!certificate)
+ return log_error_errno(
+ SYNTHETIC_ERRNO(EBADMSG),
+ "Failed to parse X.509 certificate: %s",
+ ERR_error_string(ERR_get_error(), NULL));
+ }
+
+ if (arg_private_key_source_type == OPENSSL_KEY_SOURCE_FILE) {
+ _cleanup_fclose_ FILE *privkeyf = NULL;
+ _cleanup_free_ char *resolved_pkey = NULL;
+
+ r = parse_path_argument(arg_private_key, /* suppress_root= */ false, &resolved_pkey);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse private key path %s: %m", arg_private_key);
+
+ privkeyf = fopen(resolved_pkey, "re");
+ if (!privkeyf)
+ return log_error_errno(errno, "Failed to open private key file '%s': %m", resolved_pkey);
+
+ privkey = PEM_read_PrivateKey(privkeyf, NULL, NULL, NULL);
+ if (!privkey)
+ return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to parse private key '%s'.", resolved_pkey);
+ } else if (arg_private_key_source &&
+ IN_SET(arg_private_key_source_type, OPENSSL_KEY_SOURCE_ENGINE, OPENSSL_KEY_SOURCE_PROVIDER)) {
+ r = openssl_load_key_from_token(
+ arg_private_key_source_type, arg_private_key_source, arg_private_key, &privkey);
+ if (r < 0)
+ return log_error_errno(
+ r,
+ "Failed to load key '%s' from OpenSSL key source %s: %m",
+ arg_private_key,
+ arg_private_key_source);
+ }
if (arg_public_key) {
_cleanup_fclose_ FILE *pubkeyf = NULL;
@@ -777,6 +857,13 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
pubkey = PEM_read_PUBKEY(pubkeyf, NULL, NULL, NULL);
if (!pubkey)
return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to parse public key '%s'.", arg_public_key);
+ } else if (certificate) {
+ pubkey = X509_get_pubkey(certificate);
+ if (!pubkey)
+ return log_error_errno(
+ SYNTHETIC_ERRNO(EIO),
+ "Failed to extract public key from certificate %s.",
+ arg_certificate);
} else {
_cleanup_(memstream_done) MemStream m = {};
FILE *tf;
diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c
index 6314ff8d1d..9c750fcd53 100644
--- a/src/busctl/busctl.c
+++ b/src/busctl/busctl.c
@@ -2021,6 +2021,15 @@ static int call(int argc, char **argv, void *userdata) {
if (r < 0)
return r;
+ if (!service_name_is_valid(argv[1]))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid service name: %s", argv[1]);
+ if (!object_path_is_valid(argv[2]))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid object path: %s", argv[2]);
+ if (!interface_name_is_valid(argv[3]))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid interface name: %s", argv[3]);
+ if (!member_name_is_valid(argv[4]))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid member name: %s", argv[4]);
+
r = sd_bus_message_new_method_call(bus, &m, argv[1], argv[2], argv[3], argv[4]);
if (r < 0)
return bus_log_create_error(r);
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 9567d56d0f..ccbbda47b2 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -4783,7 +4783,7 @@ static int unit_get_io_accounting_raw(Unit *u, uint64_t ret[static _CGROUP_IO_AC
r = cg_all_unified();
if (r < 0)
return r;
- if (r == 0) /* TODO: support cgroupv1 */
+ if (r == 0)
return -ENODATA;
if (!FLAGS_SET(crt->cgroup_realized_mask, CGROUP_MASK_IO))
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
index b2e5ae4f85..6d2247a840 100644
--- a/src/core/dbus-execute.c
+++ b/src/core/dbus-execute.c
@@ -492,7 +492,7 @@ static int property_get_bind_paths(
c->bind_mounts[i].source,
c->bind_mounts[i].destination,
c->bind_mounts[i].ignore_enoent,
- c->bind_mounts[i].recursive ? (uint64_t) MS_REC : (uint64_t) 0);
+ c->bind_mounts[i].recursive ? (uint64_t) MS_REC : UINT64_C(0));
if (r < 0)
return r;
}
@@ -911,7 +911,7 @@ static int bus_property_get_exec_dir_symlink(
for (size_t i = 0; i < d->n_items; i++)
STRV_FOREACH(dst, d->items[i].symlinks) {
- r = sd_bus_message_append(reply, "(sst)", d->items[i].path, *dst, 0 /* flags, unused for now */);
+ r = sd_bus_message_append(reply, "(sst)", d->items[i].path, *dst, UINT64_C(0) /* flags, unused for now */);
if (r < 0)
return r;
}
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 31b2f1daef..fbc5fce128 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -570,23 +570,14 @@ static int method_get_unit_by_invocation_id(sd_bus_message *message, void *userd
_cleanup_free_ char *path = NULL;
Manager *m = ASSERT_PTR(userdata);
sd_id128_t id;
- const void *a;
Unit *u;
- size_t sz;
int r;
assert(message);
/* Anyone can call this method */
- r = sd_bus_message_read_array(message, 'y', &a, &sz);
- if (r < 0)
- return r;
- if (sz == 0)
- id = SD_ID128_NULL;
- else if (sz == 16)
- memcpy(&id, a, sz);
- else
+ if (bus_message_read_id128(message, &id) < 0)
return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid invocation ID");
if (sd_id128_is_null(id)) {
@@ -2313,85 +2304,36 @@ static int send_unit_files_changed(sd_bus *bus, void *userdata) {
return sd_bus_send(bus, message, NULL);
}
-/* Create an error reply, using the error information from changes[]
- * if possible, and fall back to generating an error from error code c.
- * The error message only describes the first error.
- */
static int install_error(
sd_bus_error *error,
int c,
InstallChange *changes,
size_t n_changes) {
- CLEANUP_ARRAY(changes, n_changes, install_changes_free);
+ int r;
- for (size_t i = 0; i < n_changes; i++)
+ /* Create an error reply, using the error information from changes[] if possible, and fall back to
+ * generating an error from error code c. The error message only describes the first error. */
- /* When making changes here, make sure to also change install_changes_dump() in install.c. */
+ assert(changes || n_changes == 0);
- switch (changes[i].type) {
- case 0 ... _INSTALL_CHANGE_TYPE_MAX: /* not errors */
- break;
+ CLEANUP_ARRAY(changes, n_changes, install_changes_free);
- case -EEXIST:
- if (changes[i].source)
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS,
- "File %s already exists and is a symlink to %s.",
- changes[i].path, changes[i].source);
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS,
- "File %s already exists.",
- changes[i].path);
-
- case -ERFKILL:
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_MASKED,
- "Unit file %s is masked.", changes[i].path);
-
- case -EADDRNOTAVAIL:
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED,
- "Unit %s is transient or generated.", changes[i].path);
-
- case -ETXTBSY:
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_BAD_PATH,
- "File %s is under the systemd unit hierarchy already.", changes[i].path);
-
- case -EBADSLT:
- return sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
- "Invalid specifier in %s.", changes[i].path);
-
- case -EIDRM:
- return sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
- "Destination unit %s is a non-template unit.", changes[i].path);
-
- case -EUCLEAN:
- return sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
- "\"%s\" is not a valid unit name.",
- changes[i].path);
-
- case -ELOOP:
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_LINKED,
- "Refusing to operate on alias name or linked unit file: %s",
- changes[i].path);
-
- case -EXDEV:
- if (changes[i].source)
- return sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
- "Cannot alias %s as %s.",
- changes[i].source, changes[i].path);
- return sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
- "Invalid unit reference %s.", changes[i].path);
-
- case -ENOENT:
- return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT,
- "Unit file %s does not exist.", changes[i].path);
+ FOREACH_ARRAY(i, changes, n_changes) {
+ _cleanup_free_ char *err_message = NULL;
+ const char *bus_error;
- case -EUNATCH:
- return sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
- "Cannot resolve specifiers in %s.", changes[i].path);
+ if (i->type >= 0)
+ continue;
- default:
- assert(changes[i].type < 0); /* other errors */
- return sd_bus_error_set_errnof(error, changes[i].type, "File %s: %m", changes[i].path);
- }
+ r = install_change_dump_error(i, &err_message, &bus_error);
+ if (r == -ENOMEM)
+ return r;
+ if (r < 0)
+ return sd_bus_error_set_errnof(error, r, "File %s: %m", i->path);
+
+ return sd_bus_error_set(error, bus_error, err_message);
+ }
return c < 0 ? c : -EINVAL;
}
@@ -2430,18 +2372,17 @@ static int reply_install_changes_and_free(
if (r < 0)
return r;
- for (size_t i = 0; i < n_changes; i++) {
-
- if (changes[i].type < 0) {
+ FOREACH_ARRAY(i, changes, n_changes) {
+ if (i->type < 0) {
bad = true;
continue;
}
r = sd_bus_message_append(
reply, "(sss)",
- install_change_type_to_string(changes[i].type),
- changes[i].path,
- changes[i].source);
+ install_change_type_to_string(i->type),
+ i->path,
+ i->source);
if (r < 0)
return r;
diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c
index 77cf6f003d..ff970df957 100644
--- a/src/core/dbus-service.c
+++ b/src/core/dbus-service.c
@@ -61,7 +61,7 @@ static int property_get_open_files(
return r;
LIST_FOREACH(open_files, of, *open_files) {
- r = sd_bus_message_append(reply, "(sst)", of->path, of->fdname, of->flags);
+ r = sd_bus_message_append(reply, "(sst)", of->path, of->fdname, (uint64_t) of->flags);
if (r < 0)
return r;
}
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
index eda9f6c74e..9e8ff2cc13 100644
--- a/src/core/dbus-unit.c
+++ b/src/core/dbus-unit.c
@@ -1239,7 +1239,7 @@ static int property_get_cgroup_id(
assert(reply);
CGroupRuntime *crt = unit_get_cgroup_runtime(u);
- return sd_bus_message_append(reply, "t", crt ? crt->cgroup_id : 0);
+ return sd_bus_message_append(reply, "t", crt ? crt->cgroup_id : UINT64_C(0));
}
static int append_process(sd_bus_message *reply, const char *p, PidRef *pid, Set *pids) {
diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c
index 8462a31e5b..4f8f764733 100644
--- a/src/core/dynamic-user.c
+++ b/src/core/dynamic-user.c
@@ -651,7 +651,7 @@ void dynamic_user_deserialize_one(Manager *m, const char *value, FDSet *fds, Dyn
/* Parse the serialization again, after a daemon reload */
- r = extract_many_words(&value, NULL, 0, &name, &s0, &s1, NULL);
+ r = extract_many_words(&value, NULL, 0, &name, &s0, &s1);
if (r != 3 || !isempty(value)) {
log_debug("Unable to parse dynamic user line.");
return;
diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c
index 1bd21a2bdf..b1298670c7 100644
--- a/src/core/exec-invoke.c
+++ b/src/core/exec-invoke.c
@@ -1170,7 +1170,7 @@ static int setup_pam(
/* Block SIGTERM, so that we know that it won't get lost in the child */
- assert_se(sigprocmask_many(SIG_BLOCK, &old_ss, SIGTERM, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, &old_ss, SIGTERM) >= 0);
parent_pid = getpid_cached();
diff --git a/src/core/execute-serialize.c b/src/core/execute-serialize.c
index c7cda98ff0..5782c2f175 100644
--- a/src/core/execute-serialize.c
+++ b/src/core/execute-serialize.c
@@ -788,7 +788,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *path = NULL, *rwm = NULL;
CGroupDevicePermissions p;
- r = extract_many_words(&val, " ", 0, &path, &rwm, NULL);
+ r = extract_many_words(&val, " ", 0, &path, &rwm);
if (r < 0)
return r;
if (r == 0)
@@ -805,7 +805,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *path = NULL, *weight = NULL;
CGroupIODeviceWeight *a = NULL;
- r = extract_many_words(&val, " ", 0, &path, &weight, NULL);
+ r = extract_many_words(&val, " ", 0, &path, &weight);
if (r < 0)
return r;
if (r != 2)
@@ -834,7 +834,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *path = NULL, *target = NULL;
CGroupIODeviceLatency *a = NULL;
- r = extract_many_words(&val, " ", 0, &path, &target, NULL);
+ r = extract_many_words(&val, " ", 0, &path, &target);
if (r < 0)
return r;
if (r != 2)
@@ -864,7 +864,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
CGroupIODeviceLimit *limit = NULL;
CGroupIOLimitType t;
- r = extract_many_words(&val, "= ", 0, &type, &path, &limits, NULL);
+ r = extract_many_words(&val, "= ", 0, &type, &path, &limits);
if (r < 0)
return r;
if (r != 3)
@@ -899,7 +899,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *path = NULL, *weight = NULL;
CGroupBlockIODeviceWeight *a = NULL;
- r = extract_many_words(&val, " ", 0, &path, &weight, NULL);
+ r = extract_many_words(&val, " ", 0, &path, &weight);
if (r < 0)
return r;
if (r != 2)
@@ -920,7 +920,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *path = NULL, *bw = NULL;
CGroupBlockIODeviceBandwidth *a = NULL;
- r = extract_many_words(&val, " ", 0, &path, &bw, NULL);
+ r = extract_many_words(&val, " ", 0, &path, &bw);
if (r < 0)
return r;
if (r != 2)
@@ -950,7 +950,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *path = NULL, *bw = NULL;
CGroupBlockIODeviceBandwidth *a = NULL;
- r = extract_many_words(&val, " ", 0, &path, &bw, NULL);
+ r = extract_many_words(&val, " ", 0, &path, &bw);
if (r < 0)
return r;
if (r != 2)
@@ -1018,7 +1018,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) {
_cleanup_free_ char *type = NULL, *path = NULL;
uint32_t t;
- r = extract_many_words(&val, " ", 0, &type, &path, NULL);
+ r = extract_many_words(&val, " ", 0, &type, &path);
if (r < 0)
return r;
if (r != 2)
@@ -1521,7 +1521,7 @@ static int exec_parameters_deserialize(ExecParameters *p, FILE *f, FDSet *fds) {
_cleanup_free_ char *type = NULL, *prefix = NULL;
ExecDirectoryType dt;
- r = extract_many_words(&val, "= ", 0, &type, &prefix, NULL);
+ r = extract_many_words(&val, "= ", 0, &type, &prefix);
if (r < 0)
return r;
if (r == 0)
@@ -1877,10 +1877,6 @@ static int exec_context_serialize(const ExecContext *c, FILE *f) {
if (r < 0)
return r;
- r = serialize_bool_elide(f, "exec-context-cpu-sched-reset-on-fork", c->cpu_sched_reset_on_fork);
- if (r < 0)
- return r;
-
r = serialize_bool(f, "exec-context-ignore-sigpipe", c->ignore_sigpipe);
if (r < 0)
return r;
@@ -2637,7 +2633,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
break;
p = word;
- r = extract_many_words(&p, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
+ r = extract_many_words(&p, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
if (r < 0)
return r;
if (r == 0)
@@ -2774,11 +2770,6 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
if (r < 0)
return r;
c->same_pgrp = r;
- } else if ((val = startswith(l, "exec-context-cpu-sched-reset-on-fork="))) {
- r = parse_boolean(val);
- if (r < 0)
- return r;
- c->cpu_sched_reset_on_fork = r;
} else if ((val = startswith(l, "exec-context-non-blocking="))) {
r = parse_boolean(val);
if (r < 0)
@@ -2829,7 +2820,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
_cleanup_free_ char *type = NULL, *mode = NULL;
ExecDirectoryType dt;
- r = extract_many_words(&val, "= ", 0, &type, &mode, NULL);
+ r = extract_many_words(&val, "= ", 0, &type, &mode);
if (r < 0)
return r;
if (r == 0 || !mode)
@@ -2855,7 +2846,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
break;
p = tuple;
- r = extract_many_words(&p, ":", EXTRACT_UNESCAPE_SEPARATORS, &path, &only_create, NULL);
+ r = extract_many_words(&p, ":", EXTRACT_UNESCAPE_SEPARATORS, &path, &only_create);
if (r < 0)
return r;
if (r < 2)
@@ -3316,7 +3307,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
} else if ((val = startswith(l, "exec-context-temporary-filesystems="))) {
_cleanup_free_ char *path = NULL, *options = NULL;
- r = extract_many_words(&val, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &path, &options, NULL);
+ r = extract_many_words(&val, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &path, &options);
if (r < 0)
return r;
if (r < 1)
@@ -3394,7 +3385,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
_cleanup_free_ char *s_id = NULL, *s_errno_num = NULL;
int id, errno_num;
- r = extract_many_words(&val, NULL, 0, &s_id, &s_errno_num, NULL);
+ r = extract_many_words(&val, NULL, 0, &s_id, &s_errno_num);
if (r < 0)
return r;
if (r != 2)
@@ -3434,7 +3425,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
_cleanup_free_ char *s_id = NULL, *s_errno_num = NULL;
int id, errno_num;
- r = extract_many_words(&val, " ", 0, &s_id, &s_errno_num, NULL);
+ r = extract_many_words(&val, " ", 0, &s_id, &s_errno_num);
if (r < 0)
return r;
if (r != 2)
@@ -3507,8 +3498,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
NULL,
EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS,
&source,
- &destination,
- NULL);
+ &destination);
if (r < 0)
return r;
if (r == 0)
@@ -3540,8 +3530,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
":",
EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS,
&partition,
- &opts,
- NULL);
+ &opts);
if (r < 0)
return r;
if (r == 0)
@@ -3621,8 +3610,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
":",
EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS,
&partition,
- &opts,
- NULL);
+ &opts);
if (r < 0)
return r;
if (r == 0)
@@ -3671,7 +3659,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
_cleanup_(exec_set_credential_freep) ExecSetCredential *sc = NULL;
_cleanup_free_ char *id = NULL, *encrypted = NULL, *data = NULL;
- r = extract_many_words(&val, " ", 0, &id, &encrypted, &data, NULL);
+ r = extract_many_words(&val, " ", 0, &id, &encrypted, &data);
if (r < 0)
return r;
if (r != 3)
@@ -3703,7 +3691,7 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
_cleanup_(exec_load_credential_freep) ExecLoadCredential *lc = NULL;
_cleanup_free_ char *id = NULL, *encrypted = NULL, *path = NULL;
- r = extract_many_words(&val, " ", 0, &id, &encrypted, &path, NULL);
+ r = extract_many_words(&val, " ", 0, &id, &encrypted, &path);
if (r < 0)
return r;
if (r != 3)
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index c8e903d030..d751b3316c 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -4692,7 +4692,7 @@ int config_parse_exec_directories(
_cleanup_free_ char *src = NULL, *dest = NULL;
const char *q = tuple;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &src, &dest, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &src, &dest);
if (r == -ENOMEM)
return log_oom();
if (r <= 0) {
@@ -5395,7 +5395,7 @@ int config_parse_mount_images(
return 0;
q = tuple;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &first, &second, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &first, &second);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
@@ -5444,7 +5444,7 @@ int config_parse_mount_images(
MountOptions *o = NULL;
PartitionDesignator partition_designator;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
@@ -5586,7 +5586,7 @@ int config_parse_extension_images(
MountOptions *o = NULL;
PartitionDesignator partition_designator;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
diff --git a/src/core/main.c b/src/core/main.c
index d5c3bf0e46..07ec98252e 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -666,7 +666,7 @@ static int parse_config_file(void) {
{ "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, &arg_cpu_affinity },
{ "Manager", "NUMAPolicy", config_parse_numa_policy, 0, &arg_numa_policy.type },
{ "Manager", "NUMAMask", config_parse_numa_mask, 0, &arg_numa_policy },
- { "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_CONFIGURATION, NULL },
+ { "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_LEGACY, NULL },
{ "Manager", "RuntimeWatchdogSec", config_parse_watchdog_sec, 0, &arg_runtime_watchdog },
{ "Manager", "RuntimeWatchdogPreSec", config_parse_watchdog_sec, 0, &arg_pretimeout_watchdog },
{ "Manager", "RebootWatchdogSec", config_parse_watchdog_sec, 0, &arg_reboot_watchdog },
@@ -2203,9 +2203,9 @@ static void log_execution_mode(bool *ret_first_boot) {
/* Let's check whether we are in first boot. First, check if an override was
* specified on the kernel command line. If yes, we honour that. */
- r = proc_cmdline_get_bool("systemd.condition-first-boot", /* flags = */ 0, &first_boot);
+ r = proc_cmdline_get_bool("systemd.condition_first_boot", /* flags = */ 0, &first_boot);
if (r < 0)
- log_debug_errno(r, "Failed to parse systemd.condition-first-boot= kernel command line argument, ignoring: %m");
+ log_debug_errno(r, "Failed to parse systemd.condition_first_boot= kernel command line argument, ignoring: %m");
if (r > 0)
log_full(first_boot ? LOG_INFO : LOG_DEBUG,
@@ -2291,12 +2291,6 @@ static int initialize_runtime(
install_crash_handler();
if (!skip_setup) {
- r = mount_cgroup_controllers();
- if (r < 0) {
- *ret_error_message = "Failed to mount cgroup hierarchies";
- return r;
- }
-
/* Pull credentials from various sources into a common credential directory (we do
* this here, before setting up the machine ID, so that we can use credential info
* for setting up the machine ID) */
@@ -3023,6 +3017,24 @@ int main(int argc, char *argv[]) {
goto finish;
}
+ if (!skip_setup) {
+ /* Before we actually start deleting cgroup v1 code, make it harder to boot
+ * in cgroupv1 mode first. See also #30852. */
+
+ r = mount_cgroup_legacy_controllers(loaded_policy);
+ if (r < 0) {
+ if (r == -ERFKILL)
+ error_message = "Refusing to run under cgroup v1, SYSTEMD_CGROUP_ENABLE_LEGACY_FORCE=1 not specified on kernel command line";
+ else
+ error_message = "Failed to mount cgroup v1 hierarchy";
+ goto finish;
+ }
+ if (r > 0) {
+ log_full(LOG_CRIT, "Legacy cgroup v1 support selected. This is no longer supported. Will proceed anyway after 30s.");
+ (void) usleep_safe(30 * USEC_PER_SEC);
+ }
+ }
+
/* The efivarfs is now mounted, let's lock down the system token. */
lock_down_efi_variables();
diff --git a/src/core/manager.c b/src/core/manager.c
index e8c747d96d..d307c07a62 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -25,6 +25,7 @@
#include "alloc-util.h"
#include "audit-fd.h"
#include "boot-timestamps.h"
+#include "build-path.h"
#include "bus-common-errors.h"
#include "bus-error.h"
#include "bus-kernel.h"
@@ -1024,42 +1025,19 @@ int manager_new(RuntimeScope runtime_scope, ManagerTestRunFlags test_run_flags,
if (r < 0 && r != -EEXIST)
return r;
+ }
- m->executor_fd = open(SYSTEMD_EXECUTOR_BINARY_PATH, O_CLOEXEC|O_PATH);
- if (m->executor_fd < 0)
- return log_emergency_errno(errno,
- "Failed to open executor binary '%s': %m",
- SYSTEMD_EXECUTOR_BINARY_PATH);
- } else if (!FLAGS_SET(test_run_flags, MANAGER_TEST_DONT_OPEN_EXECUTOR)) {
- _cleanup_free_ char *self_exe = NULL, *executor_path = NULL;
- _cleanup_close_ int self_dir_fd = -EBADF;
- int level = LOG_DEBUG;
-
- /* Prefer sd-executor from the same directory as the test, e.g.: when running unit tests from the
- * build directory. Fallback to working directory and then the installation path. */
- r = readlink_and_make_absolute("/proc/self/exe", &self_exe);
- if (r < 0)
- return r;
-
- self_dir_fd = open_parent(self_exe, O_CLOEXEC|O_PATH|O_DIRECTORY, 0);
- if (self_dir_fd < 0)
- return self_dir_fd;
-
- m->executor_fd = RET_NERRNO(openat(self_dir_fd, "systemd-executor", O_CLOEXEC|O_PATH));
- if (m->executor_fd == -ENOENT)
- m->executor_fd = RET_NERRNO(openat(AT_FDCWD, "systemd-executor", O_CLOEXEC|O_PATH));
- if (m->executor_fd == -ENOENT) {
- m->executor_fd = RET_NERRNO(open(SYSTEMD_EXECUTOR_BINARY_PATH, O_CLOEXEC|O_PATH));
- level = LOG_WARNING; /* Tests should normally use local builds */
- }
+ if (!FLAGS_SET(test_run_flags, MANAGER_TEST_DONT_OPEN_EXECUTOR)) {
+ m->executor_fd = pin_callout_binary(SYSTEMD_EXECUTOR_BINARY_PATH);
if (m->executor_fd < 0)
- return m->executor_fd;
+ return log_debug_errno(m->executor_fd, "Failed to pin executor binary: %m");
+ _cleanup_free_ char *executor_path = NULL;
r = fd_get_path(m->executor_fd, &executor_path);
if (r < 0)
return r;
- log_full(level, "Using systemd-executor binary from '%s'.", executor_path);
+ log_debug("Using systemd-executor binary from '%s'.", executor_path);
}
/* Note that we do not set up the notify fd here. We do that after deserialization,
@@ -1690,7 +1668,7 @@ Manager* manager_free(Manager *m) {
free(m->notify_socket);
- lookup_paths_free(&m->lookup_paths);
+ lookup_paths_done(&m->lookup_paths);
strv_free(m->transient_environment);
strv_free(m->client_environment);
@@ -3579,7 +3557,7 @@ int manager_reload(Manager *m) {
manager_clear_jobs_and_units(m);
lookup_paths_flush_generator(&m->lookup_paths);
- lookup_paths_free(&m->lookup_paths);
+ lookup_paths_done(&m->lookup_paths);
exec_shared_runtime_vacuum(m);
dynamic_user_vacuum(m, false);
m->uid_refs = hashmap_free(m->uid_refs);
diff --git a/src/core/namespace.c b/src/core/namespace.c
index e55982ffa5..855ad0de89 100644
--- a/src/core/namespace.c
+++ b/src/core/namespace.c
@@ -2125,7 +2125,8 @@ int setup_namespace(const NamespaceParameters *p, char **error_path) {
DISSECT_IMAGE_USR_NO_ROOT |
DISSECT_IMAGE_GROWFS |
DISSECT_IMAGE_ADD_PARTITION_DEVICES |
- DISSECT_IMAGE_PIN_PARTITION_DEVICES;
+ DISSECT_IMAGE_PIN_PARTITION_DEVICES |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
int r;
assert(p);
diff --git a/src/core/service.c b/src/core/service.c
index d017515c92..a9047be1ca 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -523,7 +523,8 @@ static int service_add_fd_store(Service *s, int fd_in, const char *name, bool do
if (fstat(fd, &st) < 0)
return -errno;
- log_unit_debug(UNIT(s), "Trying to stash fd for dev=" DEVNUM_FORMAT_STR "/inode=%" PRIu64, DEVNUM_FORMAT_VAL(st.st_dev), (uint64_t) st.st_ino);
+ log_unit_debug(UNIT(s), "Trying to stash fd for dev=" DEVNUM_FORMAT_STR "/inode=%" PRIu64,
+ DEVNUM_FORMAT_VAL(st.st_dev), (uint64_t) st.st_ino);
if (s->n_fd_store >= s->n_fd_store_max)
/* Our store is full. Use this errno rather than E[NM]FILE to distinguish from the case
@@ -557,17 +558,16 @@ static int service_add_fd_store(Service *s, int fd_in, const char *name, bool do
r = sd_event_add_io(UNIT(s)->manager->event, &fs->event_source, fs->fd, 0, on_fd_store_io, fs);
if (r < 0 && r != -EPERM) /* EPERM indicates fds that aren't pollable, which is OK */
return r;
- else if (r >= 0)
+ if (r >= 0)
(void) sd_event_source_set_description(fs->event_source, "service-fd-store");
}
+ log_unit_debug(UNIT(s), "Added fd %i (%s) to fd store.", fs->fd, fs->fdname);
+
fs->service = s;
- LIST_PREPEND(fd_store, s->fd_store, fs);
+ LIST_PREPEND(fd_store, s->fd_store, TAKE_PTR(fs));
s->n_fd_store++;
- log_unit_debug(UNIT(s), "Added fd %i (%s) to fd store.", fs->fd, fs->fdname);
-
- TAKE_PTR(fs);
return 1; /* fd newly stored */
}
@@ -3018,7 +3018,7 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
if (!c)
return log_oom();
- (void) serialize_item_format(f, "fd-store-fd", "%i \"%s\" %i", copy, c, fs->do_poll);
+ (void) serialize_item_format(f, "fd-store-fd", "%i \"%s\" %s", copy, c, one_zero(fs->do_poll));
}
if (s->main_exec_status.pid > 0) {
@@ -3261,9 +3261,9 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
_cleanup_close_ int fd = -EBADF;
int do_poll;
- r = extract_first_word(&value, &fdv, NULL, 0);
- if (r <= 0) {
- log_unit_debug(u, "Failed to parse fd-store-fd value, ignoring: %s", value);
+ r = extract_many_words(&value, " ", EXTRACT_CUNESCAPE|EXTRACT_UNQUOTE, &fdv, &fdn, &fdp);
+ if (r < 2 || r > 3) {
+ log_unit_debug(u, "Failed to deserialize fd-store-fd, ignoring: %s", value);
return 0;
}
@@ -3271,24 +3271,17 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
if (fd < 0)
return 0;
- r = extract_first_word(&value, &fdn, NULL, EXTRACT_CUNESCAPE | EXTRACT_UNQUOTE);
- if (r <= 0) {
- log_unit_debug(u, "Failed to parse fd-store-fd value, ignoring: %s", value);
- return 0;
- }
-
- r = extract_first_word(&value, &fdp, NULL, 0);
- if (r == 0) {
- /* If the value is not present, we assume the default */
- do_poll = 1;
- } else if (r < 0 || (r = safe_atoi(fdp, &do_poll)) < 0) {
- log_unit_debug_errno(u, r, "Failed to parse fd-store-fd value \"%s\", ignoring: %m", value);
+ do_poll = r == 3 ? parse_boolean(fdp) : true;
+ if (do_poll < 0) {
+ log_unit_debug_errno(u, do_poll,
+ "Failed to deserialize fd-store-fd do_poll, ignoring: %s", fdp);
return 0;
}
r = service_add_fd_store(s, fd, fdn, do_poll);
if (r < 0) {
- log_unit_debug_errno(u, r, "Failed to store deserialized fd %i, ignoring: %m", fd);
+ log_unit_debug_errno(u, r,
+ "Failed to store deserialized fd '%s', ignoring: %m", fdn);
return 0;
}
@@ -3611,8 +3604,10 @@ static void service_notify_cgroup_empty_event(Unit *u) {
break;
}
- if (s->exit_type == SERVICE_EXIT_CGROUP && main_pid_good(s) <= 0)
- service_enter_start_post(s);
+ if (s->exit_type == SERVICE_EXIT_CGROUP && main_pid_good(s) <= 0) {
+ service_enter_stop_post(s, SERVICE_SUCCESS);
+ break;
+ }
_fallthrough_;
case SERVICE_START_POST:
@@ -3884,11 +3879,13 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
default:
assert_not_reached();
}
- } else if (s->exit_type == SERVICE_EXIT_CGROUP && s->state == SERVICE_START)
+ } else if (s->exit_type == SERVICE_EXIT_CGROUP && s->state == SERVICE_START &&
+ !IN_SET(s->type, SERVICE_NOTIFY, SERVICE_NOTIFY_RELOAD, SERVICE_DBUS))
/* If a main process exits very quickly, this function might be executed
* before service_dispatch_exec_io(). Since this function disabled IO events
* to monitor the main process above, we need to update the state here too.
- * Let's consider the process is successfully launched and exited. */
+ * Let's consider the process is successfully launched and exited, but
+ * only when we're not expecting a readiness notification or dbus name. */
service_enter_start_post(s);
}
@@ -4311,14 +4308,25 @@ static int service_dispatch_watchdog(sd_event_source *source, usec_t usec, void
return 0;
}
-static bool service_notify_message_authorized(Service *s, pid_t pid, FDSet *fds) {
+static void service_force_watchdog(Service *s) {
+ if (!UNIT(s)->manager->service_watchdogs)
+ return;
+
+ log_unit_error(UNIT(s), "Watchdog request (last status: %s)!",
+ s->status_text ?: "<unset>");
+
+ service_enter_signal(s, SERVICE_STOP_WATCHDOG, SERVICE_FAILURE_WATCHDOG);
+}
+
+static bool service_notify_message_authorized(Service *s, pid_t pid) {
assert(s);
+ assert(pid_is_valid(pid));
NotifyAccess notify_access = service_get_notify_access(s);
if (notify_access == NOTIFY_NONE) {
/* Warn level only if no notifications are expected */
- log_unit_warning(UNIT(s), "Got notification message from PID "PID_FMT", but reception is disabled.", pid);
+ log_unit_warning(UNIT(s), "Got notification message from PID "PID_FMT", but reception is disabled", pid);
return false;
}
@@ -4334,7 +4342,7 @@ static bool service_notify_message_authorized(Service *s, pid_t pid, FDSet *fds)
if (notify_access == NOTIFY_EXEC && pid != s->main_pid.pid && pid != s->control_pid.pid) {
if (pidref_is_set(&s->main_pid) && pidref_is_set(&s->control_pid))
log_unit_debug(UNIT(s), "Got notification message from PID "PID_FMT", but reception only permitted for main PID "PID_FMT" and control PID "PID_FMT,
- pid, s->main_pid.pid, s->control_pid.pid);
+ pid, s->main_pid.pid, s->control_pid.pid);
else if (pidref_is_set(&s->main_pid))
log_unit_debug(UNIT(s), "Got notification message from PID "PID_FMT", but reception only permitted for main PID "PID_FMT, pid, s->main_pid.pid);
else if (pidref_is_set(&s->control_pid))
@@ -4348,41 +4356,29 @@ static bool service_notify_message_authorized(Service *s, pid_t pid, FDSet *fds)
return true;
}
-static void service_force_watchdog(Service *s) {
- if (!UNIT(s)->manager->service_watchdogs)
- return;
-
- log_unit_error(UNIT(s), "Watchdog request (last status: %s)!",
- s->status_text ?: "<unset>");
-
- service_enter_signal(s, SERVICE_STOP_WATCHDOG, SERVICE_FAILURE_WATCHDOG);
-}
-
static void service_notify_message(
Unit *u,
const struct ucred *ucred,
char * const *tags,
FDSet *fds) {
- Service *s = SERVICE(u);
- bool notify_dbus = false;
- usec_t monotonic_usec = USEC_INFINITY;
- const char *e;
+ Service *s = ASSERT_PTR(SERVICE(u));
int r;
- assert(u);
assert(ucred);
- if (!service_notify_message_authorized(s, ucred->pid, fds))
+ if (!service_notify_message_authorized(s, ucred->pid))
return;
if (DEBUG_LOGGING) {
- _cleanup_free_ char *cc = NULL;
-
- cc = strv_join(tags, ", ");
+ _cleanup_free_ char *cc = strv_join(tags, ", ");
log_unit_debug(u, "Got notification message from PID "PID_FMT" (%s)", ucred->pid, empty_to_na(cc));
}
+ usec_t monotonic_usec = USEC_INFINITY;
+ bool notify_dbus = false;
+ const char *e;
+
/* Interpret MAINPID= */
e = strv_find_startswith(tags, "MAINPID=");
if (e && IN_SET(s->state, SERVICE_START, SERVICE_START_POST, SERVICE_RUNNING, SERVICE_RELOAD, SERVICE_RELOAD_SIGNAL, SERVICE_RELOAD_NOTIFY)) {
diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c
index 53769f8d4c..52ded50776 100644
--- a/src/coredump/coredumpctl.c
+++ b/src/coredump/coredumpctl.c
@@ -1394,7 +1394,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_GENERIC_ROOT |
DISSECT_IMAGE_REQUIRE_ROOT |
DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_VALIDATE_OS,
+ DISSECT_IMAGE_VALIDATE_OS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/coredump/meson.build b/src/coredump/meson.build
index a69974672c..bb81149b60 100644
--- a/src/coredump/meson.build
+++ b/src/coredump/meson.build
@@ -5,15 +5,10 @@ systemd_coredump_sources = files(
'coredump-vacuum.c',
)
-common_link_with = [
- libshared,
- libbasic_compress,
-]
-
common_dependencies = [
- liblz4,
- libxz,
- libzstd,
+ liblz4_cflags,
+ libxz_cflags,
+ libzstd_cflags,
threads,
]
@@ -22,7 +17,7 @@ executables += [
'name' : 'systemd-coredump',
'conditions' : ['ENABLE_COREDUMP'],
'sources' : systemd_coredump_sources,
- 'link_with' : common_link_with,
+ 'link_with' : [libshared],
'dependencies' : common_dependencies + [libacl],
},
executable_template + {
@@ -30,7 +25,7 @@ executables += [
'public' : true,
'conditions' : ['ENABLE_COREDUMP'],
'sources' : files('coredumpctl.c'),
- 'link_with' : common_link_with,
+ 'link_with' : [libshared],
'dependencies' : common_dependencies,
},
test_template + {
diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c
index 2766990296..bef7528977 100644
--- a/src/dissect/dissect.c
+++ b/src/dissect/dissect.c
@@ -79,7 +79,8 @@ static DissectImageFlags arg_flags =
DISSECT_IMAGE_USR_NO_ROOT |
DISSECT_IMAGE_GROWFS |
DISSECT_IMAGE_PIN_PARTITION_DEVICES |
- DISSECT_IMAGE_ADD_PARTITION_DEVICES;
+ DISSECT_IMAGE_ADD_PARTITION_DEVICES |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
static VeritySettings arg_verity_settings = VERITY_SETTINGS_DEFAULT;
static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
static PagerFlags arg_pager_flags = 0;
diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c
index d9d2e28251..6afabef430 100644
--- a/src/firstboot/firstboot.c
+++ b/src/firstboot/firstboot.c
@@ -1066,10 +1066,8 @@ static int process_root_account(int rfd) {
FOREACH_STRING(s, "passwd", "shadow") {
r = verify_regular_at(pfd, s, /* follow = */ false);
- if (IN_SET(r, -EISDIR, -ELOOP, -EBADFD))
- return log_error_errno(r, "/etc/%s is not a regular file", s);
if (r < 0 && r != -ENOENT)
- return log_error_errno(r, "Failed to check whether /etc/%s is a regular file: %m", s);
+ return log_error_errno(r, "Verification of /etc/%s being regular file failed: %m", s);
r = should_configure(pfd, s);
if (r < 0)
@@ -1694,7 +1692,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_VALIDATE_OS |
DISSECT_IMAGE_RELAX_VAR_CHECK |
DISSECT_IMAGE_FSCK |
- DISSECT_IMAGE_GROWFS,
+ DISSECT_IMAGE_GROWFS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
&rfd,
&loop_device);
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 3a1d2f38db..4d65289bef 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -159,7 +159,7 @@ static int mount_array_add(bool for_initrd, const char *str) {
assert(str);
r = extract_many_words(&str, ":", EXTRACT_CUNESCAPE | EXTRACT_DONT_COALESCE_SEPARATORS,
- &what, &where, &fstype, &options, NULL);
+ &what, &where, &fstype, &options);
if (r < 0)
return r;
if (r < 2)
@@ -177,7 +177,7 @@ static int mount_array_add_swap(bool for_initrd, const char *str) {
assert(str);
r = extract_many_words(&str, ":", EXTRACT_CUNESCAPE | EXTRACT_DONT_COALESCE_SEPARATORS,
- &what, &options, NULL);
+ &what, &options);
if (r < 0)
return r;
if (r < 1)
@@ -824,7 +824,7 @@ static bool sysfs_check(void) {
int r;
if (cached < 0) {
- r = getenv_bool_secure("SYSTEMD_SYSFS_CHECK");
+ r = secure_getenv_bool("SYSTEMD_SYSFS_CHECK");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_SYSFS_CHECK, ignoring: %m");
cached = r != 0;
diff --git a/src/home/homectl.c b/src/home/homectl.c
index 4afdff74c0..11a138070b 100644
--- a/src/home/homectl.c
+++ b/src/home/homectl.c
@@ -2701,6 +2701,9 @@ static int help(int argc, char *argv[], void *userdata) {
" --kill-processes=BOOL Whether to kill user processes when sessions\n"
" terminate\n"
" --auto-login=BOOL Try to log this user in automatically\n"
+ " --session-launcher=LAUNCHER\n"
+ " Preferred session launcher file\n"
+ " --session-type=TYPE Preferred session type\n"
"\nSee the %6$s for details.\n",
program_invocation_short_name,
ansi_highlight(),
@@ -2777,6 +2780,8 @@ static int parse_argv(int argc, char *argv[]) {
ARG_PASSWORD_CHANGE_INACTIVE,
ARG_EXPORT_FORMAT,
ARG_AUTO_LOGIN,
+ ARG_SESSION_LAUNCHER,
+ ARG_SESSION_TYPE,
ARG_PKCS11_TOKEN_URI,
ARG_FIDO2_DEVICE,
ARG_FIDO2_WITH_PIN,
@@ -2870,6 +2875,8 @@ static int parse_argv(int argc, char *argv[]) {
{ "password-change-warn", required_argument, NULL, ARG_PASSWORD_CHANGE_WARN },
{ "password-change-inactive", required_argument, NULL, ARG_PASSWORD_CHANGE_INACTIVE },
{ "auto-login", required_argument, NULL, ARG_AUTO_LOGIN },
+ { "session-launcher", required_argument, NULL, ARG_SESSION_LAUNCHER, },
+ { "session-type", required_argument, NULL, ARG_SESSION_TYPE, },
{ "json", required_argument, NULL, ARG_JSON },
{ "export-format", required_argument, NULL, ARG_EXPORT_FORMAT },
{ "pkcs11-token-uri", required_argument, NULL, ARG_PKCS11_TOKEN_URI },
@@ -3009,7 +3016,9 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_CIFS_USER_NAME:
case ARG_CIFS_DOMAIN:
case ARG_CIFS_EXTRA_MOUNT_OPTIONS:
- case ARG_LUKS_EXTRA_MOUNT_OPTIONS: {
+ case ARG_LUKS_EXTRA_MOUNT_OPTIONS:
+ case ARG_SESSION_LAUNCHER:
+ case ARG_SESSION_TYPE: {
const char *field =
c == ARG_EMAIL_ADDRESS ? "emailAddress" :
@@ -3019,6 +3028,8 @@ static int parse_argv(int argc, char *argv[]) {
c == ARG_CIFS_DOMAIN ? "cifsDomain" :
c == ARG_CIFS_EXTRA_MOUNT_OPTIONS ? "cifsExtraMountOptions" :
c == ARG_LUKS_EXTRA_MOUNT_OPTIONS ? "luksExtraMountOptions" :
+ c == ARG_SESSION_LAUNCHER ? "preferredSessionLauncher" :
+ c == ARG_SESSION_TYPE ? "preferredSessionType" :
NULL;
assert(field);
diff --git a/src/home/homed-bus.c b/src/home/homed-bus.c
index bfe23ceb12..a6f26fea66 100644
--- a/src/home/homed-bus.c
+++ b/src/home/homed-bus.c
@@ -89,7 +89,7 @@ int bus_message_read_blobs(sd_bus_message *m, Hashmap **ret, sd_bus_error *error
_cleanup_free_ char *filename = NULL;
_cleanup_close_ int fd = -EBADF;
const char *_filename = NULL;
- int _fd, flags;
+ int _fd;
r = sd_bus_message_read(m, "{sh}", &_filename, &_fd);
if (r < 0)
@@ -111,18 +111,14 @@ int bus_message_read_blobs(sd_bus_message *m, Hashmap **ret, sd_bus_error *error
r = fd_verify_regular(fd);
if (r < 0)
- return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "FD for %s is not a regular file", filename);
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "FD for '%s' is not a regular file", filename);
- flags = fcntl(fd, F_GETFL);
- if (flags < 0)
- return -errno;
-
- /* Refuse fds w/ unexpected flags set. In particular, we don't want to permit O_PATH FDs, since
- * those don't actually guarantee that the client has access to the file. */
- if (UNSAFE_FD_FLAGS(flags) != 0)
+ r = fd_verify_safe_flags(fd);
+ if (r == -EREMOTEIO)
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
- "FD for %s has unexpected flags set: 0%o",
- filename, UNSAFE_FD_FLAGS(flags));
+ "FD for '%s' has unexpected flags set", filename);
+ if (r < 0)
+ return r;
r = hashmap_put(blobs, filename, FD_TO_PTR(fd));
if (r < 0)
diff --git a/src/home/homed-home.c b/src/home/homed-home.c
index a487eb1fd1..f3c72926d7 100644
--- a/src/home/homed-home.c
+++ b/src/home/homed-home.c
@@ -10,6 +10,7 @@
#include "blockdev-util.h"
#include "btrfs-util.h"
+#include "build-path.h"
#include "bus-common-errors.h"
#include "bus-locator.h"
#include "data-fd-util.h"
@@ -1276,7 +1277,7 @@ static int home_start_work(
return r;
if (r == 0) {
_cleanup_free_ char *joined = NULL;
- const char *homework, *suffix, *unix_path;
+ const char *suffix, *unix_path;
/* Child */
@@ -1320,12 +1321,8 @@ static int home_start_work(
if (r < 0)
log_warning_errno(r, "Failed to update $SYSTEMD_LOG_LEVEL, ignoring: %m");
- /* Allow overriding the homework path via an environment variable, to make debugging
- * easier. */
- homework = getenv("SYSTEMD_HOMEWORK_PATH") ?: SYSTEMD_HOMEWORK_PATH;
-
- execl(homework, homework, verb, NULL);
- log_error_errno(errno, "Failed to invoke %s: %m", homework);
+ r = invoke_callout_binary(SYSTEMD_HOMEWORK_PATH, STRV_MAKE(SYSTEMD_HOMEWORK_PATH, verb));
+ log_error_errno(r, "Failed to invoke %s: %m", SYSTEMD_HOMEWORK_PATH);
_exit(EXIT_FAILURE);
}
diff --git a/src/home/homed.c b/src/home/homed.c
index 04d9b56f07..cfb498e47f 100644
--- a/src/home/homed.c
+++ b/src/home/homed.c
@@ -29,7 +29,7 @@ static int run(int argc, char *argv[]) {
umask(0022);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/home/homework.c b/src/home/homework.c
index 39e0051486..531443e757 100644
--- a/src/home/homework.c
+++ b/src/home/homework.c
@@ -4,11 +4,14 @@
#include <sys/mount.h>
#include "blockdev-util.h"
+#include "bus-unit-util.h"
#include "chown-recursive.h"
#include "copy.h"
+#include "env-util.h"
#include "fd-util.h"
#include "fileio.h"
#include "filesystems.h"
+#include "format-util.h"
#include "fs-util.h"
#include "home-util.h"
#include "homework-blob.h"
@@ -1820,8 +1823,37 @@ static int home_inspect(UserRecord *h, UserRecord **ret_home) {
return 1;
}
+static int user_session_freezer(uid_t uid, bool freeze_now, UnitFreezer *ret) {
+ _cleanup_free_ char *unit = NULL;
+ int r;
+
+ r = getenv_bool("SYSTEMD_HOME_LOCK_FREEZE_SESSION");
+ if (r < 0 && r != -ENXIO)
+ log_warning_errno(r, "Cannot parse value of $SYSTEMD_HOME_LOCK_FREEZE_SESSION, ignoring.");
+ else if (r == 0) {
+ if (freeze_now)
+ log_notice("Session remains unfrozen on explicit request ($SYSTEMD_HOME_LOCK_FREEZE_SESSION "
+ "is set to false). This is not recommended, and might result in unexpected behavior "
+ "including data loss!");
+ *ret = (UnitFreezer) {};
+ return 0;
+ }
+
+ if (asprintf(&unit, "user-" UID_FMT ".slice", uid) < 0)
+ return log_oom();
+
+ if (freeze_now)
+ r = unit_freezer_new_freeze(unit, ret);
+ else
+ r = unit_freezer_new(unit, ret);
+ if (r < 0)
+ return r;
+ return 1;
+}
+
static int home_lock(UserRecord *h) {
_cleanup_(home_setup_done) HomeSetup setup = HOME_SETUP_INIT;
+ _cleanup_(unit_freezer_done_thaw) UnitFreezer freezer = {};
int r;
assert(h);
@@ -1837,16 +1869,27 @@ static int home_lock(UserRecord *h) {
if (r != USER_TEST_MOUNTED)
return log_error_errno(SYNTHETIC_ERRNO(ENOEXEC), "Home directory of %s is not mounted, can't lock.", h->user_name);
+ r = user_session_freezer(h->uid, /* freeze_now= */ true, &freezer);
+ if (r < 0)
+ log_warning_errno(r, "Failed to freeze user session, ignoring: %m");
+ else if (r == 0)
+ log_info("User session freeze disabled, skipping.");
+ else
+ log_info("Froze user session.");
+
r = home_lock_luks(h, &setup);
if (r < 0)
return r;
+ unit_freezer_done(&freezer); /* Don't thaw the user session. */
+
log_info("Everything completed.");
return 1;
}
static int home_unlock(UserRecord *h) {
_cleanup_(home_setup_done) HomeSetup setup = HOME_SETUP_INIT;
+ _cleanup_(unit_freezer_done_thaw) UnitFreezer freezer = {};
_cleanup_(password_cache_free) PasswordCache cache = {};
int r;
@@ -1868,6 +1911,11 @@ static int home_unlock(UserRecord *h) {
if (r < 0)
return r;
+ /* We want to thaw the session only after it's safe to access $HOME */
+ r = user_session_freezer(h->uid, /* freeze_now= */ false, &freezer);
+ if (r < 0)
+ log_warning_errno(r, "Failed to recover freezer for user session, ignoring: %m");
+
log_info("Everything completed.");
return 1;
}
diff --git a/src/home/pam_systemd_home.c b/src/home/pam_systemd_home.c
index 21caa5a058..077f9208cb 100644
--- a/src/home/pam_systemd_home.c
+++ b/src/home/pam_systemd_home.c
@@ -105,7 +105,6 @@ static int acquire_user_record(
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
_cleanup_(user_record_unrefp) UserRecord *ur = NULL;
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
_cleanup_free_ char *homed_field = NULL;
const char *json = NULL;
int r;
@@ -148,6 +147,7 @@ static int acquire_user_record(
} else {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_free_ char *generic_field = NULL, *json_copy = NULL;
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
r = pam_acquire_bus_connection(handle, "pam-systemd-home", &bus, bus_data);
if (r != PAM_SUCCESS)
@@ -501,7 +501,6 @@ static int acquire_home(
_cleanup_(user_record_unrefp) UserRecord *ur = NULL, *secret = NULL;
bool do_auth = FLAGS_SET(flags, ACQUIRE_MUST_AUTHENTICATE), home_not_active = false, home_locked = false, unrestricted = false;
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
_cleanup_close_ int acquired_fd = -EBADF;
_cleanup_free_ char *fd_field = NULL;
const void *home_fd_ptr = NULL;
@@ -552,10 +551,6 @@ static int acquire_home(
if (r == PAM_SUCCESS && PTR_TO_FD(home_fd_ptr) >= 0)
return PAM_SUCCESS;
- r = pam_acquire_bus_connection(handle, "pam-systemd-home", &bus, bus_data);
- if (r != PAM_SUCCESS)
- return r;
-
r = acquire_user_record(handle, username, debug, &ur, bus_data);
if (r != PAM_SUCCESS)
return r;
@@ -567,6 +562,11 @@ static int acquire_home(
* that by collecting and passing multiple passwords in that case. Hence we treat bad passwords as a
* request to collect one more password and pass the new all all previously used passwords again. */
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+ r = pam_acquire_bus_connection(handle, "pam-systemd-home", &bus, bus_data);
+ if (r != PAM_SUCCESS)
+ return r;
+
for (;;) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -826,6 +826,12 @@ _public_ PAM_EXTERN int pam_sm_open_session(
if (r != PAM_SUCCESS)
return r;
+ /* Explicitly get saved PamBusData here. Otherwise, this function may succeed without setting 'd'
+ * even if there is an opened sd-bus connection, and it will be leaked. See issue #31375. */
+ r = pam_get_bus_data(handle, "pam-systemd-home", &d);
+ if (r != PAM_SUCCESS)
+ return r;
+
r = acquire_home(handle, flags, debug, &d);
if (r == PAM_USER_UNKNOWN) /* Not managed by us? Don't complain. */
return PAM_SUCCESS;
@@ -852,7 +858,6 @@ _public_ PAM_EXTERN int pam_sm_close_session(
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
const char *username = NULL;
bool debug = false;
int r;
@@ -880,6 +885,7 @@ _public_ PAM_EXTERN int pam_sm_close_session(
if (r != PAM_SUCCESS)
return r;
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
r = pam_acquire_bus_connection(handle, "pam-systemd-home", &bus, NULL);
if (r != PAM_SUCCESS)
return r;
@@ -1029,7 +1035,6 @@ _public_ PAM_EXTERN int pam_sm_chauthtok(
_cleanup_(user_record_unrefp) UserRecord *ur = NULL, *old_secret = NULL, *new_secret = NULL;
const char *old_password = NULL, *new_password = NULL;
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
unsigned n_attempts = 0;
bool debug = false;
int r;
@@ -1042,10 +1047,6 @@ _public_ PAM_EXTERN int pam_sm_chauthtok(
pam_debug_syslog(handle, debug, "pam-systemd-homed account management");
- r = pam_acquire_bus_connection(handle, "pam-systemd-home", &bus, NULL);
- if (r != PAM_SUCCESS)
- return r;
-
r = acquire_user_record(handle, NULL, debug, &ur, NULL);
if (r != PAM_SUCCESS)
return r;
@@ -1102,6 +1103,11 @@ _public_ PAM_EXTERN int pam_sm_chauthtok(
if (r < 0)
return pam_syslog_errno(handle, LOG_ERR, r, "Failed to store new password: %m");
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+ r = pam_acquire_bus_connection(handle, "pam-systemd-home", &bus, NULL);
+ if (r != PAM_SUCCESS)
+ return r;
+
for (;;) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index 4abcf40c26..d1c4d476f6 100644
--- a/src/hostname/hostnamectl.c
+++ b/src/hostname/hostnamectl.c
@@ -59,6 +59,8 @@ typedef struct StatusInfo {
usec_t firmware_date;
sd_id128_t machine_id;
sd_id128_t boot_id;
+ const char *hardware_serial;
+ sd_id128_t product_uuid;
uint32_t vsock_cid;
} StatusInfo;
@@ -193,6 +195,14 @@ static int print_status_info(StatusInfo *i) {
return table_log_add_error(r);
}
+ if (!sd_id128_is_null(i->product_uuid)) {
+ r = table_add_many(table,
+ TABLE_FIELD, "Product UUID",
+ TABLE_UUID, i->product_uuid);
+ if (r < 0)
+ return table_log_add_error(r);
+ }
+
if (i->vsock_cid != VMADDR_CID_ANY) {
r = table_add_many(table,
TABLE_FIELD, "AF_VSOCK CID",
@@ -226,7 +236,7 @@ static int print_status_info(StatusInfo *i) {
return table_log_add_error(r);
}
- if (i->os_support_end != USEC_INFINITY) {
+ if (timestamp_is_set(i->os_support_end)) {
usec_t n = now(CLOCK_REALTIME);
r = table_add_many(table,
@@ -274,6 +284,14 @@ static int print_status_info(StatusInfo *i) {
return table_log_add_error(r);
}
+ if (!isempty(i->hardware_serial)) {
+ r = table_add_many(table,
+ TABLE_FIELD, "Hardware Serial",
+ TABLE_STRING, i->hardware_serial);
+ if (r < 0)
+ return table_log_add_error(r);
+ }
+
if (!isempty(i->firmware_version)) {
r = table_add_many(table,
TABLE_FIELD, "Firmware Version",
@@ -344,6 +362,8 @@ static int get_one_name(sd_bus *bus, const char* attr, char **ret) {
static int show_all_names(sd_bus *bus) {
StatusInfo info = {
.vsock_cid = VMADDR_CID_ANY,
+ .os_support_end = USEC_INFINITY,
+ .firmware_date = USEC_INFINITY,
};
static const struct bus_properties_map hostname_map[] = {
@@ -400,6 +420,49 @@ static int show_all_names(sd_bus *bus) {
if (r < 0)
return log_error_errno(r, "Failed to query system properties: %s", bus_error_message(&error, r));
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *product_uuid_reply = NULL;
+ r = bus_call_method(bus,
+ bus_hostname,
+ "GetProductUUID",
+ &error,
+ &product_uuid_reply,
+ "b",
+ false);
+ if (r < 0) {
+ log_full_errno(sd_bus_error_has_names(
+ &error,
+ BUS_ERROR_NO_PRODUCT_UUID,
+ SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED,
+ SD_BUS_ERROR_UNKNOWN_METHOD) ? LOG_DEBUG : LOG_WARNING,
+ r, "Failed to query product UUID, ignoring: %s", bus_error_message(&error, r));
+ sd_bus_error_free(&error);
+ } else {
+ r = bus_message_read_id128(product_uuid_reply, &info.product_uuid);
+ if (r < 0)
+ return bus_log_parse_error(r);
+ }
+
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *hardware_serial_reply = NULL;
+ r = bus_call_method(bus,
+ bus_hostname,
+ "GetHardwareSerial",
+ &error,
+ &hardware_serial_reply,
+ NULL);
+ if (r < 0)
+ log_full_errno(sd_bus_error_has_names(
+ &error,
+ BUS_ERROR_NO_HARDWARE_SERIAL,
+ SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED,
+ SD_BUS_ERROR_UNKNOWN_METHOD) ||
+ ERRNO_IS_DEVICE_ABSENT(r) ? LOG_DEBUG : LOG_WARNING, /* old hostnamed used to send ENOENT/ENODEV back to client as is, handle that gracefully */
+ r, "Failed to query hardware serial, ignoring: %s", bus_error_message(&error, r));
+ else {
+ r = sd_bus_message_read_basic(hardware_serial_reply, 's', &info.hardware_serial);
+ if (r < 0)
+ return bus_log_parse_error(r);
+ }
+
/* For older version of hostnamed. */
if (!arg_host) {
if (sd_id128_is_null(info.machine_id))
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index 4ab429798a..8904885c13 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -39,6 +39,7 @@
#include "string-table.h"
#include "strv.h"
#include "user-util.h"
+#include "utf8.h"
#include "varlink-io.systemd.Hostname.h"
#include "virt.h"
@@ -249,7 +250,6 @@ static int get_hardware_model(char **ret) {
static int get_hardware_firmware_data(const char *sysattr, char **ret) {
_cleanup_(sd_device_unrefp) sd_device *device = NULL;
- _cleanup_free_ char *b = NULL;
const char *s = NULL;
int r;
@@ -263,94 +263,121 @@ static int get_hardware_firmware_data(const char *sysattr, char **ret) {
return log_debug_errno(r, "Failed to open /sys/class/dmi/id device, ignoring: %m");
(void) sd_device_get_sysattr_value(device, sysattr, &s);
- if (!isempty(s)) {
- b = strdup(s);
- if (!b)
- return -ENOMEM;
- }
- if (ret)
- *ret = TAKE_PTR(b);
+ bool empty = isempty(s);
- return !isempty(s);
+ if (ret) {
+ if (empty)
+ *ret = NULL;
+ else {
+ _cleanup_free_ char *b = NULL;
+
+ b = strdup(s);
+ if (!b)
+ return -ENOMEM;
+
+ *ret = TAKE_PTR(b);
+ }
+ }
+
+ return !empty;
}
static int get_hardware_serial(char **ret) {
- int r;
+ _cleanup_free_ char *b = NULL;
+ int r = 0;
+
+ FOREACH_STRING(attr, "product_serial", "board_serial") {
+ r = get_hardware_firmware_data(attr, &b);
+ if (r != 0 && !ERRNO_IS_NEG_DEVICE_ABSENT(r))
+ break;
+ }
+ if (r < 0)
+ return r;
+ if (r == 0)
+ return -ENOENT;
+
+ /* Do some superficial validation: do not allow CCs and make sure D-Bus won't kick us off the bus
+ * because we send invalid UTF-8 data */
+
+ if (string_has_cc(b, /* ok= */ NULL))
+ return -ENOENT;
- r = get_hardware_firmware_data("product_serial", ret);
- if (r <= 0)
- return get_hardware_firmware_data("board_serial", ret);
+ if (!utf8_is_valid(b))
+ return -ENOENT;
+
+ if (ret)
+ *ret = TAKE_PTR(b);
- return r;
+ return 0;
}
static int get_firmware_version(char **ret) {
- return get_hardware_firmware_data("bios_version", ret);
+ return get_hardware_firmware_data("bios_version", ret);
}
static int get_firmware_vendor(char **ret) {
- return get_hardware_firmware_data("bios_vendor", ret);
+ return get_hardware_firmware_data("bios_vendor", ret);
}
static int get_firmware_date(usec_t *ret) {
- _cleanup_free_ char *bios_date = NULL, *month = NULL, *day = NULL, *year = NULL;
- int r;
+ _cleanup_free_ char *bios_date = NULL, *month = NULL, *day = NULL, *year = NULL;
+ int r;
- assert(ret);
+ assert(ret);
- r = get_hardware_firmware_data("bios_date", &bios_date);
- if (r < 0)
+ r = get_hardware_firmware_data("bios_date", &bios_date);
+ if (r < 0)
return r;
- if (r == 0) {
+ if (r == 0) {
*ret = USEC_INFINITY;
return 0;
- }
+ }
- const char *p = bios_date;
- r = extract_many_words(&p, "/", EXTRACT_DONT_COALESCE_SEPARATORS, &month, &day, &year, NULL);
- if (r < 0)
+ const char *p = bios_date;
+ r = extract_many_words(&p, "/", EXTRACT_DONT_COALESCE_SEPARATORS, &month, &day, &year);
+ if (r < 0)
return r;
- if (r != 3) /* less than three args read? */
+ if (r != 3) /* less than three args read? */
return -EINVAL;
- if (!isempty(p)) /* more left in the string? */
+ if (!isempty(p)) /* more left in the string? */
return -EINVAL;
- unsigned m, d, y;
- r = safe_atou_full(month, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &m);
- if (r < 0)
+ unsigned m, d, y;
+ r = safe_atou_full(month, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &m);
+ if (r < 0)
return r;
- if (m < 1 || m > 12)
+ if (m < 1 || m > 12)
return -EINVAL;
- m -= 1;
+ m -= 1;
- r = safe_atou_full(day, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &d);
- if (r < 0)
+ r = safe_atou_full(day, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &d);
+ if (r < 0)
return r;
- if (d < 1 || d > 31)
+ if (d < 1 || d > 31)
return -EINVAL;
- r = safe_atou_full(year, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &y);
- if (r < 0)
+ r = safe_atou_full(year, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &y);
+ if (r < 0)
return r;
- if (y < 1970 || y > (unsigned) INT_MAX)
+ if (y < 1970 || y > (unsigned) INT_MAX)
return -EINVAL;
- y -= 1900;
+ y -= 1900;
- struct tm tm = {
+ struct tm tm = {
.tm_mday = d,
.tm_mon = m,
.tm_year = y,
- };
- time_t v = timegm(&tm);
- if (v == (time_t) -1)
+ };
+ time_t v = timegm(&tm);
+ if (v == (time_t) -1)
return -errno;
- if (tm.tm_mday != (int) d || tm.tm_mon != (int) m || tm.tm_year != (int) y)
+ if (tm.tm_mday != (int) d || tm.tm_mon != (int) m || tm.tm_year != (int) y)
return -EINVAL; /* date was not normalized? (e.g. "30th of feb") */
- *ret = (usec_t) v * USEC_PER_SEC;
+ *ret = (usec_t) v * USEC_PER_SEC;
- return 0;
+ return 0;
}
static const char* valid_chassis(const char *chassis) {
@@ -1318,7 +1345,6 @@ static int method_get_product_uuid(sd_bus_message *m, void *userdata, sd_bus_err
}
static int method_get_hardware_serial(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_free_ char *serial = NULL;
Context *c = ASSERT_PTR(userdata);
int r;
@@ -1338,17 +1364,10 @@ static int method_get_hardware_serial(sd_bus_message *m, void *userdata, sd_bus_
r = get_hardware_serial(&serial);
if (r < 0)
- return r;
-
- r = sd_bus_message_new_method_return(m, &reply);
- if (r < 0)
- return r;
-
- r = sd_bus_message_append(reply, "s", serial);
- if (r < 0)
- return r;
+ return sd_bus_error_set(error, BUS_ERROR_NO_HARDWARE_SERIAL,
+ "Failed to read hardware serial from firmware.");
- return sd_bus_send(NULL, reply, NULL);
+ return sd_bus_reply_method_return(m, "s", serial);
}
static int build_describe_response(Context *c, bool privileged, JsonVariant **ret) {
@@ -1461,7 +1480,6 @@ static int build_describe_response(Context *c, bool privileged, JsonVariant **re
}
static int method_describe(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
Context *c = ASSERT_PTR(userdata);
_cleanup_free_ char *text = NULL;
@@ -1491,15 +1509,7 @@ static int method_describe(sd_bus_message *m, void *userdata, sd_bus_error *erro
if (r < 0)
return log_error_errno(r, "Failed to format JSON data: %m");
- r = sd_bus_message_new_method_return(m, &reply);
- if (r < 0)
- return r;
-
- r = sd_bus_message_append(reply, "s", text);
- if (r < 0)
- return r;
-
- return sd_bus_send(NULL, reply, NULL);
+ return sd_bus_reply_method_return(m, "s", text);
}
static const sd_bus_vtable hostname_vtable[] = {
diff --git a/src/import/curl-util.c b/src/import/curl-util.c
index 94f718de17..10f2aa0468 100644
--- a/src/import/curl-util.c
+++ b/src/import/curl-util.c
@@ -10,20 +10,28 @@
#include "version.h"
static void curl_glue_check_finished(CurlGlue *g) {
- CURLMsg *msg;
- int k = 0;
+ int r;
assert(g);
+ /* sd_event_get_exit_code() returns -ENODATA if no exit was scheduled yet */
+ r = sd_event_get_exit_code(g->event, /* ret_code= */ NULL);
+ if (r >= 0)
+ return; /* exit scheduled? Then don't process this anymore */
+ if (r != -ENODATA)
+ log_debug_errno(r, "Unexpected error while checking for event loop exit code, ignoring: %m");
+
+ CURLMsg *msg;
+ int k = 0;
msg = curl_multi_info_read(g->curl, &k);
if (!msg)
return;
- if (msg->msg != CURLMSG_DONE)
- return;
-
- if (g->on_finished)
+ if (msg->msg == CURLMSG_DONE && g->on_finished)
g->on_finished(g, msg->easy_handle, msg->data.result);
+
+ /* This is a queue, process another item soon, but do so in a later event loop iteration. */
+ (void) sd_event_source_set_enabled(g->defer, SD_EVENT_ONESHOT);
}
static int curl_glue_on_io(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
@@ -153,6 +161,15 @@ static int curl_glue_timer_callback(CURLM *curl, long timeout_ms, void *userdata
return 0;
}
+static int curl_glue_on_defer(sd_event_source *s, void *userdata) {
+ CurlGlue *g = ASSERT_PTR(userdata);
+
+ assert(s);
+
+ curl_glue_check_finished(g);
+ return 0;
+}
+
CurlGlue *curl_glue_unref(CurlGlue *g) {
sd_event_source *io;
@@ -167,7 +184,8 @@ CurlGlue *curl_glue_unref(CurlGlue *g) {
hashmap_free(g->ios);
- sd_event_source_unref(g->timer);
+ sd_event_source_disable_unref(g->timer);
+ sd_event_source_disable_unref(g->defer);
sd_event_unref(g->event);
return mfree(g);
}
@@ -211,6 +229,12 @@ int curl_glue_new(CurlGlue **glue, sd_event *event) {
if (curl_multi_setopt(g->curl, CURLMOPT_TIMERFUNCTION, curl_glue_timer_callback) != CURLM_OK)
return -EINVAL;
+ r = sd_event_add_defer(g->event, &g->defer, curl_glue_on_defer, g);
+ if (r < 0)
+ return r;
+
+ (void) sd_event_source_set_description(g->defer, "curl-defer");
+
*glue = TAKE_PTR(g);
return 0;
diff --git a/src/import/curl-util.h b/src/import/curl-util.h
index 6b4f992fe7..cef0b26986 100644
--- a/src/import/curl-util.h
+++ b/src/import/curl-util.h
@@ -16,6 +16,7 @@ struct CurlGlue {
CURLM *curl;
sd_event_source *timer;
Hashmap *ios;
+ sd_event_source *defer;
void (*on_finished)(CurlGlue *g, CURL *curl, CURLcode code);
void *userdata;
diff --git a/src/import/export.c b/src/import/export.c
index 7e941a29af..cdb1d6246a 100644
--- a/src/import/export.c
+++ b/src/import/export.c
@@ -14,6 +14,7 @@
#include "fd-util.h"
#include "fs-util.h"
#include "hostname-util.h"
+#include "import-common.h"
#include "import-util.h"
#include "main-func.h"
#include "signal-util.h"
@@ -22,6 +23,7 @@
#include "verbs.h"
static ImportCompressType arg_compress = IMPORT_COMPRESS_UNKNOWN;
+static ImageClass arg_class = IMAGE_MACHINE;
static void determine_compression_from_filename(const char *p) {
@@ -43,12 +45,6 @@ static void determine_compression_from_filename(const char *p) {
arg_compress = IMPORT_COMPRESS_UNCOMPRESSED;
}
-static int interrupt_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
- log_notice("Transfer aborted.");
- sd_event_exit(sd_event_source_get_event(s), EINTR);
- return 0;
-}
-
static void on_tar_finished(TarExport *export, int error, void *userdata) {
sd_event *event = userdata;
assert(export);
@@ -67,12 +63,13 @@ static int export_tar(int argc, char *argv[], void *userdata) {
_cleanup_close_ int open_fd = -EBADF;
int r, fd;
- if (hostname_is_valid(argv[1], 0)) {
- r = image_find(IMAGE_MACHINE, argv[1], NULL, &image);
+ local = argv[1];
+ if (image_name_is_valid(local)) {
+ r = image_find(arg_class, local, NULL, &image);
if (r == -ENOENT)
- return log_error_errno(r, "Machine image %s not found.", argv[1]);
+ return log_error_errno(r, "Image %s not found.", local);
if (r < 0)
- return log_error_errno(r, "Failed to look for machine %s: %m", argv[1]);
+ return log_error_errno(r, "Failed to look for image %s: %m", local);
local = image->path;
} else
@@ -101,13 +98,9 @@ static int export_tar(int argc, char *argv[], void *userdata) {
log_info("Exporting '%s', saving to '%s' with compression '%s'.", local, strna(pretty), import_compress_type_to_string(arg_compress));
}
- r = sd_event_default(&event);
+ r = import_allocate_event_with_signals(&event);
if (r < 0)
- return log_error_errno(r, "Failed to allocate event loop: %m");
-
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
- (void) sd_event_add_signal(event, NULL, SIGTERM, interrupt_signal_handler, NULL);
- (void) sd_event_add_signal(event, NULL, SIGINT, interrupt_signal_handler, NULL);
+ return r;
r = tar_export_new(&export, event, on_tar_finished, event);
if (r < 0)
@@ -143,12 +136,13 @@ static int export_raw(int argc, char *argv[], void *userdata) {
_cleanup_close_ int open_fd = -EBADF;
int r, fd;
- if (hostname_is_valid(argv[1], 0)) {
- r = image_find(IMAGE_MACHINE, argv[1], NULL, &image);
+ local = argv[1];
+ if (image_name_is_valid(local)) {
+ r = image_find(arg_class, local, NULL, &image);
if (r == -ENOENT)
- return log_error_errno(r, "Machine image %s not found.", argv[1]);
+ return log_error_errno(r, "Image %s not found.", local);
if (r < 0)
- return log_error_errno(r, "Failed to look for machine %s: %m", argv[1]);
+ return log_error_errno(r, "Failed to look for image %s: %m", local);
local = image->path;
} else
@@ -177,13 +171,9 @@ static int export_raw(int argc, char *argv[], void *userdata) {
log_info("Exporting '%s', saving to '%s' with compression '%s'.", local, strna(pretty), import_compress_type_to_string(arg_compress));
}
- r = sd_event_default(&event);
+ r = import_allocate_event_with_signals(&event);
if (r < 0)
- return log_error_errno(r, "Failed to allocate event loop: %m");
-
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
- (void) sd_event_add_signal(event, NULL, SIGTERM, interrupt_signal_handler, NULL);
- (void) sd_event_add_signal(event, NULL, SIGINT, interrupt_signal_handler, NULL);
+ return r;
r = raw_export_new(&export, event, on_raw_finished, event);
if (r < 0)
@@ -203,14 +193,16 @@ static int export_raw(int argc, char *argv[], void *userdata) {
static int help(int argc, char *argv[], void *userdata) {
printf("%1$s [OPTIONS...] {COMMAND} ...\n"
- "\n%4$sExport container or virtual machine images.%5$s\n"
+ "\n%4$sExport disk images.%5$s\n"
"\n%2$sCommands:%3$s\n"
" tar NAME [FILE] Export a TAR image\n"
" raw NAME [FILE] Export a RAW image\n"
"\n%2$sOptions:%3$s\n"
" -h --help Show this help\n"
" --version Show package version\n"
- " --format=FORMAT Select format\n\n",
+ " --format=FORMAT Select format\n"
+ " --class=CLASS Select image class (machine, sysext, confext,\n"
+ " portable)\n",
program_invocation_short_name,
ansi_underline(),
ansi_normal(),
@@ -225,12 +217,14 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_VERSION = 0x100,
ARG_FORMAT,
+ ARG_CLASS,
};
static const struct option options[] = {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, ARG_VERSION },
{ "format", required_argument, NULL, ARG_FORMAT },
+ { "class", required_argument, NULL, ARG_CLASS },
{}
};
@@ -263,6 +257,13 @@ static int parse_argv(int argc, char *argv[]) {
"Unknown format: %s", optarg);
break;
+ case ARG_CLASS:
+ arg_class = image_class_from_string(optarg);
+ if (arg_class < 0)
+ return log_error_errno(arg_class, "Failed to parse --class= argument: %s", optarg);
+
+ break;
+
case '?':
return -EINVAL;
@@ -288,8 +289,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_parse_environment();
- log_open();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/import/import-common.c b/src/import/import-common.c
index 319aa078a7..09faf16f9c 100644
--- a/src/import/import-common.c
+++ b/src/import/import-common.c
@@ -276,7 +276,7 @@ bool import_validate_local(const char *name, ImportFlags flags) {
if (FLAGS_SET(flags, IMPORT_DIRECT))
return path_is_valid(name);
- return hostname_is_valid(name, 0);
+ return image_name_is_valid(name);
}
static int interrupt_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
@@ -295,9 +295,8 @@ int import_allocate_event_with_signals(sd_event **ret) {
if (r < 0)
return log_error_errno(r, "Failed to allocate event loop: %m");
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
- (void) sd_event_add_signal(event, NULL, SIGTERM, interrupt_signal_handler, NULL);
- (void) sd_event_add_signal(event, NULL, SIGINT, interrupt_signal_handler, NULL);
+ (void) sd_event_add_signal(event, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, interrupt_signal_handler, NULL);
+ (void) sd_event_add_signal(event, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, interrupt_signal_handler, NULL);
*ret = TAKE_PTR(event);
return 0;
diff --git a/src/import/import-common.h b/src/import/import-common.h
index 97fc16d1b9..219802492d 100644
--- a/src/import/import-common.h
+++ b/src/import/import-common.h
@@ -6,16 +6,33 @@
#include "sd-event.h"
typedef enum ImportFlags {
- IMPORT_FORCE = 1 << 0, /* replace existing image */
- IMPORT_READ_ONLY = 1 << 1, /* make generated image read-only */
- IMPORT_BTRFS_SUBVOL = 1 << 2, /* tar: preferably create images as btrfs subvols */
- IMPORT_BTRFS_QUOTA = 1 << 3, /* tar: set up btrfs quota for new subvolume as child of parent subvolume */
- IMPORT_CONVERT_QCOW2 = 1 << 4, /* raw: if we detect a qcow2 image, unpack it */
- IMPORT_DIRECT = 1 << 5, /* import without rename games */
- IMPORT_SYNC = 1 << 6, /* fsync() right before we are done */
-
- IMPORT_FLAGS_MASK_TAR = IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_BTRFS_SUBVOL|IMPORT_BTRFS_QUOTA|IMPORT_DIRECT|IMPORT_SYNC,
- IMPORT_FLAGS_MASK_RAW = IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_CONVERT_QCOW2|IMPORT_DIRECT|IMPORT_SYNC,
+ /* Public Flags (i.e. accessible via D-Bus, must stay stable! */
+ IMPORT_FORCE = 1 << 0, /* replace existing image */
+ IMPORT_READ_ONLY = 1 << 1, /* make generated image read-only */
+ IMPORT_PULL_KEEP_DOWNLOAD = 1 << 2, /* keep a pristine copy of the downloaded file around */
+
+ /* Private flags */
+ IMPORT_BTRFS_SUBVOL = 1 << 3, /* tar: preferably create images as btrfs subvols */
+ IMPORT_BTRFS_QUOTA = 1 << 4, /* tar: set up btrfs quota for new subvolume as child of parent subvolume */
+ IMPORT_CONVERT_QCOW2 = 1 << 5, /* raw: if we detect a qcow2 image, unpack it */
+ IMPORT_DIRECT = 1 << 6, /* import without rename games */
+ IMPORT_SYNC = 1 << 7, /* fsync() right before we are done */
+
+ /* When pulling these flags are defined too */
+ IMPORT_PULL_SETTINGS = 1 << 8, /* download .nspawn settings file */
+ IMPORT_PULL_ROOTHASH = 1 << 9, /* only for raw: download .roothash file for verity */
+ IMPORT_PULL_ROOTHASH_SIGNATURE = 1 << 10, /* only for raw: download .roothash.p7s file for verity */
+ IMPORT_PULL_VERITY = 1 << 11, /* only for raw: download .verity file for verity */
+
+ /* The supported flags for the tar and the raw importing */
+ IMPORT_FLAGS_MASK_TAR = IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_BTRFS_SUBVOL|IMPORT_BTRFS_QUOTA|IMPORT_DIRECT|IMPORT_SYNC,
+ IMPORT_FLAGS_MASK_RAW = IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_CONVERT_QCOW2|IMPORT_DIRECT|IMPORT_SYNC,
+
+ /* The supported flags for the tar and the raw pulling */
+ IMPORT_PULL_FLAGS_MASK_TAR = IMPORT_FLAGS_MASK_TAR|IMPORT_PULL_KEEP_DOWNLOAD|IMPORT_PULL_SETTINGS,
+ IMPORT_PULL_FLAGS_MASK_RAW = IMPORT_FLAGS_MASK_RAW|IMPORT_PULL_KEEP_DOWNLOAD|IMPORT_PULL_SETTINGS|IMPORT_PULL_ROOTHASH|IMPORT_PULL_ROOTHASH_SIGNATURE|IMPORT_PULL_VERITY,
+
+ _IMPORT_FLAGS_INVALID = -EINVAL,
} ImportFlags;
int import_fork_tar_c(const char *path, pid_t *ret);
diff --git a/src/import/import-fs.c b/src/import/import-fs.c
index fd79c8f01a..44fc5be8a5 100644
--- a/src/import/import-fs.c
+++ b/src/import/import-fs.c
@@ -31,7 +31,8 @@ static bool arg_btrfs_subvol = true;
static bool arg_btrfs_quota = true;
static bool arg_sync = true;
static bool arg_direct = false;
-static const char *arg_image_root = "/var/lib/machines";
+static const char *arg_image_root = NULL;
+static ImageClass arg_class = IMAGE_MACHINE;
typedef struct ProgressInfo {
RateLimit limit;
@@ -132,7 +133,7 @@ static int import_fs(int argc, char *argv[], void *userdata) {
"Local path name '%s' is not valid.", final_path);
} else {
if (local) {
- if (!hostname_is_valid(local, 0))
+ if (!image_name_is_valid(local))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Local image name '%s' is not valid.", local);
} else
@@ -143,7 +144,7 @@ static int import_fs(int argc, char *argv[], void *userdata) {
return log_oom();
if (!arg_force) {
- r = image_find(IMAGE_MACHINE, local, NULL, NULL);
+ r = image_find(arg_class, local, NULL, NULL);
if (r < 0) {
if (r != -ENOENT)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
@@ -170,6 +171,8 @@ static int import_fs(int argc, char *argv[], void *userdata) {
log_info("Importing '%s', saving as '%s'.", strempty(pretty), local);
}
+ log_info("Operating on image directory '%s'.", arg_image_root);
+
if (!arg_sync)
log_info("File system synchronization on completion is off.");
@@ -266,7 +269,9 @@ static int help(int argc, char *argv[], void *userdata) {
" instead of a directory\n"
" --btrfs-quota=BOOL Controls whether to set up quota for btrfs\n"
" subvolume\n"
- " --sync=BOOL Controls whether to sync() before completing\n",
+ " --sync=BOOL Controls whether to sync() before completing\n"
+ " --class=CLASS Select image class (machine, sysext, confext,\n"
+ " portable)\n",
program_invocation_short_name,
ansi_underline(),
ansi_normal(),
@@ -287,6 +292,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_BTRFS_SUBVOL,
ARG_BTRFS_QUOTA,
ARG_SYNC,
+ ARG_CLASS,
};
static const struct option options[] = {
@@ -299,6 +305,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "btrfs-subvol", required_argument, NULL, ARG_BTRFS_SUBVOL },
{ "btrfs-quota", required_argument, NULL, ARG_BTRFS_QUOTA },
{ "sync", required_argument, NULL, ARG_SYNC },
+ { "class", required_argument, NULL, ARG_CLASS },
{}
};
@@ -354,6 +361,13 @@ static int parse_argv(int argc, char *argv[]) {
break;
+ case ARG_CLASS:
+ arg_class = image_class_from_string(optarg);
+ if (arg_class < 0)
+ return log_error_errno(arg_class, "Failed to parse --class= argument: %s", optarg);
+
+ break;
+
case '?':
return -EINVAL;
@@ -361,6 +375,9 @@ static int parse_argv(int argc, char *argv[]) {
assert_not_reached();
}
+ if (!arg_image_root)
+ arg_image_root = image_root_to_string(arg_class);
+
return 1;
}
@@ -379,8 +396,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_parse_environment();
- log_open();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/import/import-raw.c b/src/import/import-raw.c
index f7ed163d86..ee9b297bfe 100644
--- a/src/import/import-raw.c
+++ b/src/import/import-raw.c
@@ -95,8 +95,9 @@ int raw_import_new(
int r;
assert(ret);
+ assert(image_root);
- root = strdup(image_root ?: "/var/lib/machines");
+ root = strdup(image_root);
if (!root)
return -ENOMEM;
diff --git a/src/import/import-tar.c b/src/import/import-tar.c
index 90202709ec..39df11b5ff 100644
--- a/src/import/import-tar.c
+++ b/src/import/import-tar.c
@@ -97,8 +97,9 @@ int tar_import_new(
int r;
assert(ret);
+ assert(image_root);
- root = strdup(image_root ?: "/var/lib/machines");
+ root = strdup(image_root);
if (!root)
return -ENOMEM;
diff --git a/src/import/import.c b/src/import/import.c
index a81617d38e..889cd63ff0 100644
--- a/src/import/import.c
+++ b/src/import/import.c
@@ -25,9 +25,10 @@
#include "terminal-util.h"
#include "verbs.h"
-static const char *arg_image_root = "/var/lib/machines";
+static const char *arg_image_root = NULL;
static ImportFlags arg_import_flags = IMPORT_BTRFS_SUBVOL | IMPORT_BTRFS_QUOTA | IMPORT_CONVERT_QCOW2 | IMPORT_SYNC;
static uint64_t arg_offset = UINT64_MAX, arg_size_max = UINT64_MAX;
+static ImageClass arg_class = IMAGE_MACHINE;
static int normalize_local(const char *local, char **ret) {
_cleanup_free_ char *ll = NULL;
@@ -53,7 +54,7 @@ static int normalize_local(const char *local, char **ret) {
"Local path name '%s' is not valid.", local);
} else {
if (local) {
- if (!hostname_is_valid(local, 0))
+ if (!image_name_is_valid(local))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Local image name '%s' is not valid.",
local);
@@ -61,7 +62,7 @@ static int normalize_local(const char *local, char **ret) {
local = "imported";
if (!FLAGS_SET(arg_import_flags, IMPORT_FORCE)) {
- r = image_find(IMAGE_MACHINE, local, NULL, NULL);
+ r = image_find(arg_class, local, NULL, NULL);
if (r < 0) {
if (r != -ENOENT)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
@@ -113,6 +114,12 @@ static int open_source(const char *path, const char *local, int *ret_open_fd) {
log_info("Importing '%s', saving as '%s'.", strempty(pretty), local);
}
+ if (!FLAGS_SET(arg_import_flags, IMPORT_DIRECT))
+ log_info("Operating on image directory '%s'.", arg_image_root);
+
+ if (!FLAGS_SET(arg_import_flags, IMPORT_SYNC))
+ log_info("File system synchronization on completion is off.");
+
*ret_open_fd = TAKE_FD(open_fd);
return retval;
}
@@ -160,15 +167,12 @@ static int import_tar(int argc, char *argv[], void *userdata) {
fd = open_source(path, normalized, &open_fd);
if (fd < 0)
- return r;
+ return fd;
r = import_allocate_event_with_signals(&event);
if (r < 0)
return r;
- if (!FLAGS_SET(arg_import_flags, IMPORT_SYNC))
- log_info("File system synchronization on completion is off.");
-
r = tar_import_new(&import, event, arg_image_root, on_tar_finished, event);
if (r < 0)
return log_error_errno(r, "Failed to allocate importer: %m");
@@ -238,9 +242,6 @@ static int import_raw(int argc, char *argv[], void *userdata) {
if (r < 0)
return r;
- if (!FLAGS_SET(arg_import_flags, IMPORT_SYNC))
- log_info("File system synchronization on completion is off.");
-
r = raw_import_new(&import, event, arg_image_root, on_raw_finished, event);
if (r < 0)
return log_error_errno(r, "Failed to allocate importer: %m");
@@ -266,7 +267,7 @@ static int import_raw(int argc, char *argv[], void *userdata) {
static int help(int argc, char *argv[], void *userdata) {
printf("%1$s [OPTIONS...] {COMMAND} ...\n"
- "\n%4$sImport container or virtual machine images.%5$s\n"
+ "\n%4$sImport disk images.%5$s\n"
"\n%2$sCommands:%3$s\n"
" tar FILE [NAME] Import a TAR image\n"
" raw FILE [NAME] Import a RAW image\n"
@@ -285,7 +286,9 @@ static int help(int argc, char *argv[], void *userdata) {
" regular disk images\n"
" --sync=BOOL Controls whether to sync() before completing\n"
" --offset=BYTES Offset to seek to in destination\n"
- " --size-max=BYTES Maximum number of bytes to write to destination\n",
+ " --size-max=BYTES Maximum number of bytes to write to destination\n"
+ " --class=CLASS Select image class (machine, sysext, confext,\n"
+ " portable)\n",
program_invocation_short_name,
ansi_underline(),
ansi_normal(),
@@ -309,6 +312,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_SYNC,
ARG_OFFSET,
ARG_SIZE_MAX,
+ ARG_CLASS,
};
static const struct option options[] = {
@@ -324,6 +328,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "sync", required_argument, NULL, ARG_SYNC },
{ "offset", required_argument, NULL, ARG_OFFSET },
{ "size-max", required_argument, NULL, ARG_SIZE_MAX },
+ { "class", required_argument, NULL, ARG_CLASS },
{}
};
@@ -416,6 +421,13 @@ static int parse_argv(int argc, char *argv[]) {
break;
}
+ case ARG_CLASS:
+ arg_class = image_class_from_string(optarg);
+ if (arg_class < 0)
+ return log_error_errno(arg_class, "Failed to parse --class= argument: %s", optarg);
+
+ break;
+
case '?':
return -EINVAL;
@@ -432,6 +444,9 @@ static int parse_argv(int argc, char *argv[]) {
if (arg_offset != UINT64_MAX && !FLAGS_SET(arg_import_flags, IMPORT_DIRECT))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File offset only supported in --direct mode.");
+ if (!arg_image_root)
+ arg_image_root = image_root_to_string(arg_class);
+
return 1;
}
@@ -475,8 +490,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_parse_environment();
- log_open();
+ log_setup();
parse_env();
diff --git a/src/import/importctl.c b/src/import/importctl.c
new file mode 100644
index 0000000000..5f6f926135
--- /dev/null
+++ b/src/import/importctl.c
@@ -0,0 +1,1245 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <getopt.h>
+
+#include "sd-bus.h"
+
+#include "alloc-util.h"
+#include "build.h"
+#include "bus-error.h"
+#include "bus-locator.h"
+#include "bus-util.h"
+#include "discover-image.h"
+#include "fd-util.h"
+#include "format-table.h"
+#include "hostname-util.h"
+#include "import-common.h"
+#include "import-util.h"
+#include "locale-util.h"
+#include "log.h"
+#include "macro.h"
+#include "main-func.h"
+#include "os-util.h"
+#include "pager.h"
+#include "parse-argument.h"
+#include "parse-util.h"
+#include "path-util.h"
+#include "pretty-print.h"
+#include "signal-util.h"
+#include "sort-util.h"
+#include "spawn-polkit-agent.h"
+#include "string-table.h"
+#include "verbs.h"
+#include "web-util.h"
+
+static PagerFlags arg_pager_flags = 0;
+static bool arg_legend = true;
+static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
+static const char *arg_host = NULL;
+static ImportFlags arg_import_flags = 0;
+static ImportFlags arg_import_flags_mask = 0; /* Indicates which flags have been explicitly set to on or to off */
+static bool arg_quiet = false;
+static bool arg_ask_password = true;
+static ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
+static const char* arg_format = NULL;
+static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
+static ImageClass arg_image_class = _IMAGE_CLASS_INVALID;
+
+#define PROGRESS_PREFIX "Total: "
+
+static int settle_image_class(void) {
+
+ if (arg_image_class < 0) {
+ _cleanup_free_ char *j = NULL;
+
+ for (ImageClass class = 0; class < _IMAGE_CLASS_MAX; class++)
+ if (strextendf_with_separator(&j, ", ", "%s (downloads to %s/)",
+ image_class_to_string(class),
+ image_root_to_string(class)) < 0)
+ return log_oom();
+
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "No image class specified, retry with --class= set to one of: %s.", j);
+ }
+
+ /* Keep the original pristine downloaded file as a copy only when dealing with machine images,
+ * because unlike sysext/confext/portable they are typically modified during runtime. */
+ if (!FLAGS_SET(arg_import_flags_mask, IMPORT_PULL_KEEP_DOWNLOAD))
+ SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, arg_image_class == IMAGE_MACHINE);
+
+ return 0;
+}
+
+typedef struct Context {
+ const char *object_path;
+ double progress;
+} Context;
+
+static int match_log_message(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+ Context *c = ASSERT_PTR(userdata);
+ const char *line;
+ unsigned priority;
+ int r;
+
+ assert(m);
+
+ if (!streq_ptr(c->object_path, sd_bus_message_get_path(m)))
+ return 0;
+
+ r = sd_bus_message_read(m, "us", &priority, &line);
+ if (r < 0) {
+ bus_log_parse_error(r);
+ return 0;
+ }
+
+ if (arg_quiet && LOG_PRI(priority) >= LOG_INFO)
+ return 0;
+
+ if (!arg_quiet)
+ clear_progress_bar(PROGRESS_PREFIX);
+
+ log_full(priority, "%s", line);
+
+ if (!arg_quiet)
+ draw_progress_bar(PROGRESS_PREFIX, c->progress * 100);
+
+ return 0;
+}
+
+static int match_progress_update(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+ Context *c = ASSERT_PTR(userdata);
+ int r;
+
+ assert(m);
+
+ if (!streq_ptr(c->object_path, sd_bus_message_get_path(m)))
+ return 0;
+
+ r = sd_bus_message_read(m, "d", &c->progress);
+ if (r < 0) {
+ bus_log_parse_error(r);
+ return 0;
+ }
+
+ if (!arg_quiet)
+ draw_progress_bar(PROGRESS_PREFIX, c->progress * 100);
+
+ return 0;
+}
+
+static int match_transfer_removed(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+ Context *c = ASSERT_PTR(userdata);
+ const char *path, *result;
+ uint32_t id;
+ int r;
+
+ assert(m);
+
+ if (!arg_quiet)
+ clear_progress_bar(PROGRESS_PREFIX);
+
+ r = sd_bus_message_read(m, "uos", &id, &path, &result);
+ if (r < 0) {
+ bus_log_parse_error(r);
+ return 0;
+ }
+
+ if (!streq_ptr(c->object_path, path))
+ return 0;
+
+ sd_event_exit(sd_bus_get_event(sd_bus_message_get_bus(m)), !streq_ptr(result, "done"));
+ return 0;
+}
+
+static int transfer_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
+ assert(s);
+ assert(si);
+
+ if (!arg_quiet)
+ clear_progress_bar(PROGRESS_PREFIX);
+
+ if (!arg_quiet)
+ log_info("Continuing download in the background. Use \"%s cancel-transfer %" PRIu32 "\" to abort transfer.",
+ program_invocation_short_name,
+ PTR_TO_UINT32(userdata));
+
+ sd_event_exit(sd_event_source_get_event(s), EINTR);
+ return 0;
+}
+
+static int transfer_image_common(sd_bus *bus, sd_bus_message *m) {
+ _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *slot_job_removed = NULL, *slot_log_message = NULL, *slot_progress_update = NULL;
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ _cleanup_(sd_event_unrefp) sd_event* event = NULL;
+ Context c = {};
+ uint32_t id;
+ int r;
+
+ assert(bus);
+ assert(m);
+
+ polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
+
+ r = sd_event_default(&event);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get event loop: %m");
+
+ r = sd_bus_attach_event(bus, event, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to attach bus to event loop: %m");
+
+ r = bus_match_signal_async(
+ bus,
+ &slot_job_removed,
+ bus_import_mgr,
+ "TransferRemoved",
+ match_transfer_removed,
+ /* add_callback= */ NULL,
+ &c);
+ if (r < 0)
+ return log_error_errno(r, "Failed to request match: %m");
+
+ r = sd_bus_match_signal_async(
+ bus,
+ &slot_log_message,
+ "org.freedesktop.import1",
+ /* object_path= */ NULL,
+ "org.freedesktop.import1.Transfer",
+ "LogMessage",
+ match_log_message,
+ /* add_callback= */ NULL,
+ &c);
+ if (r < 0)
+ return log_error_errno(r, "Failed to request match: %m");
+
+ r = sd_bus_match_signal_async(
+ bus,
+ &slot_progress_update,
+ "org.freedesktop.import1",
+ /* object_path= */ NULL,
+ "org.freedesktop.import1.Transfer",
+ "ProgressUpdate",
+ match_progress_update,
+ /* add_callback= */ NULL,
+ &c);
+ if (r < 0)
+ return log_error_errno(r, "Failed to request match: %m");
+
+ r = sd_bus_call(bus, m, 0, &error, &reply);
+ if (r < 0)
+ return log_error_errno(r, "Failed to transfer image: %s", bus_error_message(&error, r));
+
+ r = sd_bus_message_read(reply, "uo", &id, &c.object_path);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ if (!arg_quiet) {
+ clear_progress_bar(PROGRESS_PREFIX);
+ log_info("Enqueued transfer job %u. Press C-c to continue download in background.", id);
+ draw_progress_bar(PROGRESS_PREFIX, c.progress);
+ }
+
+ (void) sd_event_add_signal(event, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, transfer_signal_handler, UINT32_TO_PTR(id));
+ (void) sd_event_add_signal(event, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, transfer_signal_handler, UINT32_TO_PTR(id));
+
+ r = sd_event_loop(event);
+ if (r < 0)
+ return log_error_errno(r, "Failed to run event loop: %m");
+
+ return -r;
+}
+
+static int import_tar(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_free_ char *ll = NULL, *fn = NULL;
+ const char *local = NULL, *path = NULL;
+ _cleanup_close_ int fd = -EBADF;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ if (argc >= 2)
+ path = empty_or_dash_to_null(argv[1]);
+
+ if (argc >= 3)
+ local = empty_or_dash_to_null(argv[2]);
+ else if (path) {
+ r = path_extract_filename(path, &fn);
+ if (r < 0)
+ return log_error_errno(r, "Cannot extract container name from filename: %m");
+ if (r == O_DIRECTORY)
+ return log_error_errno(SYNTHETIC_ERRNO(EISDIR),
+ "Path '%s' refers to directory, but we need a regular file: %m", path);
+
+ local = fn;
+ }
+ if (!local)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Need either path or local name.");
+
+ r = tar_strip_suffixes(local, &ll);
+ if (r < 0)
+ return log_oom();
+
+ local = ll;
+
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Local name %s is not a suitable image name.",
+ local);
+
+ if (path) {
+ fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open %s: %m", path);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && (arg_image_class & ~(IMPORT_FORCE|IMPORT_READ_ONLY)) == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportTar");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "hsbb",
+ fd >= 0 ? fd : STDIN_FILENO,
+ local,
+ FLAGS_SET(arg_import_flags, IMPORT_FORCE),
+ FLAGS_SET(arg_import_flags, IMPORT_READ_ONLY));
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportTarEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "hsst",
+ fd >= 0 ? fd : STDIN_FILENO,
+ local,
+ image_class_to_string(arg_image_class),
+ (uint64_t) arg_import_flags & (IMPORT_FORCE|IMPORT_READ_ONLY));
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ return transfer_image_common(bus, m);
+}
+
+static int import_raw(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_free_ char *ll = NULL, *fn = NULL;
+ const char *local = NULL, *path = NULL;
+ _cleanup_close_ int fd = -EBADF;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ if (argc >= 2)
+ path = empty_or_dash_to_null(argv[1]);
+
+ if (argc >= 3)
+ local = empty_or_dash_to_null(argv[2]);
+ else if (path) {
+ r = path_extract_filename(path, &fn);
+ if (r < 0)
+ return log_error_errno(r, "Cannot extract container name from filename: %m");
+ if (r == O_DIRECTORY)
+ return log_error_errno(SYNTHETIC_ERRNO(EISDIR),
+ "Path '%s' refers to directory, but we need a regular file: %m", path);
+
+ local = fn;
+ }
+ if (!local)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Need either path or local name.");
+
+ r = raw_strip_suffixes(local, &ll);
+ if (r < 0)
+ return log_oom();
+
+ local = ll;
+
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Local name %s is not a suitable image name.",
+ local);
+
+ if (path) {
+ fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open %s: %m", path);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && (arg_image_class & ~(IMPORT_FORCE|IMPORT_READ_ONLY)) == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportRaw");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "hsbb",
+ fd >= 0 ? fd : STDIN_FILENO,
+ local,
+ FLAGS_SET(arg_import_flags, IMPORT_FORCE),
+ FLAGS_SET(arg_import_flags, IMPORT_READ_ONLY));
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportRawEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "hsst",
+ fd >= 0 ? fd : STDIN_FILENO,
+ local,
+ image_class_to_string(arg_image_class),
+ (uint64_t) arg_import_flags & (IMPORT_FORCE|IMPORT_READ_ONLY));
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ return transfer_image_common(bus, m);
+}
+
+static int import_fs(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ const char *local = NULL, *path = NULL;
+ _cleanup_free_ char *fn = NULL;
+ _cleanup_close_ int fd = -EBADF;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ if (argc >= 2)
+ path = empty_or_dash_to_null(argv[1]);
+
+ if (argc >= 3)
+ local = empty_or_dash_to_null(argv[2]);
+ else if (path) {
+ r = path_extract_filename(path, &fn);
+ if (r < 0)
+ return log_error_errno(r, "Cannot extract container name from filename: %m");
+
+ local = fn;
+ }
+ if (!local)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Need either path or local name.");
+
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Local name %s is not a suitable image name.",
+ local);
+
+ if (path) {
+ fd = open(path, O_DIRECTORY|O_RDONLY|O_CLOEXEC);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open directory '%s': %m", path);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && (arg_image_class & ~(IMPORT_FORCE|IMPORT_READ_ONLY)) == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportFileSystem");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "hsbb",
+ fd >= 0 ? fd : STDIN_FILENO,
+ local,
+ FLAGS_SET(arg_import_flags, IMPORT_FORCE),
+ FLAGS_SET(arg_import_flags, IMPORT_READ_ONLY));
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportFileSystemEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "hsst",
+ fd >= 0 ? fd : STDIN_FILENO,
+ local,
+ image_class_to_string(arg_image_class),
+ (uint64_t) arg_import_flags & (IMPORT_FORCE|IMPORT_READ_ONLY));
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+
+ return transfer_image_common(bus, m);
+}
+
+static void determine_compression_from_filename(const char *p) {
+ if (arg_format)
+ return;
+
+ if (!p)
+ return;
+
+ if (endswith(p, ".xz"))
+ arg_format = "xz";
+ else if (endswith(p, ".gz"))
+ arg_format = "gzip";
+ else if (endswith(p, ".bz2"))
+ arg_format = "bzip2";
+}
+
+static int export_tar(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_close_ int fd = -EBADF;
+ const char *local = NULL, *path = NULL;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ local = argv[1];
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Image name %s is not valid.", local);
+
+ if (argc >= 3)
+ path = argv[2];
+ path = empty_or_dash_to_null(path);
+
+ if (path) {
+ determine_compression_from_filename(path);
+
+ fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC|O_NOCTTY, 0666);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open %s: %m", path);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && arg_import_flags == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ExportTar");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "shs",
+ local,
+ fd >= 0 ? fd : STDOUT_FILENO,
+ arg_format);
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ExportTarEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "sshst",
+ local,
+ image_class_to_string(arg_image_class),
+ fd >= 0 ? fd : STDOUT_FILENO,
+ arg_format,
+ /* flags= */ 0);
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ return transfer_image_common(bus, m);
+}
+
+static int export_raw(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_close_ int fd = -EBADF;
+ const char *local = NULL, *path = NULL;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ local = argv[1];
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Image name %s is not valid.", local);
+
+ if (argc >= 3)
+ path = argv[2];
+ path = empty_or_dash_to_null(path);
+
+ if (path) {
+ determine_compression_from_filename(path);
+
+ fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC|O_NOCTTY, 0666);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open %s: %m", path);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && arg_import_flags == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ExportRaw");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "shs",
+ local,
+ fd >= 0 ? fd : STDOUT_FILENO,
+ arg_format);
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ExportRawEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "sshst",
+ local,
+ image_class_to_string(arg_image_class),
+ fd >= 0 ? fd : STDOUT_FILENO,
+ arg_format,
+ /* flags= */ 0);
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ return transfer_image_common(bus, m);
+}
+
+static int pull_tar(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_free_ char *l = NULL, *ll = NULL;
+ const char *local, *remote;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ remote = argv[1];
+ if (!http_url_is_valid(remote) && !file_url_is_valid(remote))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "URL '%s' is not valid.", remote);
+
+ if (argc >= 3)
+ local = argv[2];
+ else {
+ r = import_url_last_component(remote, &l);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get final component of URL: %m");
+
+ local = l;
+ }
+
+ local = empty_or_dash_to_null(local);
+
+ if (local) {
+ r = tar_strip_suffixes(local, &ll);
+ if (r < 0)
+ return log_oom();
+
+ local = ll;
+
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Local name %s is not a suitable image name.",
+ local);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && (arg_image_class & ~IMPORT_FORCE) == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "PullTar");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "sssb",
+ remote,
+ local,
+ import_verify_to_string(arg_verify),
+ FLAGS_SET(arg_import_flags, IMPORT_FORCE));
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "PullTarEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "sssst",
+ remote,
+ local,
+ image_class_to_string(arg_image_class),
+ import_verify_to_string(arg_verify),
+ (uint64_t) arg_import_flags & (IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_PULL_KEEP_DOWNLOAD));
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ return transfer_image_common(bus, m);
+}
+
+static int pull_raw(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ _cleanup_free_ char *l = NULL, *ll = NULL;
+ const char *local, *remote;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ r = settle_image_class();
+ if (r < 0)
+ return r;
+
+ remote = argv[1];
+ if (!http_url_is_valid(remote) && !file_url_is_valid(remote))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "URL '%s' is not valid.", remote);
+
+ if (argc >= 3)
+ local = argv[2];
+ else {
+ r = import_url_last_component(remote, &l);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get final component of URL: %m");
+
+ local = l;
+ }
+
+ local = empty_or_dash_to_null(local);
+
+ if (local) {
+ r = raw_strip_suffixes(local, &ll);
+ if (r < 0)
+ return log_oom();
+
+ local = ll;
+
+ if (!image_name_is_valid(local))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Local name %s is not a suitable image name.",
+ local);
+ }
+
+ if (arg_image_class == IMAGE_MACHINE && (arg_image_class & ~IMPORT_FORCE) == 0) {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "PullRaw");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "sssb",
+ remote,
+ local,
+ import_verify_to_string(arg_verify),
+ FLAGS_SET(arg_import_flags, IMPORT_FORCE));
+ } else {
+ r = bus_message_new_method_call(bus, &m, bus_import_mgr, "PullRawEx");
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ r = sd_bus_message_append(
+ m,
+ "sssst",
+ remote,
+ local,
+ image_class_to_string(arg_image_class),
+ import_verify_to_string(arg_verify),
+ (uint64_t) arg_import_flags & (IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_PULL_KEEP_DOWNLOAD));
+ }
+ if (r < 0)
+ return bus_log_create_error(r);
+
+ return transfer_image_common(bus, m);
+}
+
+static int list_transfers(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ _cleanup_(table_unrefp) Table *t = NULL;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ pager_open(arg_pager_flags);
+
+ bool ex;
+ r = bus_call_method(bus, bus_import_mgr, "ListTransfersEx", &error, &reply, "st", image_class_to_string(arg_image_class), UINT64_C(0));
+ if (r < 0) {
+ if (sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD)) {
+ sd_bus_error_free(&error);
+
+ r = bus_call_method(bus, bus_import_mgr, "ListTransfers", &error, &reply, NULL);
+ }
+ if (r < 0)
+ return log_error_errno(r, "Could not get transfers: %s", bus_error_message(&error, r));
+
+ ex = false;
+ r = sd_bus_message_enter_container(reply, 'a', "(usssdo)");
+ } else {
+ ex = true;
+ r = sd_bus_message_enter_container(reply, 'a', "(ussssdo)");
+ }
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ t = table_new("id", "progress", "type", "class", "local", "remote");
+ if (!t)
+ return log_oom();
+
+ (void) table_set_sort(t, (size_t) 4, (size_t) 0);
+ table_set_ersatz_string(t, TABLE_ERSATZ_DASH);
+
+ for (;;) {
+ const char *type, *remote, *local, *class = "machine";
+ double progress;
+ uint32_t id;
+
+ if (ex)
+ r = sd_bus_message_read(reply, "(ussssdo)", &id, &type, &remote, &local, &class, &progress, NULL);
+ else
+ r = sd_bus_message_read(reply, "(usssdo)", &id, &type, &remote, &local, &progress, NULL);
+ if (r < 0)
+ return bus_log_parse_error(r);
+ if (r == 0)
+ break;
+
+ /* Ideally we use server-side filtering. But if the server can't do it, we need to do it client side */
+ if (arg_image_class >= 0 && image_class_from_string(class) != arg_image_class)
+ continue;
+
+ r = table_add_many(
+ t,
+ TABLE_UINT32, id,
+ TABLE_SET_ALIGN_PERCENT, 100);
+ if (r < 0)
+ return table_log_add_error(r);
+
+ if (progress < 0)
+ r = table_add_many(
+ t,
+ TABLE_EMPTY,
+ TABLE_SET_ALIGN_PERCENT, 100);
+ else
+ r = table_add_many(
+ t,
+ TABLE_PERCENT, (int) (progress * 100),
+ TABLE_SET_ALIGN_PERCENT, 100);
+ if (r < 0)
+ return table_log_add_error(r);
+ r = table_add_many(
+ t,
+ TABLE_STRING, type,
+ TABLE_STRING, class,
+ TABLE_STRING, local,
+ TABLE_STRING, remote,
+ TABLE_SET_URL, remote);
+ if (r < 0)
+ return table_log_add_error(r);
+ }
+
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ if (!table_isempty(t)) {
+ r = table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
+ if (r < 0)
+ return log_error_errno(r, "Failed to output table: %m");
+ }
+
+ if (arg_legend) {
+ if (!table_isempty(t))
+ printf("\n%zu transfers listed.\n", table_get_rows(t) - 1);
+ else
+ printf("No transfers.\n");
+ }
+
+ return 0;
+}
+
+static int cancel_transfer(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
+
+ for (int i = 1; i < argc; i++) {
+ uint32_t id;
+
+ r = safe_atou32(argv[i], &id);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse transfer id: %s", argv[i]);
+
+ r = bus_call_method(bus, bus_import_mgr, "CancelTransfer", &error, NULL, "u", id);
+ if (r < 0)
+ return log_error_errno(r, "Could not cancel transfer: %s", bus_error_message(&error, r));
+ }
+
+ return 0;
+}
+
+static int list_images(int argc, char *argv[], void *userdata) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ _cleanup_(table_unrefp) Table *t = NULL;
+ sd_bus *bus = ASSERT_PTR(userdata);
+ int r;
+
+ pager_open(arg_pager_flags);
+
+ r = bus_call_method(bus, bus_import_mgr, "ListImages", &error, &reply, "st", image_class_to_string(arg_image_class), UINT64_C(0));
+ if (r < 0)
+ return log_error_errno(r, "Could not list images: %s", bus_error_message(&error, r));
+
+ r = sd_bus_message_enter_container(reply, 'a', "(ssssbtttttt)");
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ t = table_new("class", "name", "type", "path", "ro", "crtime", "mtime", "usage", "usage-exclusive", "limit", "limit-exclusive");
+ if (!t)
+ return log_oom();
+
+ (void) table_set_sort(t, (size_t) 0, (size_t) 1);
+ table_set_ersatz_string(t, TABLE_ERSATZ_DASH);
+
+ /* Hide the exclusive columns for now */
+ (void) table_hide_column_from_display(t, 8);
+ (void) table_hide_column_from_display(t, 10);
+
+ for (;;) {
+ uint64_t crtime, mtime, usage, usage_exclusive, limit, limit_exclusive;
+ const char *class, *name, *type, *path;
+ int read_only;
+
+ r = sd_bus_message_read(reply, "(ssssbtttttt)", &class, &name, &type, &path, &read_only, &crtime, &mtime, &usage, &usage_exclusive, &limit, &limit_exclusive);
+ if (r < 0)
+ return bus_log_parse_error(r);
+ if (r == 0)
+ break;
+
+ r = table_add_many(
+ t,
+ TABLE_STRING, class,
+ TABLE_STRING, name,
+ TABLE_STRING, type,
+ TABLE_PATH, path);
+ if (r < 0)
+ return table_log_add_error(r);
+
+ if (FLAGS_SET(arg_json_format_flags, JSON_FORMAT_OFF))
+ r = table_add_many(
+ t,
+ TABLE_STRING, read_only ? "ro" : "rw",
+ TABLE_SET_COLOR, read_only ? ANSI_HIGHLIGHT_RED : ANSI_HIGHLIGHT_GREEN);
+ else
+ r = table_add_many(
+ t,
+ TABLE_BOOLEAN, read_only);
+ if (r < 0)
+ return table_log_add_error(r);
+
+ r = table_add_many(
+ t,
+ TABLE_TIMESTAMP, crtime,
+ TABLE_TIMESTAMP, mtime,
+ TABLE_SIZE, usage,
+ TABLE_SIZE, usage_exclusive,
+ TABLE_SIZE, limit,
+ TABLE_SIZE, limit_exclusive);
+ if (r < 0)
+ return table_log_add_error(r);
+ }
+
+ r = sd_bus_message_exit_container(reply);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ if (!table_isempty(t)) {
+ r = table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
+ if (r < 0)
+ return log_error_errno(r, "Failed to output table: %m");
+ }
+
+ if (arg_legend) {
+ if (!table_isempty(t))
+ printf("\n%zu images listed.\n", table_get_rows(t) - 1);
+ else
+ printf("No images.\n");
+ }
+
+ return 0;
+}
+
+static int help(int argc, char *argv[], void *userdata) {
+ _cleanup_free_ char *link = NULL;
+ int r;
+
+ pager_open(arg_pager_flags);
+
+ r = terminal_urlify_man("importctl", "1", &link);
+ if (r < 0)
+ return log_oom();
+
+ printf("%1$s [OPTIONS...] COMMAND ...\n\n"
+ "%5$sDownload, import or export disk images%6$s\n"
+ "\n%3$sCommands:%4$s\n"
+ " pull-tar URL [NAME] Download a TAR container image\n"
+ " pull-raw URL [NAME] Download a RAW container or VM image\n"
+ " import-tar FILE [NAME] Import a local TAR container image\n"
+ " import-raw FILE [NAME] Import a local RAW container or VM image\n"
+ " import-fs DIRECTORY [NAME] Import a local directory container image\n"
+ " export-tar NAME [FILE] Export a TAR container image locally\n"
+ " export-raw NAME [FILE] Export a RAW container or VM image locally\n"
+ " list-transfers Show list of transfers in progress\n"
+ " cancel-transfer [ID...] Cancel a transfer\n"
+ " list-images Show list of installed images\n"
+ "\n%3$sOptions:%4$s\n"
+ " -h --help Show this help\n"
+ " --version Show package version\n"
+ " --no-pager Do not pipe output into a pager\n"
+ " --no-legend Do not show the headers and footers\n"
+ " --no-ask-password Do not ask for system passwords\n"
+ " -H --host=[USER@]HOST Operate on remote host\n"
+ " -M --machine=CONTAINER Operate on local container\n"
+ " --read-only Create read-only image\n"
+ " -q --quiet Suppress output\n"
+ " --json=pretty|short|off Generate JSON output\n"
+ " -j Equvilant to --json=pretty on TTY, --json=short\n"
+ " otherwise\n"
+ " --verify=MODE Verification mode for downloaded images (no,\n"
+ " checksum, signature)\n"
+ " --format=xz|gzip|bzip2 Desired output format for export\n"
+ " --force Install image even if already exists\n"
+ " -m --class=machine Install as machine image\n"
+ " -P --class=portable Install as portable service image\n"
+ " -S --class=sysext Install as system extension image\n"
+ " -C --class=confext Install as configuration extension image\n"
+ " --keep-download=BOOL Control whether to keep pristine copy of download\n"
+ " -N Shortcut for --keep-download=no\n"
+ "\nSee the %2$s for details.\n",
+ program_invocation_short_name,
+ link,
+ ansi_underline(),
+ ansi_normal(),
+ ansi_highlight(),
+ ansi_normal());
+
+ return 0;
+}
+
+static int parse_argv(int argc, char *argv[]) {
+
+ enum {
+ ARG_VERSION = 0x100,
+ ARG_NO_PAGER,
+ ARG_NO_LEGEND,
+ ARG_NO_ASK_PASSWORD,
+ ARG_READ_ONLY,
+ ARG_JSON,
+ ARG_VERIFY,
+ ARG_FORCE,
+ ARG_FORMAT,
+ ARG_CLASS,
+ ARG_KEEP_DOWNLOAD,
+ };
+
+ static const struct option options[] = {
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, ARG_VERSION },
+ { "no-pager", no_argument, NULL, ARG_NO_PAGER },
+ { "no-legend", no_argument, NULL, ARG_NO_LEGEND },
+ { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
+ { "host", required_argument, NULL, 'H' },
+ { "machine", required_argument, NULL, 'M' },
+ { "read-only", no_argument, NULL, ARG_READ_ONLY },
+ { "json", required_argument, NULL, ARG_JSON },
+ { "quiet", no_argument, NULL, 'q' },
+ { "verify", required_argument, NULL, ARG_VERIFY },
+ { "force", no_argument, NULL, ARG_FORCE },
+ { "format", required_argument, NULL, ARG_FORMAT },
+ { "class", required_argument, NULL, ARG_CLASS },
+ { "keep-download", required_argument, NULL, ARG_KEEP_DOWNLOAD },
+ {}
+ };
+
+ int c, r;
+
+ assert(argc >= 0);
+ assert(argv);
+
+ for (;;) {
+ c = getopt_long(argc, argv, "hH:M:jqmPSCN", options, NULL);
+ if (c < 0)
+ break;
+
+ switch (c) {
+
+ case 'h':
+ return help(0, NULL, NULL);
+
+ case ARG_VERSION:
+ return version();
+
+ case ARG_NO_PAGER:
+ arg_pager_flags |= PAGER_DISABLE;
+ break;
+
+ case ARG_NO_LEGEND:
+ arg_legend = false;
+ break;
+
+ case ARG_NO_ASK_PASSWORD:
+ arg_ask_password = false;
+ break;
+
+ case 'H':
+ arg_transport = BUS_TRANSPORT_REMOTE;
+ arg_host = optarg;
+ break;
+
+ case 'M':
+ arg_transport = BUS_TRANSPORT_MACHINE;
+ arg_host = optarg;
+ break;
+
+ case ARG_READ_ONLY:
+ arg_import_flags |= IMPORT_READ_ONLY;
+ arg_import_flags_mask |= IMPORT_READ_ONLY;
+ break;
+
+ case 'q':
+ arg_quiet = true;
+ break;
+
+ case ARG_VERIFY:
+ if (streq(optarg, "help")) {
+ DUMP_STRING_TABLE(import_verify, ImportVerify, _IMPORT_VERIFY_MAX);
+ return 0;
+ }
+
+ r = import_verify_from_string(optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse --verify= setting: %s", optarg);
+ arg_verify = r;
+ break;
+
+ case ARG_FORCE:
+ arg_import_flags |= IMPORT_FORCE;
+ arg_import_flags_mask |= IMPORT_FORCE;
+ break;
+
+ case ARG_FORMAT:
+ if (!STR_IN_SET(optarg, "uncompressed", "xz", "gzip", "bzip2"))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Unknown format: %s", optarg);
+
+ arg_format = optarg;
+ break;
+
+ case ARG_JSON:
+ r = parse_json_argument(optarg, &arg_json_format_flags);
+ if (r <= 0)
+ return r;
+
+ arg_legend = false;
+ break;
+
+ case 'j':
+ arg_json_format_flags = JSON_FORMAT_PRETTY_AUTO|JSON_FORMAT_COLOR_AUTO;
+ arg_legend = false;
+ break;
+
+ case ARG_CLASS:
+ arg_image_class = image_class_from_string(optarg);
+ if (arg_image_class < 0)
+ return log_error_errno(arg_image_class, "Failed to parse --class= parameter: %s", optarg);
+ break;
+
+ case 'm':
+ arg_image_class = IMAGE_MACHINE;
+ break;
+
+ case 'P':
+ arg_image_class = IMAGE_PORTABLE;
+ break;
+
+ case 'S':
+ arg_image_class = IMAGE_SYSEXT;
+ break;
+
+ case 'C':
+ arg_image_class = IMAGE_CONFEXT;
+ break;
+
+ case ARG_KEEP_DOWNLOAD:
+ r = parse_boolean(optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse --keep-download= value: %s", optarg);
+
+ SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, r);
+ arg_import_flags_mask |= IMPORT_PULL_KEEP_DOWNLOAD;
+ break;
+
+ case 'N':
+ arg_import_flags_mask &= ~IMPORT_PULL_KEEP_DOWNLOAD;
+ arg_import_flags_mask |= IMPORT_PULL_KEEP_DOWNLOAD;
+ break;
+
+ case '?':
+ return -EINVAL;
+
+ default:
+ assert_not_reached();
+ }
+ }
+
+ return 1;
+}
+
+static int importctl_main(int argc, char *argv[], sd_bus *bus) {
+
+ static const Verb verbs[] = {
+ { "help", VERB_ANY, VERB_ANY, 0, help },
+ { "import-tar", 2, 3, 0, import_tar },
+ { "import-raw", 2, 3, 0, import_raw },
+ { "import-fs", 2, 3, 0, import_fs },
+ { "export-tar", 2, 3, 0, export_tar },
+ { "export-raw", 2, 3, 0, export_raw },
+ { "pull-tar", 2, 3, 0, pull_tar },
+ { "pull-raw", 2, 3, 0, pull_raw },
+ { "list-transfers", VERB_ANY, 1, VERB_DEFAULT, list_transfers },
+ { "cancel-transfer", 2, VERB_ANY, 0, cancel_transfer },
+ { "list-images", VERB_ANY, 1, 0, list_images },
+ {}
+ };
+
+ return dispatch_verb(argc, argv, verbs, bus);
+}
+
+static int run(int argc, char *argv[]) {
+ _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+ int r;
+
+ setlocale(LC_ALL, "");
+ log_setup();
+
+ r = parse_argv(argc, argv);
+ if (r <= 0)
+ return r;
+
+ r = bus_connect_transport(arg_transport, arg_host, RUNTIME_SCOPE_SYSTEM, &bus);
+ if (r < 0)
+ return bus_log_connect_error(r, arg_transport);
+
+ (void) sd_bus_set_allow_interactive_authorization(bus, arg_ask_password);
+
+ return importctl_main(argc, argv, bus);
+}
+
+DEFINE_MAIN_FUNCTION(run);
diff --git a/src/import/importd.c b/src/import/importd.c
index 3321155e84..4bba46984a 100644
--- a/src/import/importd.c
+++ b/src/import/importd.c
@@ -6,6 +6,7 @@
#include "sd-bus.h"
#include "alloc-util.h"
+#include "build-path.h"
#include "bus-common-errors.h"
#include "bus-get-properties.h"
#include "bus-log-control-api.h"
@@ -13,15 +14,19 @@
#include "common-signal.h"
#include "constants.h"
#include "daemon-util.h"
+#include "discover-image.h"
#include "env-util.h"
+#include "event-util.h"
#include "fd-util.h"
#include "float.h"
#include "hostname-util.h"
+#include "import-common.h"
#include "import-util.h"
#include "machine-pool.h"
#include "main-func.h"
#include "missing_capability.h"
#include "mkdir-label.h"
+#include "os-util.h"
#include "parse-util.h"
#include "path-util.h"
#include "percent-util.h"
@@ -62,12 +67,11 @@ struct Transfer {
char *remote;
char *local;
- bool force_local;
- bool read_only;
-
+ ImageClass class;
+ ImportFlags flags;
char *format;
- pid_t pid;
+ PidRef pidref;
int log_fd;
@@ -79,6 +83,7 @@ struct Transfer {
unsigned n_canceled;
unsigned progress_percent;
+ unsigned progress_percent_sent;
int stdin_fd;
int stdout_fd;
@@ -106,11 +111,11 @@ struct Manager {
static const char* const transfer_type_table[_TRANSFER_TYPE_MAX] = {
[TRANSFER_IMPORT_TAR] = "import-tar",
[TRANSFER_IMPORT_RAW] = "import-raw",
- [TRANSFER_IMPORT_FS] = "import-fs",
+ [TRANSFER_IMPORT_FS] = "import-fs",
[TRANSFER_EXPORT_TAR] = "export-tar",
[TRANSFER_EXPORT_RAW] = "export-raw",
- [TRANSFER_PULL_TAR] = "pull-tar",
- [TRANSFER_PULL_RAW] = "pull-raw",
+ [TRANSFER_PULL_TAR] = "pull-tar",
+ [TRANSFER_PULL_RAW] = "pull-raw",
};
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(transfer_type, TransferType);
@@ -130,8 +135,7 @@ static Transfer *transfer_unref(Transfer *t) {
free(t->format);
free(t->object_path);
- if (t->pid > 1)
- sigkill_wait(t->pid);
+ pidref_done_sigkill_wait(&t->pidref);
safe_close(t->log_fd);
safe_close(t->stdin_fd);
@@ -163,7 +167,8 @@ static int transfer_new(Manager *m, Transfer **ret) {
.stdin_fd = -EBADF,
.stdout_fd = -EBADF,
.verify = _IMPORT_VERIFY_INVALID,
- .progress_percent= UINT_MAX,
+ .progress_percent = UINT_MAX,
+ .progress_percent_sent = UINT_MAX,
};
id = m->current_transfer_id + 1;
@@ -214,7 +219,28 @@ static void transfer_send_log_line(Transfer *t, const char *line) {
line);
if (r < 0)
log_warning_errno(r, "Cannot emit log message signal, ignoring: %m");
- }
+}
+
+static void transfer_send_progress_update(Transfer *t) {
+ int r;
+
+ assert(t);
+
+ if (t->progress_percent_sent == t->progress_percent)
+ return;
+
+ r = sd_bus_emit_signal(
+ t->manager->bus,
+ t->object_path,
+ "org.freedesktop.import1.Transfer",
+ "ProgressUpdate",
+ "d",
+ transfer_percent_as_double(t));
+ if (r < 0)
+ log_warning_errno(r, "Cannot emit progress update signal, ignoring: %m");
+
+ t->progress_percent_sent = t->progress_percent;
+}
static void transfer_send_logs(Transfer *t, bool flush) {
assert(t);
@@ -301,7 +327,7 @@ static int transfer_cancel(Transfer *t) {
assert(t);
- r = kill_and_sigcont(t->pid, t->n_canceled < 3 ? SIGTERM : SIGKILL);
+ r = pidref_kill_and_sigcont(&t->pidref, t->n_canceled < 3 ? SIGTERM : SIGKILL);
if (r < 0)
return r;
@@ -328,7 +354,7 @@ static int transfer_on_pid(sd_event_source *s, const siginfo_t *si, void *userda
else
log_error("Transfer process failed due to unknown reason.");
- t->pid = 0;
+ pidref_done(&t->pidref);
return transfer_finalize(t, success);
}
@@ -362,15 +388,17 @@ static int transfer_start(Transfer *t) {
int r;
assert(t);
- assert(t->pid <= 0);
+ assert(!pidref_is_set(&t->pidref));
if (pipe2(pipefd, O_CLOEXEC) < 0)
return -errno;
- r = safe_fork_full("(sd-transfer)",
- (int[]) { t->stdin_fd, t->stdout_fd < 0 ? pipefd[1] : t->stdout_fd, pipefd[1] },
- NULL, 0,
- FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG_SIGTERM|FORK_REARRANGE_STDIO, &t->pid);
+ r = pidref_safe_fork_full(
+ "(sd-transfer)",
+ (int[]) { t->stdin_fd, t->stdout_fd < 0 ? pipefd[1] : t->stdout_fd, pipefd[1] },
+ /* except_fds= */ NULL, /* n_except_fds= */ 0,
+ FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG_SIGTERM|FORK_REARRANGE_STDIO|FORK_REOPEN_LOG,
+ &t->pidref);
if (r < 0)
return r;
if (r == 0) {
@@ -379,6 +407,9 @@ static int transfer_start(Transfer *t) {
NULL, /* tar, raw */
NULL, /* --verify= */
NULL, /* verify argument */
+ NULL, /* --class= */
+ NULL, /* class argument */
+ NULL, /* --keep-download= */
NULL, /* maybe --force */
NULL, /* maybe --read-only */
NULL, /* if so: the actual URL */
@@ -388,7 +419,7 @@ static int transfer_start(Transfer *t) {
NULL, /* local */
NULL
};
- unsigned k = 0;
+ size_t k = 0;
/* Child */
@@ -398,6 +429,10 @@ static int transfer_start(Transfer *t) {
_exit(EXIT_FAILURE);
}
+ r = setenv_systemd_log_level();
+ if (r < 0)
+ log_warning_errno(r, "Failed to update $SYSTEMD_LOG_LEVEL, ignoring: %m");
+
r = setenv_systemd_exec_pid(true);
if (r < 0)
log_warning_errno(r, "Failed to update $SYSTEMD_EXEC_PID, ignoring: %m");
@@ -454,9 +489,18 @@ static int transfer_start(Transfer *t) {
cmd[k++] = import_verify_to_string(t->verify);
}
- if (t->force_local)
+ if (t->class != IMAGE_MACHINE) {
+ cmd[k++] = "--class";
+ cmd[k++] = image_class_to_string(t->class);
+ }
+
+ if (IN_SET(t->type, TRANSFER_PULL_TAR, TRANSFER_PULL_RAW))
+ cmd[k++] = FLAGS_SET(t->flags, IMPORT_PULL_KEEP_DOWNLOAD) ?
+ "--keep-download=yes" : "--keep-download=no";
+
+ if (FLAGS_SET(t->flags, IMPORT_FORCE))
cmd[k++] = "--force";
- if (t->read_only)
+ if (FLAGS_SET(t->flags, IMPORT_READ_ONLY))
cmd[k++] = "--read-only";
if (t->format) {
@@ -475,8 +519,15 @@ static int transfer_start(Transfer *t) {
cmd[k++] = t->local;
cmd[k] = NULL;
- execv(cmd[0], (char * const *) cmd);
- log_error_errno(errno, "Failed to execute %s tool: %m", cmd[0]);
+ assert(k < ELEMENTSOF(cmd));
+
+ if (DEBUG_LOGGING) {
+ _cleanup_free_ char *joined = strv_join((char**) cmd, " ");
+ log_debug("Calling: %s", strnull(joined));
+ }
+
+ r = invoke_callout_binary(cmd[0], (char * const *) cmd);
+ log_error_errno(r, "Failed to execute %s tool: %m", cmd[0]);
_exit(EXIT_FAILURE);
}
@@ -485,8 +536,13 @@ static int transfer_start(Transfer *t) {
t->stdin_fd = safe_close(t->stdin_fd);
- r = sd_event_add_child(t->manager->event, &t->pid_event_source,
- t->pid, WEXITED, transfer_on_pid, t);
+ r = event_add_child_pidref(
+ t->manager->event,
+ &t->pid_event_source,
+ &t->pidref,
+ WEXITED,
+ transfer_on_pid,
+ t);
if (r < 0)
return r;
@@ -581,7 +637,7 @@ static int manager_on_notify(sd_event_source *s, int fd, uint32_t revents, void
}
HASHMAP_FOREACH(t, m->transfers)
- if (ucred->pid == t->pid)
+ if (ucred->pid == t->pidref.pid)
break;
if (!t) {
@@ -606,6 +662,8 @@ static int manager_on_notify(sd_event_source *s, int fd, uint32_t revents, void
t->progress_percent = (unsigned) r;
log_debug("Got percentage from client: %u%%", t->progress_percent);
+
+ transfer_send_progress_update(t);
return 0;
}
@@ -632,17 +690,11 @@ static int manager_new(Manager **ret) {
if (r < 0)
return r;
- (void) sd_event_set_watchdog(m->event, true);
-
- r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
- if (r < 0)
- return r;
-
- r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
+ r = sd_event_set_signal_exit(m->event, true);
if (r < 0)
return r;
- r = sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, NULL);
+ r = sd_event_add_signal(m->event, NULL, (SIGRTMIN+18)|SD_EVENT_SIGNAL_PROCMASK, sigrtmin18_handler, NULL);
if (r < 0)
return r;
@@ -650,6 +702,10 @@ static int manager_new(Manager **ret) {
if (r < 0)
log_debug_errno(r, "Failed allocate memory pressure event source, ignoring: %m");
+ r = sd_event_set_watchdog(m->event, true);
+ if (r < 0)
+ log_debug_errno(r, "Failed to enable watchdog logic, ignoring: %m");
+
r = sd_bus_default_system(&m->bus);
if (r < 0)
return r;
@@ -694,12 +750,13 @@ static Transfer *manager_find(Manager *m, TransferType type, const char *remote)
static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_error *error) {
_cleanup_(transfer_unrefp) Transfer *t = NULL;
- int fd, force, read_only, r;
- const char *local, *object;
+ ImageClass class = _IMAGE_CLASS_INVALID;
Manager *m = ASSERT_PTR(userdata);
+ const char *local;
TransferType type;
struct stat st;
- uint32_t id;
+ uint64_t flags;
+ int fd, r;
assert(msg);
@@ -714,7 +771,36 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (r == 0)
return 1; /* Will call us back */
- r = sd_bus_message_read(msg, "hsbb", &fd, &local, &force, &read_only);
+ if (endswith(sd_bus_message_get_member(msg), "Ex")) {
+ const char *sclass;
+
+ r = sd_bus_message_read(msg, "hsst", &fd, &local, &sclass, &flags);
+ if (r < 0)
+ return r;
+
+ class = image_class_from_string(sclass);
+ if (class < 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Image class '%s' not known", sclass);
+
+ if (flags & ~(IMPORT_READ_ONLY|IMPORT_FORCE))
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Flags 0x%" PRIx64 " invalid", flags);
+ } else {
+ int force, read_only;
+
+ r = sd_bus_message_read(msg, "hsbb", &fd, &local, &force, &read_only);
+ if (r < 0)
+ return r;
+
+ class = IMAGE_MACHINE;
+
+ flags = 0;
+ SET_FLAG(flags, IMPORT_FORCE, force);
+ SET_FLAG(flags, IMPORT_READ_ONLY, read_only);
+ }
+
+ r = fd_verify_safe_flags(fd);
if (r < 0)
return r;
@@ -724,15 +810,17 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (!S_ISREG(st.st_mode) && !S_ISFIFO(st.st_mode))
return -EINVAL;
- if (!hostname_is_valid(local, 0))
+ if (!image_name_is_valid(local))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
- "Local name %s is invalid", local);
+ "Local image name %s is invalid", local);
- r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
- if (r < 0)
- return r;
+ if (class == IMAGE_MACHINE) {
+ r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
+ if (r < 0)
+ return r;
+ }
- type = streq_ptr(sd_bus_message_get_member(msg), "ImportTar") ?
+ type = startswith(sd_bus_message_get_member(msg), "ImportTar") ?
TRANSFER_IMPORT_TAR : TRANSFER_IMPORT_RAW;
r = transfer_new(m, &t);
@@ -740,8 +828,8 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
return r;
t->type = type;
- t->force_local = force;
- t->read_only = read_only;
+ t->class = class;
+ t->flags = flags;
t->local = strdup(local);
if (!t->local)
@@ -755,19 +843,21 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (r < 0)
return r;
- object = t->object_path;
- id = t->id;
- t = NULL;
+ r = sd_bus_reply_method_return(msg, "uo", t->id, t->object_path);
+ if (r < 0)
+ return r;
- return sd_bus_reply_method_return(msg, "uo", id, object);
+ TAKE_PTR(t);
+ return 1;
}
static int method_import_fs(sd_bus_message *msg, void *userdata, sd_bus_error *error) {
_cleanup_(transfer_unrefp) Transfer *t = NULL;
- int fd, force, read_only, r;
- const char *local, *object;
+ ImageClass class = _IMAGE_CLASS_INVALID;
Manager *m = ASSERT_PTR(userdata);
- uint32_t id;
+ const char *local;
+ uint64_t flags;
+ int fd, r;
assert(msg);
@@ -782,7 +872,36 @@ static int method_import_fs(sd_bus_message *msg, void *userdata, sd_bus_error *e
if (r == 0)
return 1; /* Will call us back */
- r = sd_bus_message_read(msg, "hsbb", &fd, &local, &force, &read_only);
+ if (endswith(sd_bus_message_get_member(msg), "Ex")) {
+ const char *sclass;
+
+ r = sd_bus_message_read(msg, "hsst", &fd, &local, &sclass, &flags);
+ if (r < 0)
+ return r;
+
+ class = image_class_from_string(sclass);
+ if (class < 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Image class '%s' not known", sclass);
+
+ if (flags & ~(IMPORT_READ_ONLY|IMPORT_FORCE))
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Flags 0x%" PRIx64 " invalid", flags);
+ } else {
+ int force, read_only;
+
+ r = sd_bus_message_read(msg, "hsbb", &fd, &local, &force, &read_only);
+ if (r < 0)
+ return r;
+
+ class = IMAGE_MACHINE;
+
+ flags = 0;
+ SET_FLAG(flags, IMPORT_FORCE, force);
+ SET_FLAG(flags, IMPORT_READ_ONLY, read_only);
+ }
+
+ r = fd_verify_safe_flags(fd);
if (r < 0)
return r;
@@ -790,21 +909,23 @@ static int method_import_fs(sd_bus_message *msg, void *userdata, sd_bus_error *e
if (r < 0)
return r;
- if (!hostname_is_valid(local, 0))
+ if (!image_name_is_valid(local))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
- "Local name %s is invalid", local);
+ "Local image name %s is invalid", local);
- r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
- if (r < 0)
- return r;
+ if (class == IMAGE_MACHINE) {
+ r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
+ if (r < 0)
+ return r;
+ }
r = transfer_new(m, &t);
if (r < 0)
return r;
t->type = TRANSFER_IMPORT_FS;
- t->force_local = force;
- t->read_only = read_only;
+ t->class = class;
+ t->flags = flags;
t->local = strdup(local);
if (!t->local)
@@ -818,21 +939,23 @@ static int method_import_fs(sd_bus_message *msg, void *userdata, sd_bus_error *e
if (r < 0)
return r;
- object = t->object_path;
- id = t->id;
- t = NULL;
+ r = sd_bus_reply_method_return(msg, "uo", t->id, t->object_path);
+ if (r < 0)
+ return r;
- return sd_bus_reply_method_return(msg, "uo", id, object);
+ TAKE_PTR(t);
+ return 1;
}
static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_error *error) {
_cleanup_(transfer_unrefp) Transfer *t = NULL;
- int fd, r;
- const char *local, *object, *format;
+ ImageClass class = _IMAGE_CLASS_INVALID;
Manager *m = ASSERT_PTR(userdata);
+ const char *local, *format;
TransferType type;
+ uint64_t flags;
struct stat st;
- uint32_t id;
+ int fd, r;
assert(msg);
@@ -847,13 +970,37 @@ static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (r == 0)
return 1; /* Will call us back */
- r = sd_bus_message_read(msg, "shs", &local, &fd, &format);
- if (r < 0)
- return r;
+ if (endswith(sd_bus_message_get_member(msg), "Ex")) {
+ const char *sclass;
+
+ r = sd_bus_message_read(msg, "sshst", &local, &sclass, &fd, &format, &flags);
+ if (r < 0)
+ return r;
+
+ class = image_class_from_string(sclass);
+ if (class < 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Image class '%s' not known", sclass);
+
+ if (flags != 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Flags 0x%" PRIx64 " invalid", flags);
+ } else {
+ r = sd_bus_message_read(msg, "shs", &local, &fd, &format);
+ if (r < 0)
+ return r;
+
+ class = IMAGE_MACHINE;
+ flags = 0;
+ }
- if (!hostname_is_valid(local, 0))
+ if (!image_name_is_valid(local))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
- "Local name %s is invalid", local);
+ "Local image name %s is invalid", local);
+
+ r = fd_verify_safe_flags(fd);
+ if (r < 0)
+ return r;
if (fstat(fd, &st) < 0)
return -errno;
@@ -861,7 +1008,7 @@ static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (!S_ISREG(st.st_mode) && !S_ISFIFO(st.st_mode))
return -EINVAL;
- type = streq_ptr(sd_bus_message_get_member(msg), "ExportTar") ?
+ type = startswith(sd_bus_message_get_member(msg), "ExportTar") ?
TRANSFER_EXPORT_TAR : TRANSFER_EXPORT_RAW;
r = transfer_new(m, &t);
@@ -869,6 +1016,8 @@ static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
return r;
t->type = type;
+ t->class = class;
+ t->flags = flags;
if (!isempty(format)) {
t->format = strdup(format);
@@ -888,21 +1037,23 @@ static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (r < 0)
return r;
- object = t->object_path;
- id = t->id;
- t = NULL;
+ r = sd_bus_reply_method_return(msg, "uo", t->id, t->object_path);
+ if (r < 0)
+ return r;
- return sd_bus_reply_method_return(msg, "uo", id, object);
+ TAKE_PTR(t);
+ return 1;
}
static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_error *error) {
_cleanup_(transfer_unrefp) Transfer *t = NULL;
- const char *remote, *local, *verify, *object;
+ ImageClass class = _IMAGE_CLASS_INVALID;
+ const char *remote, *local, *verify;
Manager *m = ASSERT_PTR(userdata);
- ImportVerify v;
TransferType type;
- int force, r;
- uint32_t id;
+ uint64_t flags;
+ ImportVerify v;
+ int r;
assert(msg);
@@ -917,9 +1068,33 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er
if (r == 0)
return 1; /* Will call us back */
- r = sd_bus_message_read(msg, "sssb", &remote, &local, &verify, &force);
- if (r < 0)
- return r;
+ if (endswith(sd_bus_message_get_member(msg), "Ex")) {
+ const char *sclass;
+
+ r = sd_bus_message_read(msg, "sssst", &remote, &local, &sclass, &verify, &flags);
+ if (r < 0)
+ return r;
+
+ class = image_class_from_string(sclass);
+ if (class < 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Image class '%s' not known", sclass);
+
+ if (flags & ~(IMPORT_FORCE|IMPORT_READ_ONLY|IMPORT_PULL_KEEP_DOWNLOAD))
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Flags 0x%" PRIx64 " invalid", flags);
+ } else {
+ int force;
+
+ r = sd_bus_message_read(msg, "sssb", &remote, &local, &verify, &force);
+ if (r < 0)
+ return r;
+
+ class = IMAGE_MACHINE;
+
+ flags = 0;
+ SET_FLAG(flags, IMPORT_FORCE, force);
+ }
if (!http_url_is_valid(remote) && !file_url_is_valid(remote))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
@@ -927,9 +1102,9 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er
if (isempty(local))
local = NULL;
- else if (!hostname_is_valid(local, 0))
+ else if (!image_name_is_valid(local))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
- "Local name %s is invalid", local);
+ "Local image name %s is invalid", local);
if (isempty(verify))
v = IMPORT_VERIFY_SIGNATURE;
@@ -939,11 +1114,13 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
"Unknown verification mode %s", verify);
- r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
- if (r < 0)
- return r;
+ if (class == IMAGE_MACHINE) {
+ r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
+ if (r < 0)
+ return r;
+ }
- type = streq_ptr(sd_bus_message_get_member(msg), "PullTar") ?
+ type = startswith(sd_bus_message_get_member(msg), "PullTar") ?
TRANSFER_PULL_TAR : TRANSFER_PULL_RAW;
if (manager_find(m, type, remote))
@@ -956,7 +1133,8 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er
t->type = type;
t->verify = v;
- t->force_local = force;
+ t->flags = flags;
+ t->class = class;
t->remote = strdup(remote);
if (!t->remote)
@@ -972,40 +1150,81 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er
if (r < 0)
return r;
- object = t->object_path;
- id = t->id;
- t = NULL;
+ r = sd_bus_reply_method_return(msg, "uo", t->id, t->object_path);
+ if (r < 0)
+ return r;
- return sd_bus_reply_method_return(msg, "uo", id, object);
+ TAKE_PTR(t);
+ return 1;
}
static int method_list_transfers(sd_bus_message *msg, void *userdata, sd_bus_error *error) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
Manager *m = ASSERT_PTR(userdata);
+ ImageClass class = _IMAGE_CLASS_INVALID;
Transfer *t;
int r;
assert(msg);
+ bool ex = endswith(sd_bus_message_get_member(msg), "Ex");
+ if (ex) {
+ const char *sclass;
+ uint64_t flags;
+
+ r = sd_bus_message_read(msg, "st", &sclass, &flags);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ if (!isempty(sclass)) {
+ class = image_class_from_string(sclass);
+ if (class < 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Image class '%s' not known", sclass);
+ }
+
+ if (flags != 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Flags 0x%" PRIx64 " invalid", flags);
+ }
+
r = sd_bus_message_new_method_return(msg, &reply);
if (r < 0)
return r;
- r = sd_bus_message_open_container(reply, 'a', "(usssdo)");
+ if (ex)
+ r = sd_bus_message_open_container(reply, 'a', "(ussssdo)");
+ else
+ r = sd_bus_message_open_container(reply, 'a', "(usssdo)");
if (r < 0)
return r;
HASHMAP_FOREACH(t, m->transfers) {
- r = sd_bus_message_append(
- reply,
- "(usssdo)",
- t->id,
- transfer_type_to_string(t->type),
- t->remote,
- t->local,
- transfer_percent_as_double(t),
- t->object_path);
+ if (class >= 0 && class != t->class)
+ continue;
+
+ if (ex)
+ r = sd_bus_message_append(
+ reply,
+ "(ussssdo)",
+ t->id,
+ transfer_type_to_string(t->type),
+ t->remote,
+ t->local,
+ image_class_to_string(t->class),
+ transfer_percent_as_double(t),
+ t->object_path);
+ else
+ r = sd_bus_message_append(
+ reply,
+ "(usssdo)",
+ t->id,
+ transfer_type_to_string(t->type),
+ t->remote,
+ t->local,
+ transfer_percent_as_double(t),
+ t->object_path);
if (r < 0)
return r;
}
@@ -1051,7 +1270,7 @@ static int method_cancel_transfer(sd_bus_message *msg, void *userdata, sd_bus_er
r = bus_verify_polkit_async(
msg,
- "org.freedesktop.import1.pull",
+ "org.freedesktop.import1.cancel",
/* details= */ NULL,
&m->polkit_registry,
error);
@@ -1077,6 +1296,86 @@ static int method_cancel_transfer(sd_bus_message *msg, void *userdata, sd_bus_er
return sd_bus_reply_method_return(msg, NULL);
}
+static int method_list_images(sd_bus_message *msg, void *userdata, sd_bus_error *error) {
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ ImageClass class = _IMAGE_CLASS_INVALID;
+ int r;
+
+ assert(msg);
+
+ const char *sclass;
+ uint64_t flags;
+
+ r = sd_bus_message_read(msg, "st", &sclass, &flags);
+ if (r < 0)
+ return r;
+
+ if (!isempty(sclass)) {
+ class = image_class_from_string(sclass);
+ if (class < 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Image class '%s' not known", sclass);
+ }
+
+ if (flags != 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+ "Flags 0x%" PRIx64 " invalid", flags);
+
+ r = sd_bus_message_new_method_return(msg, &reply);
+ if (r < 0)
+ return r;
+
+ r = sd_bus_message_open_container(reply, 'a', "(ssssbtttttt)");
+ if (r < 0)
+ return r;
+
+ for (ImageClass c = class < 0 ? 0 : class;
+ class < 0 ? (c < _IMAGE_CLASS_MAX) : (c == class);
+ c++) {
+
+ _cleanup_(hashmap_freep) Hashmap *h = NULL;
+
+ h = hashmap_new(&image_hash_ops);
+ if (!h)
+ return -ENOMEM;
+
+ r = image_discover(c, /* root= */ NULL, h);
+ if (r < 0) {
+ if (class >= 0)
+ return r;
+
+ log_warning_errno(r, "Failed to discover images of type %s: %m", image_class_to_string(c));
+ continue;
+ }
+
+ Image *i;
+ HASHMAP_FOREACH(i, h) {
+ r = sd_bus_message_append(
+ reply,
+ "(ssssbtttttt)",
+ image_class_to_string(i->class),
+ i->name,
+ image_type_to_string(i->type),
+ i->path,
+ i->read_only,
+ i->crtime,
+ i->mtime,
+ i->usage,
+ i->usage_exclusive,
+ i->limit,
+ i->limit_exclusive);
+ if (r < 0)
+ return r;
+ }
+ }
+
+ r = sd_bus_message_close_container(reply);
+ if (r < 0)
+ return r;
+
+ return sd_bus_send(NULL, reply, NULL);
+}
+
static int property_get_progress(
sd_bus *bus,
const char *path,
@@ -1179,6 +1478,10 @@ static const sd_bus_vtable transfer_vtable[] = {
SD_BUS_PARAM(priority)
SD_BUS_PARAM(line),
0),
+ SD_BUS_SIGNAL_WITH_NAMES("ProgressUpdate",
+ "d",
+ SD_BUS_PARAM(progress),
+ 0),
SD_BUS_VTABLE_END,
};
@@ -1204,6 +1507,17 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_import_tar_or_raw,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ImportTarEx",
+ "hsst",
+ SD_BUS_PARAM(fd)
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_import_tar_or_raw,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ImportRaw",
"hsbb",
SD_BUS_PARAM(fd)
@@ -1215,6 +1529,17 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_import_tar_or_raw,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ImportRawEx",
+ "hsst",
+ SD_BUS_PARAM(fd)
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_import_tar_or_raw,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ImportFileSystem",
"hsbb",
SD_BUS_PARAM(fd)
@@ -1226,6 +1551,17 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_import_fs,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ImportFileSystemEx",
+ "hsst",
+ SD_BUS_PARAM(fd)
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_import_fs,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ExportTar",
"shs",
SD_BUS_PARAM(local_name)
@@ -1236,6 +1572,18 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_export_tar_or_raw,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ExportTarEx",
+ "sshst",
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(fd)
+ SD_BUS_PARAM(format)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_export_tar_or_raw,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ExportRaw",
"shs",
SD_BUS_PARAM(local_name)
@@ -1246,6 +1594,18 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_export_tar_or_raw,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ExportRawEx",
+ "sshst",
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(fd)
+ SD_BUS_PARAM(format)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_export_tar_or_raw,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("PullTar",
"sssb",
SD_BUS_PARAM(url)
@@ -1257,6 +1617,18 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_pull_tar_or_raw,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("PullTarEx",
+ "sssst",
+ SD_BUS_PARAM(url)
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(verify_mode)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_pull_tar_or_raw,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("PullRaw",
"sssb",
SD_BUS_PARAM(url)
@@ -1268,18 +1640,46 @@ static const sd_bus_vtable manager_vtable[] = {
SD_BUS_PARAM(transfer_path),
method_pull_tar_or_raw,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("PullRawEx",
+ "sssst",
+ SD_BUS_PARAM(url)
+ SD_BUS_PARAM(local_name)
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(verify_mode)
+ SD_BUS_PARAM(flags),
+ "uo",
+ SD_BUS_PARAM(transfer_id)
+ SD_BUS_PARAM(transfer_path),
+ method_pull_tar_or_raw,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("ListTransfers",
NULL,,
"a(usssdo)",
SD_BUS_PARAM(transfers),
method_list_transfers,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ListTransfersEx",
+ "st",
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(flags),
+ "a(ussssdo)",
+ SD_BUS_PARAM(transfers),
+ method_list_transfers,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_NAMES("CancelTransfer",
"u",
SD_BUS_PARAM(transfer_id),
NULL,,
method_cancel_transfer,
SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_NAMES("ListImages",
+ "st",
+ SD_BUS_PARAM(class)
+ SD_BUS_PARAM(flags),
+ "a(ssssbtttttt)",
+ SD_BUS_PARAM(images),
+ method_list_images,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_SIGNAL_WITH_NAMES("TransferNew",
"uo",
@@ -1371,7 +1771,7 @@ static int run(int argc, char *argv[]) {
umask(0022);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/import/meson.build b/src/import/meson.build
index 3f0acf8358..ca23726603 100644
--- a/src/import/meson.build
+++ b/src/import/meson.build
@@ -100,6 +100,12 @@ executables += [
'link_with' : common_libs,
'dependencies' : common_deps,
},
+ executable_template + {
+ 'name' : 'importctl',
+ 'public' : true,
+ 'conditions' : ['ENABLE_IMPORTD'],
+ 'sources' : files('importctl.c'),
+ },
test_template + {
'sources' : files(
'test-qcow2.c',
diff --git a/src/import/org.freedesktop.import1.conf b/src/import/org.freedesktop.import1.conf
index d252ff6460..f99ec56c79 100644
--- a/src/import/org.freedesktop.import1.conf
+++ b/src/import/org.freedesktop.import1.conf
@@ -44,6 +44,10 @@
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="ListTransfersEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="CancelTransfer"/>
<allow send_destination="org.freedesktop.import1"
@@ -52,32 +56,64 @@
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="ImportTarEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="ImportRaw"/>
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="ImportRawEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="ImportFileSystem"/>
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="ImportFileSystemEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="ExportTar"/>
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="ExportTarEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="ExportRaw"/>
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="ExportRawEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="PullTar"/>
<allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Manager"
+ send_member="PullTarEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
send_member="PullRaw"/>
<allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Manager"
+ send_member="PullRawEx"/>
+
+ <allow send_destination="org.freedesktop.import1"
send_interface="org.freedesktop.import1.Transfer"
send_member="Cancel"/>
+ <allow send_destination="org.freedesktop.import1"
+ send_interface="org.freedesktop.import1.Transfer"
+ send_member="ListImages"/>
+
<allow receive_sender="org.freedesktop.import1"/>
</policy>
diff --git a/src/import/org.freedesktop.import1.policy b/src/import/org.freedesktop.import1.policy
index 88e436dc3a..45c11def67 100644
--- a/src/import/org.freedesktop.import1.policy
+++ b/src/import/org.freedesktop.import1.policy
@@ -19,8 +19,8 @@
<vendor_url>https://systemd.io</vendor_url>
<action id="org.freedesktop.import1.import">
- <description gettext-domain="systemd">Import a VM or container image</description>
- <message gettext-domain="systemd">Authentication is required to import a VM or container image</message>
+ <description gettext-domain="systemd">Import a disk image</description>
+ <message gettext-domain="systemd">Authentication is required to import an image</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
@@ -29,8 +29,8 @@
</action>
<action id="org.freedesktop.import1.export">
- <description gettext-domain="systemd">Export a VM or container image</description>
- <message gettext-domain="systemd">Authentication is required to export a VM or container image</message>
+ <description gettext-domain="systemd">Export a disk image</description>
+ <message gettext-domain="systemd">Authentication is required to export disk image</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
@@ -39,8 +39,18 @@
</action>
<action id="org.freedesktop.import1.pull">
- <description gettext-domain="systemd">Download a VM or container image</description>
- <message gettext-domain="systemd">Authentication is required to download a VM or container image</message>
+ <description gettext-domain="systemd">Download a disk image</description>
+ <message gettext-domain="systemd">Authentication is required to download a disk image</message>
+ <defaults>
+ <allow_any>auth_admin</allow_any>
+ <allow_inactive>auth_admin</allow_inactive>
+ <allow_active>auth_admin_keep</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.freedesktop.import1.cancel">
+ <description gettext-domain="systemd">Cancel transfer of a disk image</description>
+ <message gettext-domain="systemd">Authentication is required to cancel the ongoing transfer of a disk image</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
diff --git a/src/import/pull-common.c b/src/import/pull-common.c
index 37387a76e0..9a2ced002b 100644
--- a/src/import/pull-common.c
+++ b/src/import/pull-common.c
@@ -7,6 +7,7 @@
#include "capability-util.h"
#include "copy.h"
#include "dirent-util.h"
+#include "discover-image.h"
#include "escape.h"
#include "fd-util.h"
#include "hostname-util.h"
@@ -37,11 +38,9 @@ int pull_find_old_etags(
int r;
assert(url);
+ assert(image_root);
assert(etags);
- if (!image_root)
- image_root = "/var/lib/machines";
-
_cleanup_free_ char *escaped_url = xescape(url, FILENAME_ESCAPE);
if (!escaped_url)
return -ENOMEM;
@@ -128,11 +127,9 @@ int pull_make_path(const char *url, const char *etag, const char *image_root, co
char *path;
assert(url);
+ assert(image_root);
assert(ret);
- if (!image_root)
- image_root = "/var/lib/machines";
-
escaped_url = xescape(url, FILENAME_ESCAPE);
if (!escaped_url)
return -ENOMEM;
@@ -643,12 +640,12 @@ int pull_job_restart_with_sha256sum(PullJob *j, char **ret) {
return 1;
}
-bool pull_validate_local(const char *name, PullFlags flags) {
+bool pull_validate_local(const char *name, ImportFlags flags) {
- if (FLAGS_SET(flags, PULL_DIRECT))
+ if (FLAGS_SET(flags, IMPORT_DIRECT))
return path_is_valid(name);
- return hostname_is_valid(name, 0);
+ return image_name_is_valid(name);
}
int pull_url_needs_checksum(const char *url) {
diff --git a/src/import/pull-common.h b/src/import/pull-common.h
index 475613a907..82e25267e3 100644
--- a/src/import/pull-common.h
+++ b/src/import/pull-common.h
@@ -3,27 +3,10 @@
#include <stdbool.h>
+#include "import-common.h"
#include "import-util.h"
#include "pull-job.h"
-typedef enum PullFlags {
- PULL_FORCE = 1 << 0, /* replace existing image */
- PULL_READ_ONLY = 1 << 1, /* make generated image read-only */
- PULL_SETTINGS = 1 << 2, /* download .nspawn settings file */
- PULL_ROOTHASH = 1 << 3, /* only for raw: download .roothash file for verity */
- PULL_ROOTHASH_SIGNATURE = 1 << 4, /* only for raw: download .roothash.p7s file for verity */
- PULL_VERITY = 1 << 5, /* only for raw: download .verity file for verity */
- PULL_BTRFS_SUBVOL = 1 << 6, /* tar: preferably create images as btrfs subvols */
- PULL_BTRFS_QUOTA = 1 << 7, /* tar: set up btrfs quota for new subvolume as child of parent subvolume */
- PULL_CONVERT_QCOW2 = 1 << 8, /* raw: if we detect a qcow2 image, unpack it */
- PULL_DIRECT = 1 << 9, /* download without rename games */
- PULL_SYNC = 1 << 10, /* fsync() right before we are done */
-
- /* The supported flags for the tar and the raw pulling */
- PULL_FLAGS_MASK_TAR = PULL_FORCE|PULL_READ_ONLY|PULL_SETTINGS|PULL_BTRFS_SUBVOL|PULL_BTRFS_QUOTA|PULL_DIRECT|PULL_SYNC,
- PULL_FLAGS_MASK_RAW = PULL_FORCE|PULL_READ_ONLY|PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY|PULL_CONVERT_QCOW2|PULL_DIRECT|PULL_SYNC,
-} PullFlags;
-
int pull_find_old_etags(const char *url, const char *root, int dt, const char *prefix, const char *suffix, char ***etags);
int pull_make_path(const char *url, const char *etag, const char *image_root, const char *prefix, const char *suffix, char **ret);
@@ -44,6 +27,6 @@ int verification_style_from_url(const char *url, VerificationStyle *style);
int pull_job_restart_with_sha256sum(PullJob *job, char **ret);
-bool pull_validate_local(const char *name, PullFlags flags);
+bool pull_validate_local(const char *name, ImportFlags flags);
int pull_url_needs_checksum(const char *url);
diff --git a/src/import/pull-job.c b/src/import/pull-job.c
index bed7e64030..a4feda4081 100644
--- a/src/import/pull-job.c
+++ b/src/import/pull-job.c
@@ -187,7 +187,7 @@ void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
}
}
- r = log_error_errno(
+ r = log_notice_errno(
status == 404 ? SYNTHETIC_ERRNO(ENOMEDIUM) : SYNTHETIC_ERRNO(EIO), /* Make the most common error recognizable */
"HTTP request to %s failed with code %li.", j->url, status);
goto finish;
diff --git a/src/import/pull-raw.c b/src/import/pull-raw.c
index dc5434cd2d..f3e6b3af8c 100644
--- a/src/import/pull-raw.c
+++ b/src/import/pull-raw.c
@@ -42,7 +42,7 @@ struct RawPull {
sd_event *event;
CurlGlue *glue;
- PullFlags flags;
+ ImportFlags flags;
ImportVerify verify;
char *image_root;
@@ -60,7 +60,7 @@ struct RawPull {
void *userdata;
char *local; /* In PULL_DIRECT mode the path we are supposed to place things in, otherwise the
- * machine name of the final copy we make */
+ * image name of the final copy we make */
char *final_path;
char *temp_path;
@@ -127,8 +127,9 @@ int raw_pull_new(
int r;
assert(ret);
+ assert(image_root);
- root = strdup(image_root ?: "/var/lib/machines");
+ root = strdup(image_root);
if (!root)
return -ENOMEM;
@@ -244,9 +245,9 @@ static int raw_pull_maybe_convert_qcow2(RawPull *i) {
assert(i);
assert(i->raw_job);
- assert(!FLAGS_SET(i->flags, PULL_DIRECT));
+ assert(!FLAGS_SET(i->flags, IMPORT_DIRECT));
- if (!FLAGS_SET(i->flags, PULL_CONVERT_QCOW2))
+ if (!FLAGS_SET(i->flags, IMPORT_CONVERT_QCOW2))
return 0;
assert(i->final_path);
@@ -310,7 +311,7 @@ static int raw_pull_copy_auxiliary_file(
const char *suffix,
char **path /* input + output (!) */) {
- const char *local;
+ _cleanup_free_ char *local = NULL;
int r;
assert(i);
@@ -321,21 +322,29 @@ static int raw_pull_copy_auxiliary_file(
if (r < 0)
return r;
- local = strjoina(i->image_root, "/", i->local, suffix);
+ local = strjoin(i->image_root, "/", i->local, suffix);
+ if (!local)
+ return log_oom();
- r = copy_file_atomic(
- *path,
- local,
- 0644,
- COPY_REFLINK |
- (FLAGS_SET(i->flags, PULL_FORCE) ? COPY_REPLACE : 0) |
- (FLAGS_SET(i->flags, PULL_SYNC) ? COPY_FSYNC_FULL : 0));
+ if (FLAGS_SET(i->flags, IMPORT_PULL_KEEP_DOWNLOAD))
+ r = copy_file_atomic(
+ *path,
+ local,
+ 0644,
+ COPY_REFLINK |
+ (FLAGS_SET(i->flags, IMPORT_FORCE) ? COPY_REPLACE : 0) |
+ (FLAGS_SET(i->flags, IMPORT_SYNC) ? COPY_FSYNC_FULL : 0));
+ else
+ r = install_file(AT_FDCWD, *path,
+ AT_FDCWD, local,
+ (i->flags & IMPORT_FORCE ? INSTALL_REPLACE : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_SYNCFS : 0));
if (r == -EEXIST)
log_warning_errno(r, "File %s already exists, not replacing.", local);
else if (r == -ENOENT)
log_debug_errno(r, "Skipping creation of auxiliary file, since none was found.");
else if (r < 0)
- log_warning_errno(r, "Failed to copy file %s, ignoring: %m", local);
+ log_warning_errno(r, "Failed to install file %s, ignoring: %m", local);
else
log_info("Created new file %s.", local);
@@ -344,14 +353,12 @@ static int raw_pull_copy_auxiliary_file(
static int raw_pull_make_local_copy(RawPull *i) {
_cleanup_(unlink_and_freep) char *tp = NULL;
- _cleanup_free_ char *f = NULL;
- _cleanup_close_ int dfd = -EBADF;
- const char *p;
+ _cleanup_free_ char *p = NULL;
int r;
assert(i);
assert(i->raw_job);
- assert(!FLAGS_SET(i->flags, PULL_DIRECT));
+ assert(!FLAGS_SET(i->flags, IMPORT_DIRECT));
if (!i->local)
return 0;
@@ -374,62 +381,73 @@ static int raw_pull_make_local_copy(RawPull *i) {
return log_error_errno(errno, "Failed to seek to beginning of vendor image: %m");
}
- p = strjoina(i->image_root, "/", i->local, ".raw");
-
- r = tempfn_random(p, NULL, &f);
- if (r < 0)
+ p = strjoin(i->image_root, "/", i->local, ".raw");
+ if (!p)
return log_oom();
- dfd = open(f, O_WRONLY|O_CREAT|O_EXCL|O_NOCTTY|O_CLOEXEC, 0664);
- if (dfd < 0)
- return log_error_errno(errno, "Failed to create writable copy of image: %m");
+ const char *source;
+ if (FLAGS_SET(i->flags, IMPORT_PULL_KEEP_DOWNLOAD)) {
+ _cleanup_close_ int dfd = -EBADF;
+ _cleanup_free_ char *f = NULL;
+
+ r = tempfn_random(p, NULL, &f);
+ if (r < 0)
+ return log_oom();
- tp = TAKE_PTR(f);
+ dfd = open(f, O_WRONLY|O_CREAT|O_EXCL|O_NOCTTY|O_CLOEXEC, 0664);
+ if (dfd < 0)
+ return log_error_errno(errno, "Failed to create writable copy of image: %m");
- /* Turn off COW writing. This should greatly improve performance on COW file systems like btrfs,
- * since it reduces fragmentation caused by not allowing in-place writes. */
- (void) import_set_nocow_and_log(dfd, tp);
+ tp = TAKE_PTR(f);
- r = copy_bytes(i->raw_job->disk_fd, dfd, UINT64_MAX, COPY_REFLINK);
- if (r < 0)
- return log_error_errno(r, "Failed to make writable copy of image: %m");
+ /* Turn off COW writing. This should greatly improve performance on COW file systems like btrfs,
+ * since it reduces fragmentation caused by not allowing in-place writes. */
+ (void) import_set_nocow_and_log(dfd, tp);
+
+ r = copy_bytes(i->raw_job->disk_fd, dfd, UINT64_MAX, COPY_REFLINK);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make writable copy of image: %m");
+
+ (void) copy_times(i->raw_job->disk_fd, dfd, COPY_CRTIME);
+ (void) copy_xattr(i->raw_job->disk_fd, NULL, dfd, NULL, 0);
- (void) copy_times(i->raw_job->disk_fd, dfd, COPY_CRTIME);
- (void) copy_xattr(i->raw_job->disk_fd, NULL, dfd, NULL, 0);
+ dfd = safe_close(dfd);
- dfd = safe_close(dfd);
+ source = tp;
+ } else
+ source = i->final_path;
- r = install_file(AT_FDCWD, tp,
+ r = install_file(AT_FDCWD, source,
AT_FDCWD, p,
- (i->flags & PULL_FORCE ? INSTALL_REPLACE : 0) |
- (i->flags & PULL_READ_ONLY ? INSTALL_READ_ONLY : 0) |
- (i->flags & PULL_SYNC ? INSTALL_FSYNC_FULL : 0));
+ (i->flags & IMPORT_FORCE ? INSTALL_REPLACE : 0) |
+ (i->flags & IMPORT_READ_ONLY ? INSTALL_READ_ONLY : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_FSYNC_FULL : 0));
if (r < 0)
- return log_error_errno(errno, "Failed to move local image into place '%s': %m", p);
+ return log_error_errno(r, "Failed to move local image into place '%s': %m", p);
tp = mfree(tp);
log_info("Created new local image '%s'.", i->local);
- if (FLAGS_SET(i->flags, PULL_SETTINGS)) {
+ if (FLAGS_SET(i->flags, IMPORT_PULL_SETTINGS)) {
r = raw_pull_copy_auxiliary_file(i, ".nspawn", &i->settings_path);
if (r < 0)
return r;
}
- if (FLAGS_SET(i->flags, PULL_ROOTHASH)) {
+ if (FLAGS_SET(i->flags, IMPORT_PULL_ROOTHASH)) {
r = raw_pull_copy_auxiliary_file(i, ".roothash", &i->roothash_path);
if (r < 0)
return r;
}
- if (FLAGS_SET(i->flags, PULL_ROOTHASH_SIGNATURE)) {
+ if (FLAGS_SET(i->flags, IMPORT_PULL_ROOTHASH_SIGNATURE)) {
r = raw_pull_copy_auxiliary_file(i, ".roothash.p7s", &i->roothash_signature_path);
if (r < 0)
return r;
}
- if (FLAGS_SET(i->flags, PULL_VERITY)) {
+ if (FLAGS_SET(i->flags, IMPORT_PULL_VERITY)) {
r = raw_pull_copy_auxiliary_file(i, ".verity", &i->verity_path);
if (r < 0)
return r;
@@ -485,7 +503,7 @@ static int raw_pull_rename_auxiliary_file(
AT_FDCWD, *temp_path,
AT_FDCWD, *path,
INSTALL_READ_ONLY|
- (i->flags & PULL_SYNC ? INSTALL_FSYNC_FULL : 0));
+ (i->flags & IMPORT_SYNC ? INSTALL_FSYNC_FULL : 0));
if (r < 0)
return log_error_errno(r, "Failed to move '%s' into place: %m", *path);
@@ -588,7 +606,7 @@ static void raw_pull_job_on_finished(PullJob *j) {
goto finish;
}
- if (i->flags & PULL_DIRECT) {
+ if (i->flags & IMPORT_DIRECT) {
assert(!i->settings_job);
assert(!i->roothash_job);
assert(!i->roothash_signature_job);
@@ -599,8 +617,8 @@ static void raw_pull_job_on_finished(PullJob *j) {
if (i->local) {
r = install_file(AT_FDCWD, i->local,
AT_FDCWD, NULL,
- ((i->flags & PULL_READ_ONLY) && i->offset == UINT64_MAX ? INSTALL_READ_ONLY : 0) |
- (i->flags & PULL_SYNC ? INSTALL_FSYNC_FULL : 0));
+ ((i->flags & IMPORT_READ_ONLY) && i->offset == UINT64_MAX ? INSTALL_READ_ONLY : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_FSYNC_FULL : 0));
if (r < 0) {
log_error_errno(r, "Failed to finalize raw file to '%s': %m", i->local);
goto finish;
@@ -627,8 +645,8 @@ static void raw_pull_job_on_finished(PullJob *j) {
r = install_file(AT_FDCWD, i->temp_path,
AT_FDCWD, i->final_path,
- INSTALL_READ_ONLY|
- (i->flags & PULL_SYNC ? INSTALL_FSYNC_FULL : 0));
+ (i->flags & IMPORT_PULL_KEEP_DOWNLOAD ? INSTALL_READ_ONLY : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_FSYNC_FULL : 0));
if (r < 0) {
log_error_errno(r, "Failed to move raw file to '%s': %m", i->final_path);
goto finish;
@@ -694,7 +712,7 @@ static int raw_pull_job_on_open_disk_generic(
assert(extra);
assert(temp_path);
- assert(!FLAGS_SET(i->flags, PULL_DIRECT));
+ assert(!FLAGS_SET(i->flags, IMPORT_DIRECT));
if (!*temp_path) {
r = tempfn_random_child(i->image_root, extra, temp_path);
@@ -722,7 +740,7 @@ static int raw_pull_job_on_open_disk_raw(PullJob *j) {
assert(i->raw_job == j);
assert(j->disk_fd < 0);
- if (i->flags & PULL_DIRECT) {
+ if (i->flags & IMPORT_DIRECT) {
if (!i->local) { /* If no local name specified, the pull job will write its data to stdout */
j->disk_fd = STDOUT_FILENO;
@@ -816,7 +834,7 @@ int raw_pull_start(
const char *local,
uint64_t offset,
uint64_t size_max,
- PullFlags flags,
+ ImportFlags flags,
ImportVerify verify,
const char *checksum) {
@@ -827,10 +845,10 @@ int raw_pull_start(
assert(verify == _IMPORT_VERIFY_INVALID || verify < _IMPORT_VERIFY_MAX);
assert(verify == _IMPORT_VERIFY_INVALID || verify >= 0);
assert((verify < 0) || !checksum);
- assert(!(flags & ~PULL_FLAGS_MASK_RAW));
- assert(offset == UINT64_MAX || FLAGS_SET(flags, PULL_DIRECT));
- assert(!(flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) || !(flags & PULL_DIRECT));
- assert(!(flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) || !checksum);
+ assert(!(flags & ~IMPORT_PULL_FLAGS_MASK_RAW));
+ assert(offset == UINT64_MAX || FLAGS_SET(flags, IMPORT_DIRECT));
+ assert(!(flags & (IMPORT_PULL_SETTINGS|IMPORT_PULL_ROOTHASH|IMPORT_PULL_ROOTHASH_SIGNATURE|IMPORT_PULL_VERITY)) || !(flags & IMPORT_DIRECT));
+ assert(!(flags & (IMPORT_PULL_SETTINGS|IMPORT_PULL_ROOTHASH|IMPORT_PULL_ROOTHASH_SIGNATURE|IMPORT_PULL_VERITY)) || !checksum);
if (!http_url_is_valid(url) && !file_url_is_valid(url))
return -EINVAL;
@@ -880,7 +898,7 @@ int raw_pull_start(
if (offset != UINT64_MAX)
i->raw_job->offset = i->offset = offset;
- if (!FLAGS_SET(flags, PULL_DIRECT)) {
+ if (!FLAGS_SET(flags, IMPORT_DIRECT)) {
r = pull_find_old_etags(url, i->image_root, DT_REG, ".raw-", ".raw", &i->raw_job->old_etags);
if (r < 0)
return r;
@@ -898,7 +916,7 @@ int raw_pull_start(
if (r < 0)
return r;
- if (FLAGS_SET(flags, PULL_SETTINGS)) {
+ if (FLAGS_SET(flags, IMPORT_PULL_SETTINGS)) {
r = pull_make_auxiliary_job(
&i->settings_job,
url,
@@ -913,7 +931,7 @@ int raw_pull_start(
return r;
}
- if (FLAGS_SET(flags, PULL_ROOTHASH)) {
+ if (FLAGS_SET(flags, IMPORT_PULL_ROOTHASH)) {
r = pull_make_auxiliary_job(
&i->roothash_job,
url,
@@ -928,7 +946,7 @@ int raw_pull_start(
return r;
}
- if (FLAGS_SET(flags, PULL_ROOTHASH_SIGNATURE)) {
+ if (FLAGS_SET(flags, IMPORT_PULL_ROOTHASH_SIGNATURE)) {
r = pull_make_auxiliary_job(
&i->roothash_signature_job,
url,
@@ -943,7 +961,7 @@ int raw_pull_start(
return r;
}
- if (FLAGS_SET(flags, PULL_VERITY)) {
+ if (FLAGS_SET(flags, IMPORT_PULL_VERITY)) {
r = pull_make_auxiliary_job(
&i->verity_job,
url,
@@ -972,7 +990,7 @@ int raw_pull_start(
continue;
j->on_progress = raw_pull_job_on_progress;
- j->sync = FLAGS_SET(flags, PULL_SYNC);
+ j->sync = FLAGS_SET(flags, IMPORT_SYNC);
r = pull_job_begin(j);
if (r < 0)
diff --git a/src/import/pull-raw.h b/src/import/pull-raw.h
index b39e4e257c..e50ba326f6 100644
--- a/src/import/pull-raw.h
+++ b/src/import/pull-raw.h
@@ -16,4 +16,4 @@ RawPull* raw_pull_unref(RawPull *pull);
DEFINE_TRIVIAL_CLEANUP_FUNC(RawPull*, raw_pull_unref);
-int raw_pull_start(RawPull *pull, const char *url, const char *local, uint64_t offset, uint64_t size_max, PullFlags flags, ImportVerify verify, const char *checksum);
+int raw_pull_start(RawPull *pull, const char *url, const char *local, uint64_t offset, uint64_t size_max, ImportFlags flags, ImportVerify verify, const char *checksum);
diff --git a/src/import/pull-tar.c b/src/import/pull-tar.c
index 9e185c255a..7fc71fe6f3 100644
--- a/src/import/pull-tar.c
+++ b/src/import/pull-tar.c
@@ -41,7 +41,7 @@ struct TarPull {
sd_event *event;
CurlGlue *glue;
- PullFlags flags;
+ ImportFlags flags;
ImportVerify verify;
char *image_root;
@@ -106,9 +106,10 @@ int tar_pull_new(
_cleanup_free_ char *root = NULL;
int r;
+ assert(image_root);
assert(ret);
- root = strdup(image_root ?: "/var/lib/machines");
+ root = strdup(image_root);
if (!root)
return -ENOMEM;
@@ -219,7 +220,8 @@ static int tar_pull_determine_path(
static int tar_pull_make_local_copy(TarPull *i) {
_cleanup_(rm_rf_subvolume_and_freep) char *t = NULL;
- const char *p;
+ _cleanup_free_ char *p = NULL;
+ const char *source;
int r;
assert(i);
@@ -230,30 +232,37 @@ static int tar_pull_make_local_copy(TarPull *i) {
assert(i->final_path);
- p = prefix_roota(i->image_root, i->local);
+ p = path_join(i->image_root, i->local);
+ if (!p)
+ return log_oom();
- r = tempfn_random(p, NULL, &t);
- if (r < 0)
- return log_error_errno(r, "Failed to generate temporary filename for %s: %m", p);
-
- if (i->flags & PULL_BTRFS_SUBVOL)
- r = btrfs_subvol_snapshot_at(
- AT_FDCWD, i->final_path,
- AT_FDCWD, t,
- (i->flags & PULL_BTRFS_QUOTA ? BTRFS_SNAPSHOT_QUOTA : 0)|
- BTRFS_SNAPSHOT_FALLBACK_COPY|
- BTRFS_SNAPSHOT_FALLBACK_DIRECTORY|
- BTRFS_SNAPSHOT_RECURSIVE);
- else
- r = copy_tree(i->final_path, t, UID_INVALID, GID_INVALID, COPY_REFLINK|COPY_HARDLINKS, NULL, NULL);
- if (r < 0)
- return log_error_errno(r, "Failed to create local image: %m");
+ if (FLAGS_SET(i->flags, IMPORT_PULL_KEEP_DOWNLOAD)) {
+ r = tempfn_random(p, NULL, &t);
+ if (r < 0)
+ return log_error_errno(r, "Failed to generate temporary filename for %s: %m", p);
+
+ if (i->flags & IMPORT_BTRFS_SUBVOL)
+ r = btrfs_subvol_snapshot_at(
+ AT_FDCWD, i->final_path,
+ AT_FDCWD, t,
+ (i->flags & IMPORT_BTRFS_QUOTA ? BTRFS_SNAPSHOT_QUOTA : 0)|
+ BTRFS_SNAPSHOT_FALLBACK_COPY|
+ BTRFS_SNAPSHOT_FALLBACK_DIRECTORY|
+ BTRFS_SNAPSHOT_RECURSIVE);
+ else
+ r = copy_tree(i->final_path, t, UID_INVALID, GID_INVALID, COPY_REFLINK|COPY_HARDLINKS, NULL, NULL);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create local image: %m");
- r = install_file(AT_FDCWD, t,
+ source = t;
+ } else
+ source = i->final_path;
+
+ r = install_file(AT_FDCWD, source,
AT_FDCWD, p,
- (i->flags & PULL_FORCE ? INSTALL_REPLACE : 0) |
- (i->flags & PULL_READ_ONLY ? INSTALL_READ_ONLY : 0) |
- (i->flags & PULL_SYNC ? INSTALL_SYNCFS : 0));
+ (i->flags & IMPORT_FORCE ? INSTALL_REPLACE : 0) |
+ (i->flags & IMPORT_READ_ONLY ? INSTALL_READ_ONLY : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_SYNCFS : 0));
if (r < 0)
return log_error_errno(r, "Failed to install local image '%s': %m", p);
@@ -261,29 +270,37 @@ static int tar_pull_make_local_copy(TarPull *i) {
log_info("Created new local image '%s'.", i->local);
- if (FLAGS_SET(i->flags, PULL_SETTINGS)) {
- const char *local_settings;
+ if (FLAGS_SET(i->flags, IMPORT_PULL_SETTINGS)) {
+ _cleanup_free_ char *local_settings = NULL;
assert(i->settings_job);
r = tar_pull_determine_path(i, ".nspawn", &i->settings_path);
if (r < 0)
return r;
- local_settings = strjoina(i->image_root, "/", i->local, ".nspawn");
+ local_settings = strjoin(i->image_root, "/", i->local, ".nspawn");
+ if (!local_settings)
+ return log_oom();
- r = copy_file_atomic(
- i->settings_path,
- local_settings,
- 0664,
- COPY_REFLINK |
- (FLAGS_SET(i->flags, PULL_FORCE) ? COPY_REPLACE : 0) |
- (FLAGS_SET(i->flags, PULL_SYNC) ? COPY_FSYNC_FULL : 0));
+ if (FLAGS_SET(i->flags, IMPORT_PULL_KEEP_DOWNLOAD))
+ r = copy_file_atomic(
+ i->settings_path,
+ local_settings,
+ 0664,
+ COPY_REFLINK |
+ (FLAGS_SET(i->flags, IMPORT_FORCE) ? COPY_REPLACE : 0) |
+ (FLAGS_SET(i->flags, IMPORT_SYNC) ? COPY_FSYNC_FULL : 0));
+ else
+ r = install_file(AT_FDCWD, i->settings_path,
+ AT_FDCWD, local_settings,
+ (i->flags & IMPORT_FORCE ? INSTALL_REPLACE : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_SYNCFS : 0));
if (r == -EEXIST)
log_warning_errno(r, "Settings file %s already exists, not replacing.", local_settings);
else if (r == -ENOENT)
log_debug_errno(r, "Skipping creation of settings file, since none was found.");
else if (r < 0)
- log_warning_errno(r, "Failed to copy settings files %s, ignoring: %m", local_settings);
+ log_warning_errno(r, "Failed to install settings files %s, ignoring: %m", local_settings);
else
log_info("Created new settings file %s.", local_settings);
}
@@ -392,7 +409,7 @@ static void tar_pull_job_on_finished(PullJob *j) {
goto finish;
}
- if (i->flags & PULL_DIRECT) {
+ if (i->flags & IMPORT_DIRECT) {
assert(!i->settings_job);
assert(i->local);
assert(!i->temp_path);
@@ -406,8 +423,8 @@ static void tar_pull_job_on_finished(PullJob *j) {
r = install_file(
AT_FDCWD, i->local,
AT_FDCWD, NULL,
- (i->flags & PULL_READ_ONLY) ? INSTALL_READ_ONLY : 0 |
- (i->flags & PULL_SYNC ? INSTALL_SYNCFS : 0));
+ (i->flags & IMPORT_READ_ONLY) ? INSTALL_READ_ONLY : 0 |
+ (i->flags & IMPORT_SYNC ? INSTALL_SYNCFS : 0));
if (r < 0) {
log_error_errno(r, "Failed to finalize '%s': %m", i->local);
goto finish;
@@ -432,8 +449,8 @@ static void tar_pull_job_on_finished(PullJob *j) {
r = install_file(
AT_FDCWD, i->temp_path,
AT_FDCWD, i->final_path,
- INSTALL_READ_ONLY|
- (i->flags & PULL_SYNC ? INSTALL_SYNCFS : 0));
+ (i->flags & IMPORT_PULL_KEEP_DOWNLOAD ? INSTALL_READ_ONLY : 0) |
+ (i->flags & IMPORT_SYNC ? INSTALL_SYNCFS : 0));
if (r < 0) {
log_error_errno(r, "Failed to rename to final image name to %s: %m", i->final_path);
goto finish;
@@ -460,7 +477,7 @@ static void tar_pull_job_on_finished(PullJob *j) {
AT_FDCWD, i->settings_temp_path,
AT_FDCWD, i->settings_path,
INSTALL_READ_ONLY|
- (i->flags & PULL_SYNC ? INSTALL_FSYNC_FULL : 0));
+ (i->flags & IMPORT_SYNC ? INSTALL_FSYNC_FULL : 0));
if (r < 0) {
log_error_errno(r, "Failed to rename settings file to %s: %m", i->settings_path);
goto finish;
@@ -498,7 +515,7 @@ static int tar_pull_job_on_open_disk_tar(PullJob *j) {
assert(i->tar_job == j);
assert(i->tar_pid <= 0);
- if (i->flags & PULL_DIRECT)
+ if (i->flags & IMPORT_DIRECT)
where = i->local;
else {
if (!i->temp_path) {
@@ -512,20 +529,20 @@ static int tar_pull_job_on_open_disk_tar(PullJob *j) {
(void) mkdir_parents_label(where, 0700);
- if (FLAGS_SET(i->flags, PULL_DIRECT|PULL_FORCE))
+ if (FLAGS_SET(i->flags, IMPORT_DIRECT|IMPORT_FORCE))
(void) rm_rf(where, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME);
- if (i->flags & PULL_BTRFS_SUBVOL)
+ if (i->flags & IMPORT_BTRFS_SUBVOL)
r = btrfs_subvol_make_fallback(AT_FDCWD, where, 0755);
else
r = RET_NERRNO(mkdir(where, 0755));
- if (r == -EEXIST && (i->flags & PULL_DIRECT)) /* EEXIST is OK if in direct mode, but not otherwise,
+ if (r == -EEXIST && (i->flags & IMPORT_DIRECT)) /* EEXIST is OK if in direct mode, but not otherwise,
* because in that case our temporary path collided */
r = 0;
if (r < 0)
return log_error_errno(r, "Failed to create directory/subvolume %s: %m", where);
- if (r > 0 && (i->flags & PULL_BTRFS_QUOTA)) { /* actually btrfs subvol */
- if (!(i->flags & PULL_DIRECT))
+ if (r > 0 && (i->flags & IMPORT_BTRFS_QUOTA)) { /* actually btrfs subvol */
+ if (!(i->flags & IMPORT_DIRECT))
(void) import_assign_pool_quota_and_warn(i->image_root);
(void) import_assign_pool_quota_and_warn(where);
}
@@ -577,7 +594,7 @@ int tar_pull_start(
TarPull *i,
const char *url,
const char *local,
- PullFlags flags,
+ ImportFlags flags,
ImportVerify verify,
const char *checksum) {
@@ -587,9 +604,9 @@ int tar_pull_start(
assert(verify == _IMPORT_VERIFY_INVALID || verify < _IMPORT_VERIFY_MAX);
assert(verify == _IMPORT_VERIFY_INVALID || verify >= 0);
assert((verify < 0) || !checksum);
- assert(!(flags & ~PULL_FLAGS_MASK_TAR));
- assert(!(flags & PULL_SETTINGS) || !(flags & PULL_DIRECT));
- assert(!(flags & PULL_SETTINGS) || !checksum);
+ assert(!(flags & ~IMPORT_PULL_FLAGS_MASK_TAR));
+ assert(!(flags & IMPORT_PULL_SETTINGS) || !(flags & IMPORT_DIRECT));
+ assert(!(flags & IMPORT_PULL_SETTINGS) || !checksum);
if (!http_url_is_valid(url) && !file_url_is_valid(url))
return -EINVAL;
@@ -620,7 +637,7 @@ int tar_pull_start(
i->tar_job->on_open_disk = tar_pull_job_on_open_disk_tar;
i->tar_job->calc_checksum = checksum || IN_SET(verify, IMPORT_VERIFY_CHECKSUM, IMPORT_VERIFY_SIGNATURE);
- if (!FLAGS_SET(flags, PULL_DIRECT)) {
+ if (!FLAGS_SET(flags, IMPORT_DIRECT)) {
r = pull_find_old_etags(url, i->image_root, DT_DIR, ".tar-", NULL, &i->tar_job->old_etags);
if (r < 0)
return r;
@@ -640,7 +657,7 @@ int tar_pull_start(
return r;
/* Set up download job for the settings file (.nspawn) */
- if (FLAGS_SET(flags, PULL_SETTINGS)) {
+ if (FLAGS_SET(flags, IMPORT_PULL_SETTINGS)) {
r = pull_make_auxiliary_job(
&i->settings_job,
url,
@@ -666,7 +683,7 @@ int tar_pull_start(
continue;
j->on_progress = tar_pull_job_on_progress;
- j->sync = FLAGS_SET(flags, PULL_SYNC);
+ j->sync = FLAGS_SET(flags, IMPORT_SYNC);
r = pull_job_begin(j);
if (r < 0)
diff --git a/src/import/pull-tar.h b/src/import/pull-tar.h
index e54c01c302..1a5b740463 100644
--- a/src/import/pull-tar.h
+++ b/src/import/pull-tar.h
@@ -16,4 +16,4 @@ TarPull* tar_pull_unref(TarPull *pull);
DEFINE_TRIVIAL_CLEANUP_FUNC(TarPull*, tar_pull_unref);
-int tar_pull_start(TarPull *pull, const char *url, const char *local, PullFlags flags, ImportVerify verify, const char *checksum);
+int tar_pull_start(TarPull *pull, const char *url, const char *local, ImportFlags flags, ImportVerify verify, const char *checksum);
diff --git a/src/import/pull.c b/src/import/pull.c
index 10e3f131a1..7c838a5307 100644
--- a/src/import/pull.c
+++ b/src/import/pull.c
@@ -26,11 +26,12 @@
#include "verbs.h"
#include "web-util.h"
-static const char *arg_image_root = "/var/lib/machines";
+static const char *arg_image_root = NULL;
static ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
-static PullFlags arg_pull_flags = PULL_SETTINGS | PULL_ROOTHASH | PULL_ROOTHASH_SIGNATURE | PULL_VERITY | PULL_BTRFS_SUBVOL | PULL_BTRFS_QUOTA | PULL_CONVERT_QCOW2 | PULL_SYNC;
+static ImportFlags arg_import_flags = IMPORT_PULL_SETTINGS | IMPORT_PULL_ROOTHASH | IMPORT_PULL_ROOTHASH_SIGNATURE | IMPORT_PULL_VERITY | IMPORT_BTRFS_SUBVOL | IMPORT_BTRFS_QUOTA | IMPORT_CONVERT_QCOW2 | IMPORT_SYNC;
static uint64_t arg_offset = UINT64_MAX, arg_size_max = UINT64_MAX;
static char *arg_checksum = NULL;
+static ImageClass arg_class = IMAGE_MACHINE;
STATIC_DESTRUCTOR_REGISTER(arg_checksum, freep);
@@ -38,7 +39,7 @@ static int normalize_local(const char *local, const char *url, char **ret) {
_cleanup_free_ char *ll = NULL;
int r;
- if (arg_pull_flags & PULL_DIRECT) {
+ if (arg_import_flags & IMPORT_DIRECT) {
if (!local)
log_debug("Writing downloaded data to STDOUT.");
@@ -58,13 +59,13 @@ static int normalize_local(const char *local, const char *url, char **ret) {
} else if (local) {
- if (!hostname_is_valid(local, 0))
+ if (!image_name_is_valid(local))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Local image name '%s' is not valid.",
local);
- if (!FLAGS_SET(arg_pull_flags, PULL_FORCE)) {
- r = image_find(IMAGE_MACHINE, local, NULL, NULL);
+ if (!FLAGS_SET(arg_import_flags, IMPORT_FORCE)) {
+ r = image_find(arg_class, local, NULL, NULL);
if (r < 0) {
if (r != -ENOENT)
return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local);
@@ -89,6 +90,12 @@ static int normalize_local(const char *local, const char *url, char **ret) {
} else
log_info("Pulling '%s'.", url);
+ if (!FLAGS_SET(arg_import_flags, IMPORT_DIRECT))
+ log_info("Operating on image directory '%s'.", arg_image_root);
+
+ if (!FLAGS_SET(arg_import_flags, IMPORT_SYNC))
+ log_info("File system synchronization on completion is off.");
+
*ret = TAKE_PTR(ll);
return 0;
}
@@ -130,7 +137,7 @@ static int pull_tar(int argc, char *argv[], void *userdata) {
local = ll;
}
- if (!local && FLAGS_SET(arg_pull_flags, PULL_DIRECT))
+ if (!local && FLAGS_SET(arg_import_flags, IMPORT_DIRECT))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Pulling tar images to STDOUT is not supported.");
r = normalize_local(local, url, &normalized);
@@ -141,9 +148,6 @@ static int pull_tar(int argc, char *argv[], void *userdata) {
if (r < 0)
return r;
- if (!FLAGS_SET(arg_pull_flags, PULL_SYNC))
- log_info("File system synchronization on completion is off.");
-
r = tar_pull_new(&pull, event, arg_image_root, on_tar_finished, event);
if (r < 0)
return log_error_errno(r, "Failed to allocate puller: %m");
@@ -152,7 +156,7 @@ static int pull_tar(int argc, char *argv[], void *userdata) {
pull,
url,
normalized,
- arg_pull_flags & PULL_FLAGS_MASK_TAR,
+ arg_import_flags & IMPORT_PULL_FLAGS_MASK_TAR,
arg_verify,
arg_checksum);
if (r < 0)
@@ -211,9 +215,7 @@ static int pull_raw(int argc, char *argv[], void *userdata) {
if (r < 0)
return r;
- if (!FLAGS_SET(arg_pull_flags, PULL_SYNC))
- log_info("File system synchronization on completion is off.");
- r = raw_pull_new(&pull, event, arg_image_root, on_raw_finished, event);
+ r = raw_pull_new(&pull, event, arg_image_root, on_raw_finished, event);
if (r < 0)
return log_error_errno(r, "Failed to allocate puller: %m");
@@ -223,7 +225,7 @@ static int pull_raw(int argc, char *argv[], void *userdata) {
normalized,
arg_offset,
arg_size_max,
- arg_pull_flags & PULL_FLAGS_MASK_RAW,
+ arg_import_flags & IMPORT_PULL_FLAGS_MASK_RAW,
arg_verify,
arg_checksum);
if (r < 0)
@@ -240,7 +242,7 @@ static int pull_raw(int argc, char *argv[], void *userdata) {
static int help(int argc, char *argv[], void *userdata) {
printf("%1$s [OPTIONS...] {COMMAND} ...\n"
- "\n%4$sDownload container or virtual machine images.%5$s\n"
+ "\n%4$sDownload disk images.%5$s\n"
"\n%2$sCommands:%3$s\n"
" tar URL [NAME] Download a TAR image\n"
" raw URL [NAME] Download a RAW image\n"
@@ -255,7 +257,7 @@ static int help(int argc, char *argv[], void *userdata) {
" --roothash-signature=BOOL\n"
" Download root hash signature file with image\n"
" --verity=BOOL Download verity file with image\n"
- " --image-root=PATH Image root directory\n\n"
+ " --image-root=PATH Image root directory\n"
" --read-only Create a read-only image\n"
" --direct Download directly to specified file\n"
" --btrfs-subvol=BOOL Controls whether to create a btrfs subvolume\n"
@@ -266,7 +268,11 @@ static int help(int argc, char *argv[], void *userdata) {
" regular disk images\n"
" --sync=BOOL Controls whether to sync() before completing\n"
" --offset=BYTES Offset to seek to in destination\n"
- " --size-max=BYTES Maximum number of bytes to write to destination\n",
+ " --size-max=BYTES Maximum number of bytes to write to destination\n"
+ " --class=CLASS Select image class (machine, sysext, confext,\n"
+ " portable)\n"
+ " --keep-download=BOOL Keep a copy pristine copy of the downloaded file\n"
+ " around\n",
program_invocation_short_name,
ansi_underline(),
ansi_normal(),
@@ -295,6 +301,8 @@ static int parse_argv(int argc, char *argv[]) {
ARG_SYNC,
ARG_OFFSET,
ARG_SIZE_MAX,
+ ARG_CLASS,
+ ARG_KEEP_DOWNLOAD,
};
static const struct option options[] = {
@@ -315,10 +323,13 @@ static int parse_argv(int argc, char *argv[]) {
{ "sync", required_argument, NULL, ARG_SYNC },
{ "offset", required_argument, NULL, ARG_OFFSET },
{ "size-max", required_argument, NULL, ARG_SIZE_MAX },
+ { "class", required_argument, NULL, ARG_CLASS },
+ { "keep-download", required_argument, NULL, ARG_KEEP_DOWNLOAD },
{}
};
int c, r;
+ bool auto_settings = true, auto_keep_download = true;
assert(argc >= 0);
assert(argv);
@@ -334,7 +345,7 @@ static int parse_argv(int argc, char *argv[]) {
return version();
case ARG_FORCE:
- arg_pull_flags |= PULL_FORCE;
+ arg_import_flags |= IMPORT_FORCE;
break;
case ARG_IMAGE_ROOT:
@@ -366,7 +377,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_oom();
free_and_replace(arg_checksum, hh);
- arg_pull_flags &= ~(PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY);
+ arg_import_flags &= ~(IMPORT_PULL_SETTINGS|IMPORT_PULL_ROOTHASH|IMPORT_PULL_ROOTHASH_SIGNATURE|IMPORT_PULL_VERITY);
arg_verify = _IMPORT_VERIFY_INVALID;
} else
arg_verify = v;
@@ -379,7 +390,8 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_SETTINGS, r);
+ SET_FLAG(arg_import_flags, IMPORT_PULL_SETTINGS, r);
+ auto_settings = false;
break;
case ARG_ROOTHASH:
@@ -387,11 +399,11 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_ROOTHASH, r);
+ SET_FLAG(arg_import_flags, IMPORT_PULL_ROOTHASH, r);
/* If we were asked to turn off the root hash, implicitly also turn off the root hash signature */
if (!r)
- SET_FLAG(arg_pull_flags, PULL_ROOTHASH_SIGNATURE, false);
+ SET_FLAG(arg_import_flags, IMPORT_PULL_ROOTHASH_SIGNATURE, false);
break;
case ARG_ROOTHASH_SIGNATURE:
@@ -399,7 +411,7 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_ROOTHASH_SIGNATURE, r);
+ SET_FLAG(arg_import_flags, IMPORT_PULL_ROOTHASH_SIGNATURE, r);
break;
case ARG_VERITY:
@@ -407,16 +419,16 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_VERITY, r);
+ SET_FLAG(arg_import_flags, IMPORT_PULL_VERITY, r);
break;
case ARG_READ_ONLY:
- arg_pull_flags |= PULL_READ_ONLY;
+ arg_import_flags |= IMPORT_READ_ONLY;
break;
case ARG_DIRECT:
- arg_pull_flags |= PULL_DIRECT;
- arg_pull_flags &= ~(PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY);
+ arg_import_flags |= IMPORT_DIRECT;
+ arg_import_flags &= ~(IMPORT_PULL_SETTINGS|IMPORT_PULL_ROOTHASH|IMPORT_PULL_ROOTHASH_SIGNATURE|IMPORT_PULL_VERITY);
break;
case ARG_BTRFS_SUBVOL:
@@ -424,7 +436,7 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_BTRFS_SUBVOL, r);
+ SET_FLAG(arg_import_flags, IMPORT_BTRFS_SUBVOL, r);
break;
case ARG_BTRFS_QUOTA:
@@ -432,7 +444,7 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_BTRFS_QUOTA, r);
+ SET_FLAG(arg_import_flags, IMPORT_BTRFS_QUOTA, r);
break;
case ARG_CONVERT_QCOW2:
@@ -440,7 +452,7 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_CONVERT_QCOW2, r);
+ SET_FLAG(arg_import_flags, IMPORT_CONVERT_QCOW2, r);
break;
case ARG_SYNC:
@@ -448,7 +460,7 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
- SET_FLAG(arg_pull_flags, PULL_SYNC, r);
+ SET_FLAG(arg_import_flags, IMPORT_SYNC, r);
break;
case ARG_OFFSET: {
@@ -477,6 +489,22 @@ static int parse_argv(int argc, char *argv[]) {
break;
}
+ case ARG_CLASS:
+ arg_class = image_class_from_string(optarg);
+ if (arg_class < 0)
+ return log_error_errno(arg_class, "Failed to parse --class= argument: %s", optarg);
+
+ break;
+
+ case ARG_KEEP_DOWNLOAD:
+ r = parse_boolean(optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse --keep-download= argument: %s", optarg);
+
+ SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, r);
+ auto_keep_download = false;
+ break;
+
case '?':
return -EINVAL;
@@ -490,12 +518,24 @@ static int parse_argv(int argc, char *argv[]) {
!FILE_SIZE_VALID(arg_offset + arg_size_max)))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File offset und maximum size out of range.");
- if (arg_offset != UINT64_MAX && !FLAGS_SET(arg_pull_flags, PULL_DIRECT))
+ if (arg_offset != UINT64_MAX && !FLAGS_SET(arg_import_flags, IMPORT_DIRECT))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File offset only supported in --direct mode.");
- if (arg_checksum && (arg_pull_flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) != 0)
+ if (arg_checksum && (arg_import_flags & (IMPORT_PULL_SETTINGS|IMPORT_PULL_ROOTHASH|IMPORT_PULL_ROOTHASH_SIGNATURE|IMPORT_PULL_VERITY)) != 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Literal checksum verification only supported if no associated files are downloaded.");
+ if (!arg_image_root)
+ arg_image_root = image_root_to_string(arg_class);
+
+ /* .nspawn settings files only really make sense for machine images, not for sysext/confext/portable */
+ if (auto_settings && arg_class != IMAGE_MACHINE)
+ arg_import_flags &= ~IMPORT_PULL_SETTINGS;
+
+ /* Keep the original pristine downloaded file as a copy only when dealing with machine images,
+ * because unlike sysext/confext/portable they are typically modified during runtime. */
+ if (auto_keep_download)
+ SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, arg_class == IMAGE_MACHINE);
+
return 1;
}
@@ -507,19 +547,19 @@ static void parse_env(void) {
r = getenv_bool("SYSTEMD_IMPORT_BTRFS_SUBVOL");
if (r >= 0)
- SET_FLAG(arg_pull_flags, PULL_BTRFS_SUBVOL, r);
+ SET_FLAG(arg_import_flags, IMPORT_BTRFS_SUBVOL, r);
else if (r != -ENXIO)
log_warning_errno(r, "Failed to parse $SYSTEMD_IMPORT_BTRFS_SUBVOL: %m");
r = getenv_bool("SYSTEMD_IMPORT_BTRFS_QUOTA");
if (r >= 0)
- SET_FLAG(arg_pull_flags, PULL_BTRFS_QUOTA, r);
+ SET_FLAG(arg_import_flags, IMPORT_BTRFS_QUOTA, r);
else if (r != -ENXIO)
log_warning_errno(r, "Failed to parse $SYSTEMD_IMPORT_BTRFS_QUOTA: %m");
r = getenv_bool("SYSTEMD_IMPORT_SYNC");
if (r >= 0)
- SET_FLAG(arg_pull_flags, PULL_SYNC, r);
+ SET_FLAG(arg_import_flags, IMPORT_SYNC, r);
else if (r != -ENXIO)
log_warning_errno(r, "Failed to parse $SYSTEMD_IMPORT_SYNC: %m");
}
@@ -539,8 +579,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_parse_environment();
- log_open();
+ log_setup();
parse_env();
diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c
index 91cb2eefaa..74bf6cfcc8 100644
--- a/src/journal-remote/journal-remote-main.c
+++ b/src/journal-remote/journal-remote-main.c
@@ -540,7 +540,7 @@ static int setup_signals(RemoteServer *s) {
assert(s);
- assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM) >= 0);
r = sd_event_add_signal(s->events, &s->sigterm_event, SIGTERM, NULL, s);
if (r < 0)
diff --git a/src/journal-remote/journal-upload.c b/src/journal-remote/journal-upload.c
index 327b7bacd7..1198791ed1 100644
--- a/src/journal-remote/journal-upload.c
+++ b/src/journal-remote/journal-upload.c
@@ -397,7 +397,7 @@ static int setup_signals(Uploader *u) {
assert(u);
- assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM) >= 0);
r = sd_event_add_signal(u->events, &u->sigterm_event, SIGTERM, dispatch_sigterm, u);
if (r < 0)
diff --git a/src/journal-remote/meson.build b/src/journal-remote/meson.build
index 964a251774..10a82751d7 100644
--- a/src/journal-remote/meson.build
+++ b/src/journal-remote/meson.build
@@ -22,9 +22,9 @@ libsystemd_journal_remote = static_library(
libsystemd_journal_remote_sources,
include_directories : includes,
dependencies : [libgnutls,
- liblz4,
+ liblz4_cflags,
libmicrohttpd,
- libxz,
+ libxz_cflags,
threads,
userspace],
build_by_default : false)
@@ -38,9 +38,9 @@ systemd_journal_gatewayd_sources = files(
common_deps = [
libgnutls,
- liblz4,
- libxz,
- libzstd,
+ liblz4_cflags,
+ libxz_cflags,
+ libzstd_cflags,
threads,
]
diff --git a/src/journal/bsod.c b/src/journal/bsod.c
index 7d8aa54b15..a4788b828c 100644
--- a/src/journal/bsod.c
+++ b/src/journal/bsod.c
@@ -17,6 +17,7 @@
#include "log.h"
#include "logs-show.h"
#include "main-func.h"
+#include "parse-argument.h"
#include "pretty-print.h"
#include "qrcode-util.h"
#include "sigbus.h"
@@ -25,6 +26,9 @@
#include "terminal-util.h"
static bool arg_continuous = false;
+static char *arg_tty = NULL;
+
+STATIC_DESTRUCTOR_REGISTER(arg_tty, freep);
static int help(void) {
_cleanup_free_ char *link = NULL;
@@ -34,19 +38,22 @@ static int help(void) {
if (r < 0)
return log_oom();
- printf("%s\n\n"
- "%sFilter the journal to fetch the first message from the\n"
- "current boot with an emergency log level and displays it\n"
- "as a string and a QR code.\n\n%s"
+ printf("%1$s [OPTIONS...]\n\n"
+ "%5$sFilter the journal to fetch the first message from the current boot with an%6$s\n"
+ "%5$semergency log level and display it as a string and a QR code.%6$s\n"
+ "\n%3$sOptions:%4$s\n"
" -h --help Show this help\n"
" --version Show package version\n"
" -c --continuous Make systemd-bsod wait continuously\n"
" for changes in the journal\n"
- "\nSee the %s for details.\n",
+ " --tty=TTY Specify path to TTY to use\n"
+ "\nSee the %2$s for details.\n",
program_invocation_short_name,
- ansi_highlight(),
+ link,
+ ansi_underline(),
ansi_normal(),
- link);
+ ansi_highlight(),
+ ansi_normal());
return 0;
}
@@ -66,16 +73,16 @@ static int acquire_first_emergency_log_message(char **ret) {
r = add_match_this_boot(j, NULL);
if (r < 0)
- return log_warning_errno(r, "Failed to add boot ID filter: %m");
+ return log_error_errno(r, "Failed to add boot ID filter: %m");
r = sd_journal_add_match(j, "_UID=0", 0);
if (r < 0)
- return log_warning_errno(r, "Failed to add User ID filter: %m");
+ return log_error_errno(r, "Failed to add User ID filter: %m");
assert_cc(0 == LOG_EMERG);
r = sd_journal_add_match(j, "PRIORITY=0", 0);
if (r < 0)
- return log_warning_errno(r, "Failed to add Emergency filter: %m");
+ return log_error_errno(r, "Failed to add Emergency filter: %m");
r = sd_journal_seek_head(j);
if (r < 0)
@@ -124,18 +131,18 @@ static int find_next_free_vt(int fd, int *ret_free_vt, int *ret_original_vt) {
for (size_t i = 0; i < sizeof(terminal_status.v_state) * 8; i++)
if ((terminal_status.v_state & (1 << i)) == 0) {
- *ret_free_vt = i;
+ *ret_free_vt = i + 1;
*ret_original_vt = terminal_status.v_active;
return 0;
}
- return log_error_errno(SYNTHETIC_ERRNO(ENOTTY), "No free VT found: %m");
+ return -ENOTTY;
}
static int display_emergency_message_fullscreen(const char *message) {
- int r, ret = 0, free_vt = 0, original_vt = 0;
+ int r, free_vt = 0, original_vt = 0;
unsigned qr_code_start_row = 1, qr_code_start_column = 1;
- char tty[STRLEN("/dev/tty") + DECIMAL_STR_MAX(int) + 1];
+ char ttybuf[STRLEN("/dev/tty") + DECIMAL_STR_MAX(int) + 1];
_cleanup_close_ int fd = -EBADF;
_cleanup_fclose_ FILE *stream = NULL;
char read_character_buffer = '\0';
@@ -143,30 +150,36 @@ static int display_emergency_message_fullscreen(const char *message) {
.ws_col = 80,
.ws_row = 25,
};
+ const char *tty;
assert(message);
- fd = open_terminal("/dev/tty1", O_RDWR|O_NOCTTY|O_CLOEXEC);
- if (fd < 0)
- return log_error_errno(fd, "Failed to open tty1: %m");
+ if (arg_tty)
+ tty = arg_tty;
+ else {
+ fd = open_terminal("/dev/tty1", O_RDWR|O_NOCTTY|O_CLOEXEC);
+ if (fd < 0)
+ return log_error_errno(fd, "Failed to open /dev/tty1: %m");
- r = find_next_free_vt(fd, &free_vt, &original_vt);
- if (r < 0)
- return log_error_errno(r, "Failed to find a free VT: %m");
+ r = find_next_free_vt(fd, &free_vt, &original_vt);
+ if (r < 0)
+ return log_error_errno(r, "Failed to find a free VT: %m");
- xsprintf(tty, "/dev/tty%d", free_vt + 1);
+ xsprintf(ttybuf, "/dev/tty%d", free_vt);
+ tty = ttybuf;
- r = open_terminal(tty, O_RDWR|O_NOCTTY|O_CLOEXEC);
- if (r < 0)
- return log_error_errno(fd, "Failed to open tty: %m");
+ fd = safe_close(fd);
+ }
- close_and_replace(fd, r);
+ fd = open_terminal(tty, O_RDWR|O_NOCTTY|O_CLOEXEC);
+ if (fd < 0)
+ return log_error_errno(fd, "Failed to open %s: %m", tty);
if (ioctl(fd, TIOCGWINSZ, &w) < 0)
log_warning_errno(errno, "Failed to fetch tty size, ignoring: %m");
- if (ioctl(fd, VT_ACTIVATE, free_vt + 1) < 0)
- return log_error_errno(errno, "Failed to activate tty: %m");
+ if (free_vt > 0 && ioctl(fd, VT_ACTIVATE, free_vt) < 0)
+ return log_error_errno(errno, "Failed to activate /dev/tty%i, ignoring: %m", free_vt);
r = loop_write(fd, ANSI_BACKGROUND_BLUE ANSI_HOME_CLEAR, SIZE_MAX);
if (r < 0)
@@ -178,7 +191,7 @@ static int display_emergency_message_fullscreen(const char *message) {
r = loop_write(fd, "The current boot has failed!", SIZE_MAX);
if (r < 0) {
- ret = log_warning_errno(r, "Failed to write to terminal: %m");
+ log_error_errno(r, "Failed to write to terminal: %m");
goto cleanup;
}
@@ -190,13 +203,13 @@ static int display_emergency_message_fullscreen(const char *message) {
r = loop_write(fd, message, SIZE_MAX);
if (r < 0) {
- ret = log_warning_errno(r, "Failed to write emergency message to terminal: %m");
+ log_error_errno(r, "Failed to write emergency message to terminal: %m");
goto cleanup;
}
r = fdopen_independent(fd, "r+", &stream);
if (r < 0) {
- ret = log_error_errno(errno, "Failed to open output file: %m");
+ r = log_error_errno(errno, "Failed to open output file: %m");
goto cleanup;
}
@@ -208,37 +221,41 @@ static int display_emergency_message_fullscreen(const char *message) {
if (r < 0)
log_warning_errno(r, "Failed to move terminal cursor position, ignoring: %m");
- r = loop_write(fd, "Press any key to exit...", SIZE_MAX);
+ r = loop_write(fd, ANSI_BACKGROUND_BLUE "Press any key to exit...", SIZE_MAX);
if (r < 0) {
- ret = log_warning_errno(r, "Failed to write to terminal: %m");
+ log_error_errno(r, "Failed to write to terminal: %m");
goto cleanup;
}
r = read_one_char(stream, &read_character_buffer, USEC_INFINITY, NULL);
if (r < 0 && r != -EINTR)
- ret = log_error_errno(r, "Failed to read character: %m");
+ log_error_errno(r, "Failed to read character: %m");
+
+ r = 0;
cleanup:
- if (ioctl(fd, VT_ACTIVATE, original_vt) < 0)
- return log_error_errno(errno, "Failed to switch back to original VT: %m");
+ if (original_vt > 0 && ioctl(fd, VT_ACTIVATE, original_vt) < 0)
+ log_warning_errno(errno, "Failed to switch back to original VT /dev/tty%i: %m", original_vt);
- return ret;
+ return r;
}
static int parse_argv(int argc, char * argv[]) {
enum {
ARG_VERSION = 0x100,
+ ARG_TTY,
};
static const struct option options[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, ARG_VERSION },
- { "continuous", no_argument, NULL, 'c' },
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, ARG_VERSION },
+ { "continuous", no_argument, NULL, 'c' },
+ { "tty", required_argument, NULL, ARG_TTY },
{}
};
- int c;
+ int c, r;
assert(argc >= 0);
assert(argv);
@@ -257,6 +274,13 @@ static int parse_argv(int argc, char * argv[]) {
arg_continuous = true;
break;
+ case ARG_TTY:
+ r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_tty);
+ if (r < 0)
+ return r;
+
+ break;
+
case '?':
return -EINVAL;
@@ -292,7 +316,7 @@ static int run(int argc, char *argv[]) {
r = acquire_first_emergency_log_message(&message);
if (r < 0)
- return log_error_errno(r, "Failed to acquire first emergency log message: %m");
+ return r;
if (!message) {
log_debug("No emergency-level entries");
@@ -301,11 +325,7 @@ static int run(int argc, char *argv[]) {
assert_se(sigaction_many(&nop_sigaction, SIGTERM, SIGINT) >= 0);
- r = display_emergency_message_fullscreen((const char*) message);
- if (r < 0)
- return log_error_errno(r, "Failed to display emergency message on terminal: %m");
-
- return 0;
+ return display_emergency_message_fullscreen(message);
}
DEFINE_MAIN_FUNCTION(run);
diff --git a/src/journal/fuzz-journald-native-fd.c b/src/journal/fuzz-journald-native-fd.c
index 26395dfbcb..07a8eb55e1 100644
--- a/src/journal/fuzz-journald-native-fd.c
+++ b/src/journal/fuzz-journald-native-fd.c
@@ -30,13 +30,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
.uid = geteuid(),
.gid = getegid(),
};
- server_process_native_file(s, sealed_fd, &ucred, tv, label, label_len);
+ (void) server_process_native_file(s, sealed_fd, &ucred, tv, label, label_len);
unsealed_fd = mkostemp_safe(name);
assert_se(unsealed_fd >= 0);
assert_se(write(unsealed_fd, data, size) == (ssize_t) size);
assert_se(lseek(unsealed_fd, 0, SEEK_SET) == 0);
- server_process_native_file(s, unsealed_fd, &ucred, tv, label, label_len);
+ (void) server_process_native_file(s, unsealed_fd, &ucred, tv, label, label_len);
return 0;
}
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 6262dd0aa6..6f83585db5 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -2326,7 +2326,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_REQUIRE_ROOT |
DISSECT_IMAGE_VALIDATE_OS |
DISSECT_IMAGE_RELAX_VAR_CHECK |
- (arg_action == ACTION_UPDATE_CATALOG ? DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS : DISSECT_IMAGE_READ_ONLY),
+ (arg_action == ACTION_UPDATE_CATALOG ? DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS : DISSECT_IMAGE_READ_ONLY) |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/journal/journald-native.c b/src/journal/journald-native.c
index 648d2254fd..d6bceb0e4a 100644
--- a/src/journal/journald-native.c
+++ b/src/journal/journald-native.c
@@ -326,7 +326,7 @@ void server_process_native_message(
} while (r == 0);
}
-void server_process_native_file(
+int server_process_native_file(
Server *s,
int fd,
const struct ucred *ucred,
@@ -342,32 +342,25 @@ void server_process_native_file(
assert(s);
assert(fd >= 0);
- if (fstat(fd, &st) < 0) {
- log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT, "Failed to stat passed file, ignoring: %m");
- return;
- }
+ if (fstat(fd, &st) < 0)
+ return log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
+ "Failed to stat passed file: %m");
r = stat_verify_regular(&st);
- if (r < 0) {
- log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT, "File passed is not regular, ignoring: %m");
- return;
- }
+ if (r < 0)
+ return log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
+ "File passed is not regular, ignoring message: %m");
if (st.st_size <= 0)
- return;
+ return 0;
- int flags = fcntl(fd, F_GETFL);
- if (flags < 0) {
- log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT, "Failed to get flags of passed file, ignoring: %m");
- return;
- }
-
- if (UNSAFE_FD_FLAGS(flags) != 0) {
- log_ratelimit_error(JOURNAL_LOG_RATELIMIT,
- "Unexpected flags of passed memory fd (0%o), ignoring message: %m",
- UNSAFE_FD_FLAGS(flags));
- return;
- }
+ r = fd_verify_safe_flags(fd);
+ if (r == -EREMOTEIO)
+ return log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
+ "Unexpected flags of passed memory fd, ignoring message.");
+ if (r < 0)
+ return log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
+ "Failed to get flags of passed file: %m");
/* If it's a memfd, check if it is sealed. If so, we can just mmap it and use it, and do not need to
* copy the data out. */
@@ -381,34 +374,26 @@ void server_process_native_file(
* path. */
r = fd_get_path(fd, &k);
- if (r < 0) {
- log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
- "readlink(/proc/self/fd/%i) failed: %m", fd);
- return;
- }
+ if (r < 0)
+ return log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
+ "Failed to get path of passed fd: %m");
e = PATH_STARTSWITH_SET(k, "/dev/shm/", "/tmp/", "/var/tmp/");
- if (!e) {
- log_ratelimit_error(JOURNAL_LOG_RATELIMIT,
- "Received file outside of allowed directories. Refusing.");
- return;
- }
+ if (!e)
+ return log_ratelimit_error_errno(SYNTHETIC_ERRNO(EPERM), JOURNAL_LOG_RATELIMIT,
+ "Received file outside of allowed directories, refusing.");
- if (!filename_is_valid(e)) {
- log_ratelimit_error(JOURNAL_LOG_RATELIMIT,
- "Received file in subdirectory of allowed directories. Refusing.");
- return;
- }
+ if (!filename_is_valid(e))
+ return log_ratelimit_error_errno(SYNTHETIC_ERRNO(EPERM), JOURNAL_LOG_RATELIMIT,
+ "Received file in subdirectory of allowed directories, refusing.");
}
/* When !sealed, set a lower memory limit. We have to read the file, effectively doubling memory
* use. */
- if (st.st_size > ENTRY_SIZE_MAX / (sealed ? 1 : 2)) {
- log_ratelimit_error(JOURNAL_LOG_RATELIMIT,
- "File passed too large (%"PRIu64" bytes). Ignoring.",
- (uint64_t) st.st_size);
- return;
- }
+ if (st.st_size > ENTRY_SIZE_MAX / (sealed ? 1 : 2))
+ return log_ratelimit_error_errno(SYNTHETIC_ERRNO(EFBIG), JOURNAL_LOG_RATELIMIT,
+ "File passed too large (%"PRIu64" bytes), refusing.",
+ (uint64_t) st.st_size);
if (sealed) {
void *p;
@@ -419,62 +404,54 @@ void server_process_native_file(
ps = PAGE_ALIGN(st.st_size);
assert(ps < SIZE_MAX);
p = mmap(NULL, ps, PROT_READ, MAP_PRIVATE, fd, 0);
- if (p == MAP_FAILED) {
- log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
- "Failed to map memfd, ignoring: %m");
- return;
- }
+ if (p == MAP_FAILED)
+ return log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
+ "Failed to map memfd: %m");
server_process_native_message(s, p, st.st_size, ucred, tv, label, label_len);
assert_se(munmap(p, ps) >= 0);
- } else {
- _cleanup_free_ void *p = NULL;
- struct statvfs vfs;
- ssize_t n;
-
- if (fstatvfs(fd, &vfs) < 0) {
- log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
- "Failed to stat file system of passed file, not processing it: %m");
- return;
- }
- /* Refuse operating on file systems that have mandatory locking enabled, see:
- *
- * https://github.com/systemd/systemd/issues/1822
- */
- if (vfs.f_flag & ST_MANDLOCK) {
- log_ratelimit_error(JOURNAL_LOG_RATELIMIT,
- "Received file descriptor from file system with mandatory locking enabled, not processing it.");
- return;
- }
+ return 0;
+ }
- /* Make the fd non-blocking. On regular files this has the effect of bypassing mandatory
- * locking. Of course, this should normally not be necessary given the check above, but let's
- * better be safe than sorry, after all NFS is pretty confusing regarding file system flags,
- * and we better don't trust it, and so is SMB. */
- r = fd_nonblock(fd, true);
- if (r < 0) {
- log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
- "Failed to make fd non-blocking, not processing it: %m");
- return;
- }
+ _cleanup_free_ void *p = NULL;
+ struct statvfs vfs;
+ ssize_t n;
+
+ if (fstatvfs(fd, &vfs) < 0)
+ return log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
+ "Failed to stat file system of passed file: %m");
+
+ /* Refuse operating on file systems that have mandatory locking enabled.
+ * See also: https://github.com/systemd/systemd/issues/1822 */
+ if (FLAGS_SET(vfs.f_flag, ST_MANDLOCK))
+ return log_ratelimit_error_errno(SYNTHETIC_ERRNO(EPERM), JOURNAL_LOG_RATELIMIT,
+ "Received file descriptor from file system with mandatory locking enabled, not processing it.");
+
+ /* Make the fd non-blocking. On regular files this has the effect of bypassing mandatory
+ * locking. Of course, this should normally not be necessary given the check above, but let's
+ * better be safe than sorry, after all NFS is pretty confusing regarding file system flags,
+ * and we better don't trust it, and so is SMB. */
+ r = fd_nonblock(fd, true);
+ if (r < 0)
+ return log_ratelimit_error_errno(r, JOURNAL_LOG_RATELIMIT,
+ "Failed to make fd non-blocking: %m");
- /* The file is not sealed, we can't map the file here, since clients might then truncate it
- * and trigger a SIGBUS for us. So let's stupidly read it. */
+ /* The file is not sealed, we can't map the file here, since clients might then truncate it
+ * and trigger a SIGBUS for us. So let's stupidly read it. */
- p = malloc(st.st_size);
- if (!p) {
- log_oom();
- return;
- }
+ p = malloc(st.st_size);
+ if (!p)
+ return log_oom();
- n = pread(fd, p, st.st_size, 0);
- if (n < 0)
- log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
- "Failed to read file, ignoring: %m");
- else if (n > 0)
- server_process_native_message(s, p, n, ucred, tv, label, label_len);
- }
+ n = pread(fd, p, st.st_size, 0);
+ if (n < 0)
+ return log_ratelimit_error_errno(errno, JOURNAL_LOG_RATELIMIT,
+ "Failed to read file: %m");
+ if (n > 0)
+ server_process_native_message(s, p, n, ucred, tv, label, label_len);
+
+ return 0;
}
int server_open_native_socket(Server *s, const char *native_socket) {
diff --git a/src/journal/journald-native.h b/src/journal/journald-native.h
index 7bbaaed181..10db267966 100644
--- a/src/journal/journald-native.h
+++ b/src/journal/journald-native.h
@@ -12,7 +12,7 @@ void server_process_native_message(
const char *label,
size_t label_len);
-void server_process_native_file(
+int server_process_native_file(
Server *s,
int fd,
const struct ucred *ucred,
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index 508263046c..285aea988a 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -1538,7 +1538,7 @@ int server_process_datagram(
if (n > 0 && n_fds == 0)
server_process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
else if (n == 0 && n_fds == 1)
- server_process_native_file(s, fds[0], ucred, tv, label, label_len);
+ (void) server_process_native_file(s, fds[0], ucred, tv, label, label_len);
else if (n_fds > 0)
log_ratelimit_warning(JOURNAL_LOG_RATELIMIT,
"Got too many file descriptors via native socket. Ignoring.");
@@ -1727,7 +1727,7 @@ static int server_setup_signals(Server *s) {
assert(s);
- assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18) >= 0);
r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s);
if (r < 0)
diff --git a/src/journal/meson.build b/src/journal/meson.build
index a3c5710610..1811feb02b 100644
--- a/src/journal/meson.build
+++ b/src/journal/meson.build
@@ -63,10 +63,10 @@ executables += [
libshared,
],
'dependencies' : [
- liblz4,
+ liblz4_cflags,
libselinux,
- libxz,
- libzstd,
+ libxz_cflags,
+ libzstd_cflags,
threads,
],
},
@@ -95,26 +95,26 @@ executables += [
'link_with' : journalctl_link_with,
'dependencies' : [
libdl,
- liblz4,
- libxz,
- libzstd,
+ liblz4_cflags,
+ libxz_cflags,
+ libzstd_cflags,
threads,
],
},
journal_test_template + {
'sources' : files('test-journald-config.c'),
'dependencies' : [
- liblz4,
+ liblz4_cflags,
libselinux,
- libxz,
+ libxz_cflags,
],
},
journal_test_template + {
'sources' : files('test-journald-syslog.c'),
'dependencies' : [
- liblz4,
+ liblz4_cflags,
libselinux,
- libxz,
+ libxz_cflags,
threads,
],
},
diff --git a/src/kernel-install/60-ukify.install.in b/src/kernel-install/60-ukify.install.in
index c7fe5108cc..3611737962 100755
--- a/src/kernel-install/60-ukify.install.in
+++ b/src/kernel-install/60-ukify.install.in
@@ -27,7 +27,7 @@ from shutil import which
from pathlib import Path
from typing import Optional
-__version__ = '{{PROJECT_VERSION_FULL}} ({{GIT_VERSION}})'
+__version__ = '{{PROJECT_VERSION_FULL}} ({{VERSION_TAG}})'
try:
VERBOSE = int(os.environ['KERNEL_INSTALL_VERBOSE']) > 0
diff --git a/src/kernel-install/90-loaderentry.install.in b/src/kernel-install/90-loaderentry.install.in
index a52dd812e4..610460b829 100755
--- a/src/kernel-install/90-loaderentry.install.in
+++ b/src/kernel-install/90-loaderentry.install.in
@@ -66,7 +66,7 @@ elif [ -f /usr/lib/os-release ]; then
. /usr/lib/os-release
fi
-[ -n "$PRETTY_NAME" ] || PRETTY_NAME="Linux $KERNEL_VERSION"
+[ -n "$PRETTY_NAME" ] || PRETTY_NAME="Linux"
SORT_KEY="$IMAGE_ID"
[ -z "$SORT_KEY" ] && SORT_KEY="$ID"
@@ -181,8 +181,8 @@ mkdir -p "${LOADER_ENTRY%/*}" || {
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Creating $LOADER_ENTRY"
{
echo "# Boot Loader Specification type#1 entry"
- echo "# File created by $0 (systemd {{GIT_VERSION}})"
- echo "title $PRETTY_NAME"
+ echo "# File created by $0 (systemd {{VERSION_TAG}})"
+ echo "title $PRETTY_NAME $KERNEL_VERSION"
echo "version $KERNEL_VERSION"
if [ "$ENTRY_TOKEN" = "$MACHINE_ID" ]; then
# See similar logic above for the systemd.machine_id= kernel command line option
diff --git a/src/kernel-install/kernel-install.c b/src/kernel-install/kernel-install.c
index af44ab911b..cf1bb5c3af 100644
--- a/src/kernel-install/kernel-install.c
+++ b/src/kernel-install/kernel-install.c
@@ -796,7 +796,7 @@ static int context_ensure_layout(Context *c) {
if (!entry_token_path)
return log_oom();
- r = is_dir_full(c->rfd, entry_token_path, /* follow = */ false);
+ r = is_dir_at(c->rfd, entry_token_path, /* follow = */ false);
if (r < 0 && r != -ENOENT)
return log_error_errno(r, "Failed to check if '%s' is a directory: %m", entry_token_path);
if (r > 0) {
@@ -1694,7 +1694,8 @@ static int run(int argc, char* argv[]) {
DISSECT_IMAGE_GENERIC_ROOT |
DISSECT_IMAGE_REQUIRE_ROOT |
DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_VALIDATE_OS,
+ DISSECT_IMAGE_VALIDATE_OS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/libsystemd-network/fuzz-lldp-rx.c b/src/libsystemd-network/fuzz-lldp-rx.c
index 844957c069..dad1038ca0 100644
--- a/src/libsystemd-network/fuzz-lldp-rx.c
+++ b/src/libsystemd-network/fuzz-lldp-rx.c
@@ -9,6 +9,8 @@
#include "fd-util.h"
#include "fuzz.h"
#include "lldp-network.h"
+#include "lldp-rx-internal.h"
+#include "memstream-util.h"
static int test_fd[2] = EBADF_PAIR;
@@ -22,6 +24,9 @@ int lldp_network_bind_raw_socket(int ifindex) {
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
_cleanup_(sd_event_unrefp) sd_event *e = NULL;
_cleanup_(sd_lldp_rx_unrefp) sd_lldp_rx *lldp_rx = NULL;
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+ _cleanup_(memstream_done) MemStream m = {};
+ FILE *f;
if (outside_size_range(size, 0, 2048))
return 0;
@@ -37,6 +42,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
assert_se(write(test_fd[1], data, size) == (ssize_t) size);
assert_se(sd_event_run(e, 0) >= 0);
+ assert_se(lldp_rx_build_neighbors_json(lldp_rx, &v) >= 0);
+ assert_se(f = memstream_init(&m));
+ (void) json_variant_dump(v, JSON_FORMAT_PRETTY|JSON_FORMAT_COLOR, f, NULL);
+
assert_se(sd_lldp_rx_stop(lldp_rx) >= 0);
assert_se(sd_lldp_rx_detach_event(lldp_rx) >= 0);
test_fd[1] = safe_close(test_fd[1]);
diff --git a/src/libsystemd-network/icmp6-packet.c b/src/libsystemd-network/icmp6-packet.c
new file mode 100644
index 0000000000..a0b0e84f54
--- /dev/null
+++ b/src/libsystemd-network/icmp6-packet.c
@@ -0,0 +1,121 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <netinet/icmp6.h>
+
+#include "icmp6-packet.h"
+#include "icmp6-util.h"
+#include "in-addr-util.h"
+#include "iovec-util.h"
+#include "network-common.h"
+#include "socket-util.h"
+
+DEFINE_TRIVIAL_REF_UNREF_FUNC(ICMP6Packet, icmp6_packet, mfree);
+
+static ICMP6Packet* icmp6_packet_new(size_t size) {
+ ICMP6Packet *p;
+
+ if (size > SIZE_MAX - offsetof(ICMP6Packet, raw_packet))
+ return NULL;
+
+ p = malloc0(offsetof(ICMP6Packet, raw_packet) + size);
+ if (!p)
+ return NULL;
+
+ p->raw_size = size;
+ p->n_ref = 1;
+
+ return p;
+}
+
+int icmp6_packet_get_sender_address(ICMP6Packet *p, struct in6_addr *ret) {
+ assert(p);
+
+ if (in6_addr_is_null(&p->sender_address))
+ return -ENODATA;
+
+ if (ret)
+ *ret = p->sender_address;
+ return 0;
+}
+
+int icmp6_packet_get_timestamp(ICMP6Packet *p, clockid_t clock, usec_t *ret) {
+ assert(p);
+ assert(ret);
+
+ if (!TRIPLE_TIMESTAMP_HAS_CLOCK(clock) || !clock_supported(clock))
+ return -EOPNOTSUPP;
+
+ if (!triple_timestamp_is_set(&p->timestamp))
+ return -ENODATA;
+
+ *ret = triple_timestamp_by_clock(&p->timestamp, clock);
+ return 0;
+}
+
+static const struct icmp6_hdr* icmp6_packet_get_header(ICMP6Packet *p) {
+ assert(p);
+
+ if (p->raw_size < sizeof(struct icmp6_hdr))
+ return NULL;
+
+ return (const struct icmp6_hdr*) p->raw_packet;
+}
+
+int icmp6_packet_get_type(ICMP6Packet *p) {
+ const struct icmp6_hdr *hdr = icmp6_packet_get_header(p);
+ if (!hdr)
+ return -EBADMSG;
+
+ return hdr->icmp6_type;
+}
+
+static int icmp6_packet_verify(ICMP6Packet *p) {
+ const struct icmp6_hdr *hdr = icmp6_packet_get_header(p);
+ if (!hdr)
+ return -EBADMSG;
+
+ if (hdr->icmp6_code != 0)
+ return -EBADMSG;
+
+ return 0;
+}
+
+int icmp6_packet_receive(int fd, ICMP6Packet **ret) {
+ _cleanup_(icmp6_packet_unrefp) ICMP6Packet *p = NULL;
+ ssize_t len;
+ int r;
+
+ assert(fd >= 0);
+ assert(ret);
+
+ len = next_datagram_size_fd(fd);
+ if (len < 0)
+ return (int) len;
+
+ p = icmp6_packet_new(len);
+ if (!p)
+ return -ENOMEM;
+
+ r = icmp6_receive(fd, p->raw_packet, p->raw_size, &p->sender_address, &p->timestamp);
+ if (r < 0)
+ switch (r) {
+ case -EADDRNOTAVAIL:
+ return log_debug_errno(r, "ICMPv6: Received a packet from neither link-local nor null address.");
+
+ case -EMULTIHOP:
+ return log_debug_errno(r, "ICMPv6: Received a packet with an invalid hop limit.");
+
+ case -EPFNOSUPPORT:
+ return log_debug_errno(r, "ICMPv6: Received a packet with an invalid source address.");
+
+ default:
+ return log_debug_errno(r, "ICMPv6: Unexpected error while receiving a packet: %m");
+ }
+
+ r = icmp6_packet_verify(p);
+ if (r < 0)
+ return r;
+
+ *ret = TAKE_PTR(p);
+ return 0;
+}
diff --git a/src/libsystemd-network/icmp6-packet.h b/src/libsystemd-network/icmp6-packet.h
new file mode 100644
index 0000000000..d77d2e8537
--- /dev/null
+++ b/src/libsystemd-network/icmp6-packet.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include <inttypes.h>
+#include <netinet/in.h>
+
+#include "macro.h"
+#include "time-util.h"
+
+typedef struct ICMP6Pakcet {
+ unsigned n_ref;
+
+ struct in6_addr sender_address;
+ struct triple_timestamp timestamp;
+
+ size_t raw_size;
+ uint8_t raw_packet[];
+} ICMP6Packet;
+
+ICMP6Packet* icmp6_packet_ref(ICMP6Packet *p);
+ICMP6Packet* icmp6_packet_unref(ICMP6Packet *p);
+DEFINE_TRIVIAL_CLEANUP_FUNC(ICMP6Packet*, icmp6_packet_unref);
+
+int icmp6_packet_get_sender_address(ICMP6Packet *p, struct in6_addr *ret);
+int icmp6_packet_get_timestamp(ICMP6Packet *p, clockid_t clock, usec_t *ret);
+int icmp6_packet_get_type(ICMP6Packet *p);
+
+int icmp6_packet_receive(int fd, ICMP6Packet **ret);
diff --git a/src/libsystemd-network/icmp6-util-unix.c b/src/libsystemd-network/icmp6-util-unix.c
index 01edb854df..5eac4a0e53 100644
--- a/src/libsystemd-network/icmp6-util-unix.c
+++ b/src/libsystemd-network/icmp6-util-unix.c
@@ -16,15 +16,11 @@ static struct in6_addr dummy_link_local = {
},
};
-int icmp6_bind_router_solicitation(int ifindex) {
- if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, test_fd) < 0)
+int icmp6_bind(int ifindex, bool is_router) {
+ if (!is_router && socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, test_fd) < 0)
return -errno;
- return test_fd[0];
-}
-
-int icmp6_bind_router_advertisement(int ifindex) {
- return test_fd[1];
+ return test_fd[is_router];
}
int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
diff --git a/src/libsystemd-network/icmp6-util.c b/src/libsystemd-network/icmp6-util.c
index 72c20baadc..559167847f 100644
--- a/src/libsystemd-network/icmp6-util.c
+++ b/src/libsystemd-network/icmp6-util.c
@@ -21,37 +21,42 @@
#include "network-common.h"
#include "socket-util.h"
-#define IN6ADDR_ALL_ROUTERS_MULTICAST_INIT \
- { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } } }
-
-#define IN6ADDR_ALL_NODES_MULTICAST_INIT \
- { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } }
-
-static int icmp6_bind_router_message(const struct icmp6_filter *filter,
- const struct ipv6_mreq *mreq) {
- int ifindex = mreq->ipv6mr_interface;
+int icmp6_bind(int ifindex, bool is_router) {
+ struct icmp6_filter filter = {};
+ struct ipv6_mreq mreq;
_cleanup_close_ int s = -EBADF;
int r;
- assert(filter);
- assert(mreq);
+ assert(ifindex > 0);
+
+ ICMP6_FILTER_SETBLOCKALL(&filter);
+ if (is_router) {
+ mreq = (struct ipv6_mreq) {
+ .ipv6mr_multiaddr = IN6ADDR_ALL_ROUTERS_MULTICAST_INIT,
+ .ipv6mr_interface = ifindex,
+ };
+ ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
+ } else {
+ mreq = (struct ipv6_mreq) {
+ .ipv6mr_multiaddr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
+ .ipv6mr_interface = ifindex,
+ };
+ ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
+ }
s = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_ICMPV6);
if (s < 0)
return -errno;
- if (setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, filter, sizeof(*filter)) < 0)
+ if (setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, &filter, sizeof(filter)) < 0)
return -errno;
- if (setsockopt(s, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, mreq, sizeof(*mreq)) < 0)
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
return -errno;
- /* RFC 3315, section 6.7, bullet point 2 may indicate that an
- IPV6_PKTINFO socket option also applies for ICMPv6 multicast.
- Empirical experiments indicates otherwise and therefore an
- IPV6_MULTICAST_IF socket option is used here instead */
+ /* RFC 3315, section 6.7, bullet point 2 may indicate that an IPV6_PKTINFO socket option also applies
+ * for ICMPv6 multicast. Empirical experiments indicates otherwise and therefore an IPV6_MULTICAST_IF
+ * socket option is used here instead. */
r = setsockopt_int(s, IPPROTO_IPV6, IPV6_MULTICAST_IF, ifindex);
if (r < 0)
return r;
@@ -83,32 +88,6 @@ static int icmp6_bind_router_message(const struct icmp6_filter *filter,
return TAKE_FD(s);
}
-int icmp6_bind_router_solicitation(int ifindex) {
- struct icmp6_filter filter = {};
- struct ipv6_mreq mreq = {
- .ipv6mr_multiaddr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
- .ipv6mr_interface = ifindex,
- };
-
- ICMP6_FILTER_SETBLOCKALL(&filter);
- ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
-
- return icmp6_bind_router_message(&filter, &mreq);
-}
-
-int icmp6_bind_router_advertisement(int ifindex) {
- struct icmp6_filter filter = {};
- struct ipv6_mreq mreq = {
- .ipv6mr_multiaddr = IN6ADDR_ALL_ROUTERS_MULTICAST_INIT,
- .ipv6mr_interface = ifindex,
- };
-
- ICMP6_FILTER_SETBLOCKALL(&filter);
- ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
-
- return icmp6_bind_router_message(&filter, &mreq);
-}
-
int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
struct sockaddr_in6 dst = {
.sin6_family = AF_INET6,
@@ -165,7 +144,6 @@ int icmp6_receive(
.msg_control = &control,
.msg_controllen = sizeof(control),
};
- struct in6_addr addr = {};
ssize_t len;
iov = IOVEC_MAKE(buffer, size);
@@ -177,17 +155,11 @@ int icmp6_receive(
if ((size_t) len != size)
return -EINVAL;
- if (msg.msg_namelen == sizeof(struct sockaddr_in6) &&
- sa.in6.sin6_family == AF_INET6) {
-
- addr = sa.in6.sin6_addr;
- if (!in6_addr_is_link_local(&addr) && !in6_addr_is_null(&addr))
- return -EADDRNOTAVAIL;
-
- } else if (msg.msg_namelen > 0)
+ if (msg.msg_namelen != sizeof(struct sockaddr_in6) || sa.in6.sin6_family != AF_INET6)
return -EPFNOSUPPORT;
- /* namelen == 0 only happens when running the test-suite over a socketpair */
+ if (!in6_addr_is_link_local(&sa.in6.sin6_addr) && !in6_addr_is_null(&sa.in6.sin6_addr))
+ return -EADDRNOTAVAIL;
assert(!(msg.msg_flags & MSG_TRUNC));
@@ -198,6 +170,6 @@ int icmp6_receive(
if (ret_timestamp)
triple_timestamp_from_cmsg(ret_timestamp, &msg);
if (ret_sender)
- *ret_sender = addr;
+ *ret_sender = sa.in6.sin6_addr;
return 0;
}
diff --git a/src/libsystemd-network/icmp6-util.h b/src/libsystemd-network/icmp6-util.h
index 0a9ecb4c44..72db688b0b 100644
--- a/src/libsystemd-network/icmp6-util.h
+++ b/src/libsystemd-network/icmp6-util.h
@@ -6,6 +6,7 @@
***/
#include <net/ethernet.h>
+#include <stdbool.h>
#include "time-util.h"
@@ -17,8 +18,7 @@
{ { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } }
-int icmp6_bind_router_solicitation(int ifindex);
-int icmp6_bind_router_advertisement(int ifindex);
+int icmp6_bind(int ifindex, bool is_router);
int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr);
int icmp6_receive(
int fd,
diff --git a/src/libsystemd-network/lldp-neighbor.c b/src/libsystemd-network/lldp-neighbor.c
index 2cac77f472..a4384ac2e1 100644
--- a/src/libsystemd-network/lldp-neighbor.c
+++ b/src/libsystemd-network/lldp-neighbor.c
@@ -376,17 +376,6 @@ int sd_lldp_neighbor_get_destination_address(sd_lldp_neighbor *n, struct ether_a
return 0;
}
-int sd_lldp_neighbor_get_raw(sd_lldp_neighbor *n, const void **ret, size_t *size) {
- assert_return(n, -EINVAL);
- assert_return(ret, -EINVAL);
- assert_return(size, -EINVAL);
-
- *ret = LLDP_NEIGHBOR_RAW(n);
- *size = n->raw_size;
-
- return 0;
-}
-
int sd_lldp_neighbor_get_chassis_id(sd_lldp_neighbor *n, uint8_t *type, const void **ret, size_t *size) {
assert_return(n, -EINVAL);
assert_return(type, -EINVAL);
@@ -640,28 +629,6 @@ int sd_lldp_neighbor_get_enabled_capabilities(sd_lldp_neighbor *n, uint16_t *ret
return 0;
}
-int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t raw_size) {
- _cleanup_(sd_lldp_neighbor_unrefp) sd_lldp_neighbor *n = NULL;
- int r;
-
- assert_return(ret, -EINVAL);
- assert_return(raw || raw_size <= 0, -EINVAL);
-
- n = lldp_neighbor_new(raw_size);
- if (!n)
- return -ENOMEM;
-
- memcpy_safe(LLDP_NEIGHBOR_RAW(n), raw, raw_size);
-
- r = lldp_neighbor_parse(n);
- if (r < 0)
- return r;
-
- *ret = TAKE_PTR(n);
-
- return r;
-}
-
int sd_lldp_neighbor_tlv_rewind(sd_lldp_neighbor *n) {
assert_return(n, -EINVAL);
@@ -793,3 +760,31 @@ int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock, uint64_
*ret = triple_timestamp_by_clock(&n->timestamp, clock);
return 0;
}
+
+int lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret) {
+ const char *chassis_id = NULL, *port_id = NULL, *port_description = NULL,
+ *system_name = NULL, *system_description = NULL;
+ uint16_t cc = 0;
+ bool valid_cc;
+
+ assert(n);
+ assert(ret);
+
+ (void) sd_lldp_neighbor_get_chassis_id_as_string(n, &chassis_id);
+ (void) sd_lldp_neighbor_get_port_id_as_string(n, &port_id);
+ (void) sd_lldp_neighbor_get_port_description(n, &port_description);
+ (void) sd_lldp_neighbor_get_system_name(n, &system_name);
+ (void) sd_lldp_neighbor_get_system_description(n, &system_description);
+
+ valid_cc = sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0;
+
+ return json_build(ret, JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("ChassisID", chassis_id),
+ JSON_BUILD_PAIR_BYTE_ARRAY("RawChassisID", n->id.chassis_id, n->id.chassis_id_size),
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("PortID", port_id),
+ JSON_BUILD_PAIR_BYTE_ARRAY("RawPortID", n->id.port_id, n->id.port_id_size),
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("PortDescription", port_description),
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("SystemName", system_name),
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("SystemDescription", system_description),
+ JSON_BUILD_PAIR_CONDITION(valid_cc, "EnabledCapabilities", JSON_BUILD_UNSIGNED(cc))));
+}
diff --git a/src/libsystemd-network/lldp-neighbor.h b/src/libsystemd-network/lldp-neighbor.h
index 016286b17d..06ba4c7460 100644
--- a/src/libsystemd-network/lldp-neighbor.h
+++ b/src/libsystemd-network/lldp-neighbor.h
@@ -8,6 +8,7 @@
#include "sd-lldp-rx.h"
#include "hash-funcs.h"
+#include "json.h"
#include "lldp-rx-internal.h"
#include "time-util.h"
@@ -90,3 +91,4 @@ sd_lldp_neighbor *lldp_neighbor_new(size_t raw_size);
int lldp_neighbor_parse(sd_lldp_neighbor *n);
void lldp_neighbor_start_ttl(sd_lldp_neighbor *n);
bool lldp_neighbor_equal(const sd_lldp_neighbor *a, const sd_lldp_neighbor *b);
+int lldp_neighbor_build_json(sd_lldp_neighbor *n, JsonVariant **ret);
diff --git a/src/libsystemd-network/lldp-rx-internal.h b/src/libsystemd-network/lldp-rx-internal.h
index 83d0bc460d..e914c6bfc6 100644
--- a/src/libsystemd-network/lldp-rx-internal.h
+++ b/src/libsystemd-network/lldp-rx-internal.h
@@ -5,6 +5,7 @@
#include "sd-lldp-rx.h"
#include "hashmap.h"
+#include "json.h"
#include "network-common.h"
#include "prioq.h"
@@ -36,6 +37,8 @@ struct sd_lldp_rx {
const char* lldp_rx_event_to_string(sd_lldp_rx_event_t e) _const_;
sd_lldp_rx_event_t lldp_rx_event_from_string(const char *s) _pure_;
+int lldp_rx_build_neighbors_json(sd_lldp_rx *lldp_rx, JsonVariant **ret);
+
#define log_lldp_rx_errno(lldp_rx, error, fmt, ...) \
log_interface_prefix_full_errno( \
"LLDP Rx: ", \
diff --git a/src/libsystemd-network/meson.build b/src/libsystemd-network/meson.build
index 301a4d5c5c..a2e5106b42 100644
--- a/src/libsystemd-network/meson.build
+++ b/src/libsystemd-network/meson.build
@@ -8,6 +8,7 @@ sources = files(
'dhcp6-network.c',
'dhcp6-option.c',
'dhcp6-protocol.c',
+ 'icmp6-packet.c',
'icmp6-util.c',
'lldp-neighbor.c',
'lldp-network.c',
diff --git a/src/libsystemd-network/ndisc-internal.h b/src/libsystemd-network/ndisc-internal.h
index 615de0db51..4e82fd5a86 100644
--- a/src/libsystemd-network/ndisc-internal.h
+++ b/src/libsystemd-network/ndisc-internal.h
@@ -24,6 +24,7 @@ struct sd_ndisc {
sd_event *event;
int event_priority;
+ struct in6_addr link_local_addr;
struct ether_addr mac_addr;
sd_event_source *recv_event_source;
diff --git a/src/libsystemd-network/ndisc-protocol.c b/src/libsystemd-network/ndisc-protocol.c
index fae4a583ad..d1f0819e14 100644
--- a/src/libsystemd-network/ndisc-protocol.c
+++ b/src/libsystemd-network/ndisc-protocol.c
@@ -1,7 +1,46 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include <netinet/icmp6.h>
+
#include "ndisc-protocol.h"
+int ndisc_option_parse(
+ ICMP6Packet *p,
+ size_t offset,
+ uint8_t *ret_type,
+ size_t *ret_len,
+ const uint8_t **ret_opt) {
+
+ assert(p);
+
+ if (offset == p->raw_size)
+ return -ESPIPE; /* end of the packet */
+
+ if (offset > p->raw_size)
+ return -EBADMSG;
+
+ if (p->raw_size - offset < sizeof(struct nd_opt_hdr))
+ return -EBADMSG;
+
+ assert_cc(alignof(struct nd_opt_hdr) == 1);
+ const struct nd_opt_hdr *hdr = (const struct nd_opt_hdr*) (p->raw_packet + offset);
+ if (hdr->nd_opt_len == 0)
+ return -EBADMSG;
+
+ size_t len = hdr->nd_opt_len * 8;
+ if (p->raw_size - offset < len)
+ return -EBADMSG;
+
+ if (ret_type)
+ *ret_type = hdr->nd_opt_type;
+ if (ret_len)
+ *ret_len = len;
+ if (ret_opt)
+ *ret_opt = p->raw_packet + offset;
+
+ return 0;
+}
+
static const uint8_t prefix_length_code_to_prefix_length[_PREFIX_LENGTH_CODE_MAX] = {
[PREFIX_LENGTH_CODE_96] = 96,
[PREFIX_LENGTH_CODE_64] = 64,
diff --git a/src/libsystemd-network/ndisc-protocol.h b/src/libsystemd-network/ndisc-protocol.h
index 8e403e3425..dcb1b191c7 100644
--- a/src/libsystemd-network/ndisc-protocol.h
+++ b/src/libsystemd-network/ndisc-protocol.h
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include "icmp6-packet.h"
#include "time-util.h"
/* RFC 8781: PREF64 or (NAT64 prefix) */
@@ -25,7 +26,14 @@ struct nd_opt_prefix64_info {
uint8_t length;
uint16_t lifetime_and_plc;
uint8_t prefix[12];
-} __attribute__((__packed__));
+} _packed_;
int pref64_plc_to_prefix_length(uint16_t plc, uint8_t *ret);
int pref64_prefix_length_to_plc(uint8_t prefixlen, uint8_t *ret);
+
+int ndisc_option_parse(
+ ICMP6Packet *p,
+ size_t offset,
+ uint8_t *ret_type,
+ size_t *ret_len,
+ const uint8_t **ret_opt);
diff --git a/src/libsystemd-network/ndisc-router-internal.h b/src/libsystemd-network/ndisc-router-internal.h
index 5bd9a65dd2..f1a03bc0ab 100644
--- a/src/libsystemd-network/ndisc-router-internal.h
+++ b/src/libsystemd-network/ndisc-router-internal.h
@@ -7,16 +7,13 @@
#include "sd-ndisc.h"
+#include "icmp6-packet.h"
#include "time-util.h"
struct sd_ndisc_router {
unsigned n_ref;
- triple_timestamp timestamp;
- struct in6_addr address;
-
- /* The raw packet size. The data is appended to the object, accessible via NDIS_ROUTER_RAW() */
- size_t raw_size;
+ ICMP6Packet *packet;
/* The current read index for the iterative option interface */
size_t rindex;
@@ -29,11 +26,10 @@ struct sd_ndisc_router {
uint8_t hop_limit;
uint32_t mtu;
- uint64_t icmp6_ratelimit_usec;
};
static inline void* NDISC_ROUTER_RAW(const sd_ndisc_router *rt) {
- return (uint8_t*) rt + ALIGN(sizeof(sd_ndisc_router));
+ return ASSERT_PTR(ASSERT_PTR(rt)->packet)->raw_packet;
}
static inline void *NDISC_ROUTER_OPTION_DATA(const sd_ndisc_router *rt) {
@@ -47,5 +43,5 @@ static inline size_t NDISC_ROUTER_OPTION_LENGTH(const sd_ndisc_router *rt) {
return ((uint8_t*) NDISC_ROUTER_OPTION_DATA(rt))[1] * 8;
}
-sd_ndisc_router *ndisc_router_new(size_t raw_size);
+sd_ndisc_router* ndisc_router_new(ICMP6Packet *packet);
int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt);
diff --git a/src/libsystemd-network/sd-lldp-rx.c b/src/libsystemd-network/sd-lldp-rx.c
index 2fc9a55323..74000ffb8b 100644
--- a/src/libsystemd-network/sd-lldp-rx.c
+++ b/src/libsystemd-network/sd-lldp-rx.c
@@ -10,6 +10,7 @@
#include "ether-addr-util.h"
#include "event-util.h"
#include "fd-util.h"
+#include "json.h"
#include "lldp-neighbor.h"
#include "lldp-network.h"
#include "lldp-rx-internal.h"
@@ -490,6 +491,30 @@ int sd_lldp_rx_get_neighbors(sd_lldp_rx *lldp_rx, sd_lldp_neighbor ***ret) {
return k;
}
+int lldp_rx_build_neighbors_json(sd_lldp_rx *lldp_rx, JsonVariant **ret) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+ int r;
+
+ assert(lldp_rx);
+ assert(ret);
+
+ sd_lldp_neighbor *n;
+ HASHMAP_FOREACH(n, lldp_rx->neighbor_by_id) {
+ _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+
+ r = lldp_neighbor_build_json(n, &w);
+ if (r < 0)
+ return r;
+
+ r = json_variant_append_array(&v, w);
+ if (r < 0)
+ return r;
+ }
+
+ *ret = TAKE_PTR(v);
+ return 0;
+}
+
int sd_lldp_rx_set_neighbors_max(sd_lldp_rx *lldp_rx, uint64_t m) {
assert_return(lldp_rx, -EINVAL);
assert_return(m > 0, -EINVAL);
diff --git a/src/libsystemd-network/sd-ndisc-router.c b/src/libsystemd-network/sd-ndisc-router.c
index b90fb77cd8..4a95d7dba7 100644
--- a/src/libsystemd-network/sd-ndisc-router.c
+++ b/src/libsystemd-network/sd-ndisc-router.c
@@ -18,46 +18,44 @@
#include "ndisc-router-internal.h"
#include "strv.h"
-DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_ndisc_router, sd_ndisc_router, mfree);
+static sd_ndisc_router* ndisc_router_free(sd_ndisc_router *rt) {
+ if (!rt)
+ return NULL;
+
+ icmp6_packet_unref(rt->packet);
+ return mfree(rt);
+}
-sd_ndisc_router *ndisc_router_new(size_t raw_size) {
+DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_ndisc_router, sd_ndisc_router, ndisc_router_free);
+
+sd_ndisc_router* ndisc_router_new(ICMP6Packet *packet) {
sd_ndisc_router *rt;
- if (raw_size > SIZE_MAX - ALIGN(sizeof(sd_ndisc_router)))
- return NULL;
+ assert(packet);
- rt = malloc0(ALIGN(sizeof(sd_ndisc_router)) + raw_size);
+ rt = new(sd_ndisc_router, 1);
if (!rt)
return NULL;
- rt->raw_size = raw_size;
- rt->n_ref = 1;
+ *rt = (sd_ndisc_router) {
+ .n_ref = 1,
+ .packet = icmp6_packet_ref(packet),
+ };
return rt;
}
int sd_ndisc_router_get_address(sd_ndisc_router *rt, struct in6_addr *ret) {
assert_return(rt, -EINVAL);
- assert_return(ret, -EINVAL);
- if (in6_addr_is_null(&rt->address))
- return -ENODATA;
-
- *ret = rt->address;
- return 0;
+ return icmp6_packet_get_sender_address(rt->packet, ret);
}
int sd_ndisc_router_get_timestamp(sd_ndisc_router *rt, clockid_t clock, uint64_t *ret) {
assert_return(rt, -EINVAL);
- assert_return(TRIPLE_TIMESTAMP_HAS_CLOCK(clock), -EOPNOTSUPP);
- assert_return(clock_supported(clock), -EOPNOTSUPP);
assert_return(ret, -EINVAL);
- if (!triple_timestamp_is_set(&rt->timestamp))
- return -ENODATA;
-
- *ret = triple_timestamp_by_clock(&rt->timestamp, clock);
- return 0;
+ return icmp6_packet_get_timestamp(rt->packet, clock, ret);
}
#define DEFINE_GET_TIMESTAMP(name) \
@@ -92,17 +90,6 @@ DEFINE_GET_TIMESTAMP(rdnss_get_lifetime);
DEFINE_GET_TIMESTAMP(dnssl_get_lifetime);
DEFINE_GET_TIMESTAMP(prefix64_get_lifetime);
-int sd_ndisc_router_get_raw(sd_ndisc_router *rt, const void **ret, size_t *ret_size) {
- assert_return(rt, -EINVAL);
- assert_return(ret, -EINVAL);
- assert_return(ret_size, -EINVAL);
-
- *ret = NDISC_ROUTER_RAW(rt);
- *ret_size = rt->raw_size;
-
- return 0;
-}
-
static bool pref64_option_verify(const struct nd_opt_prefix64_info *p, size_t length) {
uint16_t lifetime_and_plc;
@@ -119,32 +106,24 @@ static bool pref64_option_verify(const struct nd_opt_prefix64_info *p, size_t le
}
int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt) {
- struct nd_router_advert *a;
- const uint8_t *p;
+ const struct nd_router_advert *a;
bool has_mtu = false, has_flag_extension = false;
- size_t left;
+ int r;
assert(rt);
+ assert(rt->packet);
- if (rt->raw_size < sizeof(struct nd_router_advert))
+ if (rt->packet->raw_size < sizeof(struct nd_router_advert))
return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
"Too small to be a router advertisement, ignoring.");
- /* Router advertisement packets are neatly aligned to 64-bit boundaries, hence we can access them directly */
- a = NDISC_ROUTER_RAW(rt);
-
- if (a->nd_ra_type != ND_ROUTER_ADVERT)
- return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
- "Received ND packet that is not a router advertisement, ignoring.");
-
- if (a->nd_ra_code != 0)
- return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
- "Received ND packet with wrong RA code, ignoring.");
+ a = (const struct nd_router_advert*) rt->packet->raw_packet;
+ assert(a->nd_ra_type == ND_ROUTER_ADVERT);
+ assert(a->nd_ra_code == 0);
rt->hop_limit = a->nd_ra_curhoplimit;
rt->flags = a->nd_ra_flags_reserved; /* the first 8 bits */
rt->lifetime_usec = be16_sec_to_usec(a->nd_ra_router_lifetime, /* max_as_infinity = */ false);
- rt->icmp6_ratelimit_usec = be32_msec_to_usec(a->nd_ra_retransmit, /* max_as_infinity = */ false);
rt->reachable_time_usec = be32_msec_to_usec(a->nd_ra_reachable, /* mas_as_infinity = */ false);
rt->retransmission_time_usec = be32_msec_to_usec(a->nd_ra_retransmit, /* max_as_infinity = */ false);
@@ -152,29 +131,13 @@ int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt) {
if (!IN_SET(rt->preference, SD_NDISC_PREFERENCE_LOW, SD_NDISC_PREFERENCE_HIGH))
rt->preference = SD_NDISC_PREFERENCE_MEDIUM;
- p = (const uint8_t*) NDISC_ROUTER_RAW(rt) + sizeof(struct nd_router_advert);
- left = rt->raw_size - sizeof(struct nd_router_advert);
-
- for (;;) {
+ for (size_t offset = sizeof(struct nd_router_advert), length; offset < rt->packet->raw_size; offset += length) {
uint8_t type;
- size_t length;
+ const uint8_t *p;
- if (left == 0)
- break;
-
- if (left < 2)
- return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
- "Option lacks header, ignoring datagram.");
-
- type = p[0];
- length = p[1] * 8;
-
- if (length == 0)
- return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
- "Zero-length option, ignoring datagram.");
- if (left < length)
- return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
- "Option truncated, ignoring datagram.");
+ r = ndisc_option_parse(rt->packet, offset, &type, &length, &p);
+ if (r < 0)
+ return log_ndisc_errno(nd, r, "Failed to parse NDisc option header, ignoring: %m");
switch (type) {
@@ -262,8 +225,6 @@ int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt) {
"PREF64 prefix has invalid prefix length.");
break;
}}
-
- p += length, left -= length;
}
rt->rindex = sizeof(struct nd_router_advert);
@@ -294,14 +255,6 @@ int sd_ndisc_router_get_retransmission_time(sd_ndisc_router *rt, uint64_t *ret)
return 0;
}
-int sd_ndisc_router_get_icmp6_ratelimit(sd_ndisc_router *rt, uint64_t *ret) {
- assert_return(rt, -EINVAL);
- assert_return(ret, -EINVAL);
-
- *ret = rt->icmp6_ratelimit_usec;
- return 0;
-}
-
int sd_ndisc_router_get_flags(sd_ndisc_router *rt, uint64_t *ret) {
assert_return(rt, -EINVAL);
assert_return(ret, -EINVAL);
@@ -341,43 +294,30 @@ int sd_ndisc_router_get_mtu(sd_ndisc_router *rt, uint32_t *ret) {
int sd_ndisc_router_option_rewind(sd_ndisc_router *rt) {
assert_return(rt, -EINVAL);
- assert(rt->raw_size >= sizeof(struct nd_router_advert));
- rt->rindex = sizeof(struct nd_router_advert);
+ assert(rt->packet);
+ assert(rt->packet->raw_size >= sizeof(struct nd_router_advert));
- return rt->rindex < rt->raw_size;
+ rt->rindex = sizeof(struct nd_router_advert);
+ return rt->rindex < rt->packet->raw_size;
}
int sd_ndisc_router_option_next(sd_ndisc_router *rt) {
size_t length;
+ int r;
assert_return(rt, -EINVAL);
- if (rt->rindex == rt->raw_size) /* EOF */
- return -ESPIPE;
-
- if (rt->rindex + 2 > rt->raw_size) /* Truncated message */
- return -EBADMSG;
-
- length = NDISC_ROUTER_OPTION_LENGTH(rt);
- if (rt->rindex + length > rt->raw_size)
- return -EBADMSG;
+ r = ndisc_option_parse(rt->packet, rt->rindex, NULL, &length, NULL);
+ if (r < 0)
+ return r;
rt->rindex += length;
- return rt->rindex < rt->raw_size;
+ return rt->rindex < rt->packet->raw_size;
}
int sd_ndisc_router_option_get_type(sd_ndisc_router *rt, uint8_t *ret) {
assert_return(rt, -EINVAL);
- assert_return(ret, -EINVAL);
-
- if (rt->rindex == rt->raw_size) /* EOF */
- return -ESPIPE;
-
- if (rt->rindex + 2 > rt->raw_size) /* Truncated message */
- return -EBADMSG;
-
- *ret = NDISC_ROUTER_OPTION_TYPE(rt);
- return 0;
+ return ndisc_option_parse(rt->packet, rt->rindex, ret, NULL, NULL);
}
int sd_ndisc_router_option_is_type(sd_ndisc_router *rt, uint8_t type) {
@@ -402,11 +342,11 @@ int sd_ndisc_router_option_get_raw(sd_ndisc_router *rt, const void **ret, size_t
/* Note that this returns the full option, including the option header */
- if (rt->rindex + 2 > rt->raw_size)
+ if (rt->rindex + 2 > rt->packet->raw_size)
return -EBADMSG;
length = NDISC_ROUTER_OPTION_LENGTH(rt);
- if (rt->rindex + length > rt->raw_size)
+ if (rt->rindex + length > rt->packet->raw_size)
return -EBADMSG;
*ret = (uint8_t*) NDISC_ROUTER_RAW(rt) + rt->rindex;
diff --git a/src/libsystemd-network/sd-ndisc.c b/src/libsystemd-network/sd-ndisc.c
index 0b5626670b..939fa87d30 100644
--- a/src/libsystemd-network/sd-ndisc.c
+++ b/src/libsystemd-network/sd-ndisc.c
@@ -31,7 +31,7 @@ static const char * const ndisc_event_table[_SD_NDISC_EVENT_MAX] = {
DEFINE_STRING_TABLE_LOOKUP(ndisc_event, sd_ndisc_event_t);
-static void ndisc_callback(sd_ndisc *ndisc, sd_ndisc_event_t event, sd_ndisc_router *rt) {
+static void ndisc_callback(sd_ndisc *ndisc, sd_ndisc_event_t event, void *message) {
assert(ndisc);
assert(event >= 0 && event < _SD_NDISC_EVENT_MAX);
@@ -39,7 +39,7 @@ static void ndisc_callback(sd_ndisc *ndisc, sd_ndisc_event_t event, sd_ndisc_rou
return (void) log_ndisc(ndisc, "Received '%s' event.", ndisc_event_to_string(event));
log_ndisc(ndisc, "Invoking callback for '%s' event.", ndisc_event_to_string(event));
- ndisc->callback(ndisc, event, rt, ndisc->userdata);
+ ndisc->callback(ndisc, event, message, ndisc->userdata);
}
int sd_ndisc_is_running(sd_ndisc *nd) {
@@ -96,6 +96,18 @@ int sd_ndisc_get_ifname(sd_ndisc *nd, const char **ret) {
return 0;
}
+int sd_ndisc_set_link_local_address(sd_ndisc *nd, const struct in6_addr *addr) {
+ assert_return(nd, -EINVAL);
+ assert_return(!addr || in6_addr_is_link_local(addr), -EINVAL);
+
+ if (addr)
+ nd->link_local_addr = *addr;
+ else
+ zero(nd->link_local_addr);
+
+ return 0;
+}
+
int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr) {
assert_return(nd, -EINVAL);
@@ -186,16 +198,23 @@ int sd_ndisc_new(sd_ndisc **ret) {
return 0;
}
-static int ndisc_handle_datagram(sd_ndisc *nd, sd_ndisc_router *rt) {
+static int ndisc_handle_router(sd_ndisc *nd, ICMP6Packet *packet) {
+ _cleanup_(sd_ndisc_router_unrefp) sd_ndisc_router *rt = NULL;
int r;
assert(nd);
- assert(rt);
+ assert(packet);
+
+ rt = ndisc_router_new(packet);
+ if (!rt)
+ return -ENOMEM;
r = ndisc_router_parse(nd, rt);
if (r < 0)
return r;
+ (void) event_source_disable(nd->timeout_event_source);
+
log_ndisc(nd, "Received Router Advertisement: flags %s preference %s lifetime %s",
rt->flags & ND_RA_FLAG_MANAGED ? "MANAGED" : rt->flags & ND_RA_FLAG_OTHER ? "OTHER" : "none",
rt->preference == SD_NDISC_PREFERENCE_HIGH ? "high" : rt->preference == SD_NDISC_PREFERENCE_LOW ? "low" : "medium",
@@ -206,55 +225,46 @@ static int ndisc_handle_datagram(sd_ndisc *nd, sd_ndisc_router *rt) {
}
static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
- _cleanup_(sd_ndisc_router_unrefp) sd_ndisc_router *rt = NULL;
+ _cleanup_(icmp6_packet_unrefp) ICMP6Packet *packet = NULL;
sd_ndisc *nd = ASSERT_PTR(userdata);
- ssize_t buflen;
int r;
assert(s);
assert(nd->event);
- buflen = next_datagram_size_fd(fd);
- if (ERRNO_IS_NEG_TRANSIENT(buflen) || ERRNO_IS_NEG_DISCONNECT(buflen))
- return 0;
- if (buflen < 0) {
- log_ndisc_errno(nd, buflen, "Failed to determine datagram size to read, ignoring: %m");
+ r = icmp6_packet_receive(fd, &packet);
+ if (r < 0) {
+ log_ndisc_errno(nd, r, "Failed to receive ICMPv6 packet, ignoring: %m");
return 0;
}
- rt = ndisc_router_new(buflen);
- if (!rt)
- return -ENOMEM;
-
- r = icmp6_receive(fd, NDISC_ROUTER_RAW(rt), rt->raw_size, &rt->address, &rt->timestamp);
- if (ERRNO_IS_NEG_TRANSIENT(r) || ERRNO_IS_NEG_DISCONNECT(r))
+ /* The function icmp6_receive() accepts the null source address, but RFC 4861 Section 6.1.2 states
+ * that hosts MUST discard messages with the null source address. */
+ if (in6_addr_is_null(&packet->sender_address)) {
+ log_ndisc(nd, "Received an ICMPv6 packet from null address, ignoring.");
return 0;
- if (r < 0)
- switch (r) {
- case -EADDRNOTAVAIL:
- log_ndisc(nd, "Received RA from neither link-local nor null address. Ignoring.");
- return 0;
+ }
- case -EMULTIHOP:
- log_ndisc(nd, "Received RA with invalid hop limit. Ignoring.");
- return 0;
+ if (in6_addr_equal(&packet->sender_address, &nd->link_local_addr)) {
+ log_ndisc(nd, "Received an ICMPv6 packet sent by the same interface, ignoring.");
+ return 0;
+ }
- case -EPFNOSUPPORT:
- log_ndisc(nd, "Received invalid source address from ICMPv6 socket. Ignoring.");
- return 0;
+ r = icmp6_packet_get_type(packet);
+ if (r < 0) {
+ log_ndisc_errno(nd, r, "Received an invalid ICMPv6 packet, ignoring: %m");
+ return 0;
+ }
- default:
- log_ndisc_errno(nd, r, "Unexpected error while reading from ICMPv6, ignoring: %m");
- return 0;
- }
+ switch (r) {
+ case ND_ROUTER_ADVERT:
+ (void) ndisc_handle_router(nd, packet);
+ break;
- /* The function icmp6_receive() accepts the null source address, but RFC 4861 Section 6.1.2 states
- * that hosts MUST discard messages with the null source address. */
- if (in6_addr_is_null(&rt->address))
- log_ndisc(nd, "Received RA from null address. Ignoring.");
+ default:
+ log_ndisc(nd, "Received an ICMPv6 packet with unexpected type %i, ignoring.", r);
+ }
- (void) event_source_disable(nd->timeout_event_source);
- (void) ndisc_handle_datagram(nd, rt);
return 0;
}
@@ -332,50 +342,74 @@ int sd_ndisc_stop(sd_ndisc *nd) {
return 1;
}
-int sd_ndisc_start(sd_ndisc *nd) {
+static int ndisc_setup_recv_event(sd_ndisc *nd) {
int r;
- usec_t time_now;
- assert_return(nd, -EINVAL);
- assert_return(nd->event, -EINVAL);
- assert_return(nd->ifindex > 0, -EINVAL);
+ assert(nd);
+ assert(nd->event);
+ assert(nd->ifindex > 0);
- if (sd_ndisc_is_running(nd))
- return 0;
+ _cleanup_close_ int fd = -EBADF;
+ fd = icmp6_bind(nd->ifindex, /* is_router = */ false);
+ if (fd < 0)
+ return fd;
- assert(!nd->recv_event_source);
+ _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
+ r = sd_event_add_io(nd->event, &s, fd, EPOLLIN, ndisc_recv, nd);
+ if (r < 0)
+ return r;
- r = sd_event_now(nd->event, CLOCK_BOOTTIME, &time_now);
+ r = sd_event_source_set_priority(s, nd->event_priority);
if (r < 0)
- goto fail;
+ return r;
- nd->fd = icmp6_bind_router_solicitation(nd->ifindex);
- if (nd->fd < 0)
- return nd->fd;
+ (void) sd_event_source_set_description(s, "ndisc-receive-router-message");
- r = sd_event_add_io(nd->event, &nd->recv_event_source, nd->fd, EPOLLIN, ndisc_recv, nd);
+ nd->fd = TAKE_FD(fd);
+ nd->recv_event_source = TAKE_PTR(s);
+ return 1;
+}
+
+static int ndisc_setup_timer(sd_ndisc *nd) {
+ int r;
+
+ assert(nd);
+ assert(nd->event);
+
+ r = event_reset_time_relative(nd->event, &nd->timeout_event_source,
+ CLOCK_BOOTTIME,
+ USEC_PER_SEC / 2, 1 * USEC_PER_SEC, /* See RFC 8415 sec. 18.2.1 */
+ ndisc_timeout, nd,
+ nd->event_priority, "ndisc-timeout", true);
if (r < 0)
- goto fail;
+ return r;
- r = sd_event_source_set_priority(nd->recv_event_source, nd->event_priority);
+ r = event_reset_time_relative(nd->event, &nd->timeout_no_ra,
+ CLOCK_BOOTTIME,
+ NDISC_TIMEOUT_NO_RA_USEC, 10 * USEC_PER_MSEC,
+ ndisc_timeout_no_ra, nd,
+ nd->event_priority, "ndisc-timeout-no-ra", true);
if (r < 0)
- goto fail;
+ return r;
- (void) sd_event_source_set_description(nd->recv_event_source, "ndisc-receive-message");
+ return 0;
+}
- r = event_reset_time(nd->event, &nd->timeout_event_source,
- CLOCK_BOOTTIME,
- time_now + USEC_PER_SEC / 2, 1 * USEC_PER_SEC, /* See RFC 8415 sec. 18.2.1 */
- ndisc_timeout, nd,
- nd->event_priority, "ndisc-timeout", true);
+int sd_ndisc_start(sd_ndisc *nd) {
+ int r;
+
+ assert_return(nd, -EINVAL);
+ assert_return(nd->event, -EINVAL);
+ assert_return(nd->ifindex > 0, -EINVAL);
+
+ if (sd_ndisc_is_running(nd))
+ return 0;
+
+ r = ndisc_setup_recv_event(nd);
if (r < 0)
goto fail;
- r = event_reset_time(nd->event, &nd->timeout_no_ra,
- CLOCK_BOOTTIME,
- time_now + NDISC_TIMEOUT_NO_RA_USEC, 10 * USEC_PER_MSEC,
- ndisc_timeout_no_ra, nd,
- nd->event_priority, "ndisc-timeout-no-ra", true);
+ r = ndisc_setup_timer(nd);
if (r < 0)
goto fail;
diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c
index 97d306c49b..71e7a71897 100644
--- a/src/libsystemd-network/sd-radv.c
+++ b/src/libsystemd-network/sd-radv.c
@@ -121,30 +121,39 @@ static sd_radv *radv_free(sd_radv *ra) {
DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_radv, sd_radv, radv_free);
static bool router_lifetime_is_valid(usec_t lifetime_usec) {
+ assert_cc(RADV_MAX_ROUTER_LIFETIME_USEC <= UINT16_MAX * USEC_PER_SEC);
return lifetime_usec == 0 ||
(lifetime_usec >= RADV_MIN_ROUTER_LIFETIME_USEC &&
lifetime_usec <= RADV_MAX_ROUTER_LIFETIME_USEC);
}
-static int radv_send(sd_radv *ra, const struct in6_addr *dst, usec_t lifetime_usec) {
+static int radv_send_router(sd_radv *ra, const struct in6_addr *dst, usec_t lifetime_usec) {
+ assert(ra);
+ assert(router_lifetime_is_valid(lifetime_usec));
+
struct sockaddr_in6 dst_addr = {
.sin6_family = AF_INET6,
.sin6_addr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
};
- struct nd_router_advert adv = {};
+ struct nd_router_advert adv = {
+ .nd_ra_type = ND_ROUTER_ADVERT,
+ .nd_ra_router_lifetime = usec_to_be16_sec(lifetime_usec),
+ .nd_ra_retransmit = usec_to_be32_msec(ra->retransmit_usec),
+ };
struct {
struct nd_opt_hdr opthdr;
struct ether_addr slladdr;
} _packed_ opt_mac = {
.opthdr = {
.nd_opt_type = ND_OPT_SOURCE_LINKADDR,
- .nd_opt_len = (sizeof(struct nd_opt_hdr) +
- sizeof(struct ether_addr) - 1) /8 + 1,
+ .nd_opt_len = DIV_ROUND_UP(sizeof(struct nd_opt_hdr) + sizeof(struct ether_addr), 8),
},
+ .slladdr = ra->mac_addr,
};
struct nd_opt_mtu opt_mtu = {
.nd_opt_mtu_type = ND_OPT_MTU,
.nd_opt_mtu_len = 1,
+ .nd_opt_mtu_mtu = htobe32(ra->mtu),
};
/* Reserve iov space for RA header, linkaddr, MTU, N prefixes, N routes, N pref64 prefixes, RDNSS,
* DNSSL, and home agent. */
@@ -157,9 +166,6 @@ static int radv_send(sd_radv *ra, const struct in6_addr *dst, usec_t lifetime_us
usec_t time_now;
int r;
- assert(ra);
- assert(router_lifetime_is_valid(lifetime_usec));
-
r = sd_event_now(ra->event, CLOCK_BOOTTIME, &time_now);
if (r < 0)
return r;
@@ -167,25 +173,19 @@ static int radv_send(sd_radv *ra, const struct in6_addr *dst, usec_t lifetime_us
if (dst && in6_addr_is_set(dst))
dst_addr.sin6_addr = *dst;
- adv.nd_ra_type = ND_ROUTER_ADVERT;
+ /* The nd_ra_curhoplimit and nd_ra_flags_reserved fields cannot specified with nd_ra_router_lifetime
+ * simultaneously in the structured initializer in the above. */
adv.nd_ra_curhoplimit = ra->hop_limit;
- adv.nd_ra_retransmit = usec_to_be32_msec(ra->retransmit_usec);
adv.nd_ra_flags_reserved = ra->flags;
- assert_cc(RADV_MAX_ROUTER_LIFETIME_USEC <= UINT16_MAX * USEC_PER_SEC);
- adv.nd_ra_router_lifetime = usec_to_be16_sec(lifetime_usec);
iov[msg.msg_iovlen++] = IOVEC_MAKE(&adv, sizeof(adv));
- /* MAC address is optional, either because the link does not use L2
- addresses or load sharing is desired. See RFC 4861, Section 4.2 */
- if (!ether_addr_is_null(&ra->mac_addr)) {
- opt_mac.slladdr = ra->mac_addr;
+ /* MAC address is optional, either because the link does not use L2 addresses or load sharing is
+ * desired. See RFC 4861, Section 4.2. */
+ if (!ether_addr_is_null(&ra->mac_addr))
iov[msg.msg_iovlen++] = IOVEC_MAKE(&opt_mac, sizeof(opt_mac));
- }
- if (ra->mtu > 0) {
- opt_mtu.nd_opt_mtu_mtu = htobe32(ra->mtu);
+ if (ra->mtu > 0)
iov[msg.msg_iovlen++] = IOVEC_MAKE(&opt_mtu, sizeof(opt_mtu));
- }
LIST_FOREACH(prefix, p, ra->prefixes) {
usec_t lifetime_valid_usec, lifetime_preferred_usec;
@@ -263,15 +263,15 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
if (r < 0)
switch (r) {
case -EADDRNOTAVAIL:
- log_radv(ra, "Received RS from neither link-local nor null address. Ignoring");
+ log_radv(ra, "Received RS from neither link-local nor null address, ignoring.");
return 0;
case -EMULTIHOP:
- log_radv(ra, "Received RS with invalid hop limit. Ignoring.");
+ log_radv(ra, "Received RS with invalid hop limit, ignoring.");
return 0;
case -EPFNOSUPPORT:
- log_radv(ra, "Received invalid source address from ICMPv6 socket. Ignoring.");
+ log_radv(ra, "Received invalid source address from ICMPv6 socket, ignoring.");
return 0;
default:
@@ -288,12 +288,11 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
* address option. See RFC 4861 Section 6.1.1. */
const char *addr = IN6_ADDR_TO_STRING(&src);
-
- r = radv_send(ra, &src, ra->lifetime_usec);
+ r = radv_send_router(ra, &src, ra->lifetime_usec);
if (r < 0)
log_radv_errno(ra, r, "Unable to send solicited Router Advertisement to %s, ignoring: %m", addr);
else
- log_radv(ra, "Sent solicited Router Advertisement to %s", addr);
+ log_radv(ra, "Sent solicited Router Advertisement to %s.", addr);
return 0;
}
@@ -311,7 +310,7 @@ static int radv_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
if (r < 0)
goto fail;
- r = radv_send(ra, NULL, ra->lifetime_usec);
+ r = radv_send_router(ra, NULL, ra->lifetime_usec);
if (r < 0)
log_radv_errno(ra, r, "Unable to send Router Advertisement, ignoring: %m");
@@ -371,9 +370,10 @@ int sd_radv_stop(sd_radv *ra) {
log_radv(ra, "Stopping IPv6 Router Advertisement daemon");
- /* RFC 4861, Section 6.2.5, send at least one Router Advertisement
- with zero lifetime */
- r = radv_send(ra, NULL, 0);
+ /* RFC 4861, Section 6.2.5:
+ * the router SHOULD transmit one or more (but not more than MAX_FINAL_RTR_ADVERTISEMENTS) final
+ * multicast Router Advertisements on the interface with a Router Lifetime field of zero. */
+ r = radv_send_router(ra, NULL, 0);
if (r < 0)
log_radv_errno(ra, r, "Unable to send last Router Advertisement with router lifetime set to zero, ignoring: %m");
@@ -384,6 +384,34 @@ int sd_radv_stop(sd_radv *ra) {
return 0;
}
+static int radv_setup_recv_event(sd_radv *ra) {
+ int r;
+
+ assert(ra);
+ assert(ra->event);
+ assert(ra->ifindex > 0);
+
+ _cleanup_close_ int fd = -EBADF;
+ fd = icmp6_bind(ra->ifindex, /* is_router = */ true);
+ if (fd < 0)
+ return fd;
+
+ _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
+ r = sd_event_add_io(ra->event, &s, fd, EPOLLIN, radv_recv, ra);
+ if (r < 0)
+ return r;
+
+ r = sd_event_source_set_priority(s, ra->event_priority);
+ if (r < 0)
+ return r;
+
+ (void) sd_event_source_set_description(s, "radv-receive-message");
+
+ ra->fd = TAKE_FD(fd);
+ ra->recv_event_source = TAKE_PTR(s);
+ return 0;
+}
+
int sd_radv_start(sd_radv *ra) {
int r;
@@ -394,6 +422,10 @@ int sd_radv_start(sd_radv *ra) {
if (ra->state != RADV_STATE_IDLE)
return 0;
+ r = radv_setup_recv_event(ra);
+ if (r < 0)
+ goto fail;
+
r = event_reset_time(ra->event, &ra->timeout_event_source,
CLOCK_BOOTTIME,
0, 0,
@@ -402,22 +434,6 @@ int sd_radv_start(sd_radv *ra) {
if (r < 0)
goto fail;
- r = icmp6_bind_router_advertisement(ra->ifindex);
- if (r < 0)
- goto fail;
-
- ra->fd = r;
-
- r = sd_event_add_io(ra->event, &ra->recv_event_source, ra->fd, EPOLLIN, radv_recv, ra);
- if (r < 0)
- goto fail;
-
- r = sd_event_source_set_priority(ra->recv_event_source, ra->event_priority);
- if (r < 0)
- goto fail;
-
- (void) sd_event_source_set_description(ra->recv_event_source, "radv-receive-message");
-
ra->state = RADV_STATE_ADVERTISING;
log_radv(ra, "Started IPv6 Router Advertisement daemon");
@@ -674,7 +690,7 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
return 0;
/* If RAs have already been sent, send an RA immediately to announce the newly-added prefix */
- r = radv_send(ra, NULL, ra->lifetime_usec);
+ r = radv_send_router(ra, NULL, ra->lifetime_usec);
if (r < 0)
log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix %s, ignoring: %m", addr_p);
else
@@ -770,7 +786,7 @@ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p) {
return 0;
/* If RAs have already been sent, send an RA immediately to announce the newly-added route prefix */
- r = radv_send(ra, NULL, ra->lifetime_usec);
+ r = radv_send_router(ra, NULL, ra->lifetime_usec);
if (r < 0)
log_radv_errno(ra, r, "Unable to send Router Advertisement for added route prefix %s, ignoring: %m",
strna(addr_p));
@@ -842,7 +858,7 @@ int sd_radv_add_pref64_prefix(sd_radv *ra, sd_radv_pref64_prefix *p) {
return 0;
/* If RAs have already been sent, send an RA immediately to announce the newly-added route prefix */
- r = radv_send(ra, NULL, ra->lifetime_usec);
+ r = radv_send_router(ra, NULL, ra->lifetime_usec);
if (r < 0)
log_radv_errno(ra, r, "Unable to send Router Advertisement for added PREF64 prefix %s, ignoring: %m",
strna(addr_p));
diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c
index 442b139f9b..c5f10cc795 100644
--- a/src/libsystemd-network/test-ndisc-ra.c
+++ b/src/libsystemd-network/test-ndisc-ra.c
@@ -20,37 +20,6 @@ static struct ether_addr mac_addr = {
.ether_addr_octet = { 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53 }
};
-static uint8_t advertisement[] = {
- /* ICMPv6 Router Advertisement, no checksum */
- 0x86, 0x00, 0x00, 0x00, 0x40, 0xc0, 0x00, 0xb4,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- /* Source Link Layer Address Option */
- 0x01, 0x01, 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53,
- /* Prefix Information Option */
- 0x03, 0x04, 0x40, 0xc0, 0x00, 0x00, 0x01, 0xf4,
- 0x00, 0x00, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- /* Prefix Information Option */
- 0x03, 0x04, 0x40, 0xc0, 0x00, 0x00, 0x0e, 0x10,
- 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- /* Prefix Information Option */
- 0x03, 0x04, 0x30, 0xc0, 0x00, 0x00, 0x0e, 0x10,
- 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- /* Recursive DNS Server Option */
- 0x19, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
- 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- /* DNS Search List Option */
- 0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
- 0x03, 0x6c, 0x61, 0x62, 0x05, 0x69, 0x6e, 0x74,
- 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
static bool test_stopped;
static struct {
struct in6_addr address;
@@ -271,49 +240,91 @@ TEST(radv) {
assert_se(!ra);
}
-static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
- sd_radv *ra = userdata;
- unsigned char buf[168];
- size_t i;
-
- assert_se(read(test_fd[0], &buf, sizeof(buf)) == sizeof(buf));
+static void dump_message(const uint8_t *buf, size_t len) {
+ assert(len >= sizeof(struct nd_router_advert));
- /* router lifetime must be zero when test is stopped */
- if (test_stopped) {
- advertisement[6] = 0x00;
- advertisement[7] = 0x00;
- }
+ printf("Received Router Advertisement with lifetime %i sec\n",
+ (buf[6] << 8) + buf[7]);
- printf ("Received Router Advertisement with lifetime %i\n",
- (advertisement[6] << 8) + advertisement[7]);
-
- /* test only up to buf size, rest is not yet implemented */
- for (i = 0; i < sizeof(buf); i++) {
+ for (size_t i = 0; i < len; i++) {
if (!(i % 8))
printf("%3zu: ", i);
printf("0x%02x", buf[i]);
- assert_se(buf[i] == advertisement[i]);
-
if ((i + 1) % 8)
printf(", ");
else
printf("\n");
}
+}
- if (test_stopped) {
- sd_event *e;
+static void verify_message(const uint8_t *buf, size_t len) {
+ static const uint8_t advertisement[] = {
+ /* ICMPv6 Router Advertisement, no checksum */
+ 0x86, 0x00, 0x00, 0x00, 0x40, 0xc0, 0x00, 0xb4,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* Source Link Layer Address Option */
+ 0x01, 0x01, 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53,
+ /* Prefix Information Option */
+ 0x03, 0x04, 0x40, 0xc0, 0x00, 0x00, 0x01, 0xf4,
+ 0x00, 0x00, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* Prefix Information Option */
+ 0x03, 0x04, 0x40, 0xc0, 0x00, 0x00, 0x0e, 0x10,
+ 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* Prefix Information Option */
+ 0x03, 0x04, 0x30, 0xc0, 0x00, 0x00, 0x0e, 0x10,
+ 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* Recursive DNS Server Option */
+ 0x19, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
+ 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ /* DNS Search List Option */
+ 0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
+ 0x03, 0x6c, 0x61, 0x62, 0x05, 0x69, 0x6e, 0x74,
+ 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+
+ /* verify only up to known options, rest is not yet implemented */
+ for (size_t i = 0, m = MIN(len, sizeof(advertisement)); i < m; i++) {
+ if (test_stopped)
+ switch (i) {
+ case 6 ... 7: /* router lifetime must be zero on stop. */
+ assert_se(buf[i] == 0);
+ continue;
+ }
- e = sd_radv_get_event(ra);
- sd_event_exit(e, 0);
+ assert_se(buf[i] == advertisement[i]);
+ }
+}
+
+static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
+ sd_radv *ra = ASSERT_PTR(userdata);
+ _cleanup_free_ uint8_t *buf = NULL;
+ ssize_t buflen;
+ buflen = next_datagram_size_fd(fd);
+ assert_se(buflen >= 0);
+ assert_se(buf = new0(uint8_t, buflen));
+
+ assert_se(read(fd, buf, buflen) == buflen);
+
+ dump_message(buf, buflen);
+ verify_message(buf, buflen);
+
+ if (test_stopped) {
+ assert_se(sd_event_exit(sd_radv_get_event(ra), 0) >= 0);
return 0;
}
assert_se(sd_radv_stop(ra) >= 0);
test_stopped = true;
-
return 0;
}
diff --git a/src/libsystemd-network/test-ndisc-rs.c b/src/libsystemd-network/test-ndisc-rs.c
index 9c755ecbc6..e37dfeeded 100644
--- a/src/libsystemd-network/test-ndisc-rs.c
+++ b/src/libsystemd-network/test-ndisc-rs.c
@@ -202,7 +202,7 @@ static int send_ra(uint8_t flags) {
return 0;
}
-static void test_callback(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router *rt, void *userdata) {
+static void test_callback(sd_ndisc *nd, sd_ndisc_event_t event, void *message, void *userdata) {
sd_event *e = userdata;
static unsigned idx = 0;
uint64_t flags_array[] = {
@@ -219,6 +219,8 @@ static void test_callback(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router
if (event != SD_NDISC_EVENT_ROUTER)
return;
+ sd_ndisc_router *rt = ASSERT_PTR(message);
+
router_dump(rt);
assert_se(sd_ndisc_router_get_flags(rt, &flags) >= 0);
diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build
index 5d18f974ba..817e3a5e09 100644
--- a/src/libsystemd/meson.build
+++ b/src/libsystemd/meson.build
@@ -118,8 +118,7 @@ libsystemd_static = static_library(
libsystemd_sources,
include_directories : libsystemd_includes,
c_args : libsystemd_c_args,
- link_with : [libbasic,
- libbasic_compress],
+ link_with : [libbasic],
dependencies : [threads,
librt,
userspace],
diff --git a/src/libsystemd/sd-bus/bus-common-errors.c b/src/libsystemd/sd-bus/bus-common-errors.c
index e44795b1d3..de12ec5e9e 100644
--- a/src/libsystemd/sd-bus/bus-common-errors.c
+++ b/src/libsystemd/sd-bus/bus-common-errors.c
@@ -105,6 +105,7 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
SD_BUS_ERROR_MAP(BUS_ERROR_TRANSFER_IN_PROGRESS, EBUSY),
SD_BUS_ERROR_MAP(BUS_ERROR_NO_PRODUCT_UUID, EOPNOTSUPP),
+ SD_BUS_ERROR_MAP(BUS_ERROR_NO_HARDWARE_SERIAL, EOPNOTSUPP),
SD_BUS_ERROR_MAP(BUS_ERROR_FILE_IS_PROTECTED, EACCES),
SD_BUS_ERROR_MAP(BUS_ERROR_READ_ONLY_FILESYSTEM, EROFS),
diff --git a/src/libsystemd/sd-bus/bus-common-errors.h b/src/libsystemd/sd-bus/bus-common-errors.h
index 36f53dbde1..94dc85d301 100644
--- a/src/libsystemd/sd-bus/bus-common-errors.h
+++ b/src/libsystemd/sd-bus/bus-common-errors.h
@@ -106,6 +106,7 @@
#define BUS_ERROR_TRANSFER_IN_PROGRESS "org.freedesktop.import1.TransferInProgress"
#define BUS_ERROR_NO_PRODUCT_UUID "org.freedesktop.hostname1.NoProductUUID"
+#define BUS_ERROR_NO_HARDWARE_SERIAL "org.freedesktop.hostname1.NoHardwareSerial"
#define BUS_ERROR_FILE_IS_PROTECTED "org.freedesktop.hostname1.FileIsProtected"
#define BUS_ERROR_READ_ONLY_FILESYSTEM "org.freedesktop.hostname1.ReadOnlyFilesystem"
diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c
index bfc2a8a9ca..9a34015738 100644
--- a/src/libsystemd/sd-device/sd-device.c
+++ b/src/libsystemd/sd-device/sd-device.c
@@ -214,7 +214,7 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) {
/* Only operate on sysfs, i.e. refuse going down into /sys/fs/cgroup/ or similar places where
* things are not arranged as kobjects in kernel, and hence don't necessarily have
* kobject/attribute structure. */
- r = getenv_bool_secure("SYSTEMD_DEVICE_VERIFY_SYSFS");
+ r = secure_getenv_bool("SYSTEMD_DEVICE_VERIFY_SYSFS");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_DEVICE_VERIFY_SYSFS value: %m");
if (r != 0) {
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
index 338609b186..12aa980593 100644
--- a/src/libsystemd/sd-event/sd-event.c
+++ b/src/libsystemd/sd-event/sd-event.c
@@ -1574,7 +1574,7 @@ static int child_exit_callback(sd_event_source *s, const siginfo_t *si, void *us
static bool shall_use_pidfd(void) {
/* Mostly relevant for debugging, i.e. this is used in test-event.c to test the event loop once with and once without pidfd */
- return getenv_bool_secure("SYSTEMD_PIDFD") != 0;
+ return secure_getenv_bool("SYSTEMD_PIDFD") != 0;
}
_public_ int sd_event_add_child(
@@ -4915,13 +4915,13 @@ _public_ int sd_event_get_state(sd_event *e) {
_public_ int sd_event_get_exit_code(sd_event *e, int *code) {
assert_return(e, -EINVAL);
assert_return(e = event_resolve(e), -ENOPKG);
- assert_return(code, -EINVAL);
assert_return(!event_origin_changed(e), -ECHILD);
if (!e->exit_requested)
return -ENODATA;
- *code = e->exit_code;
+ if (code)
+ *code = e->exit_code;
return 0;
}
diff --git a/src/libsystemd/sd-event/test-event.c b/src/libsystemd/sd-event/test-event.c
index 63d3ee7284..e02de097ba 100644
--- a/src/libsystemd/sd-event/test-event.c
+++ b/src/libsystemd/sd-event/test-event.c
@@ -92,7 +92,7 @@ static int signal_handler(sd_event_source *s, const struct signalfd_siginfo *si,
assert_se(userdata == INT_TO_PTR('e'));
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGUSR2, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGUSR2) >= 0);
pid = fork();
assert_se(pid >= 0);
@@ -142,7 +142,7 @@ static int defer_handler(sd_event_source *s, void *userdata) {
assert_se(userdata == INT_TO_PTR('d'));
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGUSR1, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGUSR1) >= 0);
assert_se(sd_event_add_signal(sd_event_source_get_event(s), &p, SIGUSR1, signal_handler, INT_TO_PTR('e')) >= 0);
assert_se(sd_event_source_set_enabled(p, SD_EVENT_ONESHOT) >= 0);
@@ -254,7 +254,7 @@ static void test_basic_one(bool with_pidfd) {
assert_se(sd_event_source_set_prepare(z, prepare_handler) >= 0);
/* Test for floating event sources */
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN+1, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN+1) >= 0);
assert_se(sd_event_add_signal(e, NULL, SIGRTMIN+1, NULL, NULL) >= 0);
assert_se(write(a[1], &ch, 1) >= 0);
@@ -346,7 +346,7 @@ TEST(rtqueue) {
assert_se(sd_event_default(&e) >= 0);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN+2, SIGRTMIN+3, SIGUSR2, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN+2, SIGRTMIN+3, SIGUSR2) >= 0);
assert_se(sd_event_add_signal(e, &u, SIGRTMIN+2, rtqueue_handler, NULL) >= 0);
assert_se(sd_event_add_signal(e, &v, SIGRTMIN+3, rtqueue_handler, NULL) >= 0);
assert_se(sd_event_add_signal(e, &s, SIGUSR2, rtqueue_handler, NULL) >= 0);
@@ -556,7 +556,7 @@ TEST(pidfd) {
int pidfd;
pid_t pid, pid2;
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
pid = fork();
if (pid == 0)
diff --git a/src/libsystemd/sd-journal/catalog.c b/src/libsystemd/sd-journal/catalog.c
index cb50060772..826d67371a 100644
--- a/src/libsystemd/sd-journal/catalog.c
+++ b/src/libsystemd/sd-journal/catalog.c
@@ -618,8 +618,7 @@ int catalog_get(const char* database, sd_id128_t id, char **_text) {
r = 0;
finish:
- if (p)
- munmap(p, st.st_size);
+ (void) munmap(p, st.st_size);
return r;
}
diff --git a/src/libsystemd/sd-netlink/netlink-types-rtnl.c b/src/libsystemd/sd-netlink/netlink-types-rtnl.c
index 1fa88b1ca5..e39a75cfe4 100644
--- a/src/libsystemd/sd-netlink/netlink-types-rtnl.c
+++ b/src/libsystemd/sd-netlink/netlink-types-rtnl.c
@@ -308,6 +308,7 @@ static const NLAPolicy rtnl_link_info_data_macvlan_policies[] = {
[IFLA_MACVLAN_MACADDR_COUNT] = BUILD_POLICY(U32),
[IFLA_MACVLAN_BC_QUEUE_LEN] = BUILD_POLICY(U32),
[IFLA_MACVLAN_BC_QUEUE_LEN_USED] = BUILD_POLICY(U32),
+ [IFLA_MACVLAN_BC_CUTOFF] = BUILD_POLICY(S32),
};
static const NLAPolicy rtnl_link_info_data_tun_policies[] = {
diff --git a/src/libsystemd/sd-netlink/netlink-util.c b/src/libsystemd/sd-netlink/netlink-util.c
index e634fd3378..90616094bc 100644
--- a/src/libsystemd/sd-netlink/netlink-util.c
+++ b/src/libsystemd/sd-netlink/netlink-util.c
@@ -509,7 +509,7 @@ int rtnl_get_link_info(
assert(rtnl);
assert(ifindex > 0);
- if (!ret_iftype && !ret_flags)
+ if (!ret_iftype && !ret_flags && !ret_kind && !ret_hw_addr && !ret_permanent_hw_addr)
return 0;
if (!*rtnl) {
diff --git a/src/libsystemd/sd-path/sd-path.c b/src/libsystemd/sd-path/sd-path.c
index 7290d1c40a..85bca9fd3b 100644
--- a/src/libsystemd/sd-path/sd-path.c
+++ b/src/libsystemd/sd-path/sd-path.c
@@ -596,7 +596,7 @@ static int get_search(uint64_t type, char ***list) {
case SD_PATH_SYSTEMD_SEARCH_SYSTEM_UNIT:
case SD_PATH_SYSTEMD_SEARCH_USER_UNIT: {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
RuntimeScope scope = type == SD_PATH_SYSTEMD_SEARCH_SYSTEM_UNIT ?
RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER;
diff --git a/src/locale/xkbcommon-util.c b/src/locale/xkbcommon-util.c
index 295ac8af8d..468452f8af 100644
--- a/src/locale/xkbcommon-util.c
+++ b/src/locale/xkbcommon-util.c
@@ -9,20 +9,11 @@
#if HAVE_XKBCOMMON
static void *xkbcommon_dl = NULL;
-struct xkb_context* (*sym_xkb_context_new)(enum xkb_context_flags flags);
-void (*sym_xkb_context_unref)(struct xkb_context *context);
-void (*sym_xkb_context_set_log_fn)(
- struct xkb_context *context,
- void (*log_fn)(
- struct xkb_context *context,
- enum xkb_log_level level,
- const char *format,
- va_list args));
-struct xkb_keymap* (*sym_xkb_keymap_new_from_names)(
- struct xkb_context *context,
- const struct xkb_rule_names *names,
- enum xkb_keymap_compile_flags flags);
-void (*sym_xkb_keymap_unref)(struct xkb_keymap *keymap);
+DLSYM_FUNCTION(xkb_context_new);
+DLSYM_FUNCTION(xkb_context_unref);
+DLSYM_FUNCTION(xkb_context_set_log_fn);
+DLSYM_FUNCTION(xkb_keymap_new_from_names);
+DLSYM_FUNCTION(xkb_keymap_unref);
static int dlopen_xkbcommon(void) {
return dlopen_many_sym_or_warn(
diff --git a/src/locale/xkbcommon-util.h b/src/locale/xkbcommon-util.h
index e99c2d7783..92f45c2bcb 100644
--- a/src/locale/xkbcommon-util.h
+++ b/src/locale/xkbcommon-util.h
@@ -1,23 +1,16 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include "dlfcn-util.h"
+
#if HAVE_XKBCOMMON
#include <xkbcommon/xkbcommon.h>
-extern struct xkb_context* (*sym_xkb_context_new)(enum xkb_context_flags flags);
-extern void (*sym_xkb_context_unref)(struct xkb_context *context);
-extern void (*sym_xkb_context_set_log_fn)(
- struct xkb_context *context,
- void (*log_fn)(
- struct xkb_context *context,
- enum xkb_log_level level,
- const char *format,
- va_list args));
-extern struct xkb_keymap* (*sym_xkb_keymap_new_from_names)(
- struct xkb_context *context,
- const struct xkb_rule_names *names,
- enum xkb_keymap_compile_flags flags);
-extern void (*sym_xkb_keymap_unref)(struct xkb_keymap *keymap);
+DLSYM_PROTOTYPE(xkb_context_new);
+DLSYM_PROTOTYPE(xkb_context_unref);
+DLSYM_PROTOTYPE(xkb_context_set_log_fn);
+DLSYM_PROTOTYPE(xkb_keymap_new_from_names);
+DLSYM_PROTOTYPE(xkb_keymap_unref);
int verify_xkb_rmlvo(const char *model, const char *layout, const char *variant, const char *options);
diff --git a/src/login/logind-core.c b/src/login/logind-core.c
index e09bb9f2de..54febdadd7 100644
--- a/src/login/logind-core.c
+++ b/src/login/logind-core.c
@@ -121,7 +121,7 @@ int manager_add_seat(Manager *m, const char *id, Seat **ret_seat) {
s = hashmap_get(m->seats, id);
if (!s) {
- r = seat_new(&s, m, id);
+ r = seat_new(m, id, &s);
if (r < 0)
return r;
}
@@ -141,7 +141,7 @@ int manager_add_session(Manager *m, const char *id, Session **ret_session) {
s = hashmap_get(m->sessions, id);
if (!s) {
- r = session_new(&s, m, id);
+ r = session_new(m, id, &s);
if (r < 0)
return r;
}
@@ -165,7 +165,7 @@ int manager_add_user(
u = hashmap_get(m->users, UID_TO_PTR(ur->uid));
if (!u) {
- r = user_new(&u, m, ur);
+ r = user_new(m, ur, &u);
if (r < 0)
return r;
}
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 4886895ee6..7290616252 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1671,7 +1671,7 @@ static int have_multiple_sessions(
/* Check for other users' sessions. Greeter sessions do not
* count, and non-login sessions do not count either. */
HASHMAP_FOREACH(session, m->sessions)
- if (session->class == SESSION_USER &&
+ if (IN_SET(session->class, SESSION_USER, SESSION_USER_EARLY) &&
session->user->user_record->uid != uid)
return true;
diff --git a/src/login/logind-device.h b/src/login/logind-device.h
index 0d89613d77..f96c4dbfb6 100644
--- a/src/login/logind-device.h
+++ b/src/login/logind-device.h
@@ -16,7 +16,7 @@ struct Device {
dual_timestamp timestamp;
- LIST_FIELDS(struct Device, devices);
+ LIST_FIELDS(Device, devices);
LIST_HEAD(SessionDevice, session_devices);
};
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index 8d875d2ea7..bed1f7db03 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -25,13 +25,13 @@
#include "terminal-util.h"
#include "tmpfile-util.h"
-int seat_new(Seat** ret, Manager *m, const char *id) {
+int seat_new(Manager *m, const char *id, Seat **ret) {
_cleanup_(seat_freep) Seat *s = NULL;
int r;
- assert(ret);
assert(m);
assert(id);
+ assert(ret);
if (!seat_name_is_valid(id))
return -EINVAL;
@@ -42,14 +42,12 @@ int seat_new(Seat** ret, Manager *m, const char *id) {
*s = (Seat) {
.manager = m,
+ .id = strdup(id),
+ .state_file = path_join("/run/systemd/seats/", id),
};
-
- s->state_file = path_join("/run/systemd/seats", id);
- if (!s->state_file)
+ if (!s->id || !s->state_file)
return -ENOMEM;
- s->id = basename(s->state_file);
-
r = hashmap_put(m->seats, s->id, s);
if (r < 0)
return r;
@@ -77,6 +75,7 @@ Seat* seat_free(Seat *s) {
free(s->positions);
free(s->state_file);
+ free(s->id);
return mfree(s);
}
diff --git a/src/login/logind-seat.h b/src/login/logind-seat.h
index 2d18e7595a..76a69e6517 100644
--- a/src/login/logind-seat.h
+++ b/src/login/logind-seat.h
@@ -26,10 +26,10 @@ struct Seat {
LIST_FIELDS(Seat, gc_queue);
};
-int seat_new(Seat **ret, Manager *m, const char *id);
+int seat_new(Manager *m, const char *id, Seat **ret);
Seat* seat_free(Seat *s);
-DEFINE_TRIVIAL_CLEANUP_FUNC(Seat *, seat_free);
+DEFINE_TRIVIAL_CLEANUP_FUNC(Seat*, seat_free);
int seat_save(Seat *s);
int seat_load(Seat *s);
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 787855a7b5..2713215e10 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -46,13 +46,13 @@
static void session_remove_fifo(Session *s);
static void session_restore_vt(Session *s);
-int session_new(Session **ret, Manager *m, const char *id) {
+int session_new(Manager *m, const char *id, Session **ret) {
_cleanup_(session_freep) Session *s = NULL;
int r;
- assert(ret);
assert(m);
assert(id);
+ assert(ret);
if (!session_id_valid(id))
return -EINVAL;
@@ -63,19 +63,17 @@ int session_new(Session **ret, Manager *m, const char *id) {
*s = (Session) {
.manager = m,
+ .id = strdup(id),
+ .state_file = path_join("/run/systemd/sessions/", id),
.fifo_fd = -EBADF,
.vtfd = -EBADF,
.audit_id = AUDIT_SESSION_INVALID,
.tty_validity = _TTY_VALIDITY_INVALID,
.leader = PIDREF_NULL,
};
-
- s->state_file = path_join("/run/systemd/sessions", id);
- if (!s->state_file)
+ if (!s->id || !s->state_file)
return -ENOMEM;
- s->id = basename(s->state_file);
-
s->devices = hashmap_new(&devt_hash_ops);
if (!s->devices)
return -ENOMEM;
@@ -146,10 +144,12 @@ Session* session_free(Session *s) {
if (!s)
return NULL;
+ sd_event_source_unref(s->stop_on_idle_event_source);
+
if (s->in_gc_queue)
LIST_REMOVE(gc_queue, s->manager->session_gc_queue, s);
- s->timer_event_source = sd_event_source_unref(s->timer_event_source);
+ sd_event_source_unref(s->timer_event_source);
session_drop_controller(s);
@@ -203,10 +203,9 @@ Session* session_free(Session *s) {
/* Note that we remove neither the state file nor the fifo path here, since we want both to survive
* daemon restarts */
- free(s->state_file);
free(s->fifo_path);
-
- sd_event_source_unref(s->stop_on_idle_event_source);
+ free(s->state_file);
+ free(s->id);
return mfree(s);
}
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
index f344fb6a61..c187bcd779 100644
--- a/src/login/logind-session.h
+++ b/src/login/logind-session.h
@@ -95,7 +95,8 @@ typedef enum TTYValidity {
struct Session {
Manager *manager;
- const char *id;
+ char *id;
+
unsigned position;
SessionType type;
SessionType original_type;
@@ -164,10 +165,10 @@ struct Session {
LIST_FIELDS(Session, gc_queue);
};
-int session_new(Session **ret, Manager *m, const char *id);
+int session_new(Manager *m, const char *id, Session **ret);
Session* session_free(Session *s);
-DEFINE_TRIVIAL_CLEANUP_FUNC(Session *, session_free);
+DEFINE_TRIVIAL_CLEANUP_FUNC(Session*, session_free);
void session_set_user(Session *s, User *u);
int session_set_leader_consume(Session *s, PidRef _leader);
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index a14c9b7cfb..537cc551cc 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -37,17 +37,14 @@
#include "unit-name.h"
#include "user-util.h"
-int user_new(User **ret,
- Manager *m,
- UserRecord *ur) {
-
+int user_new(Manager *m, UserRecord *ur, User **ret) {
_cleanup_(user_freep) User *u = NULL;
char lu[DECIMAL_STR_MAX(uid_t) + 1];
int r;
- assert(ret);
assert(m);
assert(ur);
+ assert(ret);
if (!ur->user_name)
return -EINVAL;
diff --git a/src/login/logind-user.h b/src/login/logind-user.h
index 723b66d189..7b10c4fd60 100644
--- a/src/login/logind-user.h
+++ b/src/login/logind-user.h
@@ -65,10 +65,10 @@ struct User {
LIST_FIELDS(User, gc_queue);
};
-int user_new(User **out, Manager *m, UserRecord *ur);
+int user_new(Manager *m, UserRecord *ur, User **ret);
User *user_free(User *u);
-DEFINE_TRIVIAL_CLEANUP_FUNC(User *, user_free);
+DEFINE_TRIVIAL_CLEANUP_FUNC(User*, user_free);
int user_start_service_manager(User *u);
int user_start(User *u);
diff --git a/src/login/logind.c b/src/login/logind.c
index 7b6467d63a..415d63da1f 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -832,7 +832,7 @@ static int manager_connect_console(Manager *m) {
SIGRTMIN, SIGRTMAX);
assert_se(ignore_signals(SIGRTMIN + 1) >= 0);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN) >= 0);
r = sd_event_add_signal(m->event, NULL, SIGRTMIN, manager_vt_switch, m);
if (r < 0)
@@ -1244,7 +1244,7 @@ static int run(int argc, char *argv[]) {
(void) mkdir_label("/run/systemd/users", 0755);
(void) mkdir_label("/run/systemd/sessions", 0755);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, SIGCHLD, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, SIGCHLD, SIGRTMIN+18) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/login/meson.build b/src/login/meson.build
index b5bb150258..43db03184c 100644
--- a/src/login/meson.build
+++ b/src/login/meson.build
@@ -65,9 +65,9 @@ executables += [
'conditions' : ['ENABLE_LOGIND'],
'sources' : loginctl_sources,
'dependencies' : [
- liblz4,
- libxz,
- libzstd,
+ liblz4_cflags,
+ libxz_cflags,
+ libzstd_cflags,
threads,
],
},
diff --git a/src/login/pam_systemd.c b/src/login/pam_systemd.c
index 9aa298c654..2ea3f6c850 100644
--- a/src/login/pam_systemd.c
+++ b/src/login/pam_systemd.c
@@ -835,7 +835,7 @@ static int create_session_message(
if (!avoid_pidfd) {
pidfd = pidfd_open(getpid_cached(), 0);
- if (pidfd < 0 && !ERRNO_IS_NOT_SUPPORTED(errno))
+ if (pidfd < 0 && !ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno))
return -errno;
}
diff --git a/src/machine-id-setup/machine-id-setup-main.c b/src/machine-id-setup/machine-id-setup-main.c
index 59aad985f8..bbc58945bd 100644
--- a/src/machine-id-setup/machine-id-setup-main.c
+++ b/src/machine-id-setup/machine-id-setup-main.c
@@ -156,7 +156,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_VALIDATE_OS |
DISSECT_IMAGE_RELAX_VAR_CHECK |
DISSECT_IMAGE_FSCK |
- DISSECT_IMAGE_GROWFS,
+ DISSECT_IMAGE_GROWFS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index e1bc932443..bab3719a49 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -15,6 +15,7 @@
#include "alloc-util.h"
#include "build.h"
+#include "build-path.h"
#include "bus-common-errors.h"
#include "bus-error.h"
#include "bus-locator.h"
@@ -62,6 +63,25 @@
#include "verbs.h"
#include "web-util.h"
+typedef enum MachineRunner {
+ RUNNER_NSPAWN,
+ RUNNER_VMSPAWN,
+ _RUNNER_MAX,
+ _RUNNER_INVALID = -EINVAL,
+} MachineRunner;
+
+static const char* const machine_runner_table[_RUNNER_MAX] = {
+ [RUNNER_NSPAWN] = "nspawn",
+ [RUNNER_VMSPAWN] = "vmspawn",
+};
+
+DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(machine_runner, MachineRunner);
+
+static const char* const machine_runner_unit_prefix_table[_RUNNER_MAX] = {
+ [RUNNER_NSPAWN] = "systemd-nspawn",
+ [RUNNER_VMSPAWN] = "systemd-vmspawn",
+};
+
static char **arg_property = NULL;
static bool arg_all = false;
static BusPrintPropertyFlags arg_print_flags = 0;
@@ -81,6 +101,7 @@ static OutputMode arg_output = OUTPUT_SHORT;
static bool arg_now = false;
static bool arg_force = false;
static ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
+static MachineRunner arg_runner = RUNNER_NSPAWN;
static const char* arg_format = NULL;
static const char *arg_uid = NULL;
static char **arg_setenv = NULL;
@@ -747,22 +768,17 @@ static int print_image_hostname(sd_bus *bus, const char *name) {
static int print_image_machine_id(sd_bus *bus, const char *name) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- sd_id128_t id = SD_ID128_NULL;
- const void *p;
- size_t size;
+ sd_id128_t id;
int r;
r = bus_call_method(bus, bus_machine_mgr, "GetImageMachineID", NULL, &reply, "s", name);
if (r < 0)
return r;
- r = sd_bus_message_read_array(reply, 'y', &p, &size);
+ r = bus_message_read_id128(reply, &id);
if (r < 0)
return r;
- if (size == sizeof(sd_id128_t))
- memcpy(&id, p, size);
-
if (!sd_id128_is_null(id))
printf(" Machine ID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(id));
@@ -1052,6 +1068,12 @@ static int kill_machine(int argc, char *argv[], void *userdata) {
}
static int reboot_machine(int argc, char *argv[], void *userdata) {
+ if (arg_runner == RUNNER_VMSPAWN)
+ return log_error_errno(
+ SYNTHETIC_ERRNO(EOPNOTSUPP),
+ "%s only support supported for --runner=nspawn",
+ streq(argv[0], "reboot") ? "Reboot" : "Restart");
+
arg_kill_whom = "leader";
arg_signal = SIGINT; /* sysvinit + systemd */
@@ -1130,7 +1152,7 @@ static int copy_files(int argc, char *argv[], void *userdata) {
return bus_log_create_error(r);
if (arg_force) {
- r = sd_bus_message_append(m, "t", MACHINE_COPY_REPLACE);
+ r = sd_bus_message_append(m, "t", (uint64_t) MACHINE_COPY_REPLACE);
if (r < 0)
return bus_log_create_error(r);
}
@@ -1201,7 +1223,7 @@ static int process_forward(sd_event *event, PTYForward **forward, int master, PT
assert(master >= 0);
assert(name);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT) >= 0);
if (!arg_quiet) {
if (streq(name, ".host"))
@@ -1462,6 +1484,9 @@ static int edit_settings(int argc, char *argv[], void *userdata) {
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"Edit is only supported on the host machine.");
+ if (arg_runner == RUNNER_VMSPAWN)
+ return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Edit is only supported for --runner=nspawn");
+
r = mac_init();
if (r < 0)
return r;
@@ -1525,6 +1550,9 @@ static int cat_settings(int argc, char *argv[], void *userdata) {
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"Cat is only supported on the host machine.");
+ if (arg_runner == RUNNER_VMSPAWN)
+ return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Cat is only supported for --runner=nspawn");
+
pager_open(arg_pager_flags);
STRV_FOREACH(name, strv_skip(argv, 1)) {
@@ -1682,12 +1710,13 @@ static int make_service_name(const char *name, char **ret) {
assert(name);
assert(ret);
+ assert(arg_runner >= 0 && arg_runner < (MachineRunner) ELEMENTSOF(machine_runner_unit_prefix_table));
if (!hostname_is_valid(name, 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid machine name %s.", name);
- r = unit_name_build("systemd-nspawn", name, ".service", ret);
+ r = unit_name_build(machine_runner_unit_prefix_table[arg_runner], name, ".service", ret);
if (r < 0)
return log_error_errno(r, "Failed to build unit name: %m");
@@ -1846,633 +1875,6 @@ static int enable_machine(int argc, char *argv[], void *userdata) {
return 0;
}
-static int match_log_message(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- const char **our_path = userdata, *line;
- unsigned priority;
- int r;
-
- assert(m);
- assert(our_path);
-
- r = sd_bus_message_read(m, "us", &priority, &line);
- if (r < 0) {
- bus_log_parse_error(r);
- return 0;
- }
-
- if (!streq_ptr(*our_path, sd_bus_message_get_path(m)))
- return 0;
-
- if (arg_quiet && LOG_PRI(priority) >= LOG_INFO)
- return 0;
-
- log_full(priority, "%s", line);
- return 0;
-}
-
-static int match_transfer_removed(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- const char **our_path = userdata, *path, *result;
- uint32_t id;
- int r;
-
- assert(m);
- assert(our_path);
-
- r = sd_bus_message_read(m, "uos", &id, &path, &result);
- if (r < 0) {
- bus_log_parse_error(r);
- return 0;
- }
-
- if (!streq_ptr(*our_path, path))
- return 0;
-
- sd_event_exit(sd_bus_get_event(sd_bus_message_get_bus(m)), !streq_ptr(result, "done"));
- return 0;
-}
-
-static int transfer_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
- assert(s);
- assert(si);
-
- if (!arg_quiet)
- log_info("Continuing download in the background. Use \"machinectl cancel-transfer %" PRIu32 "\" to abort transfer.", PTR_TO_UINT32(userdata));
-
- sd_event_exit(sd_event_source_get_event(s), EINTR);
- return 0;
-}
-
-static int transfer_image_common(sd_bus *bus, sd_bus_message *m) {
- _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *slot_job_removed = NULL, *slot_log_message = NULL;
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- _cleanup_(sd_event_unrefp) sd_event* event = NULL;
- const char *path = NULL;
- uint32_t id;
- int r;
-
- assert(bus);
- assert(m);
-
- polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
-
- r = sd_event_default(&event);
- if (r < 0)
- return log_error_errno(r, "Failed to get event loop: %m");
-
- r = sd_bus_attach_event(bus, event, 0);
- if (r < 0)
- return log_error_errno(r, "Failed to attach bus to event loop: %m");
-
- r = bus_match_signal_async(
- bus,
- &slot_job_removed,
- bus_import_mgr,
- "TransferRemoved",
- match_transfer_removed, NULL, &path);
- if (r < 0)
- return log_error_errno(r, "Failed to request match: %m");
-
- r = sd_bus_match_signal_async(
- bus,
- &slot_log_message,
- "org.freedesktop.import1",
- NULL,
- "org.freedesktop.import1.Transfer",
- "LogMessage",
- match_log_message, NULL, &path);
- if (r < 0)
- return log_error_errno(r, "Failed to request match: %m");
-
- r = sd_bus_call(bus, m, 0, &error, &reply);
- if (r < 0)
- return log_error_errno(r, "Failed to transfer image: %s", bus_error_message(&error, r));
-
- r = sd_bus_message_read(reply, "uo", &id, &path);
- if (r < 0)
- return bus_log_parse_error(r);
-
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
-
- if (!arg_quiet)
- log_info("Enqueued transfer job %u. Press C-c to continue download in background.", id);
-
- (void) sd_event_add_signal(event, NULL, SIGINT, transfer_signal_handler, UINT32_TO_PTR(id));
- (void) sd_event_add_signal(event, NULL, SIGTERM, transfer_signal_handler, UINT32_TO_PTR(id));
-
- r = sd_event_loop(event);
- if (r < 0)
- return log_error_errno(r, "Failed to run event loop: %m");
-
- return -r;
-}
-
-static int import_tar(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_free_ char *ll = NULL, *fn = NULL;
- const char *local = NULL, *path = NULL;
- _cleanup_close_ int fd = -EBADF;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- if (argc >= 2)
- path = empty_or_dash_to_null(argv[1]);
-
- if (argc >= 3)
- local = empty_or_dash_to_null(argv[2]);
- else if (path) {
- r = path_extract_filename(path, &fn);
- if (r < 0)
- return log_error_errno(r, "Cannot extract container name from filename: %m");
- if (r == O_DIRECTORY)
- return log_error_errno(SYNTHETIC_ERRNO(EISDIR),
- "Path '%s' refers to directory, but we need a regular file: %m", path);
-
- local = fn;
- }
- if (!local)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Need either path or local name.");
-
- r = tar_strip_suffixes(local, &ll);
- if (r < 0)
- return log_oom();
-
- local = ll;
-
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Local name %s is not a suitable machine name.",
- local);
-
- if (path) {
- fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
- if (fd < 0)
- return log_error_errno(errno, "Failed to open %s: %m", path);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportTar");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "hsbb",
- fd >= 0 ? fd : STDIN_FILENO,
- local,
- arg_force,
- arg_read_only);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-static int import_raw(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_free_ char *ll = NULL, *fn = NULL;
- const char *local = NULL, *path = NULL;
- _cleanup_close_ int fd = -EBADF;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- if (argc >= 2)
- path = empty_or_dash_to_null(argv[1]);
-
- if (argc >= 3)
- local = empty_or_dash_to_null(argv[2]);
- else if (path) {
- r = path_extract_filename(path, &fn);
- if (r < 0)
- return log_error_errno(r, "Cannot extract container name from filename: %m");
- if (r == O_DIRECTORY)
- return log_error_errno(SYNTHETIC_ERRNO(EISDIR),
- "Path '%s' refers to directory, but we need a regular file: %m", path);
-
- local = fn;
- }
- if (!local)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Need either path or local name.");
-
- r = raw_strip_suffixes(local, &ll);
- if (r < 0)
- return log_oom();
-
- local = ll;
-
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Local name %s is not a suitable machine name.",
- local);
-
- if (path) {
- fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
- if (fd < 0)
- return log_error_errno(errno, "Failed to open %s: %m", path);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportRaw");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "hsbb",
- fd >= 0 ? fd : STDIN_FILENO,
- local,
- arg_force,
- arg_read_only);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-static int import_fs(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- const char *local = NULL, *path = NULL;
- _cleanup_free_ char *fn = NULL;
- _cleanup_close_ int fd = -EBADF;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- if (argc >= 2)
- path = empty_or_dash_to_null(argv[1]);
-
- if (argc >= 3)
- local = empty_or_dash_to_null(argv[2]);
- else if (path) {
- r = path_extract_filename(path, &fn);
- if (r < 0)
- return log_error_errno(r, "Cannot extract container name from filename: %m");
-
- local = fn;
- }
- if (!local)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Need either path or local name.");
-
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Local name %s is not a suitable machine name.",
- local);
-
- if (path) {
- fd = open(path, O_DIRECTORY|O_RDONLY|O_CLOEXEC);
- if (fd < 0)
- return log_error_errno(errno, "Failed to open directory '%s': %m", path);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ImportFileSystem");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "hsbb",
- fd >= 0 ? fd : STDIN_FILENO,
- local,
- arg_force,
- arg_read_only);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-static void determine_compression_from_filename(const char *p) {
- if (arg_format)
- return;
-
- if (!p)
- return;
-
- if (endswith(p, ".xz"))
- arg_format = "xz";
- else if (endswith(p, ".gz"))
- arg_format = "gzip";
- else if (endswith(p, ".bz2"))
- arg_format = "bzip2";
-}
-
-static int export_tar(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_close_ int fd = -EBADF;
- const char *local = NULL, *path = NULL;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- local = argv[1];
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Machine name %s is not valid.", local);
-
- if (argc >= 3)
- path = argv[2];
- path = empty_or_dash_to_null(path);
-
- if (path) {
- determine_compression_from_filename(path);
-
- fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC|O_NOCTTY, 0666);
- if (fd < 0)
- return log_error_errno(errno, "Failed to open %s: %m", path);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ExportTar");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "shs",
- local,
- fd >= 0 ? fd : STDOUT_FILENO,
- arg_format);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-static int export_raw(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_close_ int fd = -EBADF;
- const char *local = NULL, *path = NULL;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- local = argv[1];
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Machine name %s is not valid.", local);
-
- if (argc >= 3)
- path = argv[2];
- path = empty_or_dash_to_null(path);
-
- if (path) {
- determine_compression_from_filename(path);
-
- fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC|O_NOCTTY, 0666);
- if (fd < 0)
- return log_error_errno(errno, "Failed to open %s: %m", path);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "ExportRaw");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "shs",
- local,
- fd >= 0 ? fd : STDOUT_FILENO,
- arg_format);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-static int pull_tar(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_free_ char *l = NULL, *ll = NULL;
- const char *local, *remote;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- remote = argv[1];
- if (!http_url_is_valid(remote) && !file_url_is_valid(remote))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "URL '%s' is not valid.", remote);
-
- if (argc >= 3)
- local = argv[2];
- else {
- r = import_url_last_component(remote, &l);
- if (r < 0)
- return log_error_errno(r, "Failed to get final component of URL: %m");
-
- local = l;
- }
-
- local = empty_or_dash_to_null(local);
-
- if (local) {
- r = tar_strip_suffixes(local, &ll);
- if (r < 0)
- return log_oom();
-
- local = ll;
-
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Local name %s is not a suitable machine name.",
- local);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "PullTar");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "sssb",
- remote,
- local,
- import_verify_to_string(arg_verify),
- arg_force);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-static int pull_raw(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_free_ char *l = NULL, *ll = NULL;
- const char *local, *remote;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- remote = argv[1];
- if (!http_url_is_valid(remote) && !file_url_is_valid(remote))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "URL '%s' is not valid.", remote);
-
- if (argc >= 3)
- local = argv[2];
- else {
- r = import_url_last_component(remote, &l);
- if (r < 0)
- return log_error_errno(r, "Failed to get final component of URL: %m");
-
- local = l;
- }
-
- local = empty_or_dash_to_null(local);
-
- if (local) {
- r = raw_strip_suffixes(local, &ll);
- if (r < 0)
- return log_oom();
-
- local = ll;
-
- if (!hostname_is_valid(local, 0))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Local name %s is not a suitable machine name.",
- local);
- }
-
- r = bus_message_new_method_call(bus, &m, bus_import_mgr, "PullRaw");
- if (r < 0)
- return bus_log_create_error(r);
-
- r = sd_bus_message_append(
- m,
- "sssb",
- remote,
- local,
- import_verify_to_string(arg_verify),
- arg_force);
- if (r < 0)
- return bus_log_create_error(r);
-
- return transfer_image_common(bus, m);
-}
-
-typedef struct TransferInfo {
- uint32_t id;
- const char *type;
- const char *remote;
- const char *local;
- double progress;
-} TransferInfo;
-
-static int compare_transfer_info(const TransferInfo *a, const TransferInfo *b) {
- return strcmp(a->local, b->local);
-}
-
-static int list_transfers(int argc, char *argv[], void *userdata) {
- size_t max_type = STRLEN("TYPE"), max_local = STRLEN("LOCAL"), max_remote = STRLEN("REMOTE");
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_free_ TransferInfo *transfers = NULL;
- const char *type, *remote, *local;
- sd_bus *bus = userdata;
- uint32_t id, max_id = 0;
- size_t n_transfers = 0;
- double progress;
- int r;
-
- pager_open(arg_pager_flags);
-
- r = bus_call_method(bus, bus_import_mgr, "ListTransfers", &error, &reply, NULL);
- if (r < 0)
- return log_error_errno(r, "Could not get transfers: %s", bus_error_message(&error, r));
-
- r = sd_bus_message_enter_container(reply, 'a', "(usssdo)");
- if (r < 0)
- return bus_log_parse_error(r);
-
- while ((r = sd_bus_message_read(reply, "(usssdo)", &id, &type, &remote, &local, &progress, NULL)) > 0) {
- size_t l;
-
- if (!GREEDY_REALLOC(transfers, n_transfers + 1))
- return log_oom();
-
- transfers[n_transfers].id = id;
- transfers[n_transfers].type = type;
- transfers[n_transfers].remote = remote;
- transfers[n_transfers].local = local;
- transfers[n_transfers].progress = progress;
-
- l = strlen(type);
- if (l > max_type)
- max_type = l;
-
- l = strlen(remote);
- if (l > max_remote)
- max_remote = l;
-
- l = strlen(local);
- if (l > max_local)
- max_local = l;
-
- if (id > max_id)
- max_id = id;
-
- n_transfers++;
- }
- if (r < 0)
- return bus_log_parse_error(r);
-
- r = sd_bus_message_exit_container(reply);
- if (r < 0)
- return bus_log_parse_error(r);
-
- typesafe_qsort(transfers, n_transfers, compare_transfer_info);
-
- if (arg_legend && n_transfers > 0)
- printf("%-*s %-*s %-*s %-*s %-*s\n",
- (int) MAX(2U, DECIMAL_STR_WIDTH(max_id)), "ID",
- (int) 7, "PERCENT",
- (int) max_type, "TYPE",
- (int) max_local, "LOCAL",
- (int) max_remote, "REMOTE");
-
- for (size_t j = 0; j < n_transfers; j++)
-
- if (transfers[j].progress < 0)
- printf("%*" PRIu32 " %*s %-*s %-*s %-*s\n",
- (int) MAX(2U, DECIMAL_STR_WIDTH(max_id)), transfers[j].id,
- (int) 7, "n/a",
- (int) max_type, transfers[j].type,
- (int) max_local, transfers[j].local,
- (int) max_remote, transfers[j].remote);
- else
- printf("%*" PRIu32 " %*u%% %-*s %-*s %-*s\n",
- (int) MAX(2U, DECIMAL_STR_WIDTH(max_id)), transfers[j].id,
- (int) 6, (unsigned) (transfers[j].progress * 100),
- (int) max_type, transfers[j].type,
- (int) max_local, transfers[j].local,
- (int) max_remote, transfers[j].remote);
-
- if (arg_legend) {
- if (n_transfers > 0)
- printf("\n%zu transfers listed.\n", n_transfers);
- else
- printf("No transfers.\n");
- }
-
- return 0;
-}
-
-static int cancel_transfer(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- sd_bus *bus = ASSERT_PTR(userdata);
- int r;
-
- polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
-
- for (int i = 1; i < argc; i++) {
- uint32_t id;
-
- r = safe_atou32(argv[i], &id);
- if (r < 0)
- return log_error_errno(r, "Failed to parse transfer id: %s", argv[i]);
-
- r = bus_call_method(bus, bus_import_mgr, "CancelTransfer", &error, NULL, "u", id);
- if (r < 0)
- return log_error_errno(r, "Could not cancel transfer: %s", bus_error_message(&error, r));
- }
-
- return 0;
-}
-
static int set_limit(int argc, char *argv[], void *userdata) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus *bus = userdata;
@@ -2557,6 +1959,52 @@ static int clean_images(int argc, char *argv[], void *userdata) {
return 0;
}
+static int chainload_importctl(int argc, char *argv[]) {
+ int r;
+
+ log_notice("The 'machinectl %1$s' command has been replaced by 'importctl -m %1$s'. Redirecting invocation.", argv[optind]);
+
+ _cleanup_strv_free_ char **c =
+ strv_new("importctl", "--class=machine");
+ if (!c)
+ return log_oom();
+
+ if (FLAGS_SET(arg_pager_flags, PAGER_DISABLE))
+ if (strv_extend(&c, "--no-pager") < 0)
+ return log_oom();
+ if (!arg_legend)
+ if (strv_extend(&c, "--no-legend") < 0)
+ return log_oom();
+ if (arg_read_only)
+ if (strv_extend(&c, "--read-only") < 0)
+ return log_oom();
+ if (arg_force)
+ if (strv_extend(&c, "--force") < 0)
+ return log_oom();
+ if (arg_quiet)
+ if (strv_extend(&c, "--quiet") < 0)
+ return log_oom();
+ if (!arg_ask_password)
+ if (strv_extend(&c, "--no-ask-password") < 0)
+ return log_oom();
+ if (strv_extend_many(&c, "--verify", import_verify_to_string(arg_verify)) < 0)
+ return log_oom();
+ if (arg_format)
+ if (strv_extend_many(&c, "--format", arg_format) < 0)
+ return log_oom();
+
+ if (strv_extend_strv(&c, argv + optind, /* filter_duplicates= */ false) < 0)
+ return log_oom();
+
+ if (DEBUG_LOGGING) {
+ _cleanup_free_ char *joined = strv_join(c, " ");
+ log_debug("Chainloading: %s", joined);
+ }
+
+ r = invoke_callout_binary(BINDIR "/importctl", c);
+ return log_error_errno(r, "Failed to invoke 'importctl': %m");
+}
+
static int help(int argc, char *argv[], void *userdata) {
_cleanup_free_ char *link = NULL;
int r;
@@ -2601,16 +2049,6 @@ static int help(int argc, char *argv[], void *userdata) {
" remove NAME... Remove an image\n"
" set-limit [NAME] BYTES Set image or pool size limit (disk quota)\n"
" clean Remove hidden (or all) images\n"
- "\n%3$sImage Transfer Commands:%4$s\n"
- " pull-tar URL [NAME] Download a TAR container image\n"
- " pull-raw URL [NAME] Download a RAW container or VM image\n"
- " import-tar FILE [NAME] Import a local TAR container image\n"
- " import-raw FILE [NAME] Import a local RAW container or VM image\n"
- " import-fs DIRECTORY [NAME] Import a local directory container image\n"
- " export-tar NAME [FILE] Export a TAR container image locally\n"
- " export-raw NAME [FILE] Export a RAW container or VM image locally\n"
- " list-transfers Show list of downloads in progress\n"
- " cancel-transfer Cancel a download\n"
"\n%3$sOptions:%4$s\n"
" -h --help Show this help\n"
" --version Show package version\n"
@@ -2620,15 +2058,16 @@ static int help(int argc, char *argv[], void *userdata) {
" -H --host=[USER@]HOST Operate on remote host\n"
" -M --machine=CONTAINER Operate on local container\n"
" -p --property=NAME Show only properties by this name\n"
+ " --value When showing properties, only print the value\n"
+ " -P NAME Equivalent to --value --property=NAME\n"
" -q --quiet Suppress output\n"
" -a --all Show all properties, including empty ones\n"
- " --value When showing properties, only print the value\n"
" -l --full Do not ellipsize output\n"
" --kill-whom=WHOM Whom to send signal to\n"
" -s --signal=SIGNAL Which signal to send\n"
" --uid=USER Specify user ID to invoke shell as\n"
" -E --setenv=VAR[=VALUE] Add an environment variable for shell\n"
- " --read-only Create read-only bind mount\n"
+ " --read-only Create read-only bind mount or clone\n"
" --mkdir Create directory before bind mounting, if missing\n"
" -n --lines=INTEGER Number of journal entries to show\n"
" --max-addresses=INTEGER Number of internet addresses to show at most\n"
@@ -2637,11 +2076,11 @@ static int help(int argc, char *argv[], void *userdata) {
" short-monotonic, short-unix, short-delta,\n"
" json, json-pretty, json-sse, json-seq, cat,\n"
" verbose, export, with-unit)\n"
- " --verify=MODE Verification mode for downloaded images (no,\n"
- " checksum, signature)\n"
- " --force Download image even if already exists\n"
+ " --force Replace target file when copying, if necessary\n"
" --now Start or power off container after enabling or\n"
" disabling it\n"
+ " --runner=RUNNER Select between nspawn and vmspawn as the runner\n"
+ " -V Short for --runner=vmspawn\n"
"\nSee the %2$s for details.\n",
program_invocation_short_name,
link,
@@ -2665,6 +2104,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_MKDIR,
ARG_NO_ASK_PASSWORD,
ARG_VERIFY,
+ ARG_RUNNER,
ARG_NOW,
ARG_FORCE,
ARG_FORMAT,
@@ -2676,8 +2116,8 @@ static int parse_argv(int argc, char *argv[]) {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, ARG_VERSION },
{ "property", required_argument, NULL, 'p' },
- { "all", no_argument, NULL, 'a' },
{ "value", no_argument, NULL, ARG_VALUE },
+ { "all", no_argument, NULL, 'a' },
{ "full", no_argument, NULL, 'l' },
{ "no-pager", no_argument, NULL, ARG_NO_PAGER },
{ "no-legend", no_argument, NULL, ARG_NO_LEGEND },
@@ -2692,6 +2132,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "output", required_argument, NULL, 'o' },
{ "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
{ "verify", required_argument, NULL, ARG_VERIFY },
+ { "runner", required_argument, NULL, ARG_RUNNER },
{ "now", no_argument, NULL, ARG_NOW },
{ "force", no_argument, NULL, ARG_FORCE },
{ "format", required_argument, NULL, ARG_FORMAT },
@@ -2712,7 +2153,7 @@ static int parse_argv(int argc, char *argv[]) {
optind = 0;
for (;;) {
- static const char option_string[] = "-hp:als:H:M:qn:o:E:";
+ static const char option_string[] = "-hp:P:als:H:M:qn:o:E:V";
c = getopt_long(argc, argv, option_string + reorder, options, NULL);
if (c < 0)
@@ -2773,14 +2214,20 @@ static int parse_argv(int argc, char *argv[]) {
return version();
case 'p':
+ case 'P':
r = strv_extend(&arg_property, optarg);
if (r < 0)
return log_oom();
- /* If the user asked for a particular
- * property, show it to them, even if it is
- * empty. */
+ /* If the user asked for a particular property, show it to them, even if empty. */
SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_SHOW_EMPTY, true);
+
+ if (c == 'p')
+ break;
+ _fallthrough_;
+
+ case ARG_VALUE:
+ SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_ONLY_VALUE, true);
break;
case 'a':
@@ -2788,10 +2235,6 @@ static int parse_argv(int argc, char *argv[]) {
arg_all = true;
break;
- case ARG_VALUE:
- SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_ONLY_VALUE, true);
- break;
-
case 'l':
arg_full = true;
break;
@@ -2873,6 +2316,18 @@ static int parse_argv(int argc, char *argv[]) {
arg_verify = r;
break;
+ case 'V':
+ arg_runner = RUNNER_VMSPAWN;
+ break;
+
+ case ARG_RUNNER:
+ r = machine_runner_from_string(optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse --runner= setting: %s", optarg);
+
+ arg_runner = r;
+ break;
+
case ARG_NOW:
arg_now = true;
break;
@@ -2963,15 +2418,6 @@ static int machinectl_main(int argc, char *argv[], sd_bus *bus) {
{ "start", 2, VERB_ANY, 0, start_machine },
{ "enable", 2, VERB_ANY, 0, enable_machine },
{ "disable", 2, VERB_ANY, 0, enable_machine },
- { "import-tar", 2, 3, 0, import_tar },
- { "import-raw", 2, 3, 0, import_raw },
- { "import-fs", 2, 3, 0, import_fs },
- { "export-tar", 2, 3, 0, export_tar },
- { "export-raw", 2, 3, 0, export_raw },
- { "pull-tar", 2, 3, 0, pull_tar },
- { "pull-raw", 2, 3, 0, pull_raw },
- { "list-transfers", VERB_ANY, 1, 0, list_transfers },
- { "cancel-transfer", 2, VERB_ANY, 0, cancel_transfer },
{ "set-limit", 2, 3, 0, set_limit },
{ "clean", VERB_ANY, 1, 0, clean_images },
{}
@@ -2989,13 +2435,19 @@ static int run(int argc, char *argv[]) {
/* The journal merging logic potentially needs a lot of fds. */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
-
sigbus_install();
r = parse_argv(argc, argv);
if (r <= 0)
return r;
+ if (STRPTR_IN_SET(argv[optind],
+ "import-tar", "import-raw", "import-fs",
+ "export-tar", "export-raw",
+ "pull-tar", "pull-raw",
+ "list-transfers", "cancel-transfer"))
+ return chainload_importctl(argc, argv);
+
r = bus_connect_transport(arg_transport, arg_host, RUNTIME_SCOPE_SYSTEM, &bus);
if (r < 0)
return bus_log_connect_error(r, arg_transport);
diff --git a/src/machine/machined.c b/src/machine/machined.c
index 108fe0327b..99301408d3 100644
--- a/src/machine/machined.c
+++ b/src/machine/machined.c
@@ -342,7 +342,7 @@ static int run(int argc, char *argv[]) {
* make sure this check stays in. */
(void) mkdir_label("/run/systemd/machines", 0755);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/machine/meson.build b/src/machine/meson.build
index b3a1ffce8f..c82a32589d 100644
--- a/src/machine/meson.build
+++ b/src/machine/meson.build
@@ -35,9 +35,9 @@ executables += [
'conditions' : ['ENABLE_MACHINED'],
'sources' : files('machinectl.c'),
'dependencies' : [
- liblz4,
- libxz,
- libzstd,
+ liblz4_cflags,
+ libxz_cflags,
+ libzstd_cflags,
threads,
],
},
diff --git a/src/network/generator/network-generator.c b/src/network/generator/network-generator.c
index 48527a2c73..106e10a575 100644
--- a/src/network/generator/network-generator.c
+++ b/src/network/generator/network-generator.c
@@ -27,7 +27,7 @@
# .link
ifname=<interface>:<MAC>
- net.ifname-policy=policy1[,policy2,...][,<MAC>] # This is an original rule, not supported by other tools.
+ net.ifname_policy=policy1[,policy2,...][,<MAC>] # This is an original rule, not supported by other tools.
# .netdev
vlan=<vlanname>:<phydevice>
@@ -1114,7 +1114,7 @@ static int parse_cmdline_ifname_policy(Context *context, const char *key, const
assert(context);
assert(key);
- /* net.ifname-policy=policy1[,policy2,...][,<MAC>] */
+ /* net.ifname_policy=policy1[,policy2,...][,<MAC>] */
if (proc_cmdline_value_missing(key, value))
return -EINVAL;
@@ -1172,23 +1172,23 @@ int parse_cmdline_item(const char *key, const char *value, void *data) {
assert(key);
- if (streq(key, "ip"))
+ if (proc_cmdline_key_streq(key, "ip"))
return parse_cmdline_ip(context, key, value);
- if (streq(key, "rd.route"))
+ if (proc_cmdline_key_streq(key, "rd.route"))
return parse_cmdline_rd_route(context, key, value);
- if (streq(key, "nameserver"))
+ if (proc_cmdline_key_streq(key, "nameserver"))
return parse_cmdline_nameserver(context, key, value);
- if (streq(key, "rd.peerdns"))
+ if (proc_cmdline_key_streq(key, "rd.peerdns"))
return parse_cmdline_rd_peerdns(context, key, value);
- if (streq(key, "vlan"))
+ if (proc_cmdline_key_streq(key, "vlan"))
return parse_cmdline_vlan(context, key, value);
- if (streq(key, "bridge"))
+ if (proc_cmdline_key_streq(key, "bridge"))
return parse_cmdline_bridge(context, key, value);
- if (streq(key, "bond"))
+ if (proc_cmdline_key_streq(key, "bond"))
return parse_cmdline_bond(context, key, value);
- if (streq(key, "ifname"))
+ if (proc_cmdline_key_streq(key, "ifname"))
return parse_cmdline_ifname(context, key, value);
- if (streq(key, "net.ifname-policy"))
+ if (proc_cmdline_key_streq(key, "net.ifname_policy"))
return parse_cmdline_ifname_policy(context, key, value);
return 0;
diff --git a/src/network/netdev/bond.c b/src/network/netdev/bond.c
index ecf091356b..52a7f126b6 100644
--- a/src/network/netdev/bond.c
+++ b/src/network/netdev/bond.c
@@ -88,6 +88,12 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin
return r;
}
+ if (b->peer_notify_delay != 0) {
+ r = sd_netlink_message_append_u32(m, IFLA_BOND_PEER_NOTIF_DELAY, b->peer_notify_delay / USEC_PER_MSEC);
+ if (r < 0)
+ return r;
+ }
+
if (b->downdelay != 0) {
r = sd_netlink_message_append_u32(m, IFLA_BOND_DOWNDELAY, b->downdelay / USEC_PER_MSEC);
if (r < 0)
diff --git a/src/network/netdev/bond.h b/src/network/netdev/bond.h
index b301fa67f0..ea94001e6e 100644
--- a/src/network/netdev/bond.h
+++ b/src/network/netdev/bond.h
@@ -41,6 +41,7 @@ typedef struct Bond {
usec_t downdelay;
usec_t arp_interval;
usec_t lp_interval;
+ usec_t peer_notify_delay;
OrderedSet *arp_ip_targets;
} Bond;
diff --git a/src/network/netdev/macvlan.c b/src/network/netdev/macvlan.c
index 203807e3a5..85011e11de 100644
--- a/src/network/netdev/macvlan.c
+++ b/src/network/netdev/macvlan.c
@@ -10,6 +10,11 @@
#include "networkd-network.h"
#include "parse-util.h"
+typedef enum BCQueueThreshold {
+ BC_QUEUE_THRESHOLD_UNDEF = INT32_MIN,
+ BC_QUEUE_THRESHOLD_DISABLE = -1,
+} BCQueueThreshold;
+
DEFINE_CONFIG_PARSE_ENUM(config_parse_macvlan_mode, macvlan_mode, MacVlanMode, "Failed to parse macvlan mode");
static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *req) {
@@ -62,6 +67,12 @@ static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_net
return r;
}
+ if (m->bc_queue_threshold != BC_QUEUE_THRESHOLD_UNDEF) {
+ r = sd_netlink_message_append_s32(req, IFLA_MACVLAN_BC_CUTOFF, m->bc_queue_threshold);
+ if (r < 0)
+ return r;
+ }
+
return 0;
}
@@ -96,6 +107,53 @@ int config_parse_macvlan_broadcast_queue_size(
&m->bc_queue_length);
}
+int config_parse_macvlan_broadcast_queue_threshold(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+
+ int32_t v, *threshold = ASSERT_PTR(data);
+ int r;
+
+ if (isempty(rvalue)) {
+ *threshold = BC_QUEUE_THRESHOLD_UNDEF;
+ return 0;
+ }
+
+ if (streq(rvalue, "no")) {
+ *threshold = BC_QUEUE_THRESHOLD_DISABLE;
+ return 0;
+ }
+
+ r = safe_atoi32(rvalue, &v);
+ if (r < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Failed to parse %s=, ignoring assignment: %s",
+ lvalue, rvalue);
+ return 0;
+ }
+ if (v < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Invalid %s= value specified, ignoring assignment: %s",
+ lvalue, rvalue);
+ return 0;
+ }
+
+ *threshold = v;
+ return 0;
+}
+
static void macvlan_done(NetDev *netdev) {
MacVlan *m = ASSERT_PTR(netdev)->kind == NETDEV_KIND_MACVLAN ? MACVLAN(netdev) : MACVTAP(netdev);
@@ -107,6 +165,7 @@ static void macvlan_init(NetDev *netdev) {
m->mode = _NETDEV_MACVLAN_MODE_INVALID;
m->bc_queue_length = UINT32_MAX;
+ m->bc_queue_threshold = BC_QUEUE_THRESHOLD_UNDEF;
}
const NetDevVTable macvtap_vtable = {
diff --git a/src/network/netdev/macvlan.h b/src/network/netdev/macvlan.h
index c45fc4fd33..76b53a62ea 100644
--- a/src/network/netdev/macvlan.h
+++ b/src/network/netdev/macvlan.h
@@ -14,6 +14,7 @@ struct MacVlan {
Set *match_source_mac;
uint32_t bc_queue_length;
+ int32_t bc_queue_threshold;
};
DEFINE_NETDEV_CAST(MACVLAN, MacVlan);
@@ -23,3 +24,4 @@ extern const NetDevVTable macvtap_vtable;
CONFIG_PARSER_PROTOTYPE(config_parse_macvlan_mode);
CONFIG_PARSER_PROTOTYPE(config_parse_macvlan_broadcast_queue_size);
+CONFIG_PARSER_PROTOTYPE(config_parse_macvlan_broadcast_queue_threshold);
diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf
index eb28b9be54..4883a2652d 100644
--- a/src/network/netdev/netdev-gperf.gperf
+++ b/src/network/netdev/netdev-gperf.gperf
@@ -64,6 +64,7 @@ VLAN.IngressQOSMaps, config_parse_vlan_qos_maps,
MACVLAN.Mode, config_parse_macvlan_mode, 0, offsetof(MacVlan, mode)
MACVLAN.SourceMACAddress, config_parse_ether_addrs, 0, offsetof(MacVlan, match_source_mac)
MACVLAN.BroadcastMulticastQueueLength, config_parse_macvlan_broadcast_queue_size, 0, offsetof(MacVlan, bc_queue_length)
+MACVLAN.BroadcastQueueThreshold, config_parse_macvlan_broadcast_queue_threshold, 0, offsetof(MacVlan, bc_queue_threshold)
MACVTAP.Mode, config_parse_macvlan_mode, 0, offsetof(MacVlan, mode)
MACVTAP.SourceMACAddress, config_parse_ether_addrs, 0, offsetof(MacVlan, match_source_mac)
IPVLAN.Mode, config_parse_ipvlan_mode, 0, offsetof(IPVlan, mode)
@@ -215,6 +216,7 @@ Bond.UpDelaySec, config_parse_sec,
Bond.DownDelaySec, config_parse_sec, 0, offsetof(Bond, downdelay)
Bond.ARPIntervalSec, config_parse_sec, 0, offsetof(Bond, arp_interval)
Bond.LearnPacketIntervalSec, config_parse_sec, 0, offsetof(Bond, lp_interval)
+Bond.PeerNotifyDelaySec, config_parse_sec, 0, offsetof(Bond, peer_notify_delay)
Bond.AdActorSystemPriority, config_parse_ad_actor_sys_prio, 0, offsetof(Bond, ad_actor_sys_prio)
Bond.AdUserPortKey, config_parse_ad_user_port_key, 0, offsetof(Bond, ad_user_port_key)
Bond.AdActorSystem, config_parse_ad_actor_system, 0, offsetof(Bond, ad_actor_system)
diff --git a/src/network/networkctl.c b/src/network/networkctl.c
index 61fa0ed556..686d83b06b 100644
--- a/src/network/networkctl.c
+++ b/src/network/networkctl.c
@@ -15,7 +15,6 @@
#include "sd-device.h"
#include "sd-dhcp-client.h"
#include "sd-hwdb.h"
-#include "sd-lldp-rx.h"
#include "sd-netlink.h"
#include "sd-network.h"
@@ -93,11 +92,10 @@ JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
STATIC_DESTRUCTOR_REGISTER(arg_drop_in, freep);
-static int check_netns_match(void) {
- struct stat st;
- uint64_t id;
- JsonVariant *reply = NULL;
+static int varlink_connect_networkd(Varlink **ret_varlink) {
_cleanup_(varlink_unrefp) Varlink *vl = NULL;
+ JsonVariant *reply;
+ uint64_t id;
int r;
r = varlink_connect_address(&vl, "/run/systemd/netif/io.systemd.Network");
@@ -117,18 +115,21 @@ static int check_netns_match(void) {
if (r < 0)
return r;
- if (id == 0) {
+ if (id == 0)
log_debug("systemd-networkd.service not running in a network namespace (?), skipping netns check.");
- return 0;
- }
+ else {
+ struct stat st;
- if (stat("/proc/self/ns/net", &st) < 0)
- return log_error_errno(errno, "Failed to determine our own network namespace ID: %m");
+ if (stat("/proc/self/ns/net", &st) < 0)
+ return log_error_errno(errno, "Failed to determine our own network namespace ID: %m");
- if (id != st.st_ino)
- return log_error_errno(SYNTHETIC_ERRNO(EREMOTE),
- "networkctl must be invoked in same network namespace as systemd-networkd.service.");
+ if (id != st.st_ino)
+ return log_error_errno(SYNTHETIC_ERRNO(EREMOTE),
+ "networkctl must be invoked in same network namespace as systemd-networkd.service.");
+ }
+ if (ret_varlink)
+ *ret_varlink = TAKE_PTR(vl);
return 0;
}
@@ -162,7 +163,7 @@ int acquire_bus(sd_bus **ret) {
return log_error_errno(r, "Failed to connect to system bus: %m");
if (networkd_is_running()) {
- r = check_netns_match();
+ r = varlink_connect_networkd(/* ret_varlink = */ NULL);
if (r < 0)
return r;
} else
@@ -1311,96 +1312,96 @@ static int list_address_labels(int argc, char *argv[], void *userdata) {
return dump_address_labels(rtnl);
}
-static int open_lldp_neighbors(int ifindex, FILE **ret) {
- _cleanup_fclose_ FILE *f = NULL;
- char p[STRLEN("/run/systemd/netif/lldp/") + DECIMAL_STR_MAX(int)];
-
- assert(ifindex >= 0);
- assert(ret);
-
- xsprintf(p, "/run/systemd/netif/lldp/%i", ifindex);
-
- f = fopen(p, "re");
- if (!f)
- return -errno;
-
- *ret = TAKE_PTR(f);
- return 0;
-}
-
-static int next_lldp_neighbor(FILE *f, sd_lldp_neighbor **ret) {
- _cleanup_free_ void *raw = NULL;
- size_t l;
- le64_t u;
- int r;
-
- assert(f);
- assert(ret);
-
- l = fread(&u, 1, sizeof(u), f);
- if (l == 0 && feof(f))
- return 0;
- if (l != sizeof(u))
- return -EBADMSG;
-
- /* each LLDP packet is at most MTU size, but let's allow up to 4KiB just in case */
- if (le64toh(u) >= 4096)
- return -EBADMSG;
-
- raw = new(uint8_t, le64toh(u));
- if (!raw)
- return -ENOMEM;
-
- if (fread(raw, 1, le64toh(u), f) != le64toh(u))
- return -EBADMSG;
+typedef struct InterfaceInfo {
+ int ifindex;
+ const char *ifname;
+ char **altnames;
+ JsonVariant *v;
+} InterfaceInfo;
- r = sd_lldp_neighbor_from_raw(ret, raw, le64toh(u));
- if (r < 0)
- return r;
+static void interface_info_done(InterfaceInfo *p) {
+ if (!p)
+ return;
- return 1;
+ strv_free(p->altnames);
+ json_variant_unref(p->v);
}
-static int dump_lldp_neighbors(Table *table, const char *prefix, int ifindex) {
+static const JsonDispatch interface_info_dispatch_table[] = {
+ { "InterfaceIndex", _JSON_VARIANT_TYPE_INVALID, json_dispatch_int, offsetof(InterfaceInfo, ifindex), JSON_MANDATORY },
+ { "InterfaceName", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(InterfaceInfo, ifname), JSON_MANDATORY },
+ { "InterfaceAlternativeNames", JSON_VARIANT_ARRAY, json_dispatch_strv, offsetof(InterfaceInfo, altnames), 0 },
+ { "Neighbors", JSON_VARIANT_ARRAY, json_dispatch_variant, offsetof(InterfaceInfo, v), 0 },
+ {},
+};
+
+typedef struct LLDPNeighborInfo {
+ const char *chassis_id;
+ const char *port_id;
+ const char *port_description;
+ const char *system_name;
+ const char *system_description;
+ uint16_t capabilities;
+} LLDPNeighborInfo;
+
+static const JsonDispatch lldp_neighbor_dispatch_table[] = {
+ { "ChassisID", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(LLDPNeighborInfo, chassis_id), 0 },
+ { "PortID", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(LLDPNeighborInfo, port_id), 0 },
+ { "PortDescription", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(LLDPNeighborInfo, port_description), 0 },
+ { "SystemName", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(LLDPNeighborInfo, system_name), 0 },
+ { "SystemDescription", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(LLDPNeighborInfo, system_description), 0 },
+ { "EnabledCapabilities", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint16, offsetof(LLDPNeighborInfo, capabilities), 0 },
+ {},
+};
+
+static int dump_lldp_neighbors(Varlink *vl, Table *table, int ifindex) {
_cleanup_strv_free_ char **buf = NULL;
- _cleanup_fclose_ FILE *f = NULL;
+ JsonVariant *reply;
int r;
+ assert(vl);
assert(table);
- assert(prefix);
assert(ifindex > 0);
- r = open_lldp_neighbors(ifindex, &f);
- if (r == -ENOENT)
- return 0;
+ r = varlink_callb_and_log(vl, "io.systemd.Network.GetLLDPNeighbors", &reply,
+ JSON_BUILD_OBJECT(JSON_BUILD_PAIR_INTEGER("InterfaceIndex", ifindex)));
if (r < 0)
return r;
- for (;;) {
- const char *system_name = NULL, *port_id = NULL, *port_description = NULL;
- _cleanup_(sd_lldp_neighbor_unrefp) sd_lldp_neighbor *n = NULL;
+ JsonVariant *i;
+ JSON_VARIANT_ARRAY_FOREACH(i, json_variant_by_key(reply, "Neighbors")) {
+ _cleanup_(interface_info_done) InterfaceInfo info = {};
- r = next_lldp_neighbor(f, &n);
+ r = json_dispatch(i, interface_info_dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, &info);
if (r < 0)
return r;
- if (r == 0)
- break;
- (void) sd_lldp_neighbor_get_system_name(n, &system_name);
- (void) sd_lldp_neighbor_get_port_id_as_string(n, &port_id);
- (void) sd_lldp_neighbor_get_port_description(n, &port_description);
+ if (info.ifindex != ifindex)
+ continue;
- r = strv_extendf(&buf, "%s on port %s%s%s%s",
- strna(system_name),
- strna(port_id),
- isempty(port_description) ? "" : " (",
- strempty(port_description),
- isempty(port_description) ? "" : ")");
- if (r < 0)
- return log_oom();
+ JsonVariant *neighbor;
+ JSON_VARIANT_ARRAY_FOREACH(neighbor, info.v) {
+ LLDPNeighborInfo neighbor_info = {};
+
+ r = json_dispatch(neighbor, lldp_neighbor_dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, &neighbor_info);
+ if (r < 0)
+ return r;
+
+ r = strv_extendf(&buf, "%s%s%s%s on port %s%s%s%s",
+ strna(neighbor_info.system_name),
+ isempty(neighbor_info.system_description) ? "" : " (",
+ strempty(neighbor_info.system_description),
+ isempty(neighbor_info.system_description) ? "" : ")",
+ strna(neighbor_info.port_id),
+ isempty(neighbor_info.port_description) ? "" : " (",
+ strempty(neighbor_info.port_description),
+ isempty(neighbor_info.port_description) ? "" : ")");
+ if (r < 0)
+ return log_oom();
+ }
}
- return dump_list(table, prefix, buf);
+ return dump_list(table, "Connected To", buf);
}
static int dump_dhcp_leases(Table *table, const char *prefix, sd_bus *bus, const LinkInfo *link) {
@@ -1683,6 +1684,7 @@ static int link_status_one(
sd_bus *bus,
sd_netlink *rtnl,
sd_hwdb *hwdb,
+ Varlink *vl,
const LinkInfo *info) {
_cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL,
@@ -1698,6 +1700,7 @@ static int link_status_one(
assert(bus);
assert(rtnl);
+ assert(vl);
assert(info);
(void) sd_network_link_get_operational_state(info->ifindex, &operational_state);
@@ -2316,7 +2319,7 @@ static int link_status_one(
return table_log_add_error(r);
}
- r = dump_lldp_neighbors(table, "Connected To", info->ifindex);
+ r = dump_lldp_neighbors(vl, table, info->ifindex);
if (r < 0)
return r;
@@ -2424,6 +2427,7 @@ static int link_status(int argc, char *argv[], void *userdata) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
_cleanup_(sd_hwdb_unrefp) sd_hwdb *hwdb = NULL;
+ _cleanup_(varlink_unrefp) Varlink *vl = NULL;
_cleanup_(link_info_array_freep) LinkInfo *links = NULL;
int r, c;
@@ -2448,6 +2452,10 @@ static int link_status(int argc, char *argv[], void *userdata) {
if (r < 0)
log_debug_errno(r, "Failed to open hardware database: %m");
+ r = varlink_connect_networkd(&vl);
+ if (r < 0)
+ return r;
+
if (arg_all)
c = acquire_link_info(bus, rtnl, NULL, &links);
else if (argc <= 1)
@@ -2464,7 +2472,7 @@ static int link_status(int argc, char *argv[], void *userdata) {
if (!first)
putchar('\n');
- RET_GATHER(r, link_status_one(bus, rtnl, hwdb, i));
+ RET_GATHER(r, link_status_one(bus, rtnl, hwdb, vl, i));
first = false;
}
@@ -2472,7 +2480,7 @@ static int link_status(int argc, char *argv[], void *userdata) {
return r;
}
-static char *lldp_capabilities_to_string(uint16_t x) {
+static char *lldp_capabilities_to_string(uint64_t x) {
static const char characters[] = {
'o', 'p', 'b', 'w', 'r', 't', 'd', 'a', 'c', 's', 'm',
};
@@ -2522,30 +2530,94 @@ static void lldp_capabilities_legend(uint16_t x) {
puts("");
}
+static bool interface_match_pattern(const InterfaceInfo *info, char * const *patterns) {
+ assert(info);
+
+ if (strv_isempty(patterns))
+ return true;
+
+ if (strv_fnmatch(patterns, info->ifname))
+ return true;
+
+ char str[DECIMAL_STR_MAX(int)];
+ xsprintf(str, "%i", info->ifindex);
+ if (strv_fnmatch(patterns, str))
+ return true;
+
+ STRV_FOREACH(a, info->altnames)
+ if (strv_fnmatch(patterns, *a))
+ return true;
+
+ return false;
+}
+
+static int dump_lldp_neighbors_json(JsonVariant *reply, char * const *patterns) {
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL, *v = NULL;
+ int r;
+
+ assert(reply);
+
+ if (strv_isempty(patterns))
+ return json_variant_dump(reply, arg_json_format_flags, NULL, NULL);
+
+ /* Filter and dump the result. */
+
+ JsonVariant *i;
+ JSON_VARIANT_ARRAY_FOREACH(i, json_variant_by_key(reply, "Neighbors")) {
+ _cleanup_(interface_info_done) InterfaceInfo info = {};
+
+ r = json_dispatch(i, interface_info_dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, &info);
+ if (r < 0)
+ return r;
+
+ if (!interface_match_pattern(&info, patterns))
+ continue;
+
+ r = json_variant_append_array(&array, i);
+ if (r < 0)
+ return log_error_errno(r, "Failed to append json variant to array: %m");
+ }
+
+ r = json_build(&v,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_CONDITION(json_variant_is_blank_array(array), "Neighbors", JSON_BUILD_EMPTY_ARRAY),
+ JSON_BUILD_PAIR_CONDITION(!json_variant_is_blank_array(array), "Neighbors", JSON_BUILD_VARIANT(array))));
+ if (r < 0)
+ return log_error_errno(r, "Failed to build json varinat: %m");
+
+ return json_variant_dump(v, arg_json_format_flags, NULL, NULL);
+}
+
static int link_lldp_status(int argc, char *argv[], void *userdata) {
- _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
- _cleanup_(link_info_array_freep) LinkInfo *links = NULL;
+ _cleanup_(varlink_unrefp) Varlink *vl = NULL;
_cleanup_(table_unrefp) Table *table = NULL;
- int r, c, m = 0;
- uint16_t all = 0;
+ JsonVariant *reply;
+ uint64_t all = 0;
TableCell *cell;
+ size_t m = 0;
+ int r;
- r = sd_netlink_open(&rtnl);
+ r = varlink_connect_networkd(&vl);
if (r < 0)
- return log_error_errno(r, "Failed to connect to netlink: %m");
+ return r;
- c = acquire_link_info(NULL, rtnl, argc > 1 ? argv + 1 : NULL, &links);
- if (c < 0)
- return c;
+ r = varlink_call_and_log(vl, "io.systemd.Network.GetLLDPNeighbors", NULL, &reply);
+ if (r < 0)
+ return r;
+
+ if (arg_json_format_flags != JSON_FORMAT_OFF)
+ return dump_lldp_neighbors_json(reply, strv_skip(argv, 1));
pager_open(arg_pager_flags);
- table = table_new("link",
- "chassis-id",
+ table = table_new("index",
+ "link",
"system-name",
- "caps",
+ "system-description",
+ "chassis-id",
"port-id",
- "port-description");
+ "port-description",
+ "caps");
if (!table)
return log_oom();
@@ -2553,53 +2625,46 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
table_set_width(table, 0);
table_set_header(table, arg_legend);
+ table_set_ersatz_string(table, TABLE_ERSATZ_DASH);
+ table_set_sort(table, (size_t) 0, (size_t) 2);
+ table_hide_column_from_display(table, (size_t) 0);
- assert_se(cell = table_get_cell(table, 0, 3));
+ /* Make the capabilities not truncated */
+ assert_se(cell = table_get_cell(table, 0, 7));
table_set_minimum_width(table, cell, 11);
- table_set_ersatz_string(table, TABLE_ERSATZ_DASH);
- FOREACH_ARRAY(link, links, c) {
- _cleanup_fclose_ FILE *f = NULL;
+ JsonVariant *i;
+ JSON_VARIANT_ARRAY_FOREACH(i, json_variant_by_key(reply, "Neighbors")) {
+ _cleanup_(interface_info_done) InterfaceInfo info = {};
- r = open_lldp_neighbors(link->ifindex, &f);
- if (r == -ENOENT)
- continue;
- if (r < 0) {
- log_warning_errno(r, "Failed to open LLDP data for %i, ignoring: %m", link->ifindex);
+ r = json_dispatch(i, interface_info_dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, &info);
+ if (r < 0)
+ return r;
+
+ if (!interface_match_pattern(&info, strv_skip(argv, 1)))
continue;
- }
- for (;;) {
- const char *chassis_id = NULL, *port_id = NULL, *system_name = NULL, *port_description = NULL;
- _cleanup_(sd_lldp_neighbor_unrefp) sd_lldp_neighbor *n = NULL;
- _cleanup_free_ char *capabilities = NULL;
- uint16_t cc;
+ JsonVariant *neighbor;
+ JSON_VARIANT_ARRAY_FOREACH(neighbor, info.v) {
+ LLDPNeighborInfo neighbor_info = {};
- r = next_lldp_neighbor(f, &n);
- if (r < 0) {
- log_warning_errno(r, "Failed to read neighbor data: %m");
- break;
- }
- if (r == 0)
- break;
+ r = json_dispatch(neighbor, lldp_neighbor_dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, &neighbor_info);
+ if (r < 0)
+ return r;
- (void) sd_lldp_neighbor_get_chassis_id_as_string(n, &chassis_id);
- (void) sd_lldp_neighbor_get_port_id_as_string(n, &port_id);
- (void) sd_lldp_neighbor_get_system_name(n, &system_name);
- (void) sd_lldp_neighbor_get_port_description(n, &port_description);
+ all |= neighbor_info.capabilities;
- if (sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0) {
- capabilities = lldp_capabilities_to_string(cc);
- all |= cc;
- }
+ _cleanup_free_ char *cap_str = lldp_capabilities_to_string(neighbor_info.capabilities);
r = table_add_many(table,
- TABLE_STRING, link->name,
- TABLE_STRING, chassis_id,
- TABLE_STRING, system_name,
- TABLE_STRING, capabilities,
- TABLE_STRING, port_id,
- TABLE_STRING, port_description);
+ TABLE_INT, info.ifindex,
+ TABLE_STRING, info.ifname,
+ TABLE_STRING, neighbor_info.system_name,
+ TABLE_STRING, neighbor_info.system_description,
+ TABLE_STRING, neighbor_info.chassis_id,
+ TABLE_STRING, neighbor_info.port_id,
+ TABLE_STRING, neighbor_info.port_description,
+ TABLE_STRING, cap_str);
if (r < 0)
return table_log_add_error(r);
@@ -2613,7 +2678,7 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
if (arg_legend) {
lldp_capabilities_legend(all);
- printf("\n%i neighbors listed.\n", m);
+ printf("\n%zu neighbor(s) listed.\n", m);
}
return 0;
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index e301cf153d..49a43753c5 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -1180,8 +1180,8 @@ int address_remove(Address *address, Link *link) {
}
int address_remove_and_cancel(Address *address, Link *link) {
+ _cleanup_(request_unrefp) Request *req = NULL;
bool waiting = false;
- Request *req;
assert(address);
assert(link);
@@ -1193,6 +1193,7 @@ int address_remove_and_cancel(Address *address, Link *link) {
/* Cancel the request for the address. If the request is already called but we have not received the
* notification about the request, then explicitly remove the address. */
if (address_get_request(link, address, &req) >= 0) {
+ request_ref(req); /* avoid the request freed by request_detach() */
waiting = req->waiting_reply;
request_detach(req);
address_cancel_requesting(address);
diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c
index ac8baeb94c..2b442aa4c1 100644
--- a/src/network/networkd-dhcp-common.c
+++ b/src/network/networkd-dhcp-common.c
@@ -40,12 +40,12 @@ uint32_t link_get_dhcp4_route_table(Link *link) {
return link_get_vrf_table(link);
}
-uint32_t link_get_ipv6_accept_ra_route_table(Link *link) {
+uint32_t link_get_ndisc_route_table(Link *link) {
assert(link);
assert(link->network);
- if (link->network->ipv6_accept_ra_route_table_set)
- return link->network->ipv6_accept_ra_route_table;
+ if (link->network->ndisc_route_table_set)
+ return link->network->ndisc_route_table;
return link_get_vrf_table(link);
}
@@ -281,7 +281,7 @@ int link_get_captive_portal(Link *link, const char **ret) {
return r;
}
- if (link->network->ipv6_accept_ra_use_captive_portal) {
+ if (link->network->ndisc_use_captive_portal) {
NDiscCaptivePortal *cp;
usec_t usec = 0;
@@ -409,10 +409,10 @@ int config_parse_dhcp_route_metric(
/* For backward compatibility. */
if (!network->dhcp_route_metric_set)
network->dhcp_route_metric = metric;
- if (!network->ipv6_accept_ra_route_metric_set) {
- network->ipv6_accept_ra_route_metric_high = metric;
- network->ipv6_accept_ra_route_metric_medium = metric;
- network->ipv6_accept_ra_route_metric_low = metric;
+ if (!network->ndisc_route_metric_set) {
+ network->ndisc_route_metric_high = metric;
+ network->ndisc_route_metric_medium = metric;
+ network->ndisc_route_metric_low = metric;
}
break;
default:
@@ -422,7 +422,7 @@ int config_parse_dhcp_route_metric(
return 0;
}
-int config_parse_ipv6_accept_ra_route_metric(
+int config_parse_ndisc_route_metric(
const char *unit,
const char *filename,
unsigned line,
@@ -447,7 +447,7 @@ int config_parse_ipv6_accept_ra_route_metric(
_cleanup_free_ char *high = NULL, *medium = NULL, *low = NULL;
const char *p = rvalue;
- r = extract_many_words(&p, ":", EXTRACT_DONT_COALESCE_SEPARATORS, &high, &medium, &low, NULL);
+ r = extract_many_words(&p, ":", EXTRACT_DONT_COALESCE_SEPARATORS, &high, &medium, &low);
if (r == -ENOMEM)
return log_oom();
if (r != 3 || !isempty(p)) {
@@ -472,10 +472,10 @@ int config_parse_ipv6_accept_ra_route_metric(
}
}
- network->ipv6_accept_ra_route_metric_high = metric_high;
- network->ipv6_accept_ra_route_metric_medium = metric_medium;
- network->ipv6_accept_ra_route_metric_low = metric_low;
- network->ipv6_accept_ra_route_metric_set = true;
+ network->ndisc_route_metric_high = metric_high;
+ network->ndisc_route_metric_medium = metric_medium;
+ network->ndisc_route_metric_low = metric_low;
+ network->ndisc_route_metric_set = true;
return 0;
}
@@ -717,8 +717,8 @@ int config_parse_dhcp_or_ra_route_table(
network->dhcp_route_table_set = true;
break;
case AF_INET6:
- network->ipv6_accept_ra_route_table = rt;
- network->ipv6_accept_ra_route_table_set = true;
+ network->ndisc_route_table = rt;
+ network->ndisc_route_table_set = true;
break;
default:
assert_not_reached();
diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h
index f888e03b96..c3e6a6d51c 100644
--- a/src/network/networkd-dhcp-common.h
+++ b/src/network/networkd-dhcp-common.h
@@ -54,7 +54,7 @@ typedef struct DUID {
} DUID;
uint32_t link_get_dhcp4_route_table(Link *link);
-uint32_t link_get_ipv6_accept_ra_route_table(Link *link);
+uint32_t link_get_ndisc_route_table(Link *link);
bool link_dhcp_enabled(Link *link, int family);
static inline bool link_dhcp4_enabled(Link *link) {
@@ -95,7 +95,7 @@ DHCPOptionDataType dhcp_option_data_type_from_string(const char *d) _pure_;
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp);
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_route_metric);
-CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_accept_ra_route_metric);
+CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_route_metric);
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_hostname);
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_dns);
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains);
diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c
index 27081e9d31..d280251e07 100644
--- a/src/network/networkd-dhcp6.c
+++ b/src/network/networkd-dhcp6.c
@@ -799,7 +799,7 @@ int link_request_dhcp6_client(Link *link) {
assert(link);
- if (!link_dhcp6_enabled(link) && !link_ipv6_accept_ra_enabled(link))
+ if (!link_dhcp6_enabled(link) && !link_ndisc_enabled(link))
return 0;
if (link->dhcp6_client)
diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf
index c9e3c937f4..bff64633e0 100644
--- a/src/network/networkd-gperf.gperf
+++ b/src/network/networkd-gperf.gperf
@@ -27,6 +27,8 @@ Network.ManageForeignRoutingPolicyRules, config_parse_bool,
Network.ManageForeignRoutes, config_parse_bool, 0, offsetof(Manager, manage_foreign_routes)
Network.ManageForeignNextHops, config_parse_bool, 0, offsetof(Manager, manage_foreign_nexthops)
Network.RouteTable, config_parse_route_table_names, 0, 0
+Network.IPv4Forwarding, config_parse_tristate, 0, offsetof(Manager, ip_forwarding[0])
+Network.IPv6Forwarding, config_parse_tristate, 0, offsetof(Manager, ip_forwarding[1])
Network.IPv6PrivacyExtensions, config_parse_ipv6_privacy_extensions, 0, offsetof(Manager, ipv6_privacy_extensions)
DHCPv4.DUIDType, config_parse_duid_type, 0, offsetof(Manager, dhcp_duid)
DHCPv4.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, dhcp_duid)
diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c
index 134fb6bb2a..57bea190f5 100644
--- a/src/network/networkd-json.c
+++ b/src/network/networkd-json.c
@@ -490,7 +490,7 @@ static int dns_append_json(Link *link, JsonVariant **v) {
}
}
- if (link->network->ipv6_accept_ra_use_dns) {
+ if (link->network->ndisc_use_dns) {
NDiscRDNSS *a;
SET_FOREACH(a, link->ndisc_rdnss) {
@@ -730,7 +730,7 @@ static int domains_append_json(Link *link, bool is_route, JsonVariant **v) {
}
}
- if (link->network->ipv6_accept_ra_use_domains == use_domains) {
+ if (link->network->ndisc_use_domains == use_domains) {
NDiscDNSSL *a;
SET_FOREACH(a, link->ndisc_dnssl) {
@@ -869,7 +869,7 @@ static int pref64_append_json(Link *link, JsonVariant **v) {
assert(link);
assert(v);
- if (!link->network || !link->network->ipv6_accept_ra_use_pref64)
+ if (!link->network || !link->network->ndisc_use_pref64)
return 0;
SET_FOREACH(i, link->ndisc_pref64) {
@@ -1092,7 +1092,7 @@ static int dhcp6_client_duid_append_json(Link *link, JsonVariant **v) {
if (r < 0)
return 0;
- r = sd_dhcp_duid_get_raw(&link->dhcp6_client->duid, &data, &data_size);
+ r = sd_dhcp_duid_get_raw(duid, &data, &data_size);
if (r < 0)
return 0;
@@ -1220,6 +1220,29 @@ static int dhcp_client_private_options_append_json(Link *link, JsonVariant **v)
return json_variant_set_field_non_null(v, "PrivateOptions", array);
}
+static int dhcp_client_id_append_json(Link *link, JsonVariant **v) {
+ const sd_dhcp_client_id *client_id;
+ const void *data;
+ size_t l;
+ int r;
+
+ assert(link);
+ assert(v);
+
+ if (!link->dhcp_client)
+ return 0;
+
+ r = sd_dhcp_client_get_client_id(link->dhcp_client, &client_id);
+ if (r < 0)
+ return 0;
+
+ r = sd_dhcp_client_id_get_raw(client_id, &data, &l);
+ if (r < 0)
+ return 0;
+
+ return json_variant_merge_objectb(v, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_BYTE_ARRAY("ClientIdentifier", data, l)));
+}
+
static int dhcp_client_append_json(Link *link, JsonVariant **v) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
int r;
@@ -1242,6 +1265,10 @@ static int dhcp_client_append_json(Link *link, JsonVariant **v) {
if (r < 0)
return r;
+ r = dhcp_client_id_append_json(link, &w);
+ if (r < 0)
+ return r;
+
return json_variant_set_field_non_null(v, "DHCPv4Client", w);
}
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 9539101702..650e94c313 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -272,7 +272,6 @@ static Link *link_free(Link *link) {
free(link->driver);
unlink_and_free(link->lease_file);
- unlink_and_free(link->lldp_file);
unlink_and_free(link->state_file);
sd_device_unref(link->dev);
@@ -541,7 +540,7 @@ void link_check_ready(Link *link) {
* Note, ignore NDisc when ConfigureWithoutCarrier= is enabled, as IPv6AcceptRA= is enabled by default. */
if (!link_ipv4ll_enabled(link) && !link_dhcp4_enabled(link) &&
!link_dhcp6_enabled(link) && !link_dhcp_pd_is_enabled(link) &&
- (link->network->configure_without_carrier || !link_ipv6_accept_ra_enabled(link)))
+ (link->network->configure_without_carrier || !link_ndisc_enabled(link)))
goto ready;
bool ipv4ll_ready =
@@ -559,8 +558,8 @@ void link_check_ready(Link *link) {
(!link->network->dhcp_pd_assign ||
link_check_addresses_ready(link, NETWORK_CONFIG_SOURCE_DHCP_PD));
bool ndisc_ready =
- link_ipv6_accept_ra_enabled(link) && link->ndisc_configured &&
- (!link->network->ipv6_accept_ra_use_autonomous_prefix ||
+ link_ndisc_enabled(link) && link->ndisc_configured &&
+ (!link->network->ndisc_use_autonomous_prefix ||
link_check_addresses_ready(link, NETWORK_CONFIG_SOURCE_NDISC));
/* If the uplink for PD is self, then request the corresponding DHCP protocol is also ready. */
@@ -2653,7 +2652,7 @@ static Link *link_drop_or_unref(Link *link) {
DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_drop_or_unref);
static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
- _cleanup_free_ char *ifname = NULL, *kind = NULL, *state_file = NULL, *lease_file = NULL, *lldp_file = NULL;
+ _cleanup_free_ char *ifname = NULL, *kind = NULL, *state_file = NULL, *lease_file = NULL;
_cleanup_(link_drop_or_unrefp) Link *link = NULL;
unsigned short iftype;
int r, ifindex;
@@ -2694,9 +2693,6 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", ifindex) < 0)
return log_oom_debug();
-
- if (asprintf(&lldp_file, "/run/systemd/netif/lldp/%d", ifindex) < 0)
- return log_oom_debug();
}
link = new(Link, 1);
@@ -2719,7 +2715,6 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
.state_file = TAKE_PTR(state_file),
.lease_file = TAKE_PTR(lease_file),
- .lldp_file = TAKE_PTR(lldp_file),
.n_dns = UINT_MAX,
.dns_default_route = -1,
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
index 0167b1988d..b3e8bb001f 100644
--- a/src/network/networkd-link.h
+++ b/src/network/networkd-link.h
@@ -181,7 +181,6 @@ typedef struct Link {
/* This is about LLDP reception */
sd_lldp_rx *lldp_rx;
- char *lldp_file;
/* This is about LLDP transmission */
sd_lldp_tx *lldp_tx;
diff --git a/src/network/networkd-lldp-rx.c b/src/network/networkd-lldp-rx.c
index c45d3e32d7..f74485488e 100644
--- a/src/network/networkd-lldp-rx.c
+++ b/src/network/networkd-lldp-rx.c
@@ -52,8 +52,6 @@ static void lldp_rx_handler(sd_lldp_rx *lldp_rx, sd_lldp_rx_event_t event, sd_ll
Link *link = ASSERT_PTR(userdata);
int r;
- (void) link_lldp_save(link);
-
if (link->lldp_tx && event == SD_LLDP_RX_EVENT_ADDED) {
/* If we received information about a new neighbor, restart the LLDP "fast" logic */
@@ -104,70 +102,3 @@ int link_lldp_rx_configure(Link *link) {
return 0;
}
-
-int link_lldp_save(Link *link) {
- _cleanup_(unlink_and_freep) char *temp_path = NULL;
- _cleanup_fclose_ FILE *f = NULL;
- sd_lldp_neighbor **l = NULL;
- int n = 0, r, i;
-
- assert(link);
-
- if (isempty(link->lldp_file))
- return 0; /* Do not update state file when running in test mode. */
-
- if (!link->lldp_rx) {
- (void) unlink(link->lldp_file);
- return 0;
- }
-
- r = sd_lldp_rx_get_neighbors(link->lldp_rx, &l);
- if (r < 0)
- return r;
- if (r == 0) {
- (void) unlink(link->lldp_file);
- return 0;
- }
-
- n = r;
-
- r = fopen_temporary(link->lldp_file, &f, &temp_path);
- if (r < 0)
- goto finish;
-
- (void) fchmod(fileno(f), 0644);
-
- for (i = 0; i < n; i++) {
- const void *p;
- le64_t u;
- size_t sz;
-
- r = sd_lldp_neighbor_get_raw(l[i], &p, &sz);
- if (r < 0)
- goto finish;
-
- u = htole64(sz);
- fwrite(&u, 1, sizeof(u), f);
- fwrite(p, 1, sz, f);
- }
-
- r = fflush_and_check(f);
- if (r < 0)
- goto finish;
-
- r = conservative_rename(temp_path, link->lldp_file);
- if (r < 0)
- goto finish;
-
-finish:
- if (r < 0)
- log_link_error_errno(link, r, "Failed to save LLDP data to %s: %m", link->lldp_file);
-
- if (l) {
- for (i = 0; i < n; i++)
- sd_lldp_neighbor_unref(l[i]);
- free(l);
- }
-
- return r;
-}
diff --git a/src/network/networkd-lldp-rx.h b/src/network/networkd-lldp-rx.h
index 22f6602bd0..75c9f8ca86 100644
--- a/src/network/networkd-lldp-rx.h
+++ b/src/network/networkd-lldp-rx.h
@@ -14,7 +14,6 @@ typedef enum LLDPMode {
} LLDPMode;
int link_lldp_rx_configure(Link *link);
-int link_lldp_save(Link *link);
const char* lldp_mode_to_string(LLDPMode m) _const_;
LLDPMode lldp_mode_from_string(const char *s) _pure_;
diff --git a/src/network/networkd-lldp-tx.c b/src/network/networkd-lldp-tx.c
index fc9196fc8b..f48781ef8b 100644
--- a/src/network/networkd-lldp-tx.c
+++ b/src/network/networkd-lldp-tx.c
@@ -8,6 +8,7 @@
#include "networkd-link.h"
#include "networkd-lldp-tx.h"
#include "networkd-manager.h"
+#include "networkd-sysctl.h"
#include "parse-util.h"
#include "string-table.h"
#include "string-util.h"
@@ -69,9 +70,8 @@ int link_lldp_tx_configure(Link *link) {
SD_LLDP_SYSTEM_CAPABILITIES_STATION |
SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE |
SD_LLDP_SYSTEM_CAPABILITIES_ROUTER,
- (link->network->ip_forward != ADDRESS_FAMILY_NO) ?
- SD_LLDP_SYSTEM_CAPABILITIES_ROUTER :
- SD_LLDP_SYSTEM_CAPABILITIES_STATION);
+ (link_get_ip_forwarding(link, AF_INET) > 0 || link_get_ip_forwarding(link, AF_INET6) > 0) ?
+ SD_LLDP_SYSTEM_CAPABILITIES_ROUTER : SD_LLDP_SYSTEM_CAPABILITIES_STATION);
if (r < 0)
return r;
diff --git a/src/network/networkd-manager-varlink.c b/src/network/networkd-manager-varlink.c
index 30aebb5d9e..0c54e86aea 100644
--- a/src/network/networkd-manager-varlink.c
+++ b/src/network/networkd-manager-varlink.c
@@ -2,6 +2,7 @@
#include <unistd.h>
+#include "lldp-rx-internal.h"
#include "networkd-manager-varlink.h"
#include "varlink.h"
#include "varlink-io.systemd.Network.h"
@@ -47,7 +48,7 @@ static int vl_method_get_namespace_id(Varlink *link, JsonVariant *parameters, Va
r = netns_get_nsid(/* netnsfd= */ -EBADF, &nsid);
if (r < 0)
- log_warning_errno(r, "Failed to query network nsid, ignoring: %m");
+ log_full_errno(r == -ENODATA ? LOG_DEBUG : LOG_WARNING, r, "Failed to query network nsid, ignoring: %m");
return varlink_replyb(link,
JSON_BUILD_OBJECT(
@@ -56,6 +57,113 @@ static int vl_method_get_namespace_id(Varlink *link, JsonVariant *parameters, Va
JSON_BUILD_PAIR_CONDITION(nsid != UINT32_MAX, "NamespaceNSID", JSON_BUILD_UNSIGNED(nsid))));
}
+typedef struct InterfaceInfo {
+ int ifindex;
+ const char *ifname;
+} InterfaceInfo;
+
+static int dispatch_interface(Varlink *vlink, JsonVariant *parameters, Manager *manager, Link **ret) {
+ static const JsonDispatch dispatch_table[] = {
+ { "InterfaceIndex", _JSON_VARIANT_TYPE_INVALID, json_dispatch_int, offsetof(InterfaceInfo, ifindex), 0 },
+ { "InterfaceName", JSON_VARIANT_STRING, json_dispatch_const_string, offsetof(InterfaceInfo, ifname), 0 },
+ {}
+ };
+
+ InterfaceInfo info = {};
+ Link *link = NULL;
+ int r;
+
+ assert(vlink);
+ assert(manager);
+
+ r = varlink_dispatch(vlink, parameters, dispatch_table, &info);
+ if (r != 0)
+ return r;
+
+ if (info.ifindex < 0)
+ return varlink_error_invalid_parameter(vlink, JSON_VARIANT_STRING_CONST("InterfaceIndex"));
+ if (info.ifindex > 0 && link_get_by_index(manager, info.ifindex, &link) < 0)
+ return varlink_error_invalid_parameter(vlink, JSON_VARIANT_STRING_CONST("InterfaceIndex"));
+ if (info.ifname) {
+ Link *link_by_name;
+
+ if (link_get_by_name(manager, info.ifname, &link_by_name) < 0)
+ return varlink_error_invalid_parameter(vlink, JSON_VARIANT_STRING_CONST("InterfaceName"));
+
+ if (link && link_by_name != link)
+ /* If both arguments are specified, then these must be consistent. */
+ return varlink_error_invalid_parameter(vlink, JSON_VARIANT_STRING_CONST("InterfaceName"));
+
+ link = link_by_name;
+ }
+
+ /* If neither InterfaceIndex nor InterfaceName specified, this function returns NULL. */
+ *ret = link;
+ return 0;
+}
+
+static int link_append_lldp_neighbors(Link *link, JsonVariant *v, JsonVariant **array) {
+ assert(link);
+ assert(array);
+
+ return json_variant_append_arrayb(array,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_INTEGER("InterfaceIndex", link->ifindex),
+ JSON_BUILD_PAIR_STRING("InterfaceName", link->ifname),
+ JSON_BUILD_PAIR_STRV_NON_EMPTY("InterfaceAlternativeNames", link->alternative_names),
+ JSON_BUILD_PAIR_CONDITION(json_variant_is_blank_array(v), "Neighbors", JSON_BUILD_EMPTY_ARRAY),
+ JSON_BUILD_PAIR_CONDITION(!json_variant_is_blank_array(v), "Neighbors", JSON_BUILD_VARIANT(v))));
+}
+
+static int vl_method_get_lldp_neighbors(Varlink *vlink, JsonVariant *parameters, VarlinkMethodFlags flags, Manager *manager) {
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
+ Link *link = NULL;
+ int r;
+
+ assert(vlink);
+ assert(manager);
+
+ r = dispatch_interface(vlink, parameters, manager, &link);
+ if (r != 0)
+ return r;
+
+ if (link) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+
+ if (link->lldp_rx) {
+ r = lldp_rx_build_neighbors_json(link->lldp_rx, &v);
+ if (r < 0)
+ return r;
+ }
+
+ r = link_append_lldp_neighbors(link, v, &array);
+ if (r < 0)
+ return r;
+ } else
+ HASHMAP_FOREACH(link, manager->links_by_index) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+
+ if (!link->lldp_rx)
+ continue;
+
+ r = lldp_rx_build_neighbors_json(link->lldp_rx, &v);
+ if (r < 0)
+ return r;
+
+ if (json_variant_is_blank_array(v))
+ continue;
+
+ r = link_append_lldp_neighbors(link, v, &array);
+ if (r < 0)
+ return r;
+ }
+
+ return varlink_replyb(vlink,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_CONDITION(json_variant_is_blank_array(array), "Neighbors", JSON_BUILD_EMPTY_ARRAY),
+ JSON_BUILD_PAIR_CONDITION(!json_variant_is_blank_array(array), "Neighbors", JSON_BUILD_VARIANT(array))));
+}
+
int manager_connect_varlink(Manager *m) {
_cleanup_(varlink_server_unrefp) VarlinkServer *s = NULL;
int r;
@@ -78,7 +186,8 @@ int manager_connect_varlink(Manager *m) {
r = varlink_server_bind_method_many(
s,
"io.systemd.Network.GetStates", vl_method_get_states,
- "io.systemd.Network.GetNamespaceId", vl_method_get_namespace_id);
+ "io.systemd.Network.GetNamespaceId", vl_method_get_namespace_id,
+ "io.systemd.Network.GetLLDPNeighbors", vl_method_get_lldp_neighbors);
if (r < 0)
return log_error_errno(r, "Failed to register varlink methods: %m");
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 42c6371be5..c0d368ab11 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -577,6 +577,7 @@ int manager_new(Manager **ret, bool test_mode) {
.dhcp_duid.type = DUID_TYPE_EN,
.dhcp6_duid.type = DUID_TYPE_EN,
.duid_product_uuid.type = DUID_TYPE_UUID,
+ .ip_forwarding = { -1, -1, },
};
*ret = TAKE_PTR(m);
@@ -659,6 +660,8 @@ int manager_start(Manager *m) {
assert(m);
+ manager_set_sysctl(m);
+
r = manager_start_speed_meter(m);
if (r < 0)
return log_error_errno(r, "Failed to initialize speed meter: %m");
diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h
index 7788ce7d6f..8088e20b38 100644
--- a/src/network/networkd-manager.h
+++ b/src/network/networkd-manager.h
@@ -107,6 +107,9 @@ struct Manager {
Hashmap *tuntap_fds_by_name;
unsigned reloading;
+
+ /* sysctl */
+ int ip_forwarding[2];
};
int manager_new(Manager **ret, bool test_mode);
diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c
index d110482c00..b3da0c2a31 100644
--- a/src/network/networkd-ndisc.c
+++ b/src/network/networkd-ndisc.c
@@ -20,6 +20,7 @@
#include "networkd-queue.h"
#include "networkd-route.h"
#include "networkd-state-file.h"
+#include "networkd-sysctl.h"
#include "string-table.h"
#include "string-util.h"
#include "strv.h"
@@ -34,7 +35,7 @@
* Not sure if the threshold is high enough. Let's adjust later if not. */
#define NDISC_PREF64_MAX 64U
-bool link_ipv6_accept_ra_enabled(Link *link) {
+bool link_ndisc_enabled(Link *link) {
assert(link);
if (!socket_ipv6_is_supported())
@@ -52,24 +53,28 @@ bool link_ipv6_accept_ra_enabled(Link *link) {
if (!link_may_have_ipv6ll(link, /* check_multicast = */ true))
return false;
- assert(link->network->ipv6_accept_ra >= 0);
- return link->network->ipv6_accept_ra;
+ if (link->network->ndisc >= 0)
+ return link->network->ndisc;
+
+ /* Accept RAs if IPv6 forwarding is disabled, and ignore RAs if IPv6 forwarding is enabled. */
+ int t = link_get_ip_forwarding(link, AF_INET6);
+ if (t >= 0)
+ return !t;
+
+ /* Otherwise, defaults to true. */
+ return true;
}
-void network_adjust_ipv6_accept_ra(Network *network) {
+void network_adjust_ndisc(Network *network) {
assert(network);
if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6)) {
- if (network->ipv6_accept_ra > 0)
+ if (network->ndisc > 0)
log_warning("%s: IPv6AcceptRA= is enabled but IPv6 link-local addressing is disabled or not supported. "
"Disabling IPv6AcceptRA=.", network->filename);
- network->ipv6_accept_ra = false;
+ network->ndisc = false;
}
- if (network->ipv6_accept_ra < 0)
- /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
- network->ipv6_accept_ra = !FLAGS_SET(network->ip_forward, ADDRESS_FAMILY_IPV6);
-
/* When RouterAllowList=, PrefixAllowList= or RouteAllowList= are specified, then
* RouterDenyList=, PrefixDenyList= or RouteDenyList= are ignored, respectively. */
if (!set_isempty(network->ndisc_allow_listed_router))
@@ -159,13 +164,13 @@ static void ndisc_set_route_priority(Link *link, Route *route) {
switch (route->pref) {
case SD_NDISC_PREFERENCE_LOW:
- route->priority = link->network->ipv6_accept_ra_route_metric_low;
+ route->priority = link->network->ndisc_route_metric_low;
break;
case SD_NDISC_PREFERENCE_MEDIUM:
- route->priority = link->network->ipv6_accept_ra_route_metric_medium;
+ route->priority = link->network->ndisc_route_metric_medium;
break;
case SD_NDISC_PREFERENCE_HIGH:
- route->priority = link->network->ipv6_accept_ra_route_metric_high;
+ route->priority = link->network->ndisc_route_metric_high;
break;
default:
assert_not_reached();
@@ -189,13 +194,13 @@ static int ndisc_request_route(Route *route, Link *link, sd_ndisc_router *rt) {
if (r < 0)
return r;
- if (link->network->ipv6_accept_ra_use_mtu) {
+ if (link->network->ndisc_use_mtu) {
r = sd_ndisc_router_get_mtu(rt, &mtu);
if (r < 0 && r != -ENODATA)
return log_link_warning_errno(link, r, "Failed to get MTU from RA: %m");
}
- if (link->network->ipv6_accept_ra_use_hop_limit) {
+ if (link->network->ndisc_use_hop_limit) {
r = sd_ndisc_router_get_hop_limit(rt, &hop_limit);
if (r < 0 && r != -ENODATA)
return log_link_warning_errno(link, r, "Failed to get hop limit from RA: %m");
@@ -204,7 +209,7 @@ static int ndisc_request_route(Route *route, Link *link, sd_ndisc_router *rt) {
route->source = NETWORK_CONFIG_SOURCE_NDISC;
route->provider.in6 = router;
if (!route->table_set)
- route->table = link_get_ipv6_accept_ra_route_table(link);
+ route->table = link_get_ndisc_route_table(link);
if (!route->protocol_set)
route->protocol = RTPROT_RA;
r = route_metric_set(&route->metric, RTAX_MTU, mtu);
@@ -213,7 +218,7 @@ static int ndisc_request_route(Route *route, Link *link, sd_ndisc_router *rt) {
r = route_metric_set(&route->metric, RTAX_HOPLIMIT, hop_limit);
if (r < 0)
return r;
- r = route_metric_set(&route->metric, RTAX_QUICKACK, link->network->ipv6_accept_ra_quickack);
+ r = route_metric_set(&route->metric, RTAX_QUICKACK, link->network->ndisc_quickack);
if (r < 0)
return r;
@@ -283,7 +288,7 @@ static int ndisc_remove_route(Route *route, Link *link) {
ndisc_set_route_priority(link, route);
if (!route->table_set)
- route->table = link_get_ipv6_accept_ra_route_table(link);
+ route->table = link_get_ndisc_route_table(link);
r = route_adjust_nexthops(route, link);
if (r < 0)
@@ -439,7 +444,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
if (r == 0)
return ndisc_router_drop_default(link, rt);
- if (!link->network->ipv6_accept_ra_use_gateway &&
+ if (!link->network->ndisc_use_gateway &&
hashmap_isempty(link->network->routes_by_section))
return 0;
@@ -451,18 +456,11 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
if (r < 0)
return log_link_warning_errno(link, r, "Failed to get gateway address from RA: %m");
- if (link_get_ipv6_address(link, &gateway, 0, NULL) >= 0) {
- if (DEBUG_LOGGING)
- log_link_debug(link, "No NDisc route added, gateway %s matches local address",
- IN6_ADDR_TO_STRING(&gateway));
- return 0;
- }
-
r = sd_ndisc_router_get_preference(rt, &preference);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to get router preference from RA: %m");
- if (link->network->ipv6_accept_ra_use_gateway) {
+ if (link->network->ndisc_use_gateway) {
_cleanup_(route_unrefp) Route *route = NULL;
r = route_new(&route);
@@ -507,43 +505,6 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
return 0;
}
-static int ndisc_router_process_icmp6_ratelimit(Link *link, sd_ndisc_router *rt) {
- usec_t icmp6_ratelimit, msec;
- int r;
-
- assert(link);
- assert(link->network);
- assert(rt);
-
- if (!link->network->ipv6_accept_ra_use_icmp6_ratelimit)
- return 0;
-
- /* Ignore the icmp6 ratelimit field of the RA header if the lifetime is zero. */
- r = sd_ndisc_router_get_lifetime(rt, NULL);
- if (r <= 0)
- return r;
-
- r = sd_ndisc_router_get_icmp6_ratelimit(rt, &icmp6_ratelimit);
- if (r < 0)
- return log_link_warning_errno(link, r, "Failed to get ICMP6 ratelimit from RA: %m");
-
- /* We do not allow 0 here. */
- if (!timestamp_is_set(icmp6_ratelimit))
- return 0;
-
- msec = DIV_ROUND_UP(icmp6_ratelimit, USEC_PER_MSEC);
- if (msec <= 0 || msec > INT_MAX)
- return 0;
-
- /* Limit the maximal rates for sending ICMPv6 packets. 0 to disable any limiting, otherwise the
- * minimal space between responses in milliseconds. Default: 1000. */
- r = sysctl_write_ip_property_int(AF_INET6, NULL, "icmp/ratelimit", (int) msec);
- if (r < 0)
- log_link_warning_errno(link, r, "Failed to apply ICMP6 ratelimit, ignoring: %m");
-
- return 0;
-}
-
static int ndisc_router_process_reachable_time(Link *link, sd_ndisc_router *rt) {
usec_t reachable_time, msec;
int r;
@@ -552,7 +513,7 @@ static int ndisc_router_process_reachable_time(Link *link, sd_ndisc_router *rt)
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_reachable_time)
+ if (!link->network->ndisc_use_reachable_time)
return 0;
/* Ignore the reachable time field of the RA header if the lifetime is zero. */
@@ -590,7 +551,7 @@ static int ndisc_router_process_retransmission_time(Link *link, sd_ndisc_router
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_retransmission_time)
+ if (!link->network->ndisc_use_retransmission_time)
return 0;
/* Ignore the retransmission time field of the RA header if the lifetime is zero. */
@@ -628,7 +589,7 @@ static int ndisc_router_process_hop_limit(Link *link, sd_ndisc_router *rt) {
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_hop_limit)
+ if (!link->network->ndisc_use_hop_limit)
return 0;
/* Ignore the hop limit field of the RA header if the lifetime is zero. */
@@ -671,7 +632,7 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_autonomous_prefix)
+ if (!link->network->ndisc_use_autonomous_prefix)
return 0;
r = sd_ndisc_router_prefix_get_address(rt, &prefix);
@@ -751,7 +712,7 @@ static int ndisc_router_process_onlink_prefix(Link *link, sd_ndisc_router *rt) {
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_onlink_prefix)
+ if (!link->network->ndisc_use_onlink_prefix)
return 0;
r = sd_ndisc_router_prefix_get_valid_lifetime_timestamp(rt, CLOCK_BOOTTIME, &lifetime_usec);
@@ -805,7 +766,7 @@ static int ndisc_router_drop_onlink_prefix(Link *link, sd_ndisc_router *rt) {
* covered by the prefix are off-link. The only way to cancel a previous on-link indication is to
* advertise that prefix with the L-bit set and the Lifetime set to zero. */
- if (!link->network->ipv6_accept_ra_use_onlink_prefix)
+ if (!link->network->ndisc_use_onlink_prefix)
return 0;
r = sd_ndisc_router_prefix_get_valid_lifetime(rt, &lifetime_usec);
@@ -902,7 +863,7 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
assert(link);
- if (!link->network->ipv6_accept_ra_use_route_prefix)
+ if (!link->network->ndisc_use_route_prefix)
return 0;
r = sd_ndisc_router_route_get_lifetime_timestamp(rt, CLOCK_BOOTTIME, &lifetime_usec);
@@ -998,7 +959,7 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_dns)
+ if (!link->network->ndisc_use_dns)
return 0;
r = sd_ndisc_router_get_address(rt, &router);
@@ -1090,7 +1051,7 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
assert(link->network);
assert(rt);
- if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_NO)
+ if (link->network->ndisc_use_domains == DHCP_USE_DOMAINS_NO)
return 0;
r = sd_ndisc_router_get_address(rt, &router);
@@ -1195,7 +1156,7 @@ static int ndisc_router_process_captive_portal(Link *link, sd_ndisc_router *rt)
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_captive_portal)
+ if (!link->network->ndisc_use_captive_portal)
return 0;
r = sd_ndisc_router_get_address(rt, &router);
@@ -1315,7 +1276,7 @@ static int ndisc_router_process_pref64(Link *link, sd_ndisc_router *rt) {
assert(link->network);
assert(rt);
- if (!link->network->ipv6_accept_ra_use_pref64)
+ if (!link->network->ndisc_use_pref64)
return 0;
r = sd_ndisc_router_get_address(rt, &router);
@@ -1464,7 +1425,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
if (route->nexthop.ifindex != link->ifindex)
continue;
- if (route->lifetime_usec >= timestamp_usec)
+ if (route->lifetime_usec > timestamp_usec)
continue; /* the route is still valid */
r = route_remove_and_cancel(route, link->manager);
@@ -1476,7 +1437,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
if (address->source != NETWORK_CONFIG_SOURCE_NDISC)
continue;
- if (address->lifetime_valid_usec >= timestamp_usec)
+ if (address->lifetime_valid_usec > timestamp_usec)
continue; /* the address is still valid */
r = address_remove_and_cancel(address, link);
@@ -1485,7 +1446,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
}
SET_FOREACH(rdnss, link->ndisc_rdnss) {
- if (rdnss->lifetime_usec >= timestamp_usec)
+ if (rdnss->lifetime_usec > timestamp_usec)
continue; /* the DNS server is still valid */
free(set_remove(link->ndisc_rdnss, rdnss));
@@ -1493,7 +1454,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
}
SET_FOREACH(dnssl, link->ndisc_dnssl) {
- if (dnssl->lifetime_usec >= timestamp_usec)
+ if (dnssl->lifetime_usec > timestamp_usec)
continue; /* the DNS domain is still valid */
free(set_remove(link->ndisc_dnssl, dnssl));
@@ -1501,7 +1462,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
}
SET_FOREACH(cp, link->ndisc_captive_portals) {
- if (cp->lifetime_usec >= timestamp_usec)
+ if (cp->lifetime_usec > timestamp_usec)
continue; /* the captive portal is still valid */
ndisc_captive_portal_free(set_remove(link->ndisc_captive_portals, cp));
@@ -1509,7 +1470,7 @@ static int ndisc_drop_outdated(Link *link, usec_t timestamp_usec) {
}
SET_FOREACH(p64, link->ndisc_pref64) {
- if (p64->lifetime_usec >= timestamp_usec)
+ if (p64->lifetime_usec > timestamp_usec)
continue; /* the pref64 prefix is still valid */
free(set_remove(link->ndisc_pref64, p64));
@@ -1609,7 +1570,7 @@ static int ndisc_start_dhcp6_client(Link *link, sd_ndisc_router *rt) {
if (r <= 0)
return r;
- switch (link->network->ipv6_accept_ra_start_dhcp6_client) {
+ switch (link->network->ndisc_start_dhcp6_client) {
case IPV6_ACCEPT_RA_START_DHCP6_CLIENT_NO:
return 0;
@@ -1694,10 +1655,6 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
if (r < 0)
return r;
- r = ndisc_router_process_icmp6_ratelimit(link, rt);
- if (r < 0)
- return r;
-
r = ndisc_router_process_reachable_time(link, rt);
if (r < 0)
return r;
@@ -1730,7 +1687,7 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
return 0;
}
-static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router *rt, void *userdata) {
+static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event_t event, void *message, void *userdata) {
Link *link = ASSERT_PTR(userdata);
int r;
@@ -1740,7 +1697,7 @@ static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router
switch (event) {
case SD_NDISC_EVENT_ROUTER:
- r = ndisc_router_handler(link, rt);
+ r = ndisc_router_handler(link, ASSERT_PTR(message));
if (r < 0 && r != -EBADMSG) {
link_enter_failed(link);
return;
@@ -1754,8 +1711,9 @@ static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router
link_check_ready(link);
}
break;
+
default:
- assert_not_reached();
+ log_link_debug(link, "Received unsupported NDisc event, ignoring.");
}
}
@@ -1764,7 +1722,7 @@ static int ndisc_configure(Link *link) {
assert(link);
- if (!link_ipv6_accept_ra_enabled(link))
+ if (!link_ndisc_enabled(link))
return 0;
if (link->ndisc)
@@ -1809,6 +1767,10 @@ int ndisc_start(Link *link) {
if (in6_addr_is_null(&link->ipv6ll_address))
return 0;
+ r = sd_ndisc_set_link_local_address(link->ndisc, &link->ipv6ll_address);
+ if (r < 0)
+ return r;
+
log_link_debug(link, "Discovering IPv6 routers");
r = sd_ndisc_start(link->ndisc);
@@ -1844,7 +1806,7 @@ int link_request_ndisc(Link *link) {
assert(link);
- if (!link_ipv6_accept_ra_enabled(link))
+ if (!link_ndisc_enabled(link))
return 0;
if (link->ndisc)
@@ -1879,15 +1841,15 @@ void ndisc_flush(Link *link) {
link->ndisc_pref64 = set_free(link->ndisc_pref64);
}
-static const char* const ipv6_accept_ra_start_dhcp6_client_table[_IPV6_ACCEPT_RA_START_DHCP6_CLIENT_MAX] = {
+static const char* const ndisc_start_dhcp6_client_table[_IPV6_ACCEPT_RA_START_DHCP6_CLIENT_MAX] = {
[IPV6_ACCEPT_RA_START_DHCP6_CLIENT_NO] = "no",
[IPV6_ACCEPT_RA_START_DHCP6_CLIENT_ALWAYS] = "always",
[IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES] = "yes",
};
-DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING_WITH_BOOLEAN(ipv6_accept_ra_start_dhcp6_client, IPv6AcceptRAStartDHCP6Client, IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES);
+DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING_WITH_BOOLEAN(ndisc_start_dhcp6_client, IPv6AcceptRAStartDHCP6Client, IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES);
-DEFINE_CONFIG_PARSE_ENUM(config_parse_ipv6_accept_ra_use_domains, dhcp_use_domains, DHCPUseDomains,
+DEFINE_CONFIG_PARSE_ENUM(config_parse_ndisc_use_domains, dhcp_use_domains, DHCPUseDomains,
"Failed to parse UseDomains= setting");
-DEFINE_CONFIG_PARSE_ENUM(config_parse_ipv6_accept_ra_start_dhcp6_client, ipv6_accept_ra_start_dhcp6_client, IPv6AcceptRAStartDHCP6Client,
+DEFINE_CONFIG_PARSE_ENUM(config_parse_ndisc_start_dhcp6_client, ndisc_start_dhcp6_client, IPv6AcceptRAStartDHCP6Client,
"Failed to parse DHCPv6Client= setting");
diff --git a/src/network/networkd-ndisc.h b/src/network/networkd-ndisc.h
index a463f42b52..2766f5e435 100644
--- a/src/network/networkd-ndisc.h
+++ b/src/network/networkd-ndisc.h
@@ -52,9 +52,9 @@ static inline char* NDISC_DNSSL_DOMAIN(const NDiscDNSSL *n) {
return ((char*) n) + ALIGN(sizeof(NDiscDNSSL));
}
-bool link_ipv6_accept_ra_enabled(Link *link);
+bool link_ndisc_enabled(Link *link);
-void network_adjust_ipv6_accept_ra(Network *network);
+void network_adjust_ndisc(Network *network);
int ndisc_start(Link *link);
int ndisc_stop(Link *link);
@@ -62,5 +62,5 @@ void ndisc_flush(Link *link);
int link_request_ndisc(Link *link);
-CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_accept_ra_start_dhcp6_client);
-CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_accept_ra_use_domains);
+CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_start_dhcp6_client);
+CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_use_domains);
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 236bac7aa6..dffc40308c 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -124,11 +124,13 @@ Network.DNSOverTLS, config_parse_dns_over_tls_mode,
Network.DNSSEC, config_parse_dnssec_mode, 0, offsetof(Network, dnssec_mode)
Network.DNSSECNegativeTrustAnchors, config_parse_dnssec_negative_trust_anchors, 0, offsetof(Network, dnssec_negative_trust_anchors)
Network.NTP, config_parse_ntp, 0, offsetof(Network, ntp)
-Network.IPForward, config_parse_address_family_with_kernel, 0, offsetof(Network, ip_forward)
+Network.IPForward, config_parse_ip_forward_deprecated, 0, 0
+Network.IPv4Forwarding, config_parse_tristate, 0, offsetof(Network, ip_forwarding[0])
+Network.IPv6Forwarding, config_parse_tristate, 0, offsetof(Network, ip_forwarding[1])
Network.IPMasquerade, config_parse_ip_masquerade, 0, offsetof(Network, ip_masquerade)
Network.IPv6PrivacyExtensions, config_parse_ipv6_privacy_extensions, 0, offsetof(Network, ipv6_privacy_extensions)
-Network.IPv6AcceptRA, config_parse_tristate, 0, offsetof(Network, ipv6_accept_ra)
-Network.IPv6AcceptRouterAdvertisements, config_parse_tristate, 0, offsetof(Network, ipv6_accept_ra)
+Network.IPv6AcceptRA, config_parse_tristate, 0, offsetof(Network, ndisc)
+Network.IPv6AcceptRouterAdvertisements, config_parse_tristate, 0, offsetof(Network, ndisc)
Network.IPv6DuplicateAddressDetection, config_parse_int, 0, offsetof(Network, ipv6_dad_transmits)
Network.IPv6HopLimit, config_parse_uint8, 0, offsetof(Network, ipv6_hop_limit)
Network.IPv6RetransmissionTimeSec, config_parse_sec, 0, offsetof(Network, ipv6_retransmission_time)
@@ -290,23 +292,22 @@ DHCPv6.RapidCommit, config_parse_bool,
DHCPv6.NetLabel, config_parse_string, CONFIG_PARSE_STRING_SAFE, offsetof(Network, dhcp6_netlabel)
DHCPv6.SendRelease, config_parse_bool, 0, offsetof(Network, dhcp6_send_release)
DHCPv6.NFTSet, config_parse_nft_set, NFT_SET_PARSE_NETWORK, offsetof(Network, dhcp6_nft_set_context)
-IPv6AcceptRA.UseGateway, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_gateway)
-IPv6AcceptRA.UseRoutePrefix, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_route_prefix)
-IPv6AcceptRA.UseAutonomousPrefix, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_autonomous_prefix)
-IPv6AcceptRA.UseOnLinkPrefix, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_onlink_prefix)
-IPv6AcceptRA.UsePREF64, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_pref64)
-IPv6AcceptRA.UseDNS, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_dns)
-IPv6AcceptRA.UseDomains, config_parse_ipv6_accept_ra_use_domains, 0, offsetof(Network, ipv6_accept_ra_use_domains)
-IPv6AcceptRA.UseMTU, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_mtu)
-IPv6AcceptRA.UseHopLimit, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_hop_limit)
-IPv6AcceptRA.UseReachableTime, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_reachable_time)
-IPv6AcceptRA.UseRetransmissionTime, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_retransmission_time)
-IPv6AcceptRA.UseICMP6RateLimit, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_icmp6_ratelimit)
-IPv6AcceptRA.DHCPv6Client, config_parse_ipv6_accept_ra_start_dhcp6_client, 0, offsetof(Network, ipv6_accept_ra_start_dhcp6_client)
+IPv6AcceptRA.UseGateway, config_parse_bool, 0, offsetof(Network, ndisc_use_gateway)
+IPv6AcceptRA.UseRoutePrefix, config_parse_bool, 0, offsetof(Network, ndisc_use_route_prefix)
+IPv6AcceptRA.UseAutonomousPrefix, config_parse_bool, 0, offsetof(Network, ndisc_use_autonomous_prefix)
+IPv6AcceptRA.UseOnLinkPrefix, config_parse_bool, 0, offsetof(Network, ndisc_use_onlink_prefix)
+IPv6AcceptRA.UsePREF64, config_parse_bool, 0, offsetof(Network, ndisc_use_pref64)
+IPv6AcceptRA.UseDNS, config_parse_bool, 0, offsetof(Network, ndisc_use_dns)
+IPv6AcceptRA.UseDomains, config_parse_ndisc_use_domains, 0, offsetof(Network, ndisc_use_domains)
+IPv6AcceptRA.UseMTU, config_parse_bool, 0, offsetof(Network, ndisc_use_mtu)
+IPv6AcceptRA.UseHopLimit, config_parse_bool, 0, offsetof(Network, ndisc_use_hop_limit)
+IPv6AcceptRA.UseReachableTime, config_parse_bool, 0, offsetof(Network, ndisc_use_reachable_time)
+IPv6AcceptRA.UseRetransmissionTime, config_parse_bool, 0, offsetof(Network, ndisc_use_retransmission_time)
+IPv6AcceptRA.DHCPv6Client, config_parse_ndisc_start_dhcp6_client, 0, offsetof(Network, ndisc_start_dhcp6_client)
IPv6AcceptRA.RouteTable, config_parse_dhcp_or_ra_route_table, AF_INET6, 0
-IPv6AcceptRA.RouteMetric, config_parse_ipv6_accept_ra_route_metric, 0, 0
-IPv6AcceptRA.QuickAck, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_quickack)
-IPv6AcceptRA.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, ipv6_accept_ra_use_captive_portal)
+IPv6AcceptRA.RouteMetric, config_parse_ndisc_route_metric, 0, 0
+IPv6AcceptRA.QuickAck, config_parse_bool, 0, offsetof(Network, ndisc_quickack)
+IPv6AcceptRA.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, ndisc_use_captive_portal)
IPv6AcceptRA.RouterAllowList, config_parse_in_addr_prefixes, AF_INET6, offsetof(Network, ndisc_allow_listed_router)
IPv6AcceptRA.RouterDenyList, config_parse_in_addr_prefixes, AF_INET6, offsetof(Network, ndisc_deny_listed_router)
IPv6AcceptRA.PrefixAllowList, config_parse_in_addr_prefixes, AF_INET6, offsetof(Network, ndisc_allow_listed_prefix)
@@ -609,7 +610,7 @@ DHCP.RapidCommit, config_parse_bool,
DHCP.ForceDHCPv6PDOtherInformation, config_parse_warn_compat, DISABLED_LEGACY, 0
DHCPv4.UseDomainName, config_parse_dhcp_use_domains, AF_INET, 0
DHCPv4.CriticalConnection, config_parse_tristate, 0, offsetof(Network, dhcp_critical)
-DHCPv6.RouteMetric, config_parse_ipv6_accept_ra_route_metric, AF_INET6, 0
+DHCPv6.RouteMetric, config_parse_ndisc_route_metric, AF_INET6, 0
DHCPv6.ForceDHCPv6PDOtherInformation, config_parse_warn_compat, DISABLED_LEGACY, 0
DHCPv6PrefixDelegation.SubnetId, config_parse_dhcp_pd_subnet_id, 0, offsetof(Network, dhcp_pd_subnet_id)
DHCPv6PrefixDelegation.Announce, config_parse_bool, 0, offsetof(Network, dhcp_pd_announce)
@@ -619,6 +620,7 @@ DHCPv6PrefixDelegation.Token, config_parse_address_generation_typ
DHCPv6PrefixDelegation.RouteMetric, config_parse_uint32, 0, offsetof(Network, dhcp_pd_route_metric)
IPv6AcceptRA.DenyList, config_parse_in_addr_prefixes, AF_INET6, offsetof(Network, ndisc_deny_listed_prefix)
IPv6AcceptRA.BlackList, config_parse_in_addr_prefixes, AF_INET6, offsetof(Network, ndisc_deny_listed_prefix)
+IPv6AcceptRA.UseICMP6RateLimit, config_parse_warn_compat, DISABLED_LEGACY, 0
TrafficControlQueueingDiscipline.Parent, config_parse_qdisc_parent, _QDISC_KIND_INVALID, 0
TrafficControlQueueingDiscipline.NetworkEmulatorDelaySec, config_parse_network_emulator_delay, 0, 0
TrafficControlQueueingDiscipline.NetworkEmulatorDelayJitterSec, config_parse_network_emulator_delay, 0, 0
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 4101296275..3d418006d6 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -225,11 +225,8 @@ int network_verify(Network *network) {
network->ipv6ll_address_gen_mode < 0)
network->ipv6ll_address_gen_mode = IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY;
- /* IPMasquerade implies IPForward */
- network->ip_forward |= network->ip_masquerade;
-
network_adjust_ipv6_proxy_ndp(network);
- network_adjust_ipv6_accept_ra(network);
+ network_adjust_ndisc(network);
network_adjust_dhcp(network);
network_adjust_radv(network);
network_adjust_bridge_vlan(network);
@@ -465,6 +462,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
.link_local = _ADDRESS_FAMILY_INVALID,
.ipv6ll_address_gen_mode = _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID,
+ .ip_forwarding = { -1, -1, },
.ipv4_accept_local = -1,
.ipv4_route_localnet = -1,
.ipv6_privacy_extensions = _IPV6_PRIVACY_EXTENSIONS_INVALID,
@@ -474,23 +472,22 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
.proxy_arp_pvlan = -1,
.ipv4_rp_filter = _IP_REVERSE_PATH_FILTER_INVALID,
- .ipv6_accept_ra = -1,
- .ipv6_accept_ra_use_dns = true,
- .ipv6_accept_ra_use_gateway = true,
- .ipv6_accept_ra_use_captive_portal = true,
- .ipv6_accept_ra_use_route_prefix = true,
- .ipv6_accept_ra_use_autonomous_prefix = true,
- .ipv6_accept_ra_use_onlink_prefix = true,
- .ipv6_accept_ra_use_mtu = true,
- .ipv6_accept_ra_use_hop_limit = true,
- .ipv6_accept_ra_use_reachable_time = true,
- .ipv6_accept_ra_use_retransmission_time = true,
- .ipv6_accept_ra_use_icmp6_ratelimit = true,
- .ipv6_accept_ra_route_table = RT_TABLE_MAIN,
- .ipv6_accept_ra_route_metric_high = IPV6RA_ROUTE_METRIC_HIGH,
- .ipv6_accept_ra_route_metric_medium = IPV6RA_ROUTE_METRIC_MEDIUM,
- .ipv6_accept_ra_route_metric_low = IPV6RA_ROUTE_METRIC_LOW,
- .ipv6_accept_ra_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES,
+ .ndisc = -1,
+ .ndisc_use_dns = true,
+ .ndisc_use_gateway = true,
+ .ndisc_use_captive_portal = true,
+ .ndisc_use_route_prefix = true,
+ .ndisc_use_autonomous_prefix = true,
+ .ndisc_use_onlink_prefix = true,
+ .ndisc_use_mtu = true,
+ .ndisc_use_hop_limit = true,
+ .ndisc_use_reachable_time = true,
+ .ndisc_use_retransmission_time = true,
+ .ndisc_route_table = RT_TABLE_MAIN,
+ .ndisc_route_metric_high = IPV6RA_ROUTE_METRIC_HIGH,
+ .ndisc_route_metric_medium = IPV6RA_ROUTE_METRIC_MEDIUM,
+ .ndisc_route_metric_low = IPV6RA_ROUTE_METRIC_LOW,
+ .ndisc_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES,
.can_termination = -1,
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index e9ee556312..467789bd68 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -320,7 +320,7 @@ struct Network {
int ipoib_umcast;
/* sysctl settings */
- AddressFamily ip_forward;
+ int ip_forwarding[2];
int ipv4_accept_local;
int ipv4_route_localnet;
int ipv6_dad_transmits;
@@ -334,31 +334,30 @@ struct Network {
int ipv6_proxy_ndp;
Set *ipv6_proxy_ndp_addresses;
- /* IPv6 accept RA */
- int ipv6_accept_ra;
- bool ipv6_accept_ra_use_dns;
- bool ipv6_accept_ra_use_gateway;
- bool ipv6_accept_ra_use_route_prefix;
- bool ipv6_accept_ra_use_autonomous_prefix;
- bool ipv6_accept_ra_use_onlink_prefix;
- bool ipv6_accept_ra_use_mtu;
- bool ipv6_accept_ra_use_hop_limit;
- bool ipv6_accept_ra_use_reachable_time;
- bool ipv6_accept_ra_use_retransmission_time;
- bool ipv6_accept_ra_use_icmp6_ratelimit;
- bool ipv6_accept_ra_quickack;
- bool ipv6_accept_ra_use_captive_portal;
- bool ipv6_accept_ra_use_pref64;
+ /* NDisc support */
+ int ndisc;
+ bool ndisc_use_dns;
+ bool ndisc_use_gateway;
+ bool ndisc_use_route_prefix;
+ bool ndisc_use_autonomous_prefix;
+ bool ndisc_use_onlink_prefix;
+ bool ndisc_use_mtu;
+ bool ndisc_use_hop_limit;
+ bool ndisc_use_reachable_time;
+ bool ndisc_use_retransmission_time;
+ bool ndisc_quickack;
+ bool ndisc_use_captive_portal;
+ bool ndisc_use_pref64;
bool active_slave;
bool primary_slave;
- DHCPUseDomains ipv6_accept_ra_use_domains;
- IPv6AcceptRAStartDHCP6Client ipv6_accept_ra_start_dhcp6_client;
- uint32_t ipv6_accept_ra_route_table;
- bool ipv6_accept_ra_route_table_set;
- uint32_t ipv6_accept_ra_route_metric_high;
- uint32_t ipv6_accept_ra_route_metric_medium;
- uint32_t ipv6_accept_ra_route_metric_low;
- bool ipv6_accept_ra_route_metric_set;
+ DHCPUseDomains ndisc_use_domains;
+ IPv6AcceptRAStartDHCP6Client ndisc_start_dhcp6_client;
+ uint32_t ndisc_route_table;
+ bool ndisc_route_table_set;
+ uint32_t ndisc_route_metric_high;
+ uint32_t ndisc_route_metric_medium;
+ uint32_t ndisc_route_metric_low;
+ bool ndisc_route_metric_set;
Set *ndisc_deny_listed_router;
Set *ndisc_allow_listed_router;
Set *ndisc_deny_listed_prefix;
diff --git a/src/network/networkd-route-nexthop.c b/src/network/networkd-route-nexthop.c
index f7a2201b6b..8ba7505987 100644
--- a/src/network/networkd-route-nexthop.c
+++ b/src/network/networkd-route-nexthop.c
@@ -840,7 +840,7 @@ int route_section_verify_nexthops(Route *route) {
"Ignoring [Route] section from line %u.",
route->section->filename, route->section->line);
- if (route->nexthop.family == AF_INET6 && !route->network->ipv6_accept_ra)
+ if (route->nexthop.family == AF_INET6 && route->network->ndisc == 0)
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: Gateway=\"_ipv6ra\" is specified but IPv6AcceptRA= is disabled. "
"Ignoring [Route] section from line %u.",
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index ee12f1664a..3c5de98e7c 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -600,8 +600,8 @@ int route_remove(Route *route, Manager *manager) {
}
int route_remove_and_cancel(Route *route, Manager *manager) {
+ _cleanup_(request_unrefp) Request *req = NULL;
bool waiting = false;
- Request *req;
assert(route);
assert(manager);
@@ -612,6 +612,7 @@ int route_remove_and_cancel(Route *route, Manager *manager) {
/* Cancel the request for the route. If the request is already called but we have not received the
* notification about the request, then explicitly remove the route. */
if (route_get_request(manager, route, &req) >= 0) {
+ request_ref(req); /* avoid the request freed by request_detach() */
waiting = req->waiting_reply;
request_detach(req);
route_cancel_requesting(route);
diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c
index 859a28aa59..117db0af6c 100644
--- a/src/network/networkd-state-file.c
+++ b/src/network/networkd-state-file.c
@@ -123,7 +123,7 @@ static int link_put_dns(Link *link, OrderedSet **s) {
}
}
- if (link->network->ipv6_accept_ra_use_dns) {
+ if (link->network->ndisc_use_dns) {
NDiscRDNSS *a;
SET_FOREACH(a, link->ndisc_rdnss) {
@@ -254,7 +254,7 @@ static int link_put_domains(Link *link, bool is_route, OrderedSet **s) {
}
}
- if (link->network->ipv6_accept_ra_use_domains == use_domains) {
+ if (link->network->ndisc_use_domains == use_domains) {
NDiscDNSSL *a;
SET_FOREACH(a, link->ndisc_dnssl) {
@@ -559,7 +559,7 @@ static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, D
fputstrv(f, domains, NULL, &space);
}
- if (link->network->ipv6_accept_ra_use_domains == use_domains) {
+ if (link->network->ndisc_use_domains == use_domains) {
NDiscDNSSL *dd;
SET_FOREACH(dd, link->ndisc_dnssl)
@@ -583,8 +583,6 @@ static int link_save(Link *link) {
if (link->state == LINK_STATE_LINGER)
return 0;
- link_lldp_save(link);
-
admin_state = link_state_to_string(link->state);
assert(admin_state);
@@ -675,7 +673,7 @@ static int link_save(Link *link) {
sd_dhcp6_lease_get_dns,
NULL);
- if (link->network->ipv6_accept_ra_use_dns) {
+ if (link->network->ndisc_use_dns) {
NDiscRDNSS *dd;
SET_FOREACH(dd, link->ndisc_rdnss)
diff --git a/src/network/networkd-sysctl.c b/src/network/networkd-sysctl.c
index 8fa0ede5c2..f9db1f7f4a 100644
--- a/src/network/networkd-sysctl.c
+++ b/src/network/networkd-sysctl.c
@@ -4,6 +4,7 @@
#include <linux/if.h>
#include <linux/if_arp.h>
+#include "af-list.h"
#include "missing_network.h"
#include "networkd-link.h"
#include "networkd-manager.h"
@@ -13,6 +14,40 @@
#include "string-table.h"
#include "sysctl-util.h"
+static void manager_set_ip_forwarding(Manager *manager, int family) {
+ int r, t;
+
+ assert(manager);
+ assert(IN_SET(family, AF_INET, AF_INET6));
+
+ if (family == AF_INET6 && !socket_ipv6_is_supported())
+ return;
+
+ t = manager->ip_forwarding[family == AF_INET6];
+ if (t < 0)
+ return; /* keep */
+
+ /* First, set the default value. */
+ r = sysctl_write_ip_property_boolean(family, "default", "forwarding", t);
+ if (r < 0)
+ log_warning_errno(r, "Failed to %s the default %s forwarding: %m",
+ enable_disable(t), af_to_ipv4_ipv6(family));
+
+ /* Then, set the value to all interfaces. */
+ r = sysctl_write_ip_property_boolean(family, "all", "forwarding", t);
+ if (r < 0)
+ log_warning_errno(r, "Failed to %s %s forwarding for all interfaces: %m",
+ enable_disable(t), af_to_ipv4_ipv6(family));
+}
+
+void manager_set_sysctl(Manager *manager) {
+ assert(manager);
+ assert(!manager->test_mode);
+
+ manager_set_ip_forwarding(manager, AF_INET);
+ manager_set_ip_forwarding(manager, AF_INET6);
+}
+
static bool link_is_configured_for_family(Link *link, int family) {
assert(link);
@@ -70,48 +105,50 @@ static int link_set_proxy_arp_pvlan(Link *link) {
return sysctl_write_ip_property_boolean(AF_INET, link->ifname, "proxy_arp_pvlan", link->network->proxy_arp_pvlan > 0);
}
-static bool link_ip_forward_enabled(Link *link, int family) {
+int link_get_ip_forwarding(Link *link, int family) {
assert(link);
+ assert(link->manager);
+ assert(link->network);
assert(IN_SET(family, AF_INET, AF_INET6));
- if (!link_is_configured_for_family(link, family))
- return false;
-
- return link->network->ip_forward & (family == AF_INET ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_IPV6);
-}
+ /* If it is explicitly specified, then honor the setting. */
+ int t = link->network->ip_forwarding[family == AF_INET6];
+ if (t >= 0)
+ return t;
-static int link_set_ipv4_forward(Link *link) {
- assert(link);
-
- if (!link_ip_forward_enabled(link, AF_INET))
- return 0;
+ /* If IPMasquerade= is enabled, also enable IP forwarding. */
+ if (family == AF_INET && FLAGS_SET(link->network->ip_masquerade, ADDRESS_FAMILY_IPV4))
+ return true;
+ if (family == AF_INET6 && FLAGS_SET(link->network->ip_masquerade, ADDRESS_FAMILY_IPV6))
+ return true;
- /* We propagate the forwarding flag from one interface to the
- * global setting one way. This means: as long as at least one
- * interface was configured at any time that had IP forwarding
- * enabled the setting will stay on for good. We do this
- * primarily to keep IPv4 and IPv6 packet forwarding behaviour
- * somewhat in sync (see below). */
+ /* If IPv6SendRA= is enabled, also enable IPv6 forwarding. */
+ if (family == AF_INET6 && link_radv_enabled(link))
+ return true;
- return sysctl_write_ip_property(AF_INET, NULL, "ip_forward", "1");
+ /* Otherwise, use the global setting. */
+ return link->manager->ip_forwarding[family == AF_INET6];
}
-static int link_set_ipv6_forward(Link *link) {
+static int link_set_ip_forwarding(Link *link, int family) {
+ int r, t;
+
assert(link);
+ assert(IN_SET(family, AF_INET, AF_INET6));
- if (!link_ip_forward_enabled(link, AF_INET6))
+ if (!link_is_configured_for_family(link, family))
return 0;
- /* On Linux, the IPv6 stack does not know a per-interface
- * packet forwarding setting: either packet forwarding is on
- * for all, or off for all. We hence don't bother with a
- * per-interface setting, but simply propagate the interface
- * flag, if it is set, to the global flag, one-way. Note that
- * while IPv4 would allow a per-interface flag, we expose the
- * same behaviour there and also propagate the setting from
- * one to all, to keep things simple (see above). */
+ t = link_get_ip_forwarding(link, family);
+ if (t < 0)
+ return 0; /* keep */
- return sysctl_write_ip_property(AF_INET6, "all", "forwarding", "1");
+ r = sysctl_write_ip_property_boolean(family, link->ifname, "forwarding", t);
+ if (r < 0)
+ return log_link_warning_errno(link, r, "Failed to %s %s forwarding, ignoring: %m",
+ enable_disable(t), af_to_ipv4_ipv6(family));
+
+ return 0;
}
static int link_set_ipv4_rp_filter(Link *link) {
@@ -291,13 +328,8 @@ int link_set_sysctl(Link *link) {
if (r < 0)
log_link_warning_errno(link, r, "Cannot configure proxy ARP private VLAN for interface, ignoring: %m");
- r = link_set_ipv4_forward(link);
- if (r < 0)
- log_link_warning_errno(link, r, "Cannot turn on IPv4 packet forwarding, ignoring: %m");
-
- r = link_set_ipv6_forward(link);
- if (r < 0)
- log_link_warning_errno(link, r, "Cannot configure IPv6 packet forwarding, ignoring: %m");
+ (void) link_set_ip_forwarding(link, AF_INET);
+ (void) link_set_ip_forwarding(link, AF_INET6);
r = link_set_ipv6_privacy_extensions(link);
if (r < 0)
@@ -371,3 +403,24 @@ static const char* const ip_reverse_path_filter_table[_IP_REVERSE_PATH_FILTER_MA
DEFINE_STRING_TABLE_LOOKUP(ip_reverse_path_filter, IPReversePathFilter);
DEFINE_CONFIG_PARSE_ENUM(config_parse_ip_reverse_path_filter, ip_reverse_path_filter, IPReversePathFilter,
"Failed to parse IP reverse path filter option");
+
+int config_parse_ip_forward_deprecated(
+ const char* unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ assert(filename);
+
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "IPForward= setting is deprecated. "
+ "Please use IPv4Forwarding= and/or IPv6Forwarding= in networkd.conf for global setting, "
+ "and the same settings in .network files for per-interface setting.");
+ return 0;
+}
diff --git a/src/network/networkd-sysctl.h b/src/network/networkd-sysctl.h
index 064438462c..a47dda015d 100644
--- a/src/network/networkd-sysctl.h
+++ b/src/network/networkd-sysctl.h
@@ -6,6 +6,7 @@
#include "conf-parser.h"
typedef struct Link Link;
+typedef struct Manager Manager;
typedef enum IPv6PrivacyExtensions {
/* These values map to the kernel's /proc/sys/net/ipv6/conf/xxx/use_tempaddr values. Do not reorder! */
@@ -26,6 +27,9 @@ typedef enum IPReversePathFilter {
_IP_REVERSE_PATH_FILTER_INVALID = -EINVAL,
} IPReversePathFilter;
+void manager_set_sysctl(Manager *manager);
+
+int link_get_ip_forwarding(Link *link, int family);
int link_set_sysctl(Link *link);
int link_set_ipv6_mtu(Link *link);
@@ -37,3 +41,4 @@ IPReversePathFilter ip_reverse_path_filter_from_string(const char *s) _pure_;
CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_privacy_extensions);
CONFIG_PARSER_PROTOTYPE(config_parse_ip_reverse_path_filter);
+CONFIG_PARSER_PROTOTYPE(config_parse_ip_forward_deprecated);
diff --git a/src/network/networkd-util.c b/src/network/networkd-util.c
index 33352ba772..46f9008879 100644
--- a/src/network/networkd-util.c
+++ b/src/network/networkd-util.c
@@ -116,48 +116,6 @@ DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_deprecated_address_family, AddressFa
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(ip_masquerade_address_family, AddressFamily);
DEFINE_STRING_TABLE_LOOKUP(dhcp_lease_server_type, sd_dhcp_lease_server_type_t);
-int config_parse_address_family_with_kernel(
- const char* unit,
- const char *filename,
- unsigned line,
- const char *section,
- unsigned section_line,
- const char *lvalue,
- int ltype,
- const char *rvalue,
- void *data,
- void *userdata) {
-
- AddressFamily *fwd = data, s;
-
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
-
- /* This function is mostly obsolete now. It simply redirects
- * "kernel" to "no". In older networkd versions we used to
- * distinguish IPForward=off from IPForward=kernel, where the
- * former would explicitly turn off forwarding while the
- * latter would simply not touch the setting. But that logic
- * is gone, hence silently accept the old setting, but turn it
- * to "no". */
-
- s = address_family_from_string(rvalue);
- if (s < 0) {
- if (streq(rvalue, "kernel"))
- s = ADDRESS_FAMILY_NO;
- else {
- log_syntax(unit, LOG_WARNING, filename, line, 0, "Failed to parse IPForward= option, ignoring: %s", rvalue);
- return 0;
- }
- }
-
- *fwd = s;
-
- return 0;
-}
-
int config_parse_ip_masquerade(
const char *unit,
const char *filename,
diff --git a/src/network/networkd-util.h b/src/network/networkd-util.h
index 9c360f5526..c3b4586cae 100644
--- a/src/network/networkd-util.h
+++ b/src/network/networkd-util.h
@@ -52,7 +52,6 @@ static inline uint32_t usec_to_sec(usec_t usec, usec_t now_usec) {
}
CONFIG_PARSER_PROTOTYPE(config_parse_link_local_address_family);
-CONFIG_PARSER_PROTOTYPE(config_parse_address_family_with_kernel);
CONFIG_PARSER_PROTOTYPE(config_parse_ip_masquerade);
CONFIG_PARSER_PROTOTYPE(config_parse_mud_url);
diff --git a/src/network/networkd.c b/src/network/networkd.c
index 46c2c74346..69a28647c8 100644
--- a/src/network/networkd.c
+++ b/src/network/networkd.c
@@ -18,6 +18,7 @@
#include "networkd-manager.h"
#include "service-util.h"
#include "signal-util.h"
+#include "strv.h"
#include "user-util.h"
static int run(int argc, char *argv[]) {
@@ -69,17 +70,13 @@ static int run(int argc, char *argv[]) {
/* Always create the directories people can create inotify watches in.
* It is necessary to create the following subdirectories after drop_privileges()
* to support old kernels not supporting AmbientCapabilities=. */
- r = mkdir_safe_label("/run/systemd/netif/links", 0755, UID_INVALID, GID_INVALID, MKDIR_WARN_MODE);
- if (r < 0)
- log_warning_errno(r, "Could not create runtime directory 'links': %m");
-
- r = mkdir_safe_label("/run/systemd/netif/leases", 0755, UID_INVALID, GID_INVALID, MKDIR_WARN_MODE);
- if (r < 0)
- log_warning_errno(r, "Could not create runtime directory 'leases': %m");
-
- r = mkdir_safe_label("/run/systemd/netif/lldp", 0755, UID_INVALID, GID_INVALID, MKDIR_WARN_MODE);
- if (r < 0)
- log_warning_errno(r, "Could not create runtime directory 'lldp': %m");
+ FOREACH_STRING(p,
+ "/run/systemd/netif/links/",
+ "/run/systemd/netif/leases/") {
+ r = mkdir_safe_label(p, 0755, UID_INVALID, GID_INVALID, MKDIR_WARN_MODE);
+ if (r < 0)
+ log_warning_errno(r, "Could not create directory '%s': %m", p);
+ }
r = manager_new(&m, /* test_mode = */ false);
if (r < 0)
diff --git a/src/network/wait-online/wait-online.c b/src/network/wait-online/wait-online.c
index 544c360edd..4f8270ddfa 100644
--- a/src/network/wait-online/wait-online.c
+++ b/src/network/wait-online/wait-online.c
@@ -204,7 +204,7 @@ static int run(int argc, char *argv[]) {
if (arg_quiet)
log_set_max_level(LOG_ERR);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0);
r = manager_new(&m, arg_interfaces, arg_ignore, arg_required_operstate, arg_required_family, arg_any, arg_timeout);
if (r < 0)
diff --git a/src/nspawn/nspawn-mount.c b/src/nspawn/nspawn-mount.c
index 71efeb8572..e94ffd799e 100644
--- a/src/nspawn/nspawn-mount.c
+++ b/src/nspawn/nspawn-mount.c
@@ -245,7 +245,7 @@ int bind_mount_parse(CustomMount **l, size_t *n, const char *s, bool read_only)
assert(l);
assert(n);
- r = extract_many_words(&s, ":", EXTRACT_DONT_COALESCE_SEPARATORS, &source, &destination, NULL);
+ r = extract_many_words(&s, ":", EXTRACT_DONT_COALESCE_SEPARATORS, &source, &destination);
if (r < 0)
return r;
if (r == 0)
diff --git a/src/nspawn/nspawn-register.c b/src/nspawn/nspawn-register.c
index 27400aa4a2..358958b82b 100644
--- a/src/nspawn/nspawn-register.c
+++ b/src/nspawn/nspawn-register.c
@@ -305,7 +305,7 @@ int allocate_scope(
r = bus_append_scope_pidref(m, &pidref);
} else
- r = sd_bus_message_append(m, "(sv)", "PIDs", "au", 1, pid);
+ r = sd_bus_message_append(m, "(sv)", "PIDs", "au", 1, (uint32_t) pid);
if (r < 0)
return bus_log_create_error(r);
@@ -368,7 +368,11 @@ int allocate_scope(
if (r < 0)
return bus_log_parse_error(r);
- r = bus_wait_for_jobs_one(w, object, BUS_WAIT_JOBS_LOG_ERROR, NULL);
+ r = bus_wait_for_jobs_one(
+ w,
+ object,
+ BUS_WAIT_JOBS_LOG_ERROR,
+ /* extra_args= */ NULL);
if (r < 0)
return r;
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 49b57c5168..c415d3cec1 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -3712,6 +3712,14 @@ static int setup_unix_export_host_inside(const char *directory, const char *unix
return 0;
}
+static DissectImageFlags determine_dissect_image_flags(void) {
+ return
+ DISSECT_IMAGE_USR_NO_ROOT |
+ DISSECT_IMAGE_DISCARD_ON_LOOP |
+ (arg_read_only ? DISSECT_IMAGE_READ_ONLY : DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS) |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
+}
+
static int outer_child(
Barrier *barrier,
const char *directory,
@@ -3773,10 +3781,8 @@ static int outer_child(
arg_uid_shift,
arg_uid_range,
/* userns_fd= */ -EBADF,
+ determine_dissect_image_flags()|
DISSECT_IMAGE_MOUNT_ROOT_ONLY|
- DISSECT_IMAGE_DISCARD_ON_LOOP|
- DISSECT_IMAGE_USR_NO_ROOT|
- (arg_read_only ? DISSECT_IMAGE_READ_ONLY : DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS)|
(arg_start_mode == START_BOOT ? DISSECT_IMAGE_VALIDATE_OS : 0));
if (r < 0)
return r;
@@ -3958,10 +3964,8 @@ static int outer_child(
arg_uid_shift,
arg_uid_range,
/* userns_fd= */ -EBADF,
+ determine_dissect_image_flags()|
DISSECT_IMAGE_MOUNT_NON_ROOT_ONLY|
- DISSECT_IMAGE_DISCARD_ON_LOOP|
- DISSECT_IMAGE_USR_NO_ROOT|
- (arg_read_only ? DISSECT_IMAGE_READ_ONLY : DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS)|
(idmap ? DISSECT_IMAGE_MOUNT_IDMAPPED : 0));
if (r == -EUCLEAN)
return log_error_errno(r, "File system check for image failed: %m");
@@ -4443,6 +4447,9 @@ static void set_window_title(PTYForward *f) {
(void) pty_forward_set_titlef(f, "%sContainer %s on %s", strempty(dot), arg_machine, hn);
else
(void) pty_forward_set_titlef(f, "%sContainer %s", strempty(dot), arg_machine);
+
+ if (dot)
+ (void) pty_forward_set_title_prefix(f, dot);
}
static int merge_settings(Settings *settings, const char *path) {
@@ -5988,13 +5995,15 @@ static int run(int argc, char *argv[]) {
_cleanup_free_ char *u = NULL;
(void) terminal_urlify_path(t, t, &u);
- log_info("%s %sSpawning container %s on %s.%s\n"
- "%s %sPress %sCtrl-]%s three times within 1s to kill container.%s",
- special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), arg_machine, u ?: t, ansi_normal(),
- special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), ansi_highlight(), ansi_grey(), ansi_normal());
+ log_info("%s %sSpawning container %s on %s.%s",
+ special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), arg_machine, u ?: t, ansi_normal());
+
+ if (arg_console_mode == CONSOLE_INTERACTIVE)
+ log_info("%s %sPress %sCtrl-]%s three times within 1s to kill container.%s",
+ special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), ansi_highlight(), ansi_grey(), ansi_normal());
}
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, SIGRTMIN+18) >= 0);
r = make_reaper_process(true);
if (r < 0) {
diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c
index ce8c064004..3cefb6394c 100644
--- a/src/nss-resolve/nss-resolve.c
+++ b/src/nss-resolve/nss-resolve.c
@@ -202,9 +202,10 @@ static uint64_t query_flag(
const char *name,
const int value,
uint64_t flag) {
+
int r;
- r = getenv_bool_secure(name);
+ r = secure_getenv_bool(name);
if (r >= 0)
return r == value ? flag : 0;
if (r != -ENXIO)
diff --git a/src/nss-systemd/nss-systemd.c b/src/nss-systemd/nss-systemd.c
index 1d6e25399f..8e8d4cf1cb 100644
--- a/src/nss-systemd/nss-systemd.c
+++ b/src/nss-systemd/nss-systemd.c
@@ -306,7 +306,7 @@ enum nss_status _nss_systemd_getpwnam_r(
return NSS_STATUS_NOTFOUND;
/* Synthesize entries for the root and nobody users, in case they are missing in /etc/passwd */
- if (getenv_bool_secure("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
+ if (secure_getenv_bool("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
if (streq(name, root_passwd.pw_name))
return copy_synthesized_passwd(pwd, &root_passwd,
@@ -354,7 +354,7 @@ enum nss_status _nss_systemd_getpwuid_r(
return NSS_STATUS_NOTFOUND;
/* Synthesize data for the root user and for nobody in case they are missing from /etc/passwd */
- if (getenv_bool_secure("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
+ if (secure_getenv_bool("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
if (uid == root_passwd.pw_uid)
return copy_synthesized_passwd(pwd, &root_passwd,
@@ -403,7 +403,7 @@ enum nss_status _nss_systemd_getspnam_r(
return NSS_STATUS_NOTFOUND;
/* Synthesize entries for the root and nobody users, in case they are missing in /etc/passwd */
- if (getenv_bool_secure("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
+ if (secure_getenv_bool("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
if (streq(name, root_spwd.sp_namp))
return copy_synthesized_spwd(spwd, &root_spwd, buffer, buflen, errnop);
@@ -450,7 +450,7 @@ enum nss_status _nss_systemd_getgrnam_r(
return NSS_STATUS_NOTFOUND;
/* Synthesize records for root and nobody, in case they are missing from /etc/group */
- if (getenv_bool_secure("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
+ if (secure_getenv_bool("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
if (streq(name, root_group.gr_name))
return copy_synthesized_group(gr, &root_group, buffer, buflen, errnop);
@@ -494,7 +494,7 @@ enum nss_status _nss_systemd_getgrgid_r(
return NSS_STATUS_NOTFOUND;
/* Synthesize records for root and nobody, in case they are missing from /etc/group */
- if (getenv_bool_secure("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
+ if (secure_getenv_bool("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
if (gid == root_group.gr_gid)
return copy_synthesized_group(gr, &root_group, buffer, buflen, errnop);
@@ -539,7 +539,7 @@ enum nss_status _nss_systemd_getsgnam_r(
return NSS_STATUS_NOTFOUND;
/* Synthesize records for root and nobody, in case they are missing from /etc/group */
- if (getenv_bool_secure("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
+ if (secure_getenv_bool("SYSTEMD_NSS_BYPASS_SYNTHETIC") <= 0) {
if (streq(name, root_sgrp.sg_namp))
return copy_synthesized_sgrp(sgrp, &root_sgrp, buffer, buflen, errnop);
diff --git a/src/nss-systemd/userdb-glue.c b/src/nss-systemd/userdb-glue.c
index c69667d660..b02d89a20b 100644
--- a/src/nss-systemd/userdb-glue.c
+++ b/src/nss-systemd/userdb-glue.c
@@ -14,7 +14,7 @@ UserDBFlags nss_glue_userdb_flags(void) {
UserDBFlags flags = USERDB_EXCLUDE_NSS;
/* Make sure that we don't go in circles when allocating a dynamic UID by checking our own database */
- if (getenv_bool_secure("SYSTEMD_NSS_DYNAMIC_BYPASS") > 0)
+ if (secure_getenv_bool("SYSTEMD_NSS_DYNAMIC_BYPASS") > 0)
flags |= USERDB_EXCLUDE_DYNAMIC_USER;
return flags;
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
index 4f8c12bd54..0d8031052e 100644
--- a/src/oom/oomd.c
+++ b/src/oom/oomd.c
@@ -167,7 +167,7 @@ static int run(int argc, char *argv[]) {
if (!FLAGS_SET(mask, CGROUP_MASK_MEMORY))
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Requires the cgroup memory controller.");
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0);
if (arg_mem_pressure_usec > 0 && arg_mem_pressure_usec < 1 * USEC_PER_SEC)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "DefaultMemoryPressureDurationSec= must be 0 or at least 1s");
diff --git a/src/partition/repart.c b/src/partition/repart.c
index 44a785a7ed..adf1f0e696 100644
--- a/src/partition/repart.c
+++ b/src/partition/repart.c
@@ -146,6 +146,8 @@ static bool arg_legend = true;
static void *arg_key = NULL;
static size_t arg_key_size = 0;
static EVP_PKEY *arg_private_key = NULL;
+static KeySourceType arg_private_key_source_type = OPENSSL_KEY_SOURCE_FILE;
+static char *arg_private_key_source = NULL;
static X509 *arg_certificate = NULL;
static char *arg_tpm2_device = NULL;
static uint32_t arg_tpm2_seal_key_handle = 0;
@@ -177,6 +179,7 @@ STATIC_DESTRUCTOR_REGISTER(arg_image, freep);
STATIC_DESTRUCTOR_REGISTER(arg_definitions, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_key, erase_and_freep);
STATIC_DESTRUCTOR_REGISTER(arg_private_key, EVP_PKEY_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_private_key_source, freep);
STATIC_DESTRUCTOR_REGISTER(arg_certificate, X509_freep);
STATIC_DESTRUCTOR_REGISTER(arg_tpm2_device, freep);
STATIC_DESTRUCTOR_REGISTER(arg_tpm2_device_key, freep);
@@ -1755,7 +1758,7 @@ static int config_parse_mountpoint(
const char *q = rvalue;
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_DONT_COALESCE_SEPARATORS|EXTRACT_UNQUOTE,
- &where, &options, NULL);
+ &where, &options);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
@@ -1812,7 +1815,7 @@ static int config_parse_encrypted_volume(
const char *q = rvalue;
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_DONT_COALESCE_SEPARATORS|EXTRACT_UNQUOTE,
- &volume, &keyfile, &options, NULL);
+ &volume, &keyfile, &options);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
@@ -6806,8 +6809,14 @@ static int help(void) {
" Specify disk image dissection policy\n"
" --definitions=DIR Find partition definitions in specified directory\n"
" --key-file=PATH Key to use when encrypting partitions\n"
- " --private-key=PATH Private key to use when generating verity roothash\n"
- " signatures\n"
+ " --private-key=PATH|URI\n"
+ " Private key to use when generating verity roothash\n"
+ " signatures, or an engine or provider specific\n"
+ " designation if --private-key-source= is used.\n"
+ " --private-key-source=file|provider:PROVIDER|engine:ENGINE\n"
+ " Specify how to use the --private-key=. Allows to use\n"
+ " an OpenSSL engine/provider when generating verity\n"
+ " roothash signatures\n"
" --certificate=PATH PEM certificate to use when generating verity\n"
" roothash signatures\n"
" --tpm2-device=PATH Path to TPM2 device node to use\n"
@@ -6857,7 +6866,7 @@ static int help(void) {
}
static int parse_argv(int argc, char *argv[]) {
- _cleanup_free_ char *private_key = NULL, *private_key_uri = NULL;
+ _cleanup_free_ char *private_key = NULL;
enum {
ARG_VERSION = 0x100,
@@ -6878,7 +6887,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_JSON,
ARG_KEY_FILE,
ARG_PRIVATE_KEY,
- ARG_PRIVATE_KEY_URI,
+ ARG_PRIVATE_KEY_SOURCE,
ARG_CERTIFICATE,
ARG_TPM2_DEVICE,
ARG_TPM2_DEVICE_KEY,
@@ -6921,7 +6930,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "json", required_argument, NULL, ARG_JSON },
{ "key-file", required_argument, NULL, ARG_KEY_FILE },
{ "private-key", required_argument, NULL, ARG_PRIVATE_KEY },
- { "private-key-uri", required_argument, NULL, ARG_PRIVATE_KEY_URI },
+ { "private-key-source", required_argument, NULL, ARG_PRIVATE_KEY_SOURCE },
{ "certificate", required_argument, NULL, ARG_CERTIFICATE },
{ "tpm2-device", required_argument, NULL, ARG_TPM2_DEVICE },
{ "tpm2-device-key", required_argument, NULL, ARG_TPM2_DEVICE_KEY },
@@ -7115,12 +7124,14 @@ static int parse_argv(int argc, char *argv[]) {
break;
}
- case ARG_PRIVATE_KEY_URI: {
- r = free_and_strdup_warn(&private_key_uri, optarg);
+ case ARG_PRIVATE_KEY_SOURCE:
+ r = parse_openssl_key_source_argument(
+ optarg,
+ &arg_private_key_source,
+ &arg_private_key_source_type);
if (r < 0)
return r;
break;
- }
case ARG_CERTIFICATE: {
_cleanup_free_ char *cert = NULL;
@@ -7465,12 +7476,7 @@ static int parse_argv(int argc, char *argv[]) {
*p = gpt_partition_type_override_architecture(*p, arg_architecture);
}
- if (private_key && private_key_uri)
- return log_error_errno(
- SYNTHETIC_ERRNO(EINVAL),
- "Cannot specify both --private-key= and --private-key-uri=.");
-
- if (private_key) {
+ if (private_key && arg_private_key_source_type == OPENSSL_KEY_SOURCE_FILE) {
_cleanup_(erase_and_freep) char *k = NULL;
size_t n = 0;
@@ -7485,16 +7491,22 @@ static int parse_argv(int argc, char *argv[]) {
r = parse_private_key(k, n, &arg_private_key);
if (r < 0)
return r;
- } else if (private_key_uri) {
+ } else if (private_key &&
+ IN_SET(arg_private_key_source_type, OPENSSL_KEY_SOURCE_ENGINE, OPENSSL_KEY_SOURCE_PROVIDER)) {
/* This must happen after parse_x509_certificate() is called above, otherwise
* signing later will get stuck as the parsed private key won't have the
* certificate, so this block cannot be inline in ARG_PRIVATE_KEY. */
- r = openssl_load_key_from_token(private_key_uri, &arg_private_key);
+ r = openssl_load_key_from_token(
+ arg_private_key_source_type,
+ arg_private_key_source,
+ private_key,
+ &arg_private_key);
if (r < 0)
return log_error_errno(
r,
- "Failed to load key '%s' from OpenSSL provider: %m",
- private_key);
+ "Failed to load key '%s' from OpenSSL private key source %s: %m",
+ private_key,
+ arg_private_key_source);
}
return 1;
@@ -7952,7 +7964,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_GPT_ONLY |
DISSECT_IMAGE_RELAX_VAR_CHECK |
DISSECT_IMAGE_USR_NO_ROOT |
- DISSECT_IMAGE_REQUIRE_ROOT,
+ DISSECT_IMAGE_REQUIRE_ROOT |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/pcrlock/pcrlock.c b/src/pcrlock/pcrlock.c
index e70c44c675..1fb9d692a2 100644
--- a/src/pcrlock/pcrlock.c
+++ b/src/pcrlock/pcrlock.c
@@ -936,23 +936,30 @@ static int event_log_load_firmware(EventLog *el) {
assert(event->digests.count == n_algorithms);
for (size_t i = 0; i < n_algorithms; i++, ha = ha_next) {
- ha_next = (const uint8_t*) ha + offsetof(TPMT_HA, digest) + algorithms[i].digestSize;
-
/* The TPMT_HA is not aligned in the record, hence read the hashAlg field via an unaligned read */
assert_cc(__builtin_types_compatible_p(uint16_t, typeof(TPMI_ALG_HASH)));
uint16_t hash_alg = unaligned_read_ne16((const uint8_t*) ha + offsetof(TPMT_HA, hashAlg));
- if (hash_alg != algorithms[i].algorithmId)
- return log_error_errno(SYNTHETIC_ERRNO(EBADMSG), "Hash algorithms in event log record don't match log.");
+ /* On some systems (some HyperV?) the order of hash algorithms announced in the
+ * header does not match the order in the records. Let's hence search for the right
+ * mapping */
+ size_t j;
+ for (j = 0; j < n_algorithms; j++)
+ if (hash_alg == algorithms[j].algorithmId)
+ break;
+ if (j >= n_algorithms)
+ return log_error_errno(SYNTHETIC_ERRNO(EBADMSG), "Hash algorithms in event log record not among those advertised by log header.");
+
+ ha_next = (const uint8_t*) ha + offsetof(TPMT_HA, digest) + algorithms[j].digestSize;
- if (!tpm2_hash_alg_to_string(algorithms[i].algorithmId))
+ if (!tpm2_hash_alg_to_string(hash_alg))
continue;
r = event_log_record_add_bank(
record,
- algorithms[i].algorithmId,
+ hash_alg,
(const uint8_t*) ha + offsetof(TPMT_HA, digest),
- algorithms[i].digestSize,
+ algorithms[j].digestSize,
/* ret= */ NULL);
if (r < 0)
return log_error_errno(r, "Failed to add bank to event log record: %m");
diff --git a/src/portable/portable.c b/src/portable/portable.c
index 27c18b117f..a003ea0352 100644
--- a/src/portable/portable.c
+++ b/src/portable/portable.c
@@ -182,7 +182,7 @@ static int extract_now(
_cleanup_hashmap_free_ Hashmap *unit_files = NULL;
_cleanup_(portable_metadata_unrefp) PortableMetadata *os_release = NULL;
- _cleanup_(lookup_paths_free) LookupPaths paths = {};
+ _cleanup_(lookup_paths_done) LookupPaths paths = {};
_cleanup_close_ int os_release_fd = -EBADF;
_cleanup_free_ char *os_release_path = NULL;
const char *os_release_id;
@@ -362,7 +362,13 @@ static int portable_extract_by_path(
assert(path);
- r = loop_device_make_by_path(path, O_RDONLY, /* sector_size= */ UINT32_MAX, LO_FLAGS_PARTSCAN, LOCK_SH, &d);
+ r = loop_device_make_by_path(
+ path,
+ O_RDONLY,
+ /* sector_size= */ UINT32_MAX,
+ LO_FLAGS_PARTSCAN,
+ LOCK_SH,
+ &d);
if (r == -EISDIR) {
_cleanup_free_ char *image_name = NULL;
@@ -384,6 +390,21 @@ static int portable_extract_by_path(
_cleanup_(rmdir_and_freep) char *tmpdir = NULL;
_cleanup_close_pair_ int seq[2] = EBADF_PAIR;
_cleanup_(sigkill_waitp) pid_t child = 0;
+ DissectImageFlags flags =
+ DISSECT_IMAGE_READ_ONLY |
+ DISSECT_IMAGE_GENERIC_ROOT |
+ DISSECT_IMAGE_REQUIRE_ROOT |
+ DISSECT_IMAGE_DISCARD_ON_LOOP |
+ DISSECT_IMAGE_RELAX_VAR_CHECK |
+ DISSECT_IMAGE_USR_NO_ROOT |
+ DISSECT_IMAGE_ADD_PARTITION_DEVICES |
+ DISSECT_IMAGE_PIN_PARTITION_DEVICES |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
+
+ if (path_is_extension)
+ flags |= DISSECT_IMAGE_VALIDATE_OS_EXT | (relax_extension_release_check ? DISSECT_IMAGE_RELAX_EXTENSION_CHECK : 0);
+ else
+ flags |= DISSECT_IMAGE_VALIDATE_OS;
/* We now have a loopback block device, let's fork off a child in its own mount namespace, mount it
* there, and extract the metadata we need. The metadata is sent from the child back to us. */
@@ -399,14 +420,7 @@ static int portable_extract_by_path(
/* verity= */ NULL,
/* mount_options= */ NULL,
image_policy,
- DISSECT_IMAGE_READ_ONLY |
- DISSECT_IMAGE_GENERIC_ROOT |
- DISSECT_IMAGE_REQUIRE_ROOT |
- DISSECT_IMAGE_DISCARD_ON_LOOP |
- DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_USR_NO_ROOT |
- DISSECT_IMAGE_ADD_PARTITION_DEVICES |
- DISSECT_IMAGE_PIN_PARTITION_DEVICES,
+ flags,
&m);
if (r == -ENOPKG)
sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Couldn't identify a suitable partition table or file system in '%s'.", path);
@@ -428,15 +442,8 @@ static int portable_extract_by_path(
if (r < 0)
return r;
if (r == 0) {
- DissectImageFlags flags = DISSECT_IMAGE_READ_ONLY;
-
seq[0] = safe_close(seq[0]);
- if (path_is_extension)
- flags |= DISSECT_IMAGE_VALIDATE_OS_EXT | (relax_extension_release_check ? DISSECT_IMAGE_RELAX_EXTENSION_CHECK : 0);
- else
- flags |= DISSECT_IMAGE_VALIDATE_OS;
-
r = dissected_image_mount(
m,
tmpdir,
@@ -1549,7 +1556,7 @@ int portable_attach(
_cleanup_ordered_hashmap_free_ OrderedHashmap *extension_images = NULL, *extension_releases = NULL;
_cleanup_(portable_metadata_unrefp) PortableMetadata *os_release = NULL;
_cleanup_hashmap_free_ Hashmap *unit_files = NULL;
- _cleanup_(lookup_paths_free) LookupPaths paths = {};
+ _cleanup_(lookup_paths_done) LookupPaths paths = {};
_cleanup_strv_free_ char **valid_prefixes = NULL;
_cleanup_(image_unrefp) Image *image = NULL;
PortableMetadata *item;
@@ -1810,7 +1817,7 @@ int portable_detach(
size_t *n_changes,
sd_bus_error *error) {
- _cleanup_(lookup_paths_free) LookupPaths paths = {};
+ _cleanup_(lookup_paths_done) LookupPaths paths = {};
_cleanup_set_free_ Set *unit_files = NULL, *markers = NULL;
_cleanup_free_ char *extensions = NULL;
_cleanup_closedir_ DIR *d = NULL;
@@ -1995,7 +2002,7 @@ static int portable_get_state_internal(
PortableState *ret,
sd_bus_error *error) {
- _cleanup_(lookup_paths_free) LookupPaths paths = {};
+ _cleanup_(lookup_paths_done) LookupPaths paths = {};
bool found_enabled = false, found_running = false;
_cleanup_set_free_ Set *unit_files = NULL;
_cleanup_closedir_ DIR *d = NULL;
diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c
index 1867fc8a1d..db5e4febe0 100644
--- a/src/portable/portablectl.c
+++ b/src/portable/portablectl.c
@@ -1171,7 +1171,7 @@ static int is_image_attached(int argc, char *argv[], void *userdata) {
return r;
if (!strv_isempty(arg_extension_images)) {
- r = sd_bus_message_append(m, "t", 0);
+ r = sd_bus_message_append(m, "t", UINT64_C(0));
if (r < 0)
return bus_log_create_error(r);
}
diff --git a/src/portable/portabled.c b/src/portable/portabled.c
index d4a01fa53b..d46ac018a3 100644
--- a/src/portable/portabled.c
+++ b/src/portable/portabled.c
@@ -141,7 +141,7 @@ static int run(int argc, char *argv[]) {
if (argc != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments.");
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, SIGRTMIN+18) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/pstore/meson.build b/src/pstore/meson.build
index b6fda8723d..27c2855fb8 100644
--- a/src/pstore/meson.build
+++ b/src/pstore/meson.build
@@ -7,9 +7,9 @@ executables += [
'sources' : files('pstore.c'),
'dependencies' : [
libacl,
- liblz4,
- libxz,
- libzstd,
+ liblz4_cflags,
+ libxz_cflags,
+ libzstd_cflags,
threads,
],
},
diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c
index 580913b94e..f2e9e7a96b 100644
--- a/src/resolve/resolvectl.c
+++ b/src/resolve/resolvectl.c
@@ -454,6 +454,9 @@ static int output_rr_packet(const void *d, size_t l, int ifindex) {
if (r < 0)
return log_error_errno(r, "Failed to convert RR to JSON: %m");
+ if (!j)
+ return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "JSON formatting for records of type %s (%u) not available.", dns_type_to_string(rr->key->type), rr->key->type);
+
r = json_variant_dump(j, arg_json_format_flags, NULL, NULL);
if (r < 0)
return r;
@@ -3339,6 +3342,7 @@ static int native_help(void) {
" --synthesize=BOOL Allow synthetic response (default: yes)\n"
" --cache=BOOL Allow response from cache (default: yes)\n"
" --stale-data=BOOL Allow response from cache with stale data (default: yes)\n"
+ " --relax-single-label=BOOL Allow single label lookups to go upstream (default: no)\n"
" --zone=BOOL Allow response from locally registered mDNS/LLMNR\n"
" records (default: yes)\n"
" --trust-anchor=BOOL Allow response from local trust anchor (default:\n"
@@ -3698,7 +3702,8 @@ static int native_parse_argv(int argc, char *argv[]) {
ARG_SEARCH,
ARG_NO_PAGER,
ARG_JSON,
- ARG_STALE_DATA
+ ARG_STALE_DATA,
+ ARG_RELAX_SINGLE_LABEL,
};
static const struct option options[] = {
@@ -3723,6 +3728,7 @@ static int native_parse_argv(int argc, char *argv[]) {
{ "no-pager", no_argument, NULL, ARG_NO_PAGER },
{ "json", required_argument, NULL, ARG_JSON },
{ "stale-data", required_argument, NULL, ARG_STALE_DATA },
+ { "relax-single-label", required_argument, NULL, ARG_RELAX_SINGLE_LABEL },
{}
};
@@ -3909,6 +3915,13 @@ static int native_parse_argv(int argc, char *argv[]) {
SET_FLAG(arg_flags, SD_RESOLVED_NO_SEARCH, r == 0);
break;
+ case ARG_RELAX_SINGLE_LABEL:
+ r = parse_boolean_argument("--relax-single-label=", optarg, NULL);
+ if (r < 0)
+ return r;
+ SET_FLAG(arg_flags, SD_RESOLVED_RELAX_SINGLE_LABEL, r > 0);
+ break;
+
case ARG_NO_PAGER:
arg_pager_flags |= PAGER_DISABLE;
break;
diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c
index d9d967ec40..be2fdca21f 100644
--- a/src/resolve/resolved-bus.c
+++ b/src/resolve/resolved-bus.c
@@ -13,6 +13,7 @@
#include "missing_capability.h"
#include "resolved-bus.h"
#include "resolved-def.h"
+#include "resolved-dns-stream.h"
#include "resolved-dns-synthesize.h"
#include "resolved-dnssd-bus.h"
#include "resolved-dnssd.h"
@@ -372,6 +373,7 @@ static int validate_and_mangle_flags(
SD_RESOLVED_NO_TRUST_ANCHOR|
SD_RESOLVED_NO_NETWORK|
SD_RESOLVED_NO_STALE|
+ SD_RESOLVED_RELAX_SINGLE_LABEL|
ok))
return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid flags parameter");
@@ -1843,6 +1845,7 @@ static int bus_method_reset_server_features(sd_bus_message *message, void *userd
bus_client_log(message, "server feature reset");
+ (void) dns_stream_disconnect_all(m);
manager_reset_server_features(m);
return sd_bus_reply_method_return(message, NULL);
@@ -2231,9 +2234,15 @@ static int match_prepare_for_sleep(sd_bus_message *message, void *userdata, sd_b
if (b)
return 0;
- log_debug("Coming back from suspend, verifying all RRs...");
+ log_debug("Coming back from suspend, closing all TCP connections...");
+ (void) dns_stream_disconnect_all(m);
+
+ log_debug("Coming back from suspend, resetting all probed server features...");
+ manager_reset_server_features(m);
+ log_debug("Coming back from suspend, verifying all RRs...");
manager_verify_all(m);
+
return 0;
}
diff --git a/src/resolve/resolved-def.h b/src/resolve/resolved-def.h
index b7a44f9571..f702a0a0ea 100644
--- a/src/resolve/resolved-def.h
+++ b/src/resolve/resolved-def.h
@@ -73,6 +73,10 @@
/* Input: Don't answer request with stale data */
#define SD_RESOLVED_NO_STALE (UINT64_C(1) << 24)
+/* Input: Allow single-label lookups to Internet DNS servers */
+#define SD_RESOLVED_RELAX_SINGLE_LABEL \
+ (UINT64_C(1) << 25)
+
#define SD_RESOLVED_LLMNR (SD_RESOLVED_LLMNR_IPV4|SD_RESOLVED_LLMNR_IPV6)
#define SD_RESOLVED_MDNS (SD_RESOLVED_MDNS_IPV4|SD_RESOLVED_MDNS_IPV6)
#define SD_RESOLVED_PROTOCOLS_ALL (SD_RESOLVED_MDNS|SD_RESOLVED_LLMNR|SD_RESOLVED_DNS)
diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c
index ec92406a7e..90619085c4 100644
--- a/src/resolve/resolved-dns-cache.c
+++ b/src/resolve/resolved-dns-cache.c
@@ -243,6 +243,22 @@ void dns_cache_prune(DnsCache *c) {
}
}
+bool dns_cache_expiry_in_one_second(DnsCache *c, usec_t t) {
+ DnsCacheItem *i;
+
+ assert(c);
+
+ /* Check if any items expire within the next second */
+ i = prioq_peek(c->by_expiry);
+ if (!i)
+ return false;
+
+ if (i->until <= usec_add(t, USEC_PER_SEC))
+ return true;
+
+ return false;
+}
+
static int dns_cache_item_prioq_compare_func(const void *a, const void *b) {
const DnsCacheItem *x = a, *y = b;
@@ -531,6 +547,20 @@ static int dns_cache_put_positive(
TAKE_PTR(i);
return 0;
}
+/* https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml */
+/* https://www.iana.org/assignments/locally-served-dns-zones/locally-served-dns-zones.xhtml#transport-independent */
+static bool dns_special_use_domain_invalid_answer(DnsResourceKey *key, int rcode) {
+ /* Sometimes we know a domain exists, even if broken nameservers say otherwise. Make sure not to
+ * cache any answers we know are wrong. */
+
+ /* RFC9462 § 6.4: resolvers SHOULD respond to queries of any type other than SVCB for
+ * _dns.resolver.arpa. with NODATA and queries of any type for any domain name under resolver.arpa
+ * with NODATA. */
+ if (dns_name_endswith(dns_resource_key_name(key), "resolver.arpa") > 0 && rcode == DNS_RCODE_NXDOMAIN)
+ return true;
+
+ return false;
+}
static int dns_cache_put_negative(
DnsCache *c,
@@ -561,6 +591,8 @@ static int dns_cache_put_negative(
return 0;
if (dns_type_is_pseudo(key->type))
return 0;
+ if (dns_special_use_domain_invalid_answer(key, rcode))
+ return 0;
if (IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN)) {
if (!soa)
diff --git a/src/resolve/resolved-dns-cache.h b/src/resolve/resolved-dns-cache.h
index d078ae9872..6a45b95a60 100644
--- a/src/resolve/resolved-dns-cache.h
+++ b/src/resolve/resolved-dns-cache.h
@@ -58,3 +58,5 @@ bool dns_cache_is_empty(DnsCache *cache);
unsigned dns_cache_size(DnsCache *cache);
int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p, usec_t ts, unsigned max_rr);
+
+bool dns_cache_expiry_in_one_second(DnsCache *c, usec_t t);
diff --git a/src/resolve/resolved-dns-dnssec.c b/src/resolve/resolved-dns-dnssec.c
index 8788bd6b0b..a373b610b0 100644
--- a/src/resolve/resolved-dns-dnssec.c
+++ b/src/resolve/resolved-dns-dnssec.c
@@ -28,8 +28,9 @@ DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_KEY*, EC_KEY_free, NULL);
/* Permit a maximum clock skew of 1h 10min. This should be enough to deal with DST confusion */
#define SKEW_MAX (1*USEC_PER_HOUR + 10*USEC_PER_MINUTE)
-/* Maximum number of NSEC3 iterations we'll do. RFC5155 says 2500 shall be the maximum useful value */
-#define NSEC3_ITERATIONS_MAX 2500
+/* Maximum number of NSEC3 iterations we'll do. RFC5155 says 2500 shall be the maximum useful value, but
+ * RFC9276 § 3.2 says that we should reduce the acceptable iteration count */
+#define NSEC3_ITERATIONS_MAX 100
/*
* The DNSSEC Chain of trust:
@@ -1169,6 +1170,7 @@ int dnssec_verify_rrset_search(
DnsResourceRecord **ret_rrsig) {
bool found_rrsig = false, found_invalid = false, found_expired_rrsig = false, found_unsupported_algorithm = false;
+ unsigned nvalidations = 0;
DnsResourceRecord *rrsig;
int r;
@@ -1214,6 +1216,14 @@ int dnssec_verify_rrset_search(
if (realtime == USEC_INFINITY)
realtime = now(CLOCK_REALTIME);
+ /* Have we seen an unreasonable number of invalid signaures? */
+ if (nvalidations > DNSSEC_INVALID_MAX) {
+ if (ret_rrsig)
+ *ret_rrsig = NULL;
+ *result = DNSSEC_TOO_MANY_VALIDATIONS;
+ return (int) nvalidations;
+ }
+
/* Yay, we found a matching RRSIG with a matching
* DNSKEY, awesome. Now let's verify all entries of
* the RRSet against the RRSIG and DNSKEY
@@ -1223,6 +1233,8 @@ int dnssec_verify_rrset_search(
if (r < 0)
return r;
+ nvalidations++;
+
switch (one_result) {
case DNSSEC_VALIDATED:
@@ -1233,7 +1245,7 @@ int dnssec_verify_rrset_search(
*ret_rrsig = rrsig;
*result = one_result;
- return 0;
+ return (int) nvalidations;
case DNSSEC_INVALID:
/* If the signature is invalid, let's try another
@@ -1280,7 +1292,7 @@ int dnssec_verify_rrset_search(
if (ret_rrsig)
*ret_rrsig = NULL;
- return 0;
+ return (int) nvalidations;
}
int dnssec_has_rrsig(DnsAnswer *a, const DnsResourceKey *key) {
@@ -2565,6 +2577,7 @@ static const char* const dnssec_result_table[_DNSSEC_RESULT_MAX] = {
[DNSSEC_NSEC_MISMATCH] = "nsec-mismatch",
[DNSSEC_INCOMPATIBLE_SERVER] = "incompatible-server",
[DNSSEC_UPSTREAM_FAILURE] = "upstream-failure",
+ [DNSSEC_TOO_MANY_VALIDATIONS] = "too-many-validations",
};
DEFINE_STRING_TABLE_LOOKUP(dnssec_result, DnssecResult);
diff --git a/src/resolve/resolved-dns-dnssec.h b/src/resolve/resolved-dns-dnssec.h
index 2f93a7f585..d8ff3bada9 100644
--- a/src/resolve/resolved-dns-dnssec.h
+++ b/src/resolve/resolved-dns-dnssec.h
@@ -9,12 +9,13 @@ typedef enum DnssecVerdict DnssecVerdict;
#include "resolved-dns-rr.h"
enum DnssecResult {
- /* These five are returned by dnssec_verify_rrset() */
+ /* These six are returned by dnssec_verify_rrset() */
DNSSEC_VALIDATED,
DNSSEC_VALIDATED_WILDCARD, /* Validated via a wildcard RRSIG, further NSEC/NSEC3 checks necessary */
DNSSEC_INVALID,
DNSSEC_SIGNATURE_EXPIRED,
DNSSEC_UNSUPPORTED_ALGORITHM,
+ DNSSEC_TOO_MANY_VALIDATIONS,
/* These two are added by dnssec_verify_rrset_search() */
DNSSEC_NO_SIGNATURE,
@@ -46,6 +47,12 @@ enum DnssecVerdict {
/* The longest digest we'll ever generate, of all digest algorithms we support */
#define DNSSEC_HASH_SIZE_MAX (MAX(20, 32))
+/* The most invalid signatures we will tolerate for a single rrset */
+#define DNSSEC_INVALID_MAX 5
+
+/* The total number of signature validations we will tolerate for a single transaction */
+#define DNSSEC_VALIDATION_MAX 64
+
int dnssec_rrsig_match_dnskey(DnsResourceRecord *rrsig, DnsResourceRecord *dnskey, bool revoked_ok);
int dnssec_key_match_rrsig(const DnsResourceKey *key, DnsResourceRecord *rrsig);
diff --git a/src/resolve/resolved-dns-packet.c b/src/resolve/resolved-dns-packet.c
index a7d04449b2..e626740053 100644
--- a/src/resolve/resolved-dns-packet.c
+++ b/src/resolve/resolved-dns-packet.c
@@ -1220,6 +1220,30 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAns
r = dns_packet_append_blob(p, rr->caa.value, rr->caa.value_size, NULL);
break;
+ case DNS_TYPE_NAPTR:
+ r = dns_packet_append_uint16(p, rr->naptr.order, NULL);
+ if (r < 0)
+ goto fail;
+
+ r = dns_packet_append_uint16(p, rr->naptr.preference, NULL);
+ if (r < 0)
+ goto fail;
+
+ r = dns_packet_append_string(p, rr->naptr.flags, NULL);
+ if (r < 0)
+ goto fail;
+
+ r = dns_packet_append_string(p, rr->naptr.services, NULL);
+ if (r < 0)
+ goto fail;
+
+ r = dns_packet_append_string(p, rr->naptr.regexp, NULL);
+ if (r < 0)
+ goto fail;
+
+ r = dns_packet_append_name(p, rr->naptr.replacement, /* allow_compression= */ false, /* canonical_candidate= */ true, NULL);
+ break;
+
case DNS_TYPE_OPT:
case DNS_TYPE_OPENPGPKEY:
case _DNS_TYPE_INVALID: /* unparsable */
@@ -2247,6 +2271,30 @@ int dns_packet_read_rr(
break;
+ case DNS_TYPE_NAPTR:
+ r = dns_packet_read_uint16(p, &rr->naptr.order, NULL);
+ if (r < 0)
+ return r;
+
+ r = dns_packet_read_uint16(p, &rr->naptr.preference, NULL);
+ if (r < 0)
+ return r;
+
+ r = dns_packet_read_string(p, &rr->naptr.flags, NULL);
+ if (r < 0)
+ return r;
+
+ r = dns_packet_read_string(p, &rr->naptr.services, NULL);
+ if (r < 0)
+ return r;
+
+ r = dns_packet_read_string(p, &rr->naptr.regexp, NULL);
+ if (r < 0)
+ return r;
+
+ r = dns_packet_read_name(p, &rr->naptr.replacement, /* allow_compressed= */ false, NULL);
+ break;
+
case DNS_TYPE_OPT: /* we only care about the header of OPT for now. */
case DNS_TYPE_OPENPGPKEY:
default:
diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c
index 938dd61a6a..801bbe8007 100644
--- a/src/resolve/resolved-dns-query.c
+++ b/src/resolve/resolved-dns-query.c
@@ -672,6 +672,8 @@ static int dns_query_synthesize_reply(DnsQuery *q, DnsTransactionState *state) {
q->answer_query_flags = SD_RESOLVED_AUTHENTICATED|SD_RESOLVED_CONFIDENTIAL|SD_RESOLVED_SYNTHETIC;
*state = DNS_TRANSACTION_RCODE_FAILURE;
+ log_debug("Found synthetic NXDOMAIN response.");
+
return 0;
}
if (r <= 0)
@@ -687,6 +689,8 @@ static int dns_query_synthesize_reply(DnsQuery *q, DnsTransactionState *state) {
*state = DNS_TRANSACTION_SUCCESS;
+ log_debug("Found synthetic success response.");
+
return 1;
}
@@ -741,7 +745,7 @@ int dns_query_go(DnsQuery *q) {
LIST_FOREACH(scopes, s, q->manager->dns_scopes) {
DnsScopeMatch match;
- match = dns_scope_good_domain(s, q);
+ match = dns_scope_good_domain(s, q, q->flags);
assert(match >= 0);
if (match > found) { /* Does this match better? If so, remember how well it matched, and the first one
* that matches this well */
@@ -768,7 +772,7 @@ int dns_query_go(DnsQuery *q) {
LIST_FOREACH(scopes, s, first->scopes_next) {
DnsScopeMatch match;
- match = dns_scope_good_domain(s, q);
+ match = dns_scope_good_domain(s, q, q->flags);
assert(match >= 0);
if (match < found)
continue;
diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c
index 7d824ee806..ca30508ff4 100644
--- a/src/resolve/resolved-dns-rr.c
+++ b/src/resolve/resolved-dns-rr.c
@@ -481,6 +481,13 @@ static DnsResourceRecord* dns_resource_record_free(DnsResourceRecord *rr) {
free(rr->caa.value);
break;
+ case DNS_TYPE_NAPTR:
+ free(rr->naptr.flags);
+ free(rr->naptr.services);
+ free(rr->naptr.regexp);
+ free(rr->naptr.replacement);
+ break;
+
case DNS_TYPE_OPENPGPKEY:
default:
if (!rr->unparsable)
@@ -694,6 +701,17 @@ int dns_resource_record_payload_equal(const DnsResourceRecord *a, const DnsResou
streq(a->caa.tag, b->caa.tag) &&
FIELD_EQUAL(a->caa, b->caa, value);
+ case DNS_TYPE_NAPTR:
+ r = dns_name_equal(a->naptr.replacement, b->naptr.replacement);
+ if (r <= 0)
+ return r;
+
+ return a->naptr.order == b->naptr.order &&
+ a->naptr.preference == b->naptr.preference &&
+ streq(a->naptr.flags, b->naptr.flags) &&
+ streq(a->naptr.services, b->naptr.services) &&
+ streq(a->naptr.regexp, b->naptr.regexp);
+
case DNS_TYPE_OPENPGPKEY:
default:
return FIELD_EQUAL(a->generic, b->generic, data);
@@ -1263,6 +1281,31 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
return NULL;
break;
+ case DNS_TYPE_NAPTR: {
+ _cleanup_free_ char *tt = NULL, *ttt = NULL;
+
+ t = octescape(rr->naptr.flags, SIZE_MAX);
+ if (!t)
+ return NULL;
+
+ tt = octescape(rr->naptr.services, SIZE_MAX);
+ if (!tt)
+ return NULL;
+
+ ttt = octescape(rr->naptr.regexp, SIZE_MAX);
+ if (!ttt)
+ return NULL;
+
+ if (asprintf(&s, "%" PRIu16 " %" PRIu16 " \"%s\" \"%s\" \"%s\" %s.",
+ rr->naptr.order,
+ rr->naptr.preference,
+ t,
+ tt,
+ ttt,
+ rr->naptr.replacement) < 0)
+ return NULL;
+ break;
+ }
default:
/* Format as documented in RFC 3597, Section 5 */
if (rr->generic.data_size == 0)
@@ -1588,6 +1631,15 @@ void dns_resource_record_hash_func(const DnsResourceRecord *rr, struct siphash *
siphash24_compress_safe(rr->caa.value, rr->caa.value_size, state);
break;
+ case DNS_TYPE_NAPTR:
+ siphash24_compress_typesafe(rr->naptr.order, state);
+ siphash24_compress_typesafe(rr->naptr.preference, state);
+ string_hash_func(rr->naptr.flags, state);
+ string_hash_func(rr->naptr.services, state);
+ string_hash_func(rr->naptr.regexp, state);
+ dns_name_hash_func(rr->naptr.replacement, state);
+ break;
+
case DNS_TYPE_OPENPGPKEY:
default:
siphash24_compress_safe(rr->generic.data, rr->generic.data_size, state);
@@ -1806,6 +1858,23 @@ DnsResourceRecord *dns_resource_record_copy(DnsResourceRecord *rr) {
return NULL;
break;
+ case DNS_TYPE_NAPTR:
+ copy->naptr.order = rr->naptr.order;
+ copy->naptr.preference = rr->naptr.preference;
+ copy->naptr.flags = strdup(rr->naptr.flags);
+ if (!copy->naptr.flags)
+ return NULL;
+ copy->naptr.services = strdup(rr->naptr.services);
+ if (!copy->naptr.services)
+ return NULL;
+ copy->naptr.regexp = strdup(rr->naptr.regexp);
+ if (!copy->naptr.regexp)
+ return NULL;
+ copy->naptr.replacement = strdup(rr->naptr.replacement);
+ if (!copy->naptr.replacement)
+ return NULL;
+ break;
+
case DNS_TYPE_OPT:
default:
copy->generic.data = memdup(rr->generic.data, rr->generic.data_size);
@@ -2352,6 +2421,18 @@ int dns_resource_record_to_json(DnsResourceRecord *rr, JsonVariant **ret) {
JSON_BUILD_PAIR("tag", JSON_BUILD_STRING(rr->caa.tag)),
JSON_BUILD_PAIR("value", JSON_BUILD_OCTESCAPE(rr->caa.value, rr->caa.value_size))));
+ case DNS_TYPE_NAPTR:
+ return json_build(ret,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("key", JSON_BUILD_VARIANT(k)),
+ JSON_BUILD_PAIR("order", JSON_BUILD_UNSIGNED(rr->naptr.order)),
+ JSON_BUILD_PAIR("preference", JSON_BUILD_UNSIGNED(rr->naptr.preference)),
+ /* NB: we name this flags field here naptrFlags, because there's already another "flags" field (for example in CAA) which has a different type */
+ JSON_BUILD_PAIR("naptrFlags", JSON_BUILD_STRING(rr->naptr.flags)),
+ JSON_BUILD_PAIR("services", JSON_BUILD_STRING(rr->naptr.services)),
+ JSON_BUILD_PAIR("regexp", JSON_BUILD_STRING(rr->naptr.regexp)),
+ JSON_BUILD_PAIR("replacement", JSON_BUILD_STRING(rr->naptr.replacement))));
+
default:
/* Can't provide broken-down format */
*ret = NULL;
diff --git a/src/resolve/resolved-dns-rr.h b/src/resolve/resolved-dns-rr.h
index 961d3c7852..8ad4009ebf 100644
--- a/src/resolve/resolved-dns-rr.h
+++ b/src/resolve/resolved-dns-rr.h
@@ -270,6 +270,16 @@ struct DnsResourceRecord {
uint8_t flags;
} caa;
+
+ /* https://datatracker.ietf.org/doc/html/rfc2915 */
+ struct {
+ uint16_t order;
+ uint16_t preference;
+ char *flags;
+ char *services;
+ char *regexp;
+ char *replacement;
+ } naptr;
};
/* Note: fields should be ordered to minimize alignment gaps. Use pahole! */
diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c
index 40615ff605..a2b49f0b1e 100644
--- a/src/resolve/resolved-dns-scope.c
+++ b/src/resolve/resolved-dns-scope.c
@@ -12,6 +12,7 @@
#include "random-util.h"
#include "resolved-dnssd.h"
#include "resolved-dns-scope.h"
+#include "resolved-dns-synthesize.h"
#include "resolved-dns-zone.h"
#include "resolved-llmnr.h"
#include "resolved-mdns.h"
@@ -41,6 +42,7 @@ int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol protocol, int
.protocol = protocol,
.family = family,
.resend_timeout = MULTICAST_RESEND_TIMEOUT_MIN_USEC,
+ .mdns_goodbye_event_source = NULL,
};
if (protocol == DNS_PROTOCOL_DNS) {
@@ -115,6 +117,8 @@ DnsScope* dns_scope_free(DnsScope *s) {
sd_event_source_disable_unref(s->announce_event_source);
+ sd_event_source_disable_unref(s->mdns_goodbye_event_source);
+
dns_cache_flush(&s->cache);
dns_zone_flush(&s->zone);
@@ -424,7 +428,15 @@ static int dns_scope_socket(
return r;
}
- if (ifindex != 0) {
+ bool addr_is_nonlocal = s->link &&
+ !manager_find_link_address(s->manager, sa.sa.sa_family, sockaddr_in_addr(&sa.sa)) &&
+ in_addr_is_localhost(sa.sa.sa_family, sockaddr_in_addr(&sa.sa)) == 0;
+
+ if (addr_is_nonlocal && ifindex != 0) {
+ /* As a special exception we don't use UNICAST_IF if we notice that the specified IP address
+ * is on the local host. Otherwise, destination addresses on the local host result in
+ * EHOSTUNREACH, since Linux won't send the packets out of the specified interface, but
+ * delivers them directly to the local socket. */
r = socket_set_unicast_if(fd, sa.sa.sa_family, ifindex);
if (r < 0)
return r;
@@ -463,19 +475,13 @@ static int dns_scope_socket(
else {
bool bound = false;
- /* Let's temporarily bind the socket to the specified ifindex. The kernel currently takes
- * only the SO_BINDTODEVICE/SO_BINDTOINDEX ifindex into account when making routing decisions
+ /* Let's temporarily bind the socket to the specified ifindex. Older kernels only take
+ * the SO_BINDTODEVICE/SO_BINDTOINDEX ifindex into account when making routing decisions
* in connect() — and not IP_UNICAST_IF. We don't really want any of the other semantics of
* SO_BINDTODEVICE/SO_BINDTOINDEX, hence we immediately unbind the socket after the fact
* again.
- *
- * As a special exception we don't do this if we notice that the specified IP address is on
- * the local host. SO_BINDTODEVICE in combination with destination addresses on the local
- * host result in EHOSTUNREACH, since Linux won't send the packets out of the specified
- * interface, but delivers them directly to the local socket. */
- if (s->link &&
- !manager_find_link_address(s->manager, sa.sa.sa_family, sockaddr_in_addr(&sa.sa)) &&
- in_addr_is_localhost(sa.sa.sa_family, sockaddr_in_addr(&sa.sa)) == 0) {
+ */
+ if (addr_is_nonlocal) {
r = socket_bind_to_ifindex(fd, ifindex);
if (r < 0)
return r;
@@ -589,18 +595,43 @@ static DnsScopeMatch match_subnet_reverse_lookups(
return _DNS_SCOPE_MATCH_INVALID;
}
+/* https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml */
+/* https://www.iana.org/assignments/locally-served-dns-zones/locally-served-dns-zones.xhtml */
+static bool dns_refuse_special_use_domain(const char *domain, DnsQuestion *question) {
+ /* RFC9462 § 6.4: resolvers SHOULD respond to queries of any type other than SVCB for
+ * _dns.resolver.arpa. with NODATA and queries of any type for any domain name under
+ * resolver.arpa with NODATA. */
+ if (dns_name_equal(domain, "_dns.resolver.arpa") > 0) {
+ DnsResourceKey *t;
+
+ /* Only SVCB is permitted to _dns.resolver.arpa */
+ DNS_QUESTION_FOREACH(t, question)
+ if (t->type == DNS_TYPE_SVCB)
+ return false;
+
+ return true;
+ }
+
+ if (dns_name_endswith(domain, "resolver.arpa") > 0)
+ return true;
+
+ return false;
+}
+
DnsScopeMatch dns_scope_good_domain(
DnsScope *s,
- DnsQuery *q) {
+ DnsQuery *q,
+ uint64_t query_flags) {
DnsQuestion *question;
const char *domain;
uint64_t flags;
- int ifindex;
+ int ifindex, r;
/* This returns the following return values:
*
* DNS_SCOPE_NO → This scope is not suitable for lookups of this domain, at all
+ * DNS_SCOPE_LAST_RESORT→ This scope is not suitable, unless we have no alternative
* DNS_SCOPE_MAYBE → This scope is suitable, but only if nothing else wants it
* DNS_SCOPE_YES_BASE+n → This scope is suitable, and 'n' suffix labels match
*
@@ -643,6 +674,10 @@ DnsScopeMatch dns_scope_good_domain(
if (dns_name_dont_resolve(domain))
return DNS_SCOPE_NO;
+ /* Avoid asking invalid questions of some special use domains */
+ if (dns_refuse_special_use_domain(domain, question))
+ return DNS_SCOPE_NO;
+
/* Never go to network for the _gateway, _outbound, _localdnsstub, _localdnsproxy domain — they're something special, synthesized locally. */
if (is_gateway_hostname(domain) ||
is_outbound_hostname(domain) ||
@@ -650,6 +685,15 @@ DnsScopeMatch dns_scope_good_domain(
is_dns_proxy_stub_hostname(domain))
return DNS_SCOPE_NO;
+ /* Don't look up the local host name via the network, unless user turned of local synthesis of it */
+ if (manager_is_own_hostname(s->manager, domain) && shall_synthesize_own_hostname_rrs())
+ return DNS_SCOPE_NO;
+
+ /* Never send SOA or NS or DNSSEC request to LLMNR, where they make little sense. */
+ r = dns_question_types_suitable_for_protocol(question, s->protocol);
+ if (r <= 0)
+ return DNS_SCOPE_NO;
+
switch (s->protocol) {
case DNS_PROTOCOL_DNS: {
@@ -705,7 +749,8 @@ DnsScopeMatch dns_scope_good_domain(
/* If ResolveUnicastSingleLabel=yes and the query is single-label, then bump match result
to prevent LLMNR monopoly among candidates. */
- if (s->manager->resolve_unicast_single_label && dns_name_is_single_label(domain))
+ if ((s->manager->resolve_unicast_single_label || (query_flags & SD_RESOLVED_RELAX_SINGLE_LABEL)) &&
+ dns_name_is_single_label(domain))
return DNS_SCOPE_YES_BASE + 1;
/* Let's return the number of labels in the best matching result */
@@ -749,7 +794,7 @@ DnsScopeMatch dns_scope_good_domain(
if ((s->family == AF_INET && dns_name_endswith(domain, "in-addr.arpa") > 0) ||
(s->family == AF_INET6 && dns_name_endswith(domain, "ip6.arpa") > 0))
- return DNS_SCOPE_MAYBE;
+ return DNS_SCOPE_LAST_RESORT;
if ((dns_name_endswith(domain, "local") > 0 && /* only resolve names ending in .local via mDNS */
dns_name_equal(domain, "local") == 0 && /* but not the single-label "local" name itself */
@@ -772,7 +817,7 @@ DnsScopeMatch dns_scope_good_domain(
if ((s->family == AF_INET && dns_name_endswith(domain, "in-addr.arpa") > 0) ||
(s->family == AF_INET6 && dns_name_endswith(domain, "ip6.arpa") > 0))
- return DNS_SCOPE_MAYBE;
+ return DNS_SCOPE_LAST_RESORT;
if ((dns_name_is_single_label(domain) && /* only resolve single label names via LLMNR */
dns_name_equal(domain, "local") == 0 && /* don't resolve "local" with LLMNR, it's the top-level domain of mDNS after all, see above */
@@ -1681,3 +1726,65 @@ int dns_scope_dump_cache_to_json(DnsScope *scope, JsonVariant **ret) {
JSON_BUILD_PAIR_CONDITION(scope->link, "ifname", JSON_BUILD_STRING(scope->link ? scope->link->ifname : NULL)),
JSON_BUILD_PAIR_VARIANT("cache", cache)));
}
+
+int dns_type_suitable_for_protocol(uint16_t type, DnsProtocol protocol) {
+
+ /* Tests whether it makes sense to route queries for the specified DNS RR types to the specified
+ * protocol. For classic DNS pretty much all RR types are suitable, but for LLMNR/mDNS let's
+ * allowlist only a few that make sense. We use this when routing queries so that we can more quickly
+ * return errors for queries that will almost certainly fail/time-out otherwise. For example, this
+ * ensures that SOA, NS, or DS/DNSKEY queries are never routed to mDNS/LLMNR where they simply make
+ * no sense. */
+
+ if (dns_type_is_obsolete(type))
+ return false;
+
+ if (!dns_type_is_valid_query(type))
+ return false;
+
+ switch (protocol) {
+
+ case DNS_PROTOCOL_DNS:
+ return true;
+
+ case DNS_PROTOCOL_LLMNR:
+ return IN_SET(type,
+ DNS_TYPE_ANY,
+ DNS_TYPE_A,
+ DNS_TYPE_AAAA,
+ DNS_TYPE_CNAME,
+ DNS_TYPE_PTR,
+ DNS_TYPE_TXT);
+
+ case DNS_PROTOCOL_MDNS:
+ return IN_SET(type,
+ DNS_TYPE_ANY,
+ DNS_TYPE_A,
+ DNS_TYPE_AAAA,
+ DNS_TYPE_CNAME,
+ DNS_TYPE_PTR,
+ DNS_TYPE_TXT,
+ DNS_TYPE_SRV,
+ DNS_TYPE_NSEC,
+ DNS_TYPE_HINFO);
+
+ default:
+ return -EPROTONOSUPPORT;
+ }
+}
+
+int dns_question_types_suitable_for_protocol(DnsQuestion *q, DnsProtocol protocol) {
+ DnsResourceKey *key;
+ int r;
+
+ /* Tests whether the types in the specified question make any sense to be routed to the specified
+ * protocol, i.e. if dns_type_suitable_for_protocol() is true for any of the contained RR types */
+
+ DNS_QUESTION_FOREACH(key, q) {
+ r = dns_type_suitable_for_protocol(key->type, protocol);
+ if (r != 0)
+ return r;
+ }
+
+ return false;
+}
diff --git a/src/resolve/resolved-dns-scope.h b/src/resolve/resolved-dns-scope.h
index ca33fd007a..23f147b8bd 100644
--- a/src/resolve/resolved-dns-scope.h
+++ b/src/resolve/resolved-dns-scope.h
@@ -18,6 +18,7 @@ typedef struct DnsScope DnsScope;
typedef enum DnsScopeMatch {
DNS_SCOPE_NO,
+ DNS_SCOPE_LAST_RESORT,
DNS_SCOPE_MAYBE,
DNS_SCOPE_YES_BASE, /* Add the number of matching labels to this */
DNS_SCOPE_YES_END = DNS_SCOPE_YES_BASE + DNS_N_LABELS_MAX,
@@ -45,6 +46,8 @@ struct DnsScope {
sd_event_source *announce_event_source;
+ sd_event_source *mdns_goodbye_event_source;
+
RateLimit ratelimit;
usec_t resend_timeout;
@@ -76,7 +79,7 @@ int dns_scope_emit_udp(DnsScope *s, int fd, int af, DnsPacket *p);
int dns_scope_socket_tcp(DnsScope *s, int family, const union in_addr_union *address, DnsServer *server, uint16_t port, union sockaddr_union *ret_socket_address);
int dns_scope_socket_udp(DnsScope *s, DnsServer *server);
-DnsScopeMatch dns_scope_good_domain(DnsScope *s, DnsQuery *q);
+DnsScopeMatch dns_scope_good_domain(DnsScope *s, DnsQuery *q, uint64_t query_flags);
bool dns_scope_good_key(DnsScope *s, const DnsResourceKey *key);
DnsServer *dns_scope_get_dns_server(DnsScope *s);
@@ -112,3 +115,6 @@ int dns_scope_remove_dnssd_services(DnsScope *scope);
bool dns_scope_is_default_route(DnsScope *scope);
int dns_scope_dump_cache_to_json(DnsScope *scope, JsonVariant **ret);
+
+int dns_type_suitable_for_protocol(uint16_t type, DnsProtocol protocol);
+int dns_question_types_suitable_for_protocol(DnsQuestion *q, DnsProtocol protocol);
diff --git a/src/resolve/resolved-dns-stream.c b/src/resolve/resolved-dns-stream.c
index ddd1db5e09..056ba7794f 100644
--- a/src/resolve/resolved-dns-stream.c
+++ b/src/resolve/resolved-dns-stream.c
@@ -593,3 +593,44 @@ void dns_stream_detach(DnsStream *s) {
dns_server_unref_stream(s->server);
}
+
+DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(
+ dns_stream_hash_ops,
+ void,
+ trivial_hash_func,
+ trivial_compare_func,
+ dns_stream_unref);
+
+int dns_stream_disconnect_all(Manager *m) {
+ _cleanup_(set_freep) Set *closed = NULL;
+ int r;
+
+ assert(m);
+
+ /* Terminates all TCP connections (called after system suspend for example, to speed up recovery) */
+
+ log_info("Closing all remaining TCP connections.");
+
+ bool restart;
+ do {
+ restart = false;
+
+ LIST_FOREACH(streams, s, m->dns_streams) {
+ r = set_ensure_put(&closed, &dns_stream_hash_ops, s);
+ if (r < 0)
+ return log_oom();
+ if (r > 0) {
+ /* Haven't seen this one before. Close it. */
+ dns_stream_ref(s);
+ (void) dns_stream_complete(s, ECONNRESET);
+
+ /* This might have a ripple effect, let's hence no look at the list further,
+ * but scan from the beginning again */
+ restart = true;
+ break;
+ }
+ }
+ } while (restart);
+
+ return 0;
+}
diff --git a/src/resolve/resolved-dns-stream.h b/src/resolve/resolved-dns-stream.h
index ba4a59e41c..912b9bf431 100644
--- a/src/resolve/resolved-dns-stream.h
+++ b/src/resolve/resolved-dns-stream.h
@@ -126,3 +126,4 @@ static inline bool DNS_STREAM_QUEUED(DnsStream *s) {
}
void dns_stream_detach(DnsStream *s);
+int dns_stream_disconnect_all(Manager *m);
diff --git a/src/resolve/resolved-dns-stub.c b/src/resolve/resolved-dns-stub.c
index 2a3c1edbba..87f7aab6e9 100644
--- a/src/resolve/resolved-dns-stub.c
+++ b/src/resolve/resolved-dns-stub.c
@@ -958,8 +958,8 @@ static void dns_stub_process_query(Manager *m, DnsStubListenerExtra *l, DnsStrea
log_debug("Got request to DNS proxy address 127.0.0.54, enabling bypass logic.");
bypass = true;
protocol_flags = SD_RESOLVED_DNS|SD_RESOLVED_NO_ZONE; /* Turn off mDNS/LLMNR for proxy stub. */
- } else if ((DNS_PACKET_DO(p) && DNS_PACKET_CD(p))) {
- log_debug("Got request with DNSSEC checking disabled, enabling bypass logic.");
+ } else if (DNS_PACKET_DO(p)) {
+ log_debug("Got request with DNSSEC enabled, enabling bypass logic.");
bypass = true;
}
@@ -970,7 +970,8 @@ static void dns_stub_process_query(Manager *m, DnsStubListenerExtra *l, DnsStrea
SD_RESOLVED_NO_SEARCH|
SD_RESOLVED_NO_VALIDATE|
SD_RESOLVED_REQUIRE_PRIMARY|
- SD_RESOLVED_CLAMP_TTL);
+ SD_RESOLVED_CLAMP_TTL|
+ SD_RESOLVED_RELAX_SINGLE_LABEL);
else
r = dns_query_new(m, &q, p->question, p->question, NULL, 0,
protocol_flags|
diff --git a/src/resolve/resolved-dns-synthesize.c b/src/resolve/resolved-dns-synthesize.c
index 5bde29c704..cccea54f02 100644
--- a/src/resolve/resolved-dns-synthesize.c
+++ b/src/resolve/resolved-dns-synthesize.c
@@ -439,6 +439,20 @@ static int synthesize_gateway_ptr(
return answer_add_addresses_ptr(answer, "_gateway", addresses, n, af, address);
}
+bool shall_synthesize_own_hostname_rrs(void) {
+ static int cached = -1;
+ int r;
+
+ if (cached >= 0)
+ return cached;
+
+ r = secure_getenv_bool("SYSTEMD_RESOLVED_SYNTHESIZE_HOSTNAME");
+ if (r < 0 && r != -ENXIO)
+ log_debug_errno(r, "Failed to parse $SYSTEMD_RESOLVED_SYNTHESIZE_HOSTNAME: %m");
+
+ return (cached = (r != 0));
+}
+
int dns_synthesize_answer(
Manager *m,
DnsQuestion *q,
@@ -463,7 +477,7 @@ int dns_synthesize_answer(
name = dns_resource_key_name(key);
- if (dns_name_is_root(name)) {
+ if (dns_name_is_root(name) || dns_name_endswith(name, "resolver.arpa") > 0) {
/* Do nothing. */
} else if (dns_name_dont_resolve(name)) {
@@ -479,8 +493,9 @@ int dns_synthesize_answer(
} else if (manager_is_own_hostname(m, name)) {
- if (getenv_bool("SYSTEMD_RESOLVED_SYNTHESIZE_HOSTNAME") == 0)
+ if (!shall_synthesize_own_hostname_rrs())
continue;
+
r = synthesize_system_hostname_rr(m, key, ifindex, &answer);
if (r < 0)
return log_error_errno(r, "Failed to synthesize system hostname RRs: %m");
@@ -530,7 +545,7 @@ int dns_synthesize_answer(
} else if (dns_name_address(name, &af, &address) > 0) {
int v, w, u;
- if (getenv_bool("SYSTEMD_RESOLVED_SYNTHESIZE_HOSTNAME") == 0)
+ if (!shall_synthesize_own_hostname_rrs())
continue;
v = synthesize_system_hostname_ptr(m, af, &address, ifindex, &answer);
diff --git a/src/resolve/resolved-dns-synthesize.h b/src/resolve/resolved-dns-synthesize.h
index bf271e862d..ca39e682b4 100644
--- a/src/resolve/resolved-dns-synthesize.h
+++ b/src/resolve/resolved-dns-synthesize.h
@@ -9,3 +9,5 @@ int dns_synthesize_family(uint64_t flags);
DnsProtocol dns_synthesize_protocol(uint64_t flags);
int dns_synthesize_answer(Manager *m, DnsQuestion *q, int ifindex, DnsAnswer **ret);
+
+bool shall_synthesize_own_hostname_rrs(void);
diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c
index a99f8e8a58..954841bb7c 100644
--- a/src/resolve/resolved-dns-transaction.c
+++ b/src/resolve/resolved-dns-transaction.c
@@ -3232,11 +3232,14 @@ static int dnssec_validate_records(
DnsTransaction *t,
Phase phase,
bool *have_nsec,
+ unsigned *nvalidations,
DnsAnswer **validated) {
DnsResourceRecord *rr;
int r;
+ assert(nvalidations);
+
/* Returns negative on error, 0 if validation failed, 1 to restart validation, 2 when finished. */
DNS_ANSWER_FOREACH(rr, t->answer) {
@@ -3278,6 +3281,7 @@ static int dnssec_validate_records(
&rrsig);
if (r < 0)
return r;
+ *nvalidations += r;
log_debug("Looking at %s: %s", strna(dns_resource_record_to_string(rr)), dnssec_result_to_string(result));
@@ -3475,7 +3479,8 @@ static int dnssec_validate_records(
DNSSEC_SIGNATURE_EXPIRED,
DNSSEC_NO_SIGNATURE))
manager_dnssec_verdict(t->scope->manager, DNSSEC_BOGUS, rr->key);
- else /* DNSSEC_MISSING_KEY or DNSSEC_UNSUPPORTED_ALGORITHM */
+ else /* DNSSEC_MISSING_KEY, DNSSEC_UNSUPPORTED_ALGORITHM,
+ or DNSSEC_TOO_MANY_VALIDATIONS */
manager_dnssec_verdict(t->scope->manager, DNSSEC_INDETERMINATE, rr->key);
/* This is a primary response to our question, and it failed validation.
@@ -3568,13 +3573,21 @@ int dns_transaction_validate_dnssec(DnsTransaction *t) {
return r;
phase = DNSSEC_PHASE_DNSKEY;
- for (;;) {
+ for (unsigned nvalidations = 0;;) {
bool have_nsec = false;
- r = dnssec_validate_records(t, phase, &have_nsec, &validated);
+ r = dnssec_validate_records(t, phase, &have_nsec, &nvalidations, &validated);
if (r <= 0)
return r;
+ if (nvalidations > DNSSEC_VALIDATION_MAX) {
+ /* This reply requires an onerous number of signature validations to verify. Let's
+ * not waste our time trying, as this shouldn't happen for well-behaved domains
+ * anyway. */
+ t->answer_dnssec_result = DNSSEC_TOO_MANY_VALIDATIONS;
+ return 0;
+ }
+
/* Try again as long as we managed to achieve something */
if (r == 1)
continue;
diff --git a/src/resolve/resolved-dns-trust-anchor.c b/src/resolve/resolved-dns-trust-anchor.c
index 1e42cdddb1..9df93f109a 100644
--- a/src/resolve/resolved-dns-trust-anchor.c
+++ b/src/resolve/resolved-dns-trust-anchor.c
@@ -165,6 +165,11 @@ static int dns_trust_anchor_add_builtin_negative(DnsTrustAnchor *d) {
/* Defined by RFC 8375. The most official choice. */
"home.arpa\0"
+ /* RFC 9462 doesn't mention DNSSEC, but this domain
+ * can't really be signed and clients need to validate
+ * the answer before using it anyway. */
+ "resolver.arpa\0"
+
/* RFC 8880 says because the 'ipv4only.arpa' zone has to
* be an insecure delegation, DNSSEC cannot be used to
* protect these answers from tampering by malicious
@@ -228,7 +233,7 @@ static int dns_trust_anchor_load_positive(DnsTrustAnchor *d, const char *path, u
return -EINVAL;
}
- r = extract_many_words(&p, NULL, 0, &class, &type, NULL);
+ r = extract_many_words(&p, NULL, 0, &class, &type);
if (r < 0)
return log_warning_errno(r, "Unable to parse class and type in line %s:%u: %m", path, line);
if (r != 2) {
@@ -248,7 +253,7 @@ static int dns_trust_anchor_load_positive(DnsTrustAnchor *d, const char *path, u
int a, dt;
size_t l;
- r = extract_many_words(&p, NULL, 0, &key_tag, &algorithm, &digest_type, NULL);
+ r = extract_many_words(&p, NULL, 0, &key_tag, &algorithm, &digest_type);
if (r < 0) {
log_warning_errno(r, "Failed to parse DS parameters on line %s:%u: %m", path, line);
return -EINVAL;
@@ -302,7 +307,7 @@ static int dns_trust_anchor_load_positive(DnsTrustAnchor *d, const char *path, u
size_t l;
int a;
- r = extract_many_words(&p, NULL, 0, &flags, &protocol, &algorithm, NULL);
+ r = extract_many_words(&p, NULL, 0, &flags, &protocol, &algorithm);
if (r < 0)
return log_warning_errno(r, "Failed to parse DNSKEY parameters on line %s:%u: %m", path, line);
if (r != 3) {
diff --git a/src/resolve/resolved-etc-hosts.c b/src/resolve/resolved-etc-hosts.c
index 6af160a477..2d334d38dd 100644
--- a/src/resolve/resolved-etc-hosts.c
+++ b/src/resolve/resolved-etc-hosts.c
@@ -491,7 +491,7 @@ static int etc_hosts_lookup_by_name(
const char *name,
DnsAnswer **answer) {
- bool found_a = false, found_aaaa = false;
+ bool question_for_a = false, question_for_aaaa = false;
const struct in_addr_data *a;
EtcHostsItemByName *item;
DnsResourceKey *t;
@@ -513,6 +513,7 @@ static int etc_hosts_lookup_by_name(
return 0;
}
+ /* Determine whether we are looking for A and/or AAAA RRs */
DNS_QUESTION_FOREACH(t, q) {
if (!IN_SET(t->type, DNS_TYPE_A, DNS_TYPE_AAAA, DNS_TYPE_ANY))
continue;
@@ -526,20 +527,20 @@ static int etc_hosts_lookup_by_name(
continue;
if (IN_SET(t->type, DNS_TYPE_A, DNS_TYPE_ANY))
- found_a = true;
+ question_for_a = true;
if (IN_SET(t->type, DNS_TYPE_AAAA, DNS_TYPE_ANY))
- found_aaaa = true;
+ question_for_aaaa = true;
- if (found_a && found_aaaa)
- break;
+ if (question_for_a && question_for_aaaa)
+ break; /* We are looking for both, no need to continue loop */
}
SET_FOREACH(a, item ? item->addresses : NULL) {
EtcHostsItemByAddress *item_by_addr;
const char *canonical_name;
- if ((!found_a && a->family == AF_INET) ||
- (!found_aaaa && a->family == AF_INET6))
+ if ((!question_for_a && a->family == AF_INET) ||
+ (!question_for_aaaa && a->family == AF_INET6))
continue;
item_by_addr = hashmap_get(hosts->by_address, a);
@@ -559,7 +560,7 @@ static int etc_hosts_lookup_by_name(
return r;
}
- return found_a || found_aaaa;
+ return true; /* We consider ourselves authoritative for the whole name, all RR types, not just A/AAAA */
}
int manager_etc_hosts_lookup(Manager *m, DnsQuestion *q, DnsAnswer **answer) {
diff --git a/src/resolve/resolved-mdns.c b/src/resolve/resolved-mdns.c
index 3e6e83fe62..60ae0b8fbd 100644
--- a/src/resolve/resolved-mdns.c
+++ b/src/resolve/resolved-mdns.c
@@ -349,6 +349,33 @@ static int mdns_scope_process_query(DnsScope *s, DnsPacket *p) {
return 0;
}
+static int mdns_goodbye_callback(sd_event_source *s, uint64_t usec, void *userdata) {
+ DnsScope *scope = userdata;
+ int r;
+
+ assert(s);
+ assert(scope);
+
+ scope->mdns_goodbye_event_source = sd_event_source_disable_unref(scope->mdns_goodbye_event_source);
+
+ dns_cache_prune(&scope->cache);
+
+ if (dns_cache_expiry_in_one_second(&scope->cache, usec)) {
+ r = sd_event_add_time_relative(
+ scope->manager->event,
+ &scope->mdns_goodbye_event_source,
+ CLOCK_BOOTTIME,
+ USEC_PER_SEC,
+ 0,
+ mdns_goodbye_callback,
+ scope);
+ if (r < 0)
+ return log_error_errno(r, "mDNS: Failed to re-schedule goodbye callback: %m");
+ }
+
+ return 0;
+}
+
static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
_cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
Manager *m = userdata;
@@ -407,6 +434,22 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
log_debug("Got a goodbye packet");
/* See the section 10.1 of RFC6762 */
rr->ttl = 1;
+
+ /* Look at the cache 1 second later and remove stale entries.
+ * This is particularly useful to keep service browsers updated on service removal,
+ * as there are no other reliable triggers to propogate that info. */
+ if (!scope->mdns_goodbye_event_source) {
+ r = sd_event_add_time_relative(
+ scope->manager->event,
+ &scope->mdns_goodbye_event_source,
+ CLOCK_BOOTTIME,
+ USEC_PER_SEC,
+ 0,
+ mdns_goodbye_callback,
+ scope);
+ if (r < 0)
+ return r;
+ }
}
}
diff --git a/src/resolve/resolved-varlink.c b/src/resolve/resolved-varlink.c
index a85a278676..6b835904be 100644
--- a/src/resolve/resolved-varlink.c
+++ b/src/resolve/resolved-varlink.c
@@ -15,6 +15,8 @@ typedef struct LookupParameters {
union in_addr_union address;
size_t address_size;
char *name;
+ uint16_t class;
+ uint16_t type;
} LookupParameters;
typedef struct LookupParametersResolveService {
@@ -162,6 +164,7 @@ static bool validate_and_mangle_flags(
SD_RESOLVED_NO_TRUST_ANCHOR|
SD_RESOLVED_NO_NETWORK|
SD_RESOLVED_NO_STALE|
+ SD_RESOLVED_RELAX_SINGLE_LABEL|
ok))
return false;
@@ -1016,7 +1019,7 @@ static int vl_method_resolve_service(Varlink* link, JsonVariant* parameters, Var
return -EINVAL;
r = varlink_dispatch(link, parameters, dispatch_table, &p);
- if (r < 0)
+ if (r != 0)
return r;
if (p.ifindex < 0)
@@ -1073,6 +1076,158 @@ static int vl_method_resolve_service(Varlink* link, JsonVariant* parameters, Var
return 1;
}
+static void vl_method_resolve_record_complete(DnsQuery *query) {
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
+ _cleanup_(dns_query_freep) DnsQuery *q = query;
+ DnsQuestion *question;
+ int r;
+
+ assert(q);
+
+ if (q->state != DNS_TRANSACTION_SUCCESS) {
+ r = reply_query_state(q);
+ goto finish;
+ }
+
+ r = dns_query_process_cname_many(q);
+ if (r == -ELOOP) {
+ r = varlink_error(q->varlink_request, "io.systemd.Resolve.CNAMELoop", NULL);
+ goto finish;
+ }
+ if (r < 0)
+ goto finish;
+ if (r == DNS_QUERY_CNAME) {
+ /* This was a cname, and the query was restarted. */
+ TAKE_PTR(q);
+ return;
+ }
+
+ question = dns_query_question_for_protocol(q, q->answer_protocol);
+
+ unsigned added = 0;
+ int ifindex;
+ DnsResourceRecord *rr;
+ DNS_ANSWER_FOREACH_IFINDEX(rr, ifindex, q->answer) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+
+ r = dns_question_matches_rr(question, rr, NULL);
+ if (r < 0)
+ goto finish;
+ if (r == 0)
+ continue;
+
+ r = dns_resource_record_to_json(rr, &v);
+ if (r < 0)
+ goto finish;
+
+ r = dns_resource_record_to_wire_format(rr, /* canonical= */ false); /* don't use DNSSEC canonical format, since it removes casing, but we want that for DNS_SD compat */
+ if (r < 0)
+ goto finish;
+
+ r = json_variant_append_arrayb(
+ &array,
+ JSON_BUILD_OBJECT(JSON_BUILD_PAIR_CONDITION(ifindex > 0, "ifindex", JSON_BUILD_INTEGER(ifindex)),
+ JSON_BUILD_PAIR_CONDITION(v, "rr", JSON_BUILD_VARIANT(v)),
+ JSON_BUILD_PAIR("raw", JSON_BUILD_BASE64(rr->wire_format, rr->wire_format_size))));
+ if (r < 0)
+ goto finish;
+
+ added++;
+ }
+
+ if (added <= 0) {
+ r = varlink_error(q->varlink_request, "io.systemd.Resolve.NoSuchResourceRecord", NULL);
+ goto finish;
+ }
+
+ r = varlink_replyb(q->varlink_request,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("rrs", JSON_BUILD_VARIANT(array)),
+ JSON_BUILD_PAIR("flags", JSON_BUILD_INTEGER(dns_query_reply_flags_make(q)))));
+finish:
+ if (r < 0) {
+ log_full_errno(ERRNO_IS_DISCONNECT(r) ? LOG_DEBUG : LOG_ERR, r, "Failed to send record reply: %m");
+ varlink_error_errno(q->varlink_request, r);
+ }
+}
+
+static int vl_method_resolve_record(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) {
+ static const JsonDispatch dispatch_table[] = {
+ { "ifindex", _JSON_VARIANT_TYPE_INVALID, json_dispatch_int, offsetof(LookupParameters, ifindex), 0 },
+ { "name", JSON_VARIANT_STRING, json_dispatch_string, offsetof(LookupParameters, name), JSON_MANDATORY },
+ { "class", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint16, offsetof(LookupParameters, class), 0 },
+ { "type", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint16, offsetof(LookupParameters, type), JSON_MANDATORY },
+ { "flags", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(LookupParameters, flags), 0 },
+ {}
+ };
+
+ _cleanup_(lookup_parameters_destroy) LookupParameters p = {
+ .class = DNS_CLASS_IN,
+ .type = _DNS_TYPE_INVALID,
+ };
+ _cleanup_(dns_query_freep) DnsQuery *q = NULL;
+ Manager *m;
+ int r;
+
+ assert(link);
+
+ m = ASSERT_PTR(varlink_server_get_userdata(varlink_get_server(link)));
+
+ if (FLAGS_SET(flags, VARLINK_METHOD_ONEWAY))
+ return -EINVAL;
+
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
+ return r;
+
+ if (p.ifindex < 0)
+ return varlink_error_invalid_parameter(link, JSON_VARIANT_STRING_CONST("ifindex"));
+
+ r = dns_name_is_valid(p.name);
+ if (r < 0)
+ return r;
+ if (r == 0)
+ return varlink_error_invalid_parameter(link, JSON_VARIANT_STRING_CONST("name"));
+
+ if (!dns_type_is_valid_query(p.type))
+ return varlink_error(link, "io.systemd.Resolve.ResourceRecordTypeInvalidForQuery", NULL);
+ if (dns_type_is_zone_transfer(p.type))
+ return varlink_error(link, "io.systemd.Resolve.ZoneTransfersNotPermitted", NULL);
+ if (dns_type_is_obsolete(p.type))
+ return varlink_error(link, "io.systemd.Resolve.ResourceRecordTypeObsolete", NULL);
+
+ if (!validate_and_mangle_flags(p.name, &p.flags, SD_RESOLVED_NO_SEARCH))
+ return varlink_error_invalid_parameter(link, JSON_VARIANT_STRING_CONST("flags"));
+
+ _cleanup_(dns_question_unrefp) DnsQuestion *question = dns_question_new(1);
+ if (!question)
+ return -ENOMEM;
+
+ _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
+ key = dns_resource_key_new(p.class, p.type, p.name);
+ if (!key)
+ return -ENOMEM;
+
+ r = dns_question_add(question, key, /* flags= */ 0);
+ if (r < 0)
+ return r;
+
+ r = dns_query_new(m, &q, question, question, NULL, p.ifindex, p.flags|SD_RESOLVED_NO_SEARCH|SD_RESOLVED_CLAMP_TTL);
+ if (r < 0)
+ return r;
+
+ q->varlink_request = varlink_ref(link);
+ varlink_set_userdata(link, q);
+ q->complete = vl_method_resolve_record_complete;
+
+ r = dns_query_go(q);
+ if (r < 0)
+ return r;
+
+ TAKE_PTR(q);
+ return 1;
+}
+
static int vl_method_subscribe_query_results(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) {
Manager *m;
int r;
@@ -1296,9 +1451,10 @@ static int varlink_main_server_init(Manager *m) {
r = varlink_server_bind_method_many(
s,
- "io.systemd.Resolve.ResolveHostname", vl_method_resolve_hostname,
- "io.systemd.Resolve.ResolveAddress", vl_method_resolve_address,
- "io.systemd.Resolve.ResolveService", vl_method_resolve_service);
+ "io.systemd.Resolve.ResolveHostname", vl_method_resolve_hostname,
+ "io.systemd.Resolve.ResolveAddress", vl_method_resolve_address,
+ "io.systemd.Resolve.ResolveService", vl_method_resolve_service,
+ "io.systemd.Resolve.ResolveRecord", vl_method_resolve_record);
if (r < 0)
return log_error_errno(r, "Failed to register varlink methods: %m");
diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c
index 1625c5189d..664e7dd653 100644
--- a/src/resolve/resolved.c
+++ b/src/resolve/resolved.c
@@ -67,7 +67,7 @@ static int run(int argc, char *argv[]) {
return log_error_errno(r, "Failed to drop privileges: %m");
}
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/resolve/test-resolved-packet.c b/src/resolve/test-resolved-packet.c
index dd8c969b14..8a65ea0f5e 100644
--- a/src/resolve/test-resolved-packet.c
+++ b/src/resolve/test-resolved-packet.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include "hexdecoct.h"
#include "log.h"
#include "resolved-dns-packet.h"
#include "tests.h"
@@ -23,4 +24,190 @@ TEST(dns_packet_new) {
assert_se(dns_packet_new(&p2, DNS_PROTOCOL_DNS, DNS_PACKET_SIZE_MAX + 1, DNS_PACKET_SIZE_MAX) == -EFBIG);
}
+TEST(naptr) {
+ _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
+
+ static const char twilio_reply[] =
+ "Sq+BgAABAAkAAAABBnR3aWxpbwNjb20AACMAAcAMACMAAQAABwgAMgAUAAoBUwdTSVArRDJUAARf"
+ "c2lwBF90Y3AEcHN0bgdpZTEtdG54BnR3aWxpbwNjb20AwAwAIwABAAAHCAAyAAoACgFTB1NJUCtE"
+ "MlUABF9zaXAEX3VkcARwc3RuB3VzMi10bngGdHdpbGlvA2NvbQDADAAjAAEAAAcIADQAFAAKAVMI"
+ "U0lQUytEMlQABV9zaXBzBF90Y3AEcHN0bgd1czEtdG54BnR3aWxpbwNjb20AwAwAIwABAAAHCAAy"
+ "AAoACgFTB1NJUCtEMlUABF9zaXAEX3VkcARwc3RuB2llMS10bngGdHdpbGlvA2NvbQDADAAjAAEA"
+ "AAcIADIAFAAKAVMHU0lQK0QyVAAEX3NpcARfdGNwBHBzdG4HdXMyLXRueAZ0d2lsaW8DY29tAMAM"
+ "ACMAAQAABwgANAAUAAoBUwhTSVBTK0QyVAAFX3NpcHMEX3RjcARwc3RuB3VzMi10bngGdHdpbGlv"
+ "A2NvbQDADAAjAAEAAAcIADQAFAAKAVMIU0lQUytEMlQABV9zaXBzBF90Y3AEcHN0bgdpZTEtdG54"
+ "BnR3aWxpbwNjb20AwAwAIwABAAAHCAAyAAoACgFTB1NJUCtEMlUABF9zaXAEX3VkcARwc3RuB3Vz"
+ "MS10bngGdHdpbGlvA2NvbQDADAAjAAEAAAcIADIAFAAKAVMHU0lQK0QyVAAEX3NpcARfdGNwBHBz"
+ "dG4HdXMxLXRueAZ0d2lsaW8DY29tAAAAKQIAAAAAAAAA";
+
+ static const char twilio_reply_string[] =
+ "20 10 \"S\" \"SIP+D2T\" \"\" _sip._tcp.pstn.ie1-tnx.twilio.com.\n"
+ "10 10 \"S\" \"SIP+D2U\" \"\" _sip._udp.pstn.us2-tnx.twilio.com.\n"
+ "20 10 \"S\" \"SIPS+D2T\" \"\" _sips._tcp.pstn.us1-tnx.twilio.com.\n"
+ "10 10 \"S\" \"SIP+D2U\" \"\" _sip._udp.pstn.ie1-tnx.twilio.com.\n"
+ "20 10 \"S\" \"SIP+D2T\" \"\" _sip._tcp.pstn.us2-tnx.twilio.com.\n"
+ "20 10 \"S\" \"SIPS+D2T\" \"\" _sips._tcp.pstn.us2-tnx.twilio.com.\n"
+ "20 10 \"S\" \"SIPS+D2T\" \"\" _sips._tcp.pstn.ie1-tnx.twilio.com.\n"
+ "10 10 \"S\" \"SIP+D2U\" \"\" _sip._udp.pstn.us1-tnx.twilio.com.\n"
+ "20 10 \"S\" \"SIP+D2T\" \"\" _sip._tcp.pstn.us1-tnx.twilio.com.\n";
+
+ static const char twilio_reply_json[] =
+ "[\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 20,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIP+D2T\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sip._tcp.pstn.ie1-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 10,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIP+D2U\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sip._udp.pstn.us2-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 20,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIPS+D2T\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sips._tcp.pstn.us1-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 10,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIP+D2U\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sip._udp.pstn.ie1-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 20,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIP+D2T\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sip._tcp.pstn.us2-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 20,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIPS+D2T\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sips._tcp.pstn.us2-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 20,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIPS+D2T\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sips._tcp.pstn.ie1-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 10,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIP+D2U\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sip._udp.pstn.us1-tnx.twilio.com\"\n"
+ " },\n"
+ " {\n"
+ " \"key\" : {\n"
+ " \"class\" : 1,\n"
+ " \"type\" : 35,\n"
+ " \"name\" : \"twilio.com\"\n"
+ " },\n"
+ " \"order\" : 20,\n"
+ " \"preference\" : 10,\n"
+ " \"naptrFlags\" : \"S\",\n"
+ " \"services\" : \"SIP+D2T\",\n"
+ " \"regexp\" : \"\",\n"
+ " \"replacement\" : \"_sip._tcp.pstn.us1-tnx.twilio.com\"\n"
+ " }\n"
+ "]\n";
+
+ _cleanup_free_ void *buf = NULL;
+ size_t sz = 0;
+
+ assert_se(unbase64mem(twilio_reply, &buf, &sz) >= 0);
+
+ assert_se(dns_packet_new(&p, DNS_PROTOCOL_DNS, sz, DNS_PACKET_SIZE_MAX) == 0);
+ assert_se(p->allocated >= sz);
+
+ memcpy(DNS_PACKET_DATA(p), buf, sz);
+ p->size = sz;
+
+ assert_se(dns_packet_extract(p) >= 0);
+
+ _cleanup_(json_variant_unrefp) JsonVariant *a = NULL;
+ _cleanup_free_ char *joined = NULL;
+ DnsResourceRecord *rr;
+ DNS_ANSWER_FOREACH(rr, p->answer) {
+ const char *s;
+
+ s = ASSERT_PTR(dns_resource_record_to_string(rr));
+ printf("%s\n", s);
+
+ assert_se(strextend(&joined, s, "\n"));
+
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+ assert_se(dns_resource_record_to_json(rr, &v) >= 0);
+
+ assert_se(json_variant_append_array(&a, v) >= 0);
+ }
+
+ assert(streq(joined, twilio_reply_string));
+
+ _cleanup_(json_variant_unrefp) JsonVariant *parsed = NULL;
+ assert_se(json_parse(twilio_reply_json, /* flags= */ 0, &parsed, /* ret_line= */ NULL, /* ret_column= */ NULL) >= 0);
+
+ assert_se(json_variant_equal(parsed, a));
+}
+
DEFINE_TEST_MAIN(LOG_DEBUG);
diff --git a/src/resolve/test-resolved-stream.c b/src/resolve/test-resolved-stream.c
index 847de04f90..4f27eac3da 100644
--- a/src/resolve/test-resolved-stream.c
+++ b/src/resolve/test-resolved-stream.c
@@ -329,7 +329,7 @@ static void test_dns_stream(bool tls) {
log_info("test-resolved-stream: Finished %s test", tls ? "TLS" : "TCP");
}
-static void try_isolate_network(void) {
+static int try_isolate_network(void) {
_cleanup_close_ int socket_fd = -EBADF;
int r;
@@ -356,20 +356,25 @@ static void try_isolate_network(void) {
_exit(EXIT_SUCCESS);
}
if (r == -EPROTO) /* EPROTO means nonzero exit code of child, i.e. the tests in the child failed */
- return;
+ return 0;
assert_se(r > 0);
/* Now that we know that the unshare() is safe, let's actually do it */
assert_se(unshare(CLONE_NEWUSER | CLONE_NEWNET) >= 0);
- /* Bring up the loopback interfaceon the newly created network namespace */
+ /* Bring up the loopback interface on the newly created network namespace */
struct ifreq req = { .ifr_ifindex = 1 };
assert_se((socket_fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0)) >= 0);
assert_se(ioctl(socket_fd, SIOCGIFNAME, &req) >= 0);
assert_se(ioctl(socket_fd, SIOCGIFFLAGS, &req) >= 0);
assert_se(FLAGS_SET(req.ifr_flags, IFF_LOOPBACK));
req.ifr_flags |= IFF_UP;
- assert_se(ioctl(socket_fd, SIOCSIFFLAGS, &req) >= 0);
+ /* Do not assert on this, fails in the Ubuntu 24.04 CI environment */
+ r = RET_NERRNO(ioctl(socket_fd, SIOCSIFFLAGS, &req));
+ if (r < 0)
+ return r;
+
+ return 0;
}
int main(int argc, char **argv) {
@@ -378,10 +383,14 @@ int main(int argc, char **argv) {
.in.sin_port = htobe16(random_u64_range(UINT16_MAX - 1024) + 1024),
.in.sin_addr.s_addr = htobe32(INADDR_LOOPBACK)
};
+ int r;
test_setup_logging(LOG_DEBUG);
- try_isolate_network();
+ r = try_isolate_network();
+ if (ERRNO_IS_NEG_PRIVILEGE(r))
+ return log_tests_skipped("lacking privileges");
+ assert_se(r >= 0);
test_dns_stream(false);
#if ENABLE_DNS_OVER_TLS
diff --git a/src/rpm/macros.systemd.in b/src/rpm/macros.systemd.in
index 241e4b9c49..ce65ec6700 100644
--- a/src/rpm/macros.systemd.in
+++ b/src/rpm/macros.systemd.in
@@ -13,6 +13,7 @@
%_udevhwdbdir {{UDEV_HWDB_DIR}}
%_udevrulesdir {{UDEV_RULES_DIR}}
%_journalcatalogdir {{SYSTEMD_CATALOG_DIR}}
+%_kernel_install_dir {{KERNEL_INSTALL_DIR}}
%_binfmtdir {{BINFMT_DIR}}
%_sysctldir {{SYSCTL_DIR}}
%_sysusersdir {{SYSUSERS_DIR}}
@@ -26,10 +27,6 @@
%_systemd_system_env_generator_dir {{SYSTEM_ENV_GENERATOR_DIR}}
%_systemd_user_env_generator_dir {{USER_ENV_GENERATOR_DIR}}
-# Because we had one release with a typo...
-# This is temporary (Remove after systemd 240 is released)
-%_environmnentdir %{warn:Use %%_environmentdir instead}%_environmentdir
-
%systemd_requires \
Requires(post): systemd \
Requires(preun): systemd \
diff --git a/src/run/run.c b/src/run/run.c
index b42ed44231..c0c65b2ea1 100644
--- a/src/run/run.c
+++ b/src/run/run.c
@@ -1552,8 +1552,6 @@ static int acquire_invocation_id(sd_bus *bus, const char *unit, sd_id128_t *ret)
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_free_ char *object = NULL;
- const void *p;
- size_t l;
int r;
assert(bus);
@@ -1576,20 +1574,11 @@ static int acquire_invocation_id(sd_bus *bus, const char *unit, sd_id128_t *ret)
if (r < 0)
return log_error_errno(r, "Failed to request invocation ID for unit: %s", bus_error_message(&error, r));
- r = sd_bus_message_read_array(reply, 'y', &p, &l);
+ r = bus_message_read_id128(reply, ret);
if (r < 0)
return bus_log_parse_error(r);
- if (l == 0) {
- *ret = SD_ID128_NULL;
- return 0; /* no uuid set */
- }
-
- if (l != sizeof(sd_id128_t))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid UUID size, %zu != %zu.", l, sizeof(sd_id128_t));
-
- memcpy(ret, p, l);
- return !sd_id128_is_null(*ret);
+ return 0;
}
static void set_window_title(PTYForward *f) {
@@ -1610,6 +1599,8 @@ static void set_window_title(PTYForward *f) {
(void) pty_forward_set_titlef(f, "%s%s on %s", strempty(dot), cl, arg_host ?: hn);
else
(void) pty_forward_set_titlef(f, "%s%s", strempty(dot), cl);
+
+ (void) pty_forward_set_title_prefix(f, dot);
}
static int start_transient_service(sd_bus *bus) {
@@ -1749,9 +1740,9 @@ static int start_transient_service(sd_bus *bus) {
return log_error_errno(r, "Failed to get event loop: %m");
if (master >= 0) {
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
- (void) sd_event_add_signal(c.event, NULL, SIGINT, NULL, NULL);
- (void) sd_event_add_signal(c.event, NULL, SIGTERM, NULL, NULL);
+ assert_se(sigprocmask_many(SIG_BLOCK, /* old_sigset=*/ NULL, SIGWINCH) >= 0);
+
+ (void) sd_event_set_signal_exit(c.event, true);
if (!arg_quiet)
log_info("Press ^] three times within 1s to disconnect TTY.");
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index 462b3d2e00..bf79dc2633 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -713,7 +713,7 @@ int ask_password_agent(
return -EUNATCH;
assert_se(sigemptyset(&mask) >= 0);
- assert_se(sigset_add_many(&mask, SIGINT, SIGTERM, -1) >= 0);
+ assert_se(sigset_add_many(&mask, SIGINT, SIGTERM) >= 0);
assert_se(sigprocmask(SIG_BLOCK, &mask, &oldmask) >= 0);
(void) mkdir_p_label("/run/systemd/ask-password", 0755);
diff --git a/src/shared/bootspec.c b/src/shared/bootspec.c
index df45c67000..9a1f5ab127 100644
--- a/src/shared/bootspec.c
+++ b/src/shared/bootspec.c
@@ -431,12 +431,6 @@ void boot_config_free(BootConfig *config) {
assert(config);
free(config->default_pattern);
- free(config->timeout);
- free(config->editor);
- free(config->auto_entries);
- free(config->auto_firmware);
- free(config->console_mode);
- free(config->beep);
free(config->entry_oneshot);
free(config->entry_default);
@@ -491,20 +485,10 @@ int boot_loader_read_conf(BootConfig *config, FILE *file, const char *path) {
if (streq(field, "default"))
r = free_and_strdup(&config->default_pattern, p);
- else if (streq(field, "timeout"))
- r = free_and_strdup(&config->timeout, p);
- else if (streq(field, "editor"))
- r = free_and_strdup(&config->editor, p);
- else if (streq(field, "auto-entries"))
- r = free_and_strdup(&config->auto_entries, p);
- else if (streq(field, "auto-firmware"))
- r = free_and_strdup(&config->auto_firmware, p);
- else if (streq(field, "console-mode"))
- r = free_and_strdup(&config->console_mode, p);
- else if (streq(field, "random-seed-mode"))
- log_syntax(NULL, LOG_WARNING, path, line, 0, "'random-seed-mode' has been deprecated, ignoring.");
- else if (streq(field, "beep"))
- r = free_and_strdup(&config->beep, p);
+ else if (STR_IN_SET(field, "timeout", "editor", "auto-entries", "auto-firmware",
+ "auto-poweroff", "auto-reboot", "beep", "reboot-for-bitlocker",
+ "secure-boot-enroll", "console-mode"))
+ r = 0; /* we don't parse these in userspace, but they are OK */
else {
log_syntax(NULL, LOG_WARNING, path, line, 0, "Unknown line '%s', ignoring.", field);
continue;
@@ -1500,7 +1484,7 @@ static int print_cmdline(
}
if (final_cmdline)
- printf(" finalCmdline: %s\n", final_cmdline);
+ printf(" options: %s\n", final_cmdline);
return 0;
}
@@ -1560,7 +1544,7 @@ static int json_cmdline(
v, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(def_cmdline, "ukiCmdline", JSON_BUILD_STRING(def_cmdline)),
JSON_BUILD_PAIR("addons", JSON_BUILD_VARIANT(addons_array)),
- JSON_BUILD_PAIR_CONDITION(final_cmdline, "finalCmdline", JSON_BUILD_STRING(final_cmdline))));
+ JSON_BUILD_PAIR_CONDITION(final_cmdline, "options", JSON_BUILD_STRING(final_cmdline))));
if (r < 0)
return log_oom();
return 0;
diff --git a/src/shared/bootspec.h b/src/shared/bootspec.h
index 9ae88d78aa..5f9a0d7056 100644
--- a/src/shared/bootspec.h
+++ b/src/shared/bootspec.h
@@ -65,12 +65,6 @@ typedef struct BootEntry {
typedef struct BootConfig {
char *default_pattern;
- char *timeout;
- char *editor;
- char *auto_entries;
- char *auto_firmware;
- char *console_mode;
- char *beep;
char *entry_oneshot;
char *entry_default;
diff --git a/src/shared/bpf-dlopen.c b/src/shared/bpf-dlopen.c
index 15301aee60..70b1ffbf99 100644
--- a/src/shared/bpf-dlopen.c
+++ b/src/shared/bpf-dlopen.c
@@ -18,26 +18,28 @@
#define MODERN_LIBBPF 0
#endif
-struct bpf_link* (*sym_bpf_program__attach_cgroup)(const struct bpf_program *, int);
-struct bpf_link* (*sym_bpf_program__attach_lsm)(const struct bpf_program *);
-int (*sym_bpf_link__fd)(const struct bpf_link *);
-int (*sym_bpf_link__destroy)(struct bpf_link *);
-int (*sym_bpf_map__fd)(const struct bpf_map *);
-const char* (*sym_bpf_map__name)(const struct bpf_map *);
+DLSYM_FUNCTION(bpf_program__attach_cgroup);
+DLSYM_FUNCTION(bpf_program__attach_lsm);
+DLSYM_FUNCTION(bpf_link__fd);
+DLSYM_FUNCTION(bpf_link__destroy);
+DLSYM_FUNCTION(bpf_map__fd);
+DLSYM_FUNCTION(bpf_map__name);
+DLSYM_FUNCTION(bpf_map__set_max_entries);
+DLSYM_FUNCTION(bpf_map_update_elem);
+DLSYM_FUNCTION(bpf_map_delete_elem);
+DLSYM_FUNCTION(bpf_map__set_inner_map_fd);
+DLSYM_FUNCTION(bpf_object__open_skeleton);
+DLSYM_FUNCTION(bpf_object__load_skeleton);
+DLSYM_FUNCTION(bpf_object__attach_skeleton);
+DLSYM_FUNCTION(bpf_object__detach_skeleton);
+DLSYM_FUNCTION(bpf_object__destroy_skeleton);
+DLSYM_FUNCTION(bpf_program__name);
+DLSYM_FUNCTION(libbpf_set_print);
+DLSYM_FUNCTION(libbpf_get_error);
+
+/* new symbols available from libbpf 0.7.0 */
int (*sym_bpf_map_create)(enum bpf_map_type, const char *, __u32, __u32, __u32, const struct bpf_map_create_opts *);
-int (*sym_bpf_map__set_max_entries)(struct bpf_map *, __u32);
-int (*sym_bpf_map_update_elem)(int, const void *, const void *, __u64);
-int (*sym_bpf_map_delete_elem)(int, const void *);
-int (*sym_bpf_map__set_inner_map_fd)(struct bpf_map *, int);
-int (*sym_bpf_object__open_skeleton)(struct bpf_object_skeleton *, const struct bpf_object_open_opts *);
-int (*sym_bpf_object__load_skeleton)(struct bpf_object_skeleton *);
-int (*sym_bpf_object__attach_skeleton)(struct bpf_object_skeleton *);
-void (*sym_bpf_object__detach_skeleton)(struct bpf_object_skeleton *);
-void (*sym_bpf_object__destroy_skeleton)(struct bpf_object_skeleton *);
int (*sym_libbpf_probe_bpf_prog_type)(enum bpf_prog_type, const void *);
-const char* (*sym_bpf_program__name)(const struct bpf_program *);
-libbpf_print_fn_t (*sym_libbpf_set_print)(libbpf_print_fn_t);
-long (*sym_libbpf_get_error)(const void *);
/* compat symbols removed in libbpf 1.0 */
int (*sym_bpf_create_map)(enum bpf_map_type, int key_size, int value_size, int max_entries, __u32 map_flags);
diff --git a/src/shared/bpf-dlopen.h b/src/shared/bpf-dlopen.h
index 0750abc56b..859405e3c6 100644
--- a/src/shared/bpf-dlopen.h
+++ b/src/shared/bpf-dlopen.h
@@ -7,27 +7,28 @@
#include <bpf/libbpf.h>
#include "bpf-compat.h"
+#include "dlfcn-util.h"
-extern struct bpf_link* (*sym_bpf_program__attach_cgroup)(const struct bpf_program *, int);
-extern struct bpf_link* (*sym_bpf_program__attach_lsm)(const struct bpf_program *);
-extern int (*sym_bpf_link__fd)(const struct bpf_link *);
-extern int (*sym_bpf_link__destroy)(struct bpf_link *);
-extern int (*sym_bpf_map__fd)(const struct bpf_map *);
-extern const char* (*sym_bpf_map__name)(const struct bpf_map *);
-extern int (*sym_bpf_map__set_max_entries)(struct bpf_map *, __u32);
-extern int (*sym_bpf_map_update_elem)(int, const void *, const void *, __u64);
-extern int (*sym_bpf_map_delete_elem)(int, const void *);
-extern int (*sym_bpf_map__set_inner_map_fd)(struct bpf_map *, int);
+DLSYM_PROTOTYPE(bpf_program__attach_cgroup);
+DLSYM_PROTOTYPE(bpf_program__attach_lsm);
+DLSYM_PROTOTYPE(bpf_link__fd);
+DLSYM_PROTOTYPE(bpf_link__destroy);
+DLSYM_PROTOTYPE(bpf_map__fd);
+DLSYM_PROTOTYPE(bpf_map__name);
+DLSYM_PROTOTYPE(bpf_map__set_max_entries);
+DLSYM_PROTOTYPE(bpf_map_update_elem);
+DLSYM_PROTOTYPE(bpf_map_delete_elem);
+DLSYM_PROTOTYPE(bpf_map__set_inner_map_fd);
/* The *_skeleton APIs are autogenerated by bpftool, the targets can be found
* in ./build/src/core/bpf/socket_bind/socket-bind.skel.h */
-extern int (*sym_bpf_object__open_skeleton)(struct bpf_object_skeleton *, const struct bpf_object_open_opts *);
-extern int (*sym_bpf_object__load_skeleton)(struct bpf_object_skeleton *);
-extern int (*sym_bpf_object__attach_skeleton)(struct bpf_object_skeleton *);
-extern void (*sym_bpf_object__detach_skeleton)(struct bpf_object_skeleton *);
-extern void (*sym_bpf_object__destroy_skeleton)(struct bpf_object_skeleton *);
-extern const char* (*sym_bpf_program__name)(const struct bpf_program *);
-extern libbpf_print_fn_t (*sym_libbpf_set_print)(libbpf_print_fn_t);
-extern long (*sym_libbpf_get_error)(const void *);
+DLSYM_PROTOTYPE(bpf_object__open_skeleton);
+DLSYM_PROTOTYPE(bpf_object__load_skeleton);
+DLSYM_PROTOTYPE(bpf_object__attach_skeleton);
+DLSYM_PROTOTYPE(bpf_object__detach_skeleton);
+DLSYM_PROTOTYPE(bpf_object__destroy_skeleton);
+DLSYM_PROTOTYPE(bpf_program__name);
+DLSYM_PROTOTYPE(libbpf_set_print);
+DLSYM_PROTOTYPE(libbpf_get_error);
#endif
diff --git a/src/shared/bus-map-properties.c b/src/shared/bus-map-properties.c
index 809759db80..a4833a5c1e 100644
--- a/src/shared/bus-map-properties.c
+++ b/src/shared/bus-map-properties.c
@@ -8,21 +8,12 @@
int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
sd_id128_t *p = userdata;
- const void *v;
- size_t n;
int r;
- r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, &v, &n);
+ r = bus_message_read_id128(m, p);
if (r < 0)
return bus_log_parse_error_debug(r);
- if (n == 0)
- *p = SD_ID128_NULL;
- else if (n == 16)
- memcpy((*p).bytes, v, n);
- else
- return -EINVAL;
-
return 0;
}
diff --git a/src/shared/bus-unit-util.c b/src/shared/bus-unit-util.c
index dae7dd5e36..0fedafd881 100644
--- a/src/shared/bus-unit-util.c
+++ b/src/shared/bus-unit-util.c
@@ -497,7 +497,7 @@ static int bus_append_nft_set(sd_bus_message *m, const char *field, const char *
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s", field);
q = tuple;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE, &source_str, &nfproto_str, &table, &set, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE, &source_str, &nfproto_str, &table, &set);
if (r == -ENOMEM)
return log_oom();
if (r != 4 || !isempty(q))
@@ -1419,12 +1419,12 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
if (r < 0)
return log_error_errno(r, "Failed to parse resource limit: %s", eq);
- r = sd_bus_message_append(m, "(sv)", field, "t", l.rlim_max);
+ r = sd_bus_message_append(m, "(sv)", field, "t", (uint64_t) l.rlim_max);
if (r < 0)
return bus_log_create_error(r);
sn = strjoina(field, "Soft");
- r = sd_bus_message_append(m, "(sv)", sn, "t", l.rlim_cur);
+ r = sd_bus_message_append(m, "(sv)", sn, "t", (uint64_t) l.rlim_cur);
if (r < 0)
return bus_log_create_error(r);
@@ -1894,7 +1894,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
break;
q = tuple;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &first, &second, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &first, &second);
if (r < 0)
return log_error_errno(r, "Failed to parse MountImages= property: %s", eq);
if (r == 0)
@@ -1926,7 +1926,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
for (;;) {
_cleanup_free_ char *partition = NULL, *mount_options = NULL;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
if (r < 0)
return log_error_errno(r, "Failed to parse MountImages= property: %s", eq);
if (r == 0)
@@ -2027,7 +2027,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
for (;;) {
_cleanup_free_ char *partition = NULL, *mount_options = NULL;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
if (r < 0)
return log_error_errno(r, "Failed to parse ExtensionImages= property: %s", eq);
if (r == 0)
@@ -2088,7 +2088,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
break;
const char *t = tuple;
- r = extract_many_words(&t, ":", EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS, &source, &destination, NULL);
+ r = extract_many_words(&t, ":", EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS, &source, &destination);
if (r <= 0)
return log_error_errno(r ?: SYNTHETIC_ERRNO(EINVAL), "Failed to parse argument: %m");
@@ -2167,7 +2167,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
return bus_log_create_error(r);
STRV_FOREACH_PAIR(source, destination, symlinks) {
- r = sd_bus_message_append(m, "(sst)", *source, *destination, 0);
+ r = sd_bus_message_append(m, "(sst)", *source, *destination, UINT64_C(0));
if (r < 0)
return bus_log_create_error(r);
}
@@ -2937,3 +2937,96 @@ int bus_service_manager_reload(sd_bus *bus) {
return 0;
}
+
+/* Wait for 1.5 seconds at maximum for freeze operation */
+#define FREEZE_BUS_CALL_TIMEOUT (1500 * USEC_PER_MSEC)
+
+int unit_freezer_new(const char *name, UnitFreezer *ret) {
+ _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+ _cleanup_free_ char *namedup = NULL;
+ int r;
+
+ assert(name);
+ assert(ret);
+
+ namedup = strdup(name);
+ if (!namedup)
+ return log_oom_debug();
+
+ r = bus_connect_system_systemd(&bus);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to open connection to systemd: %m");
+
+ (void) sd_bus_set_method_call_timeout(bus, FREEZE_BUS_CALL_TIMEOUT);
+
+ *ret = (UnitFreezer) {
+ .name = TAKE_PTR(namedup),
+ .bus = TAKE_PTR(bus),
+ };
+ return 0;
+}
+
+void unit_freezer_done(UnitFreezer *f) {
+ assert(f);
+
+ f->name = mfree(f->name);
+ f->bus = sd_bus_flush_close_unref(f->bus);
+}
+
+static int unit_freezer_action(UnitFreezer *f, bool freeze) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ int r;
+
+ assert(f);
+ assert(f->name);
+ assert(f->bus);
+
+ r = bus_call_method(f->bus, bus_systemd_mgr,
+ freeze ? "FreezeUnit" : "ThawUnit",
+ &error,
+ /* reply = */ NULL,
+ "s",
+ f->name);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to %s unit %s: %s",
+ freeze ? "freeze" : "thaw", f->name, bus_error_message(&error, r));
+
+ return 0;
+}
+
+int unit_freezer_freeze(UnitFreezer *f) {
+ return unit_freezer_action(f, true);
+}
+
+int unit_freezer_thaw(UnitFreezer *f) {
+ return unit_freezer_action(f, false);
+}
+
+int unit_freezer_new_freeze(const char *name, UnitFreezer *ret) {
+ _cleanup_(unit_freezer_done) UnitFreezer f = {};
+ int r;
+
+ assert(name);
+ assert(ret);
+
+ r = unit_freezer_new(name, &f);
+ if (r < 0)
+ return r;
+
+ r = unit_freezer_freeze(&f);
+ if (r < 0)
+ return r;
+
+ *ret = TAKE_STRUCT(f);
+ return 0;
+}
+
+void unit_freezer_done_thaw(UnitFreezer *f) {
+ assert(f);
+
+ if (!f->name)
+ return;
+
+ (void) unit_freezer_thaw(f);
+ unit_freezer_done(f);
+}
diff --git a/src/shared/bus-unit-util.h b/src/shared/bus-unit-util.h
index d52c8475ca..a1518158ff 100644
--- a/src/shared/bus-unit-util.h
+++ b/src/shared/bus-unit-util.h
@@ -35,3 +35,18 @@ int unit_load_state(sd_bus *bus, const char *name, char **load_state);
int unit_info_compare(const UnitInfo *a, const UnitInfo *b);
int bus_service_manager_reload(sd_bus *bus);
+
+typedef struct UnitFreezer {
+ char *name;
+ sd_bus *bus;
+} UnitFreezer;
+
+int unit_freezer_new(const char *name, UnitFreezer *ret);
+void unit_freezer_done(UnitFreezer *f);
+
+int unit_freezer_freeze(UnitFreezer *f);
+int unit_freezer_thaw(UnitFreezer *f);
+
+int unit_freezer_new_freeze(const char *name, UnitFreezer *ret);
+
+void unit_freezer_done_thaw(UnitFreezer *f);
diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c
index eea6c2321a..88e1249b8e 100644
--- a/src/shared/bus-util.c
+++ b/src/shared/bus-util.c
@@ -754,3 +754,32 @@ int bus_query_sender_pidref(
return bus_creds_get_pidref(creds, ret);
}
+
+int bus_message_read_id128(sd_bus_message *m, sd_id128_t *ret) {
+ const void *a;
+ size_t sz;
+ int r;
+
+ assert(m);
+
+ r = sd_bus_message_read_array(m, 'y', &a, &sz);
+ if (r < 0)
+ return r;
+
+ switch (sz) {
+ case 0:
+ if (ret)
+ *ret = SD_ID128_NULL;
+ break;
+
+ case sizeof(sd_id128_t):
+ if (ret)
+ memcpy(ret, a, sz);
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
diff --git a/src/shared/bus-util.h b/src/shared/bus-util.h
index 1004c79406..d55665f502 100644
--- a/src/shared/bus-util.h
+++ b/src/shared/bus-util.h
@@ -77,3 +77,5 @@ int bus_property_get_string_set(sd_bus *bus, const char *path, const char *inter
int bus_creds_get_pidref(sd_bus_creds *c, PidRef *ret);
int bus_query_sender_pidref(sd_bus_message *m, PidRef *ret);
+
+int bus_message_read_id128(sd_bus_message *m, sd_id128_t *ret);
diff --git a/src/shared/cgroup-setup.c b/src/shared/cgroup-setup.c
index 934a16eaf3..d9cca6ced4 100644
--- a/src/shared/cgroup-setup.c
+++ b/src/shared/cgroup-setup.c
@@ -51,7 +51,7 @@ static int cg_any_controller_used_for_v1(void) {
continue;
const char *p = *line;
- r = extract_many_words(&p, NULL, 0, &name, &hierarchy_id, &num, &enabled, NULL);
+ r = extract_many_words(&p, NULL, 0, &name, &hierarchy_id, &num, &enabled);
if (r < 0)
return log_debug_errno(r, "Error parsing /proc/cgroups line, ignoring: %m");
else if (r < 4) {
@@ -81,9 +81,6 @@ static int cg_any_controller_used_for_v1(void) {
bool cg_is_unified_wanted(void) {
static thread_local int wanted = -1;
- bool b;
- const bool is_default = DEFAULT_HIERARCHY == CGROUP_UNIFIED_ALL;
- _cleanup_free_ char *c = NULL;
int r;
/* If we have a cached value, return that. */
@@ -96,21 +93,20 @@ bool cg_is_unified_wanted(void) {
return (wanted = r >= CGROUP_UNIFIED_ALL);
/* If we were explicitly passed systemd.unified_cgroup_hierarchy, respect that. */
+ bool b;
r = proc_cmdline_get_bool("systemd.unified_cgroup_hierarchy", /* flags = */ 0, &b);
if (r > 0)
return (wanted = b);
/* If we passed cgroup_no_v1=all with no other instructions, it seems highly unlikely that we want to
* use hybrid or legacy hierarchy. */
+ _cleanup_free_ char *c = NULL;
r = proc_cmdline_get_key("cgroup_no_v1", 0, &c);
if (r > 0 && streq_ptr(c, "all"))
return (wanted = true);
/* If any controller is in use as v1, don't use unified. */
- if (cg_any_controller_used_for_v1() > 0)
- return (wanted = false);
-
- return (wanted = is_default);
+ return (wanted = (cg_any_controller_used_for_v1() <= 0));
}
bool cg_is_legacy_wanted(void) {
@@ -132,10 +128,6 @@ bool cg_is_legacy_wanted(void) {
bool cg_is_hybrid_wanted(void) {
static thread_local int wanted = -1;
int r;
- bool b;
- const bool is_default = DEFAULT_HIERARCHY >= CGROUP_UNIFIED_SYSTEMD;
- /* We default to true if the default is "hybrid", obviously, but also when the default is "unified",
- * because if we get called, it means that unified hierarchy was not mounted. */
/* If we have a cached value, return that. */
if (wanted >= 0)
@@ -146,12 +138,33 @@ bool cg_is_hybrid_wanted(void) {
return (wanted = false);
/* Otherwise, let's see what the kernel command line has to say. Since checking is expensive, cache
- * a non-error result. */
+ * a non-error result.
+ * The meaning of the kernel option is reversed wrt. to the return value of this function, hence the
+ * negation. */
+ bool b;
r = proc_cmdline_get_bool("systemd.legacy_systemd_cgroup_controller", /* flags = */ 0, &b);
+ if (r > 0)
+ return (wanted = !b);
- /* The meaning of the kernel option is reversed wrt. to the return value of this function, hence the
- * negation. */
- return (wanted = r > 0 ? !b : is_default);
+ /* The default hierarchy is "unified". But if this is reached, it means that unified hierarchy was
+ * not mounted, so return true too. */
+ return (wanted = true);
+}
+
+bool cg_is_legacy_force_enabled(void) {
+ bool force;
+
+ if (!cg_is_legacy_wanted())
+ return false;
+
+ /* If in container, we have to follow host's cgroup hierarchy. */
+ if (detect_container() > 0)
+ return true;
+
+ if (proc_cmdline_get_bool("SYSTEMD_CGROUP_ENABLE_LEGACY_FORCE", /* flags = */ 0, &force) < 0)
+ return false;
+
+ return force;
}
int cg_weight_parse(const char *s, uint64_t *ret) {
diff --git a/src/shared/cgroup-setup.h b/src/shared/cgroup-setup.h
index 1b6f0716c6..c35884ee4d 100644
--- a/src/shared/cgroup-setup.h
+++ b/src/shared/cgroup-setup.h
@@ -10,6 +10,7 @@
bool cg_is_unified_wanted(void);
bool cg_is_legacy_wanted(void);
bool cg_is_hybrid_wanted(void);
+bool cg_is_legacy_force_enabled(void);
int cg_weight_parse(const char *s, uint64_t *ret);
int cg_cpu_weight_parse(const char *s, uint64_t *ret);
diff --git a/src/shared/condition.c b/src/shared/condition.c
index 385ceee332..d8d366a44c 100644
--- a/src/shared/condition.c
+++ b/src/shared/condition.c
@@ -751,9 +751,9 @@ static int condition_test_needs_update(Condition *c, char **env) {
assert(c->parameter);
assert(c->type == CONDITION_NEEDS_UPDATE);
- r = proc_cmdline_get_bool("systemd.condition-needs-update", /* flags = */ 0, &b);
+ r = proc_cmdline_get_bool("systemd.condition_needs_update", /* flags = */ 0, &b);
if (r < 0)
- log_debug_errno(r, "Failed to parse systemd.condition-needs-update= kernel command line argument, ignoring: %m");
+ log_debug_errno(r, "Failed to parse systemd.condition_needs_update= kernel command line argument, ignoring: %m");
if (r > 0)
return b;
@@ -1024,7 +1024,7 @@ static int condition_test_psi(Condition *c, char **env) {
"io";
p = c->parameter;
- r = extract_many_words(&p, ":", 0, &first, &second, NULL);
+ r = extract_many_words(&p, ":", 0, &first, &second);
if (r <= 0)
return log_debug_errno(r < 0 ? r : SYNTHETIC_ERRNO(EINVAL), "Failed to parse condition parameter %s: %m", c->parameter);
/* If only one parameter is passed, then we look at the global system pressure rather than a specific cgroup. */
@@ -1099,7 +1099,7 @@ static int condition_test_psi(Condition *c, char **env) {
/* If a value including a specific timespan (in the intervals allowed by the kernel),
* parse it, otherwise we assume just a plain percentage that will be checked if it is
* smaller or equal to the current pressure average over 5 minutes. */
- r = extract_many_words(&value, "/", 0, &third, &fourth, NULL);
+ r = extract_many_words(&value, "/", 0, &third, &fourth);
if (r <= 0)
return log_debug_errno(r < 0 ? r : SYNTHETIC_ERRNO(EINVAL), "Failed to parse condition parameter %s: %m", c->parameter);
if (r == 1)
diff --git a/src/shared/cpu-set-util.c b/src/shared/cpu-set-util.c
index d096576cd6..1112de1333 100644
--- a/src/shared/cpu-set-util.c
+++ b/src/shared/cpu-set-util.c
@@ -11,6 +11,7 @@
#include "errno-util.h"
#include "extract-word.h"
#include "fd-util.h"
+#include "hexdecoct.h"
#include "log.h"
#include "macro.h"
#include "memory-util.h"
@@ -82,6 +83,63 @@ char *cpu_set_to_range_string(const CPUSet *set) {
return TAKE_PTR(str) ?: strdup("");
}
+char* cpu_set_to_mask_string(const CPUSet *a) {
+ _cleanup_free_ char *str = NULL;
+ size_t len = 0;
+ bool found_nonzero = false;
+
+ assert(a);
+
+ /* Return CPU set in hexadecimal bitmap mask, e.g.
+ * CPU 0 -> "1"
+ * CPU 1 -> "2"
+ * CPU 0,1 -> "3"
+ * CPU 0-3 -> "f"
+ * CPU 0-7 -> "ff"
+ * CPU 4-7 -> "f0"
+ * CPU 7 -> "80"
+ * None -> "0"
+ *
+ * When there are more than 32 CPUs, separate every 32 CPUs by comma, e.g.
+ * CPU 0-47 -> "ffff,ffffffff"
+ * CPU 0-63 -> "ffffffff,ffffffff"
+ * CPU 0-71 -> "ff,ffffffff,ffffffff" */
+
+ for (ssize_t i = a->allocated * 8; i >= 0; i -= 4) {
+ uint8_t m = 0;
+
+ for (size_t j = 0; j < 4; j++)
+ if (CPU_ISSET_S(i + j, a->allocated, a->set))
+ m |= 1U << j;
+
+ if (!found_nonzero)
+ found_nonzero = m > 0;
+
+ if (!found_nonzero && m == 0)
+ /* Skip leading zeros */
+ continue;
+
+ if (!GREEDY_REALLOC(str, len + 3))
+ return NULL;
+
+ str[len++] = hexchar(m);
+ if (i >= 4 && i % 32 == 0)
+ /* Separate by comma for each 32 CPUs. */
+ str[len++] = ',';
+ str[len] = 0;
+ }
+
+ return TAKE_PTR(str) ?: strdup("0");
+}
+
+CPUSet* cpu_set_free(CPUSet *c) {
+ if (!c)
+ return c;
+
+ cpu_set_reset(c);
+ return mfree(c);
+}
+
int cpu_set_realloc(CPUSet *cpu_set, unsigned ncpus) {
size_t need;
@@ -290,3 +348,22 @@ int cpu_set_from_dbus(const uint8_t *bits, size_t size, CPUSet *set) {
*set = TAKE_STRUCT(s);
return 0;
}
+
+int cpu_mask_add_all(CPUSet *mask) {
+ long m;
+ int r;
+
+ assert(mask);
+
+ m = sysconf(_SC_NPROCESSORS_ONLN);
+ if (m < 0)
+ return -errno;
+
+ for (unsigned i = 0; i < (unsigned) m; i++) {
+ r = cpu_set_add(mask, i);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
diff --git a/src/shared/cpu-set-util.h b/src/shared/cpu-set-util.h
index 3c63a58826..618fe1b0a3 100644
--- a/src/shared/cpu-set-util.h
+++ b/src/shared/cpu-set-util.h
@@ -19,11 +19,15 @@ static inline void cpu_set_reset(CPUSet *a) {
*a = (CPUSet) {};
}
+CPUSet* cpu_set_free(CPUSet *c);
+DEFINE_TRIVIAL_CLEANUP_FUNC(CPUSet*, cpu_set_free);
+
int cpu_set_add_all(CPUSet *a, const CPUSet *b);
int cpu_set_add(CPUSet *a, unsigned cpu);
char* cpu_set_to_string(const CPUSet *a);
char *cpu_set_to_range_string(const CPUSet *a);
+char* cpu_set_to_mask_string(const CPUSet *a);
int cpu_set_realloc(CPUSet *cpu_set, unsigned ncpus);
int parse_cpu_set_full(
@@ -50,3 +54,4 @@ int cpu_set_to_dbus(const CPUSet *set, uint8_t **ret, size_t *allocated);
int cpu_set_from_dbus(const uint8_t *bits, size_t size, CPUSet *set);
int cpus_in_affinity_mask(void);
+int cpu_mask_add_all(CPUSet *mask);
diff --git a/src/shared/creds-util.c b/src/shared/creds-util.c
index a495f82b87..2d5846a06f 100644
--- a/src/shared/creds-util.c
+++ b/src/shared/creds-util.c
@@ -1489,7 +1489,7 @@ int decrypt_credential_and_warn(
if (validate_name && !streq(embedded_name, validate_name)) {
- r = getenv_bool_secure("SYSTEMD_CREDENTIAL_VALIDATE_NAME");
+ r = secure_getenv_bool("SYSTEMD_CREDENTIAL_VALIDATE_NAME");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_CREDENTIAL_VALIDATE_NAME: %m");
if (r != 0)
@@ -1505,7 +1505,7 @@ int decrypt_credential_and_warn(
if (le64toh(m->not_after) != USEC_INFINITY && le64toh(m->not_after) < validate_timestamp) {
- r = getenv_bool_secure("SYSTEMD_CREDENTIAL_VALIDATE_NOT_AFTER");
+ r = secure_getenv_bool("SYSTEMD_CREDENTIAL_VALIDATE_NOT_AFTER");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_CREDENTIAL_VALIDATE_NOT_AFTER: %m");
if (r != 0)
diff --git a/src/shared/cryptsetup-util.c b/src/shared/cryptsetup-util.c
index ab5764dc10..77ac85965f 100644
--- a/src/shared/cryptsetup-util.c
+++ b/src/shared/cryptsetup-util.c
@@ -9,58 +9,60 @@
#if HAVE_LIBCRYPTSETUP
static void *cryptsetup_dl = NULL;
-int (*sym_crypt_activate_by_passphrase)(struct crypt_device *cd, const char *name, int keyslot, const char *passphrase, size_t passphrase_size, uint32_t flags);
+DLSYM_FUNCTION(crypt_activate_by_passphrase);
#if HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY
-int (*sym_crypt_activate_by_signed_key)(struct crypt_device *cd, const char *name, const char *volume_key, size_t volume_key_size, const char *signature, size_t signature_size, uint32_t flags);
+DLSYM_FUNCTION(crypt_activate_by_signed_key);
#endif
-int (*sym_crypt_activate_by_volume_key)(struct crypt_device *cd, const char *name, const char *volume_key, size_t volume_key_size, uint32_t flags);
-int (*sym_crypt_deactivate_by_name)(struct crypt_device *cd, const char *name, uint32_t flags);
-int (*sym_crypt_format)(struct crypt_device *cd, const char *type, const char *cipher, const char *cipher_mode, const char *uuid, const char *volume_key, size_t volume_key_size, void *params);
-void (*sym_crypt_free)(struct crypt_device *cd);
-const char *(*sym_crypt_get_cipher)(struct crypt_device *cd);
-const char *(*sym_crypt_get_cipher_mode)(struct crypt_device *cd);
-uint64_t (*sym_crypt_get_data_offset)(struct crypt_device *cd);
-const char *(*sym_crypt_get_device_name)(struct crypt_device *cd);
-const char *(*sym_crypt_get_dir)(void);
-const char *(*sym_crypt_get_type)(struct crypt_device *cd);
-const char *(*sym_crypt_get_uuid)(struct crypt_device *cd);
-int (*sym_crypt_get_verity_info)(struct crypt_device *cd, struct crypt_params_verity *vp);
-int (*sym_crypt_get_volume_key_size)(struct crypt_device *cd);
-int (*sym_crypt_init)(struct crypt_device **cd, const char *device);
-int (*sym_crypt_init_by_name)(struct crypt_device **cd, const char *name);
-int (*sym_crypt_keyslot_add_by_volume_key)(struct crypt_device *cd, int keyslot, const char *volume_key, size_t volume_key_size, const char *passphrase, size_t passphrase_size);
-int (*sym_crypt_keyslot_destroy)(struct crypt_device *cd, int keyslot);
-int (*sym_crypt_keyslot_max)(const char *type);
-int (*sym_crypt_load)(struct crypt_device *cd, const char *requested_type, void *params);
-int (*sym_crypt_resize)(struct crypt_device *cd, const char *name, uint64_t new_size);
-int (*sym_crypt_resume_by_passphrase)(struct crypt_device *cd, const char *name, int keyslot, const char *passphrase, size_t passphrase_size);
-int (*sym_crypt_set_data_device)(struct crypt_device *cd, const char *device);
-void (*sym_crypt_set_debug_level)(int level);
-void (*sym_crypt_set_log_callback)(struct crypt_device *cd, void (*log)(int level, const char *msg, void *usrptr), void *usrptr);
+DLSYM_FUNCTION(crypt_activate_by_volume_key);
+DLSYM_FUNCTION(crypt_deactivate_by_name);
+DLSYM_FUNCTION(crypt_format);
+DLSYM_FUNCTION(crypt_free);
+DLSYM_FUNCTION(crypt_get_cipher);
+DLSYM_FUNCTION(crypt_get_cipher_mode);
+DLSYM_FUNCTION(crypt_get_data_offset);
+DLSYM_FUNCTION(crypt_get_device_name);
+DLSYM_FUNCTION(crypt_get_dir);
+DLSYM_FUNCTION(crypt_get_type);
+DLSYM_FUNCTION(crypt_get_uuid);
+DLSYM_FUNCTION(crypt_get_verity_info);
+DLSYM_FUNCTION(crypt_get_volume_key_size);
+DLSYM_FUNCTION(crypt_init);
+DLSYM_FUNCTION(crypt_init_by_name);
+DLSYM_FUNCTION(crypt_keyslot_add_by_volume_key);
+DLSYM_FUNCTION(crypt_keyslot_destroy);
+DLSYM_FUNCTION(crypt_keyslot_max);
+DLSYM_FUNCTION(crypt_load);
+DLSYM_FUNCTION(crypt_resize);
+DLSYM_FUNCTION(crypt_resume_by_passphrase);
+DLSYM_FUNCTION(crypt_set_data_device);
+DLSYM_FUNCTION(crypt_set_debug_level);
+DLSYM_FUNCTION(crypt_set_log_callback);
#if HAVE_CRYPT_SET_METADATA_SIZE
-int (*sym_crypt_set_metadata_size)(struct crypt_device *cd, uint64_t metadata_size, uint64_t keyslots_size);
+DLSYM_FUNCTION(crypt_set_metadata_size);
#endif
-int (*sym_crypt_set_pbkdf_type)(struct crypt_device *cd, const struct crypt_pbkdf_type *pbkdf);
-int (*sym_crypt_suspend)(struct crypt_device *cd, const char *name);
-int (*sym_crypt_token_json_get)(struct crypt_device *cd, int token, const char **json);
-int (*sym_crypt_token_json_set)(struct crypt_device *cd, int token, const char *json);
+DLSYM_FUNCTION(crypt_set_pbkdf_type);
+DLSYM_FUNCTION(crypt_suspend);
+DLSYM_FUNCTION(crypt_token_json_get);
+DLSYM_FUNCTION(crypt_token_json_set);
#if HAVE_CRYPT_TOKEN_MAX
-int (*sym_crypt_token_max)(const char *type);
+DLSYM_FUNCTION(crypt_token_max);
#endif
-crypt_token_info (*sym_crypt_token_status)(struct crypt_device *cd, int token, const char **type);
-int (*sym_crypt_volume_key_get)(struct crypt_device *cd, int keyslot, char *volume_key, size_t *volume_key_size, const char *passphrase, size_t passphrase_size);
+DLSYM_FUNCTION(crypt_token_status);
+DLSYM_FUNCTION(crypt_volume_key_get);
#if HAVE_CRYPT_REENCRYPT_INIT_BY_PASSPHRASE
-int (*sym_crypt_reencrypt_init_by_passphrase)(struct crypt_device *cd, const char *name, const char *passphrase, size_t passphrase_size, int keyslot_old, int keyslot_new, const char *cipher, const char *cipher_mode, const struct crypt_params_reencrypt *params);
+DLSYM_FUNCTION(crypt_reencrypt_init_by_passphrase);
#endif
#if HAVE_CRYPT_REENCRYPT
-int (*sym_crypt_reencrypt)(struct crypt_device *cd, int (*progress)(uint64_t size, uint64_t offset, void *usrptr));
+DISABLE_WARNING_DEPRECATED_DECLARATIONS;
+DLSYM_FUNCTION(crypt_reencrypt);
+REENABLE_WARNING;
#endif
-int (*sym_crypt_metadata_locking)(struct crypt_device *cd, int enable);
+DLSYM_FUNCTION(crypt_metadata_locking);
#if HAVE_CRYPT_SET_DATA_OFFSET
-int (*sym_crypt_set_data_offset)(struct crypt_device *cd, uint64_t data_offset);
+DLSYM_FUNCTION(crypt_set_data_offset);
#endif
-int (*sym_crypt_header_restore)(struct crypt_device *cd, const char *requested_type, const char *backup_file);
-int (*sym_crypt_volume_key_keyring)(struct crypt_device *cd, int enable);
+DLSYM_FUNCTION(crypt_header_restore);
+DLSYM_FUNCTION(crypt_volume_key_keyring);
/* Unfortunately libcryptsetup provides neither an environment variable to redirect where to look for token
* modules, nor does it have an API to change the token lookup path at runtime. The maintainers suggest using
diff --git a/src/shared/cryptsetup-util.h b/src/shared/cryptsetup-util.h
index 5ff439d9c2..8a4416b4fc 100644
--- a/src/shared/cryptsetup-util.h
+++ b/src/shared/cryptsetup-util.h
@@ -2,6 +2,7 @@
#pragma once
#include "alloc-util.h"
+#include "dlfcn-util.h"
#include "json.h"
#include "macro.h"
@@ -16,43 +17,43 @@
#define CRYPT_ACTIVATE_NO_WRITE_WORKQUEUE (1 << 25)
#endif
-extern int (*sym_crypt_activate_by_passphrase)(struct crypt_device *cd, const char *name, int keyslot, const char *passphrase, size_t passphrase_size, uint32_t flags);
+DLSYM_PROTOTYPE(crypt_activate_by_passphrase);
#if HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY
-extern int (*sym_crypt_activate_by_signed_key)(struct crypt_device *cd, const char *name, const char *volume_key, size_t volume_key_size, const char *signature, size_t signature_size, uint32_t flags);
+DLSYM_PROTOTYPE(crypt_activate_by_signed_key);
#endif
-extern int (*sym_crypt_activate_by_volume_key)(struct crypt_device *cd, const char *name, const char *volume_key, size_t volume_key_size, uint32_t flags);
-extern int (*sym_crypt_deactivate_by_name)(struct crypt_device *cd, const char *name, uint32_t flags);
-extern int (*sym_crypt_format)(struct crypt_device *cd, const char *type, const char *cipher, const char *cipher_mode, const char *uuid, const char *volume_key, size_t volume_key_size, void *params);
-extern void (*sym_crypt_free)(struct crypt_device *cd);
-extern const char *(*sym_crypt_get_cipher)(struct crypt_device *cd);
-extern const char *(*sym_crypt_get_cipher_mode)(struct crypt_device *cd);
-extern uint64_t (*sym_crypt_get_data_offset)(struct crypt_device *cd);
-extern const char *(*sym_crypt_get_device_name)(struct crypt_device *cd);
-extern const char *(*sym_crypt_get_dir)(void);
-extern const char *(*sym_crypt_get_type)(struct crypt_device *cd);
-extern const char *(*sym_crypt_get_uuid)(struct crypt_device *cd);
-extern int (*sym_crypt_get_verity_info)(struct crypt_device *cd, struct crypt_params_verity *vp);
-extern int (*sym_crypt_get_volume_key_size)(struct crypt_device *cd);
-extern int (*sym_crypt_init)(struct crypt_device **cd, const char *device);
-extern int (*sym_crypt_init_by_name)(struct crypt_device **cd, const char *name);
-extern int (*sym_crypt_keyslot_add_by_volume_key)(struct crypt_device *cd, int keyslot, const char *volume_key, size_t volume_key_size, const char *passphrase, size_t passphrase_size);
-extern int (*sym_crypt_keyslot_destroy)(struct crypt_device *cd, int keyslot);
-extern int (*sym_crypt_keyslot_max)(const char *type);
-extern int (*sym_crypt_load)(struct crypt_device *cd, const char *requested_type, void *params);
-extern int (*sym_crypt_resize)(struct crypt_device *cd, const char *name, uint64_t new_size);
-extern int (*sym_crypt_resume_by_passphrase)(struct crypt_device *cd, const char *name, int keyslot, const char *passphrase, size_t passphrase_size);
-extern int (*sym_crypt_set_data_device)(struct crypt_device *cd, const char *device);
-extern void (*sym_crypt_set_debug_level)(int level);
-extern void (*sym_crypt_set_log_callback)(struct crypt_device *cd, void (*log)(int level, const char *msg, void *usrptr), void *usrptr);
+DLSYM_PROTOTYPE(crypt_activate_by_volume_key);
+DLSYM_PROTOTYPE(crypt_deactivate_by_name);
+DLSYM_PROTOTYPE(crypt_format);
+DLSYM_PROTOTYPE(crypt_free);
+DLSYM_PROTOTYPE(crypt_get_cipher);
+DLSYM_PROTOTYPE(crypt_get_cipher_mode);
+DLSYM_PROTOTYPE(crypt_get_data_offset);
+DLSYM_PROTOTYPE(crypt_get_device_name);
+DLSYM_PROTOTYPE(crypt_get_dir);
+DLSYM_PROTOTYPE(crypt_get_type);
+DLSYM_PROTOTYPE(crypt_get_uuid);
+DLSYM_PROTOTYPE(crypt_get_verity_info);
+DLSYM_PROTOTYPE(crypt_get_volume_key_size);
+DLSYM_PROTOTYPE(crypt_init);
+DLSYM_PROTOTYPE(crypt_init_by_name);
+DLSYM_PROTOTYPE(crypt_keyslot_add_by_volume_key);
+DLSYM_PROTOTYPE(crypt_keyslot_destroy);
+DLSYM_PROTOTYPE(crypt_keyslot_max);
+DLSYM_PROTOTYPE(crypt_load);
+DLSYM_PROTOTYPE(crypt_resize);
+DLSYM_PROTOTYPE(crypt_resume_by_passphrase);
+DLSYM_PROTOTYPE(crypt_set_data_device);
+DLSYM_PROTOTYPE(crypt_set_debug_level);
+DLSYM_PROTOTYPE(crypt_set_log_callback);
#if HAVE_CRYPT_SET_METADATA_SIZE
-extern int (*sym_crypt_set_metadata_size)(struct crypt_device *cd, uint64_t metadata_size, uint64_t keyslots_size);
+DLSYM_PROTOTYPE(crypt_set_metadata_size);
#endif
-extern int (*sym_crypt_set_pbkdf_type)(struct crypt_device *cd, const struct crypt_pbkdf_type *pbkdf);
-extern int (*sym_crypt_suspend)(struct crypt_device *cd, const char *name);
-extern int (*sym_crypt_token_json_get)(struct crypt_device *cd, int token, const char **json);
-extern int (*sym_crypt_token_json_set)(struct crypt_device *cd, int token, const char *json);
+DLSYM_PROTOTYPE(crypt_set_pbkdf_type);
+DLSYM_PROTOTYPE(crypt_suspend);
+DLSYM_PROTOTYPE(crypt_token_json_get);
+DLSYM_PROTOTYPE(crypt_token_json_set);
#if HAVE_CRYPT_TOKEN_MAX
-extern int (*sym_crypt_token_max)(const char *type);
+DLSYM_PROTOTYPE(crypt_token_max);
#else
/* As a fallback, use the same hard-coded value libcryptsetup uses internally. */
static inline int crypt_token_max(_unused_ const char *type) {
@@ -62,20 +63,22 @@ static inline int crypt_token_max(_unused_ const char *type) {
}
#define sym_crypt_token_max(type) crypt_token_max(type)
#endif
-extern crypt_token_info (*sym_crypt_token_status)(struct crypt_device *cd, int token, const char **type);
-extern int (*sym_crypt_volume_key_get)(struct crypt_device *cd, int keyslot, char *volume_key, size_t *volume_key_size, const char *passphrase, size_t passphrase_size);
+DLSYM_PROTOTYPE(crypt_token_status);
+DLSYM_PROTOTYPE(crypt_volume_key_get);
#if HAVE_CRYPT_REENCRYPT_INIT_BY_PASSPHRASE
-extern int (*sym_crypt_reencrypt_init_by_passphrase)(struct crypt_device *cd, const char *name, const char *passphrase, size_t passphrase_size, int keyslot_old, int keyslot_new, const char *cipher, const char *cipher_mode, const struct crypt_params_reencrypt *params);
+DLSYM_PROTOTYPE(crypt_reencrypt_init_by_passphrase);
#endif
#if HAVE_CRYPT_REENCRYPT
-extern int (*sym_crypt_reencrypt)(struct crypt_device *cd, int (*progress)(uint64_t size, uint64_t offset, void *usrptr));
+DISABLE_WARNING_DEPRECATED_DECLARATIONS;
+DLSYM_PROTOTYPE(crypt_reencrypt);
+REENABLE_WARNING;
#endif
-extern int (*sym_crypt_metadata_locking)(struct crypt_device *cd, int enable);
+DLSYM_PROTOTYPE(crypt_metadata_locking);
#if HAVE_CRYPT_SET_DATA_OFFSET
-extern int (*sym_crypt_set_data_offset)(struct crypt_device *cd, uint64_t data_offset);
+DLSYM_PROTOTYPE(crypt_set_data_offset);
#endif
-extern int (*sym_crypt_header_restore)(struct crypt_device *cd, const char *requested_type, const char *backup_file);
-extern int (*sym_crypt_volume_key_keyring)(struct crypt_device *cd, int enable);
+DLSYM_PROTOTYPE(crypt_header_restore);
+DLSYM_PROTOTYPE(crypt_volume_key_keyring);
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct crypt_device *, crypt_free, NULL);
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct crypt_device *, sym_crypt_free, NULL);
diff --git a/src/shared/discover-image.c b/src/shared/discover-image.c
index 6d4f7612ca..00d32a9c87 100644
--- a/src/shared/discover-image.c
+++ b/src/shared/discover-image.c
@@ -99,6 +99,15 @@ static const char* image_class_suffix_table[_IMAGE_CLASS_MAX] = {
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(image_class_suffix, ImageClass);
+static const char *const image_root_table[_IMAGE_CLASS_MAX] = {
+ [IMAGE_MACHINE] = "/var/lib/machines",
+ [IMAGE_PORTABLE] = "/var/lib/portables",
+ [IMAGE_SYSEXT] = "/var/lib/extensions",
+ [IMAGE_CONFEXT] = "/var/lib/confexts",
+};
+
+DEFINE_STRING_TABLE_LOOKUP_TO_STRING(image_root, ImageClass);
+
static Image *image_free(Image *i) {
assert(i);
@@ -1471,8 +1480,25 @@ int image_read_metadata(Image *i, const ImagePolicy *image_policy) {
case IMAGE_BLOCK: {
_cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
_cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
-
- r = loop_device_make_by_path(i->path, O_RDONLY, /* sector_size= */ UINT32_MAX, LO_FLAGS_PARTSCAN, LOCK_SH, &d);
+ DissectImageFlags flags =
+ DISSECT_IMAGE_GENERIC_ROOT |
+ DISSECT_IMAGE_REQUIRE_ROOT |
+ DISSECT_IMAGE_RELAX_VAR_CHECK |
+ DISSECT_IMAGE_READ_ONLY |
+ DISSECT_IMAGE_USR_NO_ROOT |
+ DISSECT_IMAGE_ADD_PARTITION_DEVICES |
+ DISSECT_IMAGE_PIN_PARTITION_DEVICES |
+ DISSECT_IMAGE_VALIDATE_OS |
+ DISSECT_IMAGE_VALIDATE_OS_EXT |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
+
+ r = loop_device_make_by_path(
+ i->path,
+ O_RDONLY,
+ /* sector_size= */ UINT32_MAX,
+ LO_FLAGS_PARTSCAN,
+ LOCK_SH,
+ &d);
if (r < 0)
return r;
@@ -1481,20 +1507,12 @@ int image_read_metadata(Image *i, const ImagePolicy *image_policy) {
/* verity= */ NULL,
/* mount_options= */ NULL,
image_policy,
- DISSECT_IMAGE_GENERIC_ROOT |
- DISSECT_IMAGE_REQUIRE_ROOT |
- DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_READ_ONLY |
- DISSECT_IMAGE_USR_NO_ROOT |
- DISSECT_IMAGE_ADD_PARTITION_DEVICES |
- DISSECT_IMAGE_PIN_PARTITION_DEVICES,
+ flags,
&m);
if (r < 0)
return r;
- r = dissected_image_acquire_metadata(m,
- DISSECT_IMAGE_VALIDATE_OS |
- DISSECT_IMAGE_VALIDATE_OS_EXT);
+ r = dissected_image_acquire_metadata(m, flags);
if (r < 0)
return r;
diff --git a/src/shared/discover-image.h b/src/shared/discover-image.h
index a30a3d92ba..350c3a22cc 100644
--- a/src/shared/discover-image.h
+++ b/src/shared/discover-image.h
@@ -119,4 +119,6 @@ static inline bool IMAGE_IS_HOST(const struct Image *i) {
int image_to_json(const struct Image *i, JsonVariant **ret);
+const char *image_root_to_string(ImageClass c) _const_;
+
extern const struct hash_ops image_hash_ops;
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c
index 216c036a31..eac3641abd 100644
--- a/src/shared/dissect-image.c
+++ b/src/shared/dissect-image.c
@@ -60,6 +60,7 @@
#include "openssl-util.h"
#include "os-util.h"
#include "path-util.h"
+#include "proc-cmdline.h"
#include "process-util.h"
#include "raw-clone.h"
#include "resize-fs.h"
@@ -2537,7 +2538,35 @@ static char* dm_deferred_remove_clean(char *name) {
}
DEFINE_TRIVIAL_CLEANUP_FUNC(char *, dm_deferred_remove_clean);
-static int validate_signature_userspace(const VeritySettings *verity) {
+static int validate_signature_userspace(const VeritySettings *verity, DissectImageFlags flags) {
+ int r;
+
+ if (!FLAGS_SET(flags, DISSECT_IMAGE_ALLOW_USERSPACE_VERITY)) {
+ log_debug("Userspace dm-verity signature authentication disabled via flag.");
+ return 0;
+ }
+
+ r = secure_getenv_bool("SYSTEMD_ALLOW_USERSPACE_VERITY");
+ if (r < 0 && r != -ENXIO) {
+ log_debug_errno(r, "Failed to parse $SYSTEMD_ALLOW_USERSPACE_VERITY environment variable, refusing userspace dm-verity signature authentication.");
+ return 0;
+ }
+ if (!r) {
+ log_debug("Userspace dm-verity signature authentication disabled via $SYSTEMD_ALLOW_USERSPACE_VERITY environment variable.");
+ return 0;
+ }
+
+ bool b;
+ r = proc_cmdline_get_bool("systemd.allow_userspace_verity", PROC_CMDLINE_TRUE_WHEN_MISSING, &b);
+ if (r < 0) {
+ log_debug_errno(r, "Failed to parse systemd.allow_userspace_verity= kernel command line option, refusing userspace dm-verity signature authentication.");
+ return 0;
+ }
+ if (!b) {
+ log_debug("Userspace dm-verity signature authentication disabled via systemd.allow_userspace_verity= kernel command line variable.");
+ return 0;
+ }
+
#if HAVE_OPENSSL
_cleanup_(sk_X509_free_allp) STACK_OF(X509) *sk = NULL;
_cleanup_strv_free_ char **certs = NULL;
@@ -2546,7 +2575,6 @@ static int validate_signature_userspace(const VeritySettings *verity) {
_cleanup_(BIO_freep) BIO *bio = NULL; /* 'bio' must be freed first, 's' second, hence keep this order
* of declaration in place, please */
const unsigned char *d;
- int r;
assert(verity);
assert(verity->root_hash);
@@ -2618,7 +2646,8 @@ static int validate_signature_userspace(const VeritySettings *verity) {
static int do_crypt_activate_verity(
struct crypt_device *cd,
const char *name,
- const VeritySettings *verity) {
+ const VeritySettings *verity,
+ DissectImageFlags flags) {
bool check_signature;
int r, k;
@@ -2628,7 +2657,7 @@ static int do_crypt_activate_verity(
assert(verity);
if (verity->root_hash_sig) {
- r = getenv_bool_secure("SYSTEMD_DISSECT_VERITY_SIGNATURE");
+ r = secure_getenv_bool("SYSTEMD_DISSECT_VERITY_SIGNATURE");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_DISSECT_VERITY_SIGNATURE");
@@ -2663,7 +2692,7 @@ static int do_crypt_activate_verity(
/* Preferably propagate the original kernel error, so that the fallback logic can work,
* as the device-mapper is finicky around concurrent activations of the same volume */
- k = validate_signature_userspace(verity);
+ k = validate_signature_userspace(verity, flags);
if (k < 0)
return r < 0 ? r : k;
if (k == 0)
@@ -2784,7 +2813,7 @@ static int verity_partition(
goto check; /* The device already exists. Let's check it. */
/* The symlink to the device node does not exist yet. Assume not activated, and let's activate it. */
- r = do_crypt_activate_verity(cd, name, verity);
+ r = do_crypt_activate_verity(cd, name, verity, flags);
if (r >= 0)
goto try_open; /* The device is activated. Let's open it. */
/* libdevmapper can return EINVAL when the device is already in the activation stage.
@@ -3100,7 +3129,7 @@ int verity_settings_load(
if (is_device_path(image))
return 0;
- r = getenv_bool_secure("SYSTEMD_DISSECT_VERITY_SIDECAR");
+ r = secure_getenv_bool("SYSTEMD_DISSECT_VERITY_SIDECAR");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_DISSECT_VERITY_SIDECAR, ignoring: %m");
if (r == 0)
@@ -3285,7 +3314,7 @@ int dissected_image_load_verity_sig_partition(
if (verity->root_hash && verity->root_hash_sig) /* Already loaded? */
return 0;
- r = getenv_bool_secure("SYSTEMD_DISSECT_VERITY_EMBEDDED");
+ r = secure_getenv_bool("SYSTEMD_DISSECT_VERITY_EMBEDDED");
if (r < 0 && r != -ENXIO)
log_debug_errno(r, "Failed to parse $SYSTEMD_DISSECT_VERITY_EMBEDDED, ignoring: %m");
if (r == 0)
@@ -3966,10 +3995,12 @@ int verity_dissect_and_mount(
if (r < 0)
return log_debug_errno(r, "Failed to load root hash: %m");
- dissect_image_flags = (verity.data_path ? DISSECT_IMAGE_NO_PARTITION_TABLE : 0) |
+ dissect_image_flags =
+ (verity.data_path ? DISSECT_IMAGE_NO_PARTITION_TABLE : 0) |
(relax_extension_release_check ? DISSECT_IMAGE_RELAX_EXTENSION_CHECK : 0) |
DISSECT_IMAGE_ADD_PARTITION_DEVICES |
- DISSECT_IMAGE_PIN_PARTITION_DEVICES;
+ DISSECT_IMAGE_PIN_PARTITION_DEVICES |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
/* Note that we don't use loop_device_make here, as the FD is most likely O_PATH which would not be
* accepted by LOOP_CONFIGURE, so just let loop_device_make_by_path reopen it as a regular FD. */
diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h
index 2366a38397..559d5b861d 100644
--- a/src/shared/dissect-image.h
+++ b/src/shared/dissect-image.h
@@ -87,6 +87,7 @@ typedef enum DissectImageFlags {
DISSECT_IMAGE_DISKSEQ_DEVNODE = 1 << 23, /* Prefer /dev/disk/by-diskseq/… device nodes */
DISSECT_IMAGE_ALLOW_EMPTY = 1 << 24, /* Allow that no usable partitions is present */
DISSECT_IMAGE_TRY_ATOMIC_MOUNT_EXCHANGE = 1 << 25, /* Try to mount the image beneath the specified mountpoint, rather than on top of it, and then umount the top */
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY = 1 << 26, /* Allow userspace verity keyring in /etc/verity.d/ and related dirs */
} DissectImageFlags;
struct DissectedImage {
diff --git a/src/shared/efi-loader.c b/src/shared/efi-loader.c
index 7d6bda924a..ab377aaa8b 100644
--- a/src/shared/efi-loader.c
+++ b/src/shared/efi-loader.c
@@ -262,7 +262,7 @@ int efi_measured_uki(int log_level) {
* being used, but it measured things into a different PCR than we are configured for in
* userspace. (i.e. we expect PCR 11 being used for this by both sd-stub and us) */
- r = getenv_bool_secure("SYSTEMD_FORCE_MEASURE"); /* Give user a chance to override the variable test,
+ r = secure_getenv_bool("SYSTEMD_FORCE_MEASURE"); /* Give user a chance to override the variable test,
* for debugging purposes */
if (r >= 0)
return (cached = r);
diff --git a/src/shared/elf-util.c b/src/shared/elf-util.c
index 9f8a0f962a..85f3c173db 100644
--- a/src/shared/elf-util.c
+++ b/src/shared/elf-util.c
@@ -38,51 +38,51 @@ static void *dw_dl = NULL;
static void *elf_dl = NULL;
/* libdw symbols */
-Dwarf_Attribute *(*sym_dwarf_attr_integrate)(Dwarf_Die *, unsigned int, Dwarf_Attribute *);
-const char *(*sym_dwarf_diename)(Dwarf_Die *);
-const char *(*sym_dwarf_formstring)(Dwarf_Attribute *);
-int (*sym_dwarf_getscopes)(Dwarf_Die *, Dwarf_Addr, Dwarf_Die **);
-int (*sym_dwarf_getscopes_die)(Dwarf_Die *, Dwarf_Die **);
-Elf *(*sym_dwelf_elf_begin)(int);
+static DLSYM_FUNCTION(dwarf_attr_integrate);
+static DLSYM_FUNCTION(dwarf_diename);
+static DLSYM_FUNCTION(dwarf_formstring);
+static DLSYM_FUNCTION(dwarf_getscopes);
+static DLSYM_FUNCTION(dwarf_getscopes_die);
+static DLSYM_FUNCTION(dwelf_elf_begin);
#if HAVE_DWELF_ELF_E_MACHINE_STRING
-const char *(*sym_dwelf_elf_e_machine_string)(int);
+static DLSYM_FUNCTION(dwelf_elf_e_machine_string);
#endif
-ssize_t (*sym_dwelf_elf_gnu_build_id)(Elf *, const void **);
-int (*sym_dwarf_tag)(Dwarf_Die *);
-Dwfl_Module *(*sym_dwfl_addrmodule)(Dwfl *, Dwarf_Addr);
-Dwfl *(*sym_dwfl_begin)(const Dwfl_Callbacks *);
-int (*sym_dwfl_build_id_find_elf)(Dwfl_Module *, void **, const char *, Dwarf_Addr, char **, Elf **);
-int (*sym_dwfl_core_file_attach)(Dwfl *, Elf *);
-int (*sym_dwfl_core_file_report)(Dwfl *, Elf *, const char *);
-void (*sym_dwfl_end)(Dwfl *);
-const char *(*sym_dwfl_errmsg)(int);
-int (*sym_dwfl_errno)(void);
-bool (*sym_dwfl_frame_pc)(Dwfl_Frame *, Dwarf_Addr *, bool *);
-ptrdiff_t (*sym_dwfl_getmodules)(Dwfl *, int (*)(Dwfl_Module *, void **, const char *, Dwarf_Addr, void *), void *, ptrdiff_t);
-int (*sym_dwfl_getthreads)(Dwfl *, int (*)(Dwfl_Thread *, void *), void *);
-Dwarf_Die *(*sym_dwfl_module_addrdie)(Dwfl_Module *, Dwarf_Addr, Dwarf_Addr *);
-const char *(*sym_dwfl_module_addrname)(Dwfl_Module *, GElf_Addr);
-int (*sym_dwfl_module_build_id)(Dwfl_Module *, const unsigned char **, GElf_Addr *);
-Elf *(*sym_dwfl_module_getelf)(Dwfl_Module *, GElf_Addr *);
-const char *(*sym_dwfl_module_info)(Dwfl_Module *, void ***, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Addr *, const char **, const char **);
-int (*sym_dwfl_offline_section_address)(Dwfl_Module *, void **, const char *, Dwarf_Addr, const char *, GElf_Word, const GElf_Shdr *, Dwarf_Addr *);
-int (*sym_dwfl_report_end)(Dwfl *, int (*)(Dwfl_Module *, void *, const char *, Dwarf_Addr, void *), void *);
-int (*sym_dwfl_standard_find_debuginfo)(Dwfl_Module *, void **, const char *, Dwarf_Addr, const char *, const char *, GElf_Word, char **);
-int (*sym_dwfl_thread_getframes)(Dwfl_Thread *, int (*)(Dwfl_Frame *, void *), void *);
-pid_t (*sym_dwfl_thread_tid)(Dwfl_Thread *);
+static DLSYM_FUNCTION(dwelf_elf_gnu_build_id);
+static DLSYM_FUNCTION(dwarf_tag);
+static DLSYM_FUNCTION(dwfl_addrmodule);
+static DLSYM_FUNCTION(dwfl_begin);
+static DLSYM_FUNCTION(dwfl_build_id_find_elf);
+static DLSYM_FUNCTION(dwfl_core_file_attach);
+static DLSYM_FUNCTION(dwfl_core_file_report);
+static DLSYM_FUNCTION(dwfl_end);
+static DLSYM_FUNCTION(dwfl_errmsg);
+static DLSYM_FUNCTION(dwfl_errno);
+static DLSYM_FUNCTION(dwfl_frame_pc);
+static DLSYM_FUNCTION(dwfl_getmodules);
+static DLSYM_FUNCTION(dwfl_getthreads);
+static DLSYM_FUNCTION(dwfl_module_addrdie);
+static DLSYM_FUNCTION(dwfl_module_addrname);
+static DLSYM_FUNCTION(dwfl_module_build_id);
+static DLSYM_FUNCTION(dwfl_module_getelf);
+static DLSYM_FUNCTION(dwfl_module_info);
+static DLSYM_FUNCTION(dwfl_offline_section_address);
+static DLSYM_FUNCTION(dwfl_report_end);
+static DLSYM_FUNCTION(dwfl_standard_find_debuginfo);
+static DLSYM_FUNCTION(dwfl_thread_getframes);
+static DLSYM_FUNCTION(dwfl_thread_tid);
/* libelf symbols */
-Elf *(*sym_elf_begin)(int, Elf_Cmd, Elf *);
-int (*sym_elf_end)(Elf *);
-Elf_Data *(*sym_elf_getdata_rawchunk)(Elf *, int64_t, size_t, Elf_Type);
-GElf_Ehdr *(*sym_gelf_getehdr)(Elf *, GElf_Ehdr *);
-int (*sym_elf_getphdrnum)(Elf *, size_t *);
-const char *(*sym_elf_errmsg)(int);
-int (*sym_elf_errno)(void);
-Elf *(*sym_elf_memory)(char *, size_t);
-unsigned int (*sym_elf_version)(unsigned int);
-GElf_Phdr *(*sym_gelf_getphdr)(Elf *, int, GElf_Phdr *);
-size_t (*sym_gelf_getnote)(Elf_Data *, size_t, GElf_Nhdr *, size_t *, size_t *);
+static DLSYM_FUNCTION(elf_begin);
+static DLSYM_FUNCTION(elf_end);
+static DLSYM_FUNCTION(elf_getdata_rawchunk);
+static DLSYM_FUNCTION(gelf_getehdr);
+static DLSYM_FUNCTION(elf_getphdrnum);
+static DLSYM_FUNCTION(elf_errmsg);
+static DLSYM_FUNCTION(elf_errno);
+static DLSYM_FUNCTION(elf_memory);
+static DLSYM_FUNCTION(elf_version);
+static DLSYM_FUNCTION(gelf_getphdr);
+static DLSYM_FUNCTION(gelf_getnote);
int dlopen_dw(void) {
int r;
diff --git a/src/shared/firewall-util-nft.c b/src/shared/firewall-util-nft.c
index fe986ed212..e9bd286786 100644
--- a/src/shared/firewall-util-nft.c
+++ b/src/shared/firewall-util-nft.c
@@ -1316,7 +1316,7 @@ int config_parse_nft_set(
return 0;
q = tuple;
- r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE, &source_str, &family_str, &table, &set, NULL);
+ r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE, &source_str, &family_str, &table, &set);
if (r == -ENOMEM)
return log_oom();
if (r != 4 || !isempty(q)) {
diff --git a/src/shared/format-table.h b/src/shared/format-table.h
index 36e1f94ca0..b169eb0ba5 100644
--- a/src/shared/format-table.h
+++ b/src/shared/format-table.h
@@ -134,7 +134,7 @@ int table_set_sort_internal(Table *t, size_t first_column, ...);
#define table_set_sort(...) table_set_sort_internal(__VA_ARGS__, SIZE_MAX)
int table_set_reverse(Table *t, size_t column, bool b);
int table_hide_column_from_display_internal(Table *t, ...);
-#define table_hide_column_from_display(t, ...) table_hide_column_from_display_internal(t, __VA_ARGS__, (size_t) -1)
+#define table_hide_column_from_display(t, ...) table_hide_column_from_display_internal(t, __VA_ARGS__, SIZE_MAX)
int table_print(Table *t, FILE *f);
int table_format(Table *t, char **ret);
diff --git a/src/shared/idn-util.c b/src/shared/idn-util.c
index 6f36688dc0..70f039f825 100644
--- a/src/shared/idn-util.c
+++ b/src/shared/idn-util.c
@@ -16,9 +16,9 @@ static void* idn_dl = NULL;
#endif
#if HAVE_LIBIDN2
-int (*sym_idn2_lookup_u8)(const uint8_t* src, uint8_t** lookupname, int flags) = NULL;
+DLSYM_FUNCTION(idn2_lookup_u8);
const char *(*sym_idn2_strerror)(int rc) _const_ = NULL;
-int (*sym_idn2_to_unicode_8z8z)(const char * input, char ** output, int flags) = NULL;
+DLSYM_FUNCTION(idn2_to_unicode_8z8z);
int dlopen_idn(void) {
return dlopen_many_sym_or_warn(
@@ -30,10 +30,10 @@ int dlopen_idn(void) {
#endif
#if HAVE_LIBIDN
-int (*sym_idna_to_ascii_4i)(const uint32_t * in, size_t inlen, char *out, int flags);
-int (*sym_idna_to_unicode_44i)(const uint32_t * in, size_t inlen, uint32_t * out, size_t * outlen, int flags);
-char* (*sym_stringprep_ucs4_to_utf8)(const uint32_t * str, ssize_t len, size_t * items_read, size_t * items_written);
-uint32_t* (*sym_stringprep_utf8_to_ucs4)(const char *str, ssize_t len, size_t *items_written);
+DLSYM_FUNCTION(idna_to_ascii_4i);
+DLSYM_FUNCTION(idna_to_unicode_44i);
+DLSYM_FUNCTION(stringprep_ucs4_to_utf8);
+DLSYM_FUNCTION(stringprep_utf8_to_ucs4);
int dlopen_idn(void) {
_cleanup_(dlclosep) void *dl = NULL;
diff --git a/src/shared/idn-util.h b/src/shared/idn-util.h
index e64bd99747..3ae2f13231 100644
--- a/src/shared/idn-util.h
+++ b/src/shared/idn-util.h
@@ -11,6 +11,8 @@
#include <inttypes.h>
#if HAVE_LIBIDN2 || HAVE_LIBIDN
+#include "dlfcn-util.h"
+
int dlopen_idn(void);
#else
static inline int dlopen_idn(void) {
@@ -19,14 +21,14 @@ static inline int dlopen_idn(void) {
#endif
#if HAVE_LIBIDN2
-extern int (*sym_idn2_lookup_u8)(const uint8_t* src, uint8_t** lookupname, int flags);
+DLSYM_PROTOTYPE(idn2_lookup_u8);
extern const char *(*sym_idn2_strerror)(int rc) _const_;
-extern int (*sym_idn2_to_unicode_8z8z)(const char * input, char ** output, int flags);
+DLSYM_PROTOTYPE(idn2_to_unicode_8z8z);
#endif
#if HAVE_LIBIDN
-extern int (*sym_idna_to_ascii_4i)(const uint32_t * in, size_t inlen, char *out, int flags);
-extern int (*sym_idna_to_unicode_44i)(const uint32_t * in, size_t inlen,uint32_t * out, size_t * outlen, int flags);
-extern char* (*sym_stringprep_ucs4_to_utf8)(const uint32_t * str, ssize_t len, size_t * items_read, size_t * items_written);
-extern uint32_t* (*sym_stringprep_utf8_to_ucs4)(const char *str, ssize_t len, size_t *items_written);
+DLSYM_PROTOTYPE(idna_to_ascii_4i);
+DLSYM_PROTOTYPE(idna_to_unicode_44i);
+DLSYM_PROTOTYPE(stringprep_ucs4_to_utf8);
+DLSYM_PROTOTYPE(stringprep_utf8_to_ucs4);
#endif
diff --git a/src/shared/install.c b/src/shared/install.c
index 7191f846a9..81f898f28a 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -10,6 +10,7 @@
#include <unistd.h>
#include "alloc-util.h"
+#include "bus-common-errors.h"
#include "chase.h"
#include "conf-files.h"
#include "conf-parser.h"
@@ -324,127 +325,171 @@ InstallChangeType install_changes_add(
void install_changes_free(InstallChange *changes, size_t n_changes) {
assert(changes || n_changes == 0);
- for (size_t i = 0; i < n_changes; i++) {
- free(changes[i].path);
- free(changes[i].source);
+ FOREACH_ARRAY(i, changes, n_changes) {
+ free(i->path);
+ free(i->source);
}
free(changes);
}
-void install_changes_dump(int r, const char *verb, const InstallChange *changes, size_t n_changes, bool quiet) {
- int err = 0;
+static void install_change_dump_success(const InstallChange *change) {
+ assert(change);
+ assert(change->path);
- assert(changes || n_changes == 0);
- /* If verb is not specified, errors are not allowed! */
- assert(verb || r >= 0);
+ switch (change->type) {
- for (size_t i = 0; i < n_changes; i++) {
- if (changes[i].type < 0)
- assert(verb);
- assert(changes[i].path);
+ case INSTALL_CHANGE_SYMLINK:
+ return log_info("Created symlink '%s' %s '%s'.",
+ change->path, special_glyph(SPECIAL_GLYPH_ARROW_RIGHT), change->source);
- /* When making changes here, make sure to also change install_error() in dbus-manager.c. */
+ case INSTALL_CHANGE_UNLINK:
+ return log_info("Removed '%s'.", change->path);
- switch (changes[i].type) {
- case INSTALL_CHANGE_SYMLINK:
- if (!quiet)
- log_info("Created symlink %s %s %s.",
- changes[i].path,
- special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
- changes[i].source);
- break;
- case INSTALL_CHANGE_UNLINK:
- if (!quiet)
- log_info("Removed \"%s\".", changes[i].path);
- break;
- case INSTALL_CHANGE_IS_MASKED:
- if (!quiet)
- log_info("Unit %s is masked, ignoring.", changes[i].path);
- break;
- case INSTALL_CHANGE_IS_MASKED_GENERATOR:
- if (!quiet)
- log_info("Unit %s is masked via a generator and cannot be unmasked.",
- changes[i].path);
- break;
- case INSTALL_CHANGE_IS_DANGLING:
- if (!quiet)
- log_info("Unit %s is an alias to a unit that is not present, ignoring.",
- changes[i].path);
- break;
- case INSTALL_CHANGE_DESTINATION_NOT_PRESENT:
- if (!quiet)
- log_warning("Unit %s is added as a dependency to a non-existent unit %s.",
- changes[i].source, changes[i].path);
- break;
- case INSTALL_CHANGE_AUXILIARY_FAILED:
+ case INSTALL_CHANGE_IS_MASKED:
+ return log_info("Unit %s is masked, ignoring.", change->path);
+
+ case INSTALL_CHANGE_IS_MASKED_GENERATOR:
+ return log_info("Unit %s is masked via a generator and cannot be unmasked, skipping.", change->path);
+
+ case INSTALL_CHANGE_IS_DANGLING:
+ return log_info("Unit %s is an alias to a non-existent unit, ignoring.", change->path);
+
+ case INSTALL_CHANGE_DESTINATION_NOT_PRESENT:
+ return log_warning("Unit %s is added as a dependency to a non-existent unit %s.",
+ change->source, change->path);
+
+ case INSTALL_CHANGE_AUXILIARY_FAILED:
+ return log_warning("Failed to enable auxiliary unit %s, ignoring.", change->path);
+
+ default:
+ assert_not_reached();
+ }
+}
+
+int install_change_dump_error(const InstallChange *change, char **ret_errmsg, const char **ret_bus_error) {
+ char *m;
+ const char *bus_error;
+
+ /* Returns 0: known error and ret_errmsg formatted
+ * < 0: non-recognizable error */
+
+ assert(change);
+ assert(change->path);
+ assert(change->type < 0);
+ assert(ret_errmsg);
+
+ switch (change->type) {
+
+ case -EEXIST:
+ m = strjoin("File '", change->path, "' already exists",
+ change->source ? " and is a symlink to " : NULL, change->source);
+ bus_error = BUS_ERROR_UNIT_EXISTS;
+ break;
+
+ case -ERFKILL:
+ m = strjoin("Unit ", change->path, " is masked");
+ bus_error = BUS_ERROR_UNIT_MASKED;
+ break;
+
+ case -EADDRNOTAVAIL:
+ m = strjoin("Unit ", change->path, " is transient or generated");
+ bus_error = BUS_ERROR_UNIT_GENERATED;
+ break;
+
+ case -ETXTBSY:
+ m = strjoin("File '", change->path, "' is under the systemd unit hierarchy already");
+ bus_error = BUS_ERROR_UNIT_BAD_PATH;
+ break;
+
+ case -EBADSLT:
+ m = strjoin("Invalid specifier in unit ", change->path);
+ bus_error = BUS_ERROR_BAD_UNIT_SETTING;
+ break;
+
+ case -EIDRM:
+ m = strjoin("Refusing to operate on template unit ", change->source,
+ " when destination unit ", change->path, " is a non-template unit");
+ bus_error = BUS_ERROR_BAD_UNIT_SETTING;
+ break;
+
+ case -EUCLEAN:
+ m = strjoin("Invalid unit name ", change->path);
+ bus_error = BUS_ERROR_BAD_UNIT_SETTING;
+ break;
+
+ case -ELOOP:
+ m = strjoin("Refusing to operate on linked unit file ", change->path);
+ bus_error = BUS_ERROR_UNIT_LINKED;
+ break;
+
+ case -EXDEV:
+ if (change->source)
+ m = strjoin("Cannot alias ", change->source, " as ", change->path);
+ else
+ m = strjoin("Invalid unit reference ", change->path);
+ bus_error = BUS_ERROR_BAD_UNIT_SETTING;
+ break;
+
+ case -ENOENT:
+ m = strjoin("Unit ", change->path, " does not exist");
+ bus_error = BUS_ERROR_NO_SUCH_UNIT;
+ break;
+
+ case -EUNATCH:
+ m = strjoin("Cannot resolve specifiers in unit ", change->path);
+ bus_error = BUS_ERROR_BAD_UNIT_SETTING;
+ break;
+
+ default:
+ return change->type;
+ }
+ if (!m)
+ return -ENOMEM;
+
+ *ret_errmsg = m;
+ if (ret_bus_error)
+ *ret_bus_error = bus_error;
+
+ return 0;
+}
+
+void install_changes_dump(
+ int error,
+ const char *verb,
+ const InstallChange *changes,
+ size_t n_changes,
+ bool quiet) {
+
+ bool err_logged = false;
+ int r;
+
+ /* If verb is not specified, errors are not allowed! */
+ assert(verb || error >= 0);
+ assert(changes || n_changes == 0);
+
+ FOREACH_ARRAY(i, changes, n_changes)
+ if (i->type >= 0) {
if (!quiet)
- log_warning("Failed to enable auxiliary unit %s, ignoring.", changes[i].path);
- break;
- case -EEXIST:
- if (changes[i].source)
- err = log_error_errno(changes[i].type,
- "Failed to %s unit, file \"%s\" already exists and is a symlink to \"%s\".",
- verb, changes[i].path, changes[i].source);
- else
- err = log_error_errno(changes[i].type,
- "Failed to %s unit, file \"%s\" already exists.",
- verb, changes[i].path);
- break;
- case -ERFKILL:
- err = log_error_errno(changes[i].type, "Failed to %s unit, unit %s is masked.",
- verb, changes[i].path);
- break;
- case -EADDRNOTAVAIL:
- err = log_error_errno(changes[i].type, "Failed to %s unit, unit %s is transient or generated.",
- verb, changes[i].path);
- break;
- case -ETXTBSY:
- err = log_error_errno(changes[i].type, "Failed to %s unit, file %s is under the systemd unit hierarchy already.",
- verb, changes[i].path);
- break;
- case -EBADSLT:
- err = log_error_errno(changes[i].type, "Failed to %s unit, invalid specifier in \"%s\".",
- verb, changes[i].path);
- break;
- case -EIDRM:
- err = log_error_errno(changes[i].type, "Failed to %s %s, destination unit %s is a non-template unit.",
- verb, changes[i].source, changes[i].path);
- break;
- case -EUCLEAN:
- err = log_error_errno(changes[i].type,
- "Failed to %s unit, \"%s\" is not a valid unit name.",
- verb, changes[i].path);
- break;
- case -ELOOP:
- err = log_error_errno(changes[i].type, "Failed to %s unit, refusing to operate on linked unit file %s.",
- verb, changes[i].path);
- break;
- case -EXDEV:
- if (changes[i].source)
- err = log_error_errno(changes[i].type, "Failed to %s unit, cannot alias %s as %s.",
- verb, changes[i].source, changes[i].path);
+ install_change_dump_success(i);
+ } else {
+ _cleanup_free_ char *err_message = NULL;
+
+ assert(verb);
+
+ r = install_change_dump_error(i, &err_message, /* ret_bus_error = */ NULL);
+ if (r == -ENOMEM)
+ return (void) log_oom();
+ if (r < 0)
+ log_error_errno(r, "Failed to %s unit %s: %m", verb, i->path);
else
- err = log_error_errno(changes[i].type, "Failed to %s unit, invalid unit reference \"%s\".",
- verb, changes[i].path);
- break;
- case -ENOENT:
- err = log_error_errno(changes[i].type, "Failed to %s unit, unit %s does not exist.",
- verb, changes[i].path);
- break;
- case -EUNATCH:
- err = log_error_errno(changes[i].type, "Failed to %s unit, cannot resolve specifiers in \"%s\".",
- verb, changes[i].path);
- break;
- default:
- assert(changes[i].type < 0);
- err = log_error_errno(changes[i].type, "Failed to %s unit, file \"%s\": %m",
- verb, changes[i].path);
+ log_error_errno(i->type, "Failed to %s unit: %s", verb, err_message);
+
+ err_logged = true;
}
- }
- if (r < 0 && err >= 0)
- log_error_errno(r, "Failed to %s: %m.", verb);
+ if (error < 0 && !err_logged)
+ log_error_errno(error, "Failed to %s unit: %m.", verb);
}
/**
@@ -1889,7 +1934,7 @@ static int install_info_symlink_alias(
InstallChange **changes,
size_t *n_changes) {
- int r = 0, q;
+ int r, ret = 0;
assert(info);
assert(lp);
@@ -1897,20 +1942,17 @@ static int install_info_symlink_alias(
STRV_FOREACH(s, info->aliases) {
_cleanup_free_ char *alias_path = NULL, *dst = NULL, *dst_updated = NULL;
- bool broken;
- q = install_name_printf(scope, info, *s, &dst);
- if (q < 0) {
- install_changes_add(changes, n_changes, q, *s, NULL);
- r = r < 0 ? r : q;
+ r = install_name_printf(scope, info, *s, &dst);
+ if (r < 0) {
+ RET_GATHER(ret, install_changes_add(changes, n_changes, r, *s, NULL));
continue;
}
- q = unit_file_verify_alias(info, dst, &dst_updated, changes, n_changes);
- if (q == -ELOOP)
- continue;
- if (q < 0) {
- r = r < 0 ? r : q;
+ r = unit_file_verify_alias(info, dst, &dst_updated, changes, n_changes);
+ if (r < 0) {
+ if (r != -ELOOP)
+ RET_GATHER(ret, r);
continue;
}
@@ -1918,18 +1960,18 @@ static int install_info_symlink_alias(
if (!alias_path)
return -ENOMEM;
- q = chase(alias_path, lp->root_dir, CHASE_NONEXISTENT, NULL, NULL);
- if (q < 0 && q != -ENOENT) {
- r = r < 0 ? r : q;
+ bool broken;
+ r = chase(alias_path, lp->root_dir, CHASE_NONEXISTENT, /* ret_path = */ NULL, /* ret_fd = */ NULL);
+ if (r < 0 && r != -ENOENT) {
+ RET_GATHER(ret, r);
continue;
}
- broken = q == 0; /* symlink target does not exist? */
+ broken = r == 0; /* symlink target does not exist? */
- q = create_symlink(lp, info->path, alias_path, force || broken, changes, n_changes);
- r = r < 0 ? r : q;
+ RET_GATHER(ret, create_symlink(lp, info->path, alias_path, force || broken, changes, n_changes));
}
- return r;
+ return ret;
}
static int install_info_symlink_wants(
@@ -1992,10 +2034,7 @@ static int install_info_symlink_wants(
q = install_name_printf(scope, info, *s, &dst);
if (q < 0) {
- install_changes_add(changes, n_changes, q, *s, NULL);
- if (r >= 0)
- r = q;
-
+ RET_GATHER(r, install_changes_add(changes, n_changes, q, *s, NULL));
continue;
}
@@ -2007,15 +2046,13 @@ static int install_info_symlink_wants(
* 'systemctl enable serial-getty@.service' should fail, the user should specify an
* instance like in 'systemctl enable serial-getty@ttyS0.service'.
*/
- if (file_flags & UNIT_FILE_IGNORE_AUXILIARY_FAILURE)
+ if (FLAGS_SET(file_flags, UNIT_FILE_IGNORE_AUXILIARY_FAILURE))
continue;
if (unit_name_is_valid(dst, UNIT_NAME_ANY))
- q = install_changes_add(changes, n_changes, -EIDRM, dst, n);
+ RET_GATHER(r, install_changes_add(changes, n_changes, -EIDRM, dst, n));
else
- q = install_changes_add(changes, n_changes, -EUCLEAN, dst, NULL);
- if (r >= 0)
- r = q;
+ RET_GATHER(r, install_changes_add(changes, n_changes, -EUCLEAN, dst, NULL));
continue;
}
@@ -2024,7 +2061,7 @@ static int install_info_symlink_wants(
if (!path)
return -ENOMEM;
- q = create_symlink(lp, info->path, path, true, changes, n_changes);
+ q = create_symlink(lp, info->path, path, /* force = */ true, changes, n_changes);
if ((q < 0 && r >= 0) || r == 0)
r = q;
@@ -2256,7 +2293,7 @@ int unit_file_mask(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
const char *config_path;
int r;
@@ -2299,7 +2336,7 @@ int unit_file_unmask(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
_cleanup_strv_free_ char **todo = NULL;
const char *config_path;
@@ -2411,11 +2448,11 @@ int unit_file_link(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_strv_free_ char **todo = NULL;
const char *config_path;
size_t n_todo = 0;
- int r, q;
+ int r;
assert(scope >= 0);
assert(scope < _RUNTIME_SCOPE_MAX);
@@ -2484,9 +2521,7 @@ int unit_file_link(
if (!new_path)
return -ENOMEM;
- q = create_symlink(&lp, *i, new_path, flags & UNIT_FILE_FORCE, changes, n_changes);
- if (q < 0 && r >= 0)
- r = q;
+ RET_GATHER(r, create_symlink(&lp, *i, new_path, flags & UNIT_FILE_FORCE, changes, n_changes));
}
return r;
@@ -2519,7 +2554,7 @@ int unit_file_revert(
size_t *n_changes) {
_cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_strv_free_ char **todo = NULL;
size_t n_todo = 0;
int r, q;
@@ -2677,7 +2712,7 @@ int unit_file_add_dependency(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_(install_context_done) InstallContext ctx = { .scope = scope };
InstallInfo *info, *target_info;
const char *config_path;
@@ -2778,7 +2813,7 @@ int unit_file_enable(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
int r;
assert(scope >= 0);
@@ -2846,7 +2881,7 @@ int unit_file_disable(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
int r;
assert(scope >= 0);
@@ -2929,7 +2964,7 @@ int unit_file_reenable(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_strv_free_ char **names = NULL, **files = NULL;
int r;
@@ -2965,7 +3000,7 @@ int unit_file_set_default(
InstallChange **changes,
size_t *n_changes) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_(install_context_done) InstallContext ctx = { .scope = scope };
InstallInfo *info;
const char *new_path;
@@ -2997,7 +3032,7 @@ int unit_file_get_default(
const char *root_dir,
char **name) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_(install_context_done) InstallContext ctx = { .scope = scope };
InstallInfo *info;
char *n;
@@ -3128,7 +3163,7 @@ int unit_file_get_state(
const char *name,
UnitFileState *ret) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
int r;
assert(scope >= 0);
@@ -3555,7 +3590,7 @@ int unit_file_preset(
size_t *n_changes) {
_cleanup_(install_context_done) InstallContext plus = {}, minus = {};
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_(unit_file_presets_done) UnitFilePresets presets = {};
const char *config_path;
int r;
@@ -3594,7 +3629,7 @@ int unit_file_preset_all(
size_t *n_changes) {
_cleanup_(install_context_done) InstallContext plus = {}, minus = {};
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_(unit_file_presets_done) UnitFilePresets presets = {};
const char *config_path = NULL;
int r;
@@ -3671,7 +3706,7 @@ int unit_file_get_list(
char **states,
char **patterns) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
int r;
assert(scope >= 0);
diff --git a/src/shared/install.h b/src/shared/install.h
index 3e2ada45f4..a09557f69f 100644
--- a/src/shared/install.h
+++ b/src/shared/install.h
@@ -205,7 +205,14 @@ extern const struct hash_ops unit_file_list_hash_ops_free;
InstallChangeType install_changes_add(InstallChange **changes, size_t *n_changes, InstallChangeType type, const char *path, const char *source);
void install_changes_free(InstallChange *changes, size_t n_changes);
-void install_changes_dump(int r, const char *verb, const InstallChange *changes, size_t n_changes, bool quiet);
+
+int install_change_dump_error(const InstallChange *change, char **ret_errmsg, const char **ret_bus_error);
+void install_changes_dump(
+ int error,
+ const char *verb,
+ const InstallChange *changes,
+ size_t n_changes,
+ bool quiet);
int unit_file_verify_alias(
const InstallInfo *info,
diff --git a/src/shared/libfido2-util.c b/src/shared/libfido2-util.c
index f5df579369..15b7e42c84 100644
--- a/src/shared/libfido2-util.c
+++ b/src/shared/libfido2-util.c
@@ -16,53 +16,53 @@
static void *libfido2_dl = NULL;
-int (*sym_fido_assert_allow_cred)(fido_assert_t *, const unsigned char *, size_t) = NULL;
-void (*sym_fido_assert_free)(fido_assert_t **) = NULL;
-size_t (*sym_fido_assert_hmac_secret_len)(const fido_assert_t *, size_t) = NULL;
-const unsigned char* (*sym_fido_assert_hmac_secret_ptr)(const fido_assert_t *, size_t) = NULL;
-fido_assert_t* (*sym_fido_assert_new)(void) = NULL;
-int (*sym_fido_assert_set_clientdata_hash)(fido_assert_t *, const unsigned char *, size_t) = NULL;
-int (*sym_fido_assert_set_extensions)(fido_assert_t *, int) = NULL;
-int (*sym_fido_assert_set_hmac_salt)(fido_assert_t *, const unsigned char *, size_t) = NULL;
-int (*sym_fido_assert_set_rp)(fido_assert_t *, const char *) = NULL;
-int (*sym_fido_assert_set_up)(fido_assert_t *, fido_opt_t) = NULL;
-int (*sym_fido_assert_set_uv)(fido_assert_t *, fido_opt_t) = NULL;
-size_t (*sym_fido_cbor_info_extensions_len)(const fido_cbor_info_t *) = NULL;
-char **(*sym_fido_cbor_info_extensions_ptr)(const fido_cbor_info_t *) = NULL;
-void (*sym_fido_cbor_info_free)(fido_cbor_info_t **) = NULL;
-fido_cbor_info_t* (*sym_fido_cbor_info_new)(void) = NULL;
-size_t (*sym_fido_cbor_info_options_len)(const fido_cbor_info_t *) = NULL;
-char** (*sym_fido_cbor_info_options_name_ptr)(const fido_cbor_info_t *) = NULL;
-const bool* (*sym_fido_cbor_info_options_value_ptr)(const fido_cbor_info_t *) = NULL;
-void (*sym_fido_cred_free)(fido_cred_t **) = NULL;
-size_t (*sym_fido_cred_id_len)(const fido_cred_t *) = NULL;
-const unsigned char* (*sym_fido_cred_id_ptr)(const fido_cred_t *) = NULL;
-fido_cred_t* (*sym_fido_cred_new)(void) = NULL;
-int (*sym_fido_cred_set_clientdata_hash)(fido_cred_t *, const unsigned char *, size_t) = NULL;
-int (*sym_fido_cred_set_extensions)(fido_cred_t *, int) = NULL;
-int (*sym_fido_cred_set_rk)(fido_cred_t *, fido_opt_t) = NULL;
-int (*sym_fido_cred_set_rp)(fido_cred_t *, const char *, const char *) = NULL;
-int (*sym_fido_cred_set_type)(fido_cred_t *, int) = NULL;
-int (*sym_fido_cred_set_user)(fido_cred_t *, const unsigned char *, size_t, const char *, const char *, const char *) = NULL;
-int (*sym_fido_cred_set_uv)(fido_cred_t *, fido_opt_t) = NULL;
-void (*sym_fido_dev_free)(fido_dev_t **) = NULL;
-int (*sym_fido_dev_get_assert)(fido_dev_t *, fido_assert_t *, const char *) = NULL;
-int (*sym_fido_dev_get_cbor_info)(fido_dev_t *, fido_cbor_info_t *) = NULL;
-void (*sym_fido_dev_info_free)(fido_dev_info_t **, size_t) = NULL;
-int (*sym_fido_dev_info_manifest)(fido_dev_info_t *, size_t, size_t *) = NULL;
-const char* (*sym_fido_dev_info_manufacturer_string)(const fido_dev_info_t *) = NULL;
-const char* (*sym_fido_dev_info_product_string)(const fido_dev_info_t *) = NULL;
-fido_dev_info_t* (*sym_fido_dev_info_new)(size_t) = NULL;
-const char* (*sym_fido_dev_info_path)(const fido_dev_info_t *) = NULL;
-const fido_dev_info_t* (*sym_fido_dev_info_ptr)(const fido_dev_info_t *, size_t) = NULL;
-bool (*sym_fido_dev_is_fido2)(const fido_dev_t *) = NULL;
-int (*sym_fido_dev_make_cred)(fido_dev_t *, fido_cred_t *, const char *) = NULL;
-fido_dev_t* (*sym_fido_dev_new)(void) = NULL;
-int (*sym_fido_dev_open)(fido_dev_t *, const char *) = NULL;
-int (*sym_fido_dev_close)(fido_dev_t *) = NULL;
-void (*sym_fido_init)(int) = NULL;
-void (*sym_fido_set_log_handler)(fido_log_handler_t *) = NULL;
-const char* (*sym_fido_strerr)(int) = NULL;
+DLSYM_FUNCTION(fido_assert_allow_cred);
+DLSYM_FUNCTION(fido_assert_free);
+DLSYM_FUNCTION(fido_assert_hmac_secret_len);
+DLSYM_FUNCTION(fido_assert_hmac_secret_ptr);
+DLSYM_FUNCTION(fido_assert_new);
+DLSYM_FUNCTION(fido_assert_set_clientdata_hash);
+DLSYM_FUNCTION(fido_assert_set_extensions);
+DLSYM_FUNCTION(fido_assert_set_hmac_salt);
+DLSYM_FUNCTION(fido_assert_set_rp);
+DLSYM_FUNCTION(fido_assert_set_up);
+DLSYM_FUNCTION(fido_assert_set_uv);
+DLSYM_FUNCTION(fido_cbor_info_extensions_len);
+DLSYM_FUNCTION(fido_cbor_info_extensions_ptr);
+DLSYM_FUNCTION(fido_cbor_info_free);
+DLSYM_FUNCTION(fido_cbor_info_new);
+DLSYM_FUNCTION(fido_cbor_info_options_len);
+DLSYM_FUNCTION(fido_cbor_info_options_name_ptr);
+DLSYM_FUNCTION(fido_cbor_info_options_value_ptr);
+DLSYM_FUNCTION(fido_cred_free);
+DLSYM_FUNCTION(fido_cred_id_len);
+DLSYM_FUNCTION(fido_cred_id_ptr);
+DLSYM_FUNCTION(fido_cred_new);
+DLSYM_FUNCTION(fido_cred_set_clientdata_hash);
+DLSYM_FUNCTION(fido_cred_set_extensions);
+DLSYM_FUNCTION(fido_cred_set_rk);
+DLSYM_FUNCTION(fido_cred_set_rp);
+DLSYM_FUNCTION(fido_cred_set_type);
+DLSYM_FUNCTION(fido_cred_set_user);
+DLSYM_FUNCTION(fido_cred_set_uv);
+DLSYM_FUNCTION(fido_dev_free);
+DLSYM_FUNCTION(fido_dev_get_assert);
+DLSYM_FUNCTION(fido_dev_get_cbor_info);
+DLSYM_FUNCTION(fido_dev_info_free);
+DLSYM_FUNCTION(fido_dev_info_manifest);
+DLSYM_FUNCTION(fido_dev_info_manufacturer_string);
+DLSYM_FUNCTION(fido_dev_info_product_string);
+DLSYM_FUNCTION(fido_dev_info_new);
+DLSYM_FUNCTION(fido_dev_info_path);
+DLSYM_FUNCTION(fido_dev_info_ptr);
+DLSYM_FUNCTION(fido_dev_is_fido2);
+DLSYM_FUNCTION(fido_dev_make_cred);
+DLSYM_FUNCTION(fido_dev_new);
+DLSYM_FUNCTION(fido_dev_open);
+DLSYM_FUNCTION(fido_dev_close);
+DLSYM_FUNCTION(fido_init);
+DLSYM_FUNCTION(fido_set_log_handler);
+DLSYM_FUNCTION(fido_strerr);
static void fido_log_propagate_handler(const char *s) {
log_debug("libfido2: %s", strempty(s));
diff --git a/src/shared/libfido2-util.h b/src/shared/libfido2-util.h
index 3520ab4ec3..198408fdaf 100644
--- a/src/shared/libfido2-util.h
+++ b/src/shared/libfido2-util.h
@@ -17,53 +17,55 @@ typedef enum Fido2EnrollFlags {
#if HAVE_LIBFIDO2
#include <fido.h>
-extern int (*sym_fido_assert_allow_cred)(fido_assert_t *, const unsigned char *, size_t);
-extern void (*sym_fido_assert_free)(fido_assert_t **);
-extern size_t (*sym_fido_assert_hmac_secret_len)(const fido_assert_t *, size_t);
-extern const unsigned char* (*sym_fido_assert_hmac_secret_ptr)(const fido_assert_t *, size_t);
-extern fido_assert_t* (*sym_fido_assert_new)(void);
-extern int (*sym_fido_assert_set_clientdata_hash)(fido_assert_t *, const unsigned char *, size_t);
-extern int (*sym_fido_assert_set_extensions)(fido_assert_t *, int);
-extern int (*sym_fido_assert_set_hmac_salt)(fido_assert_t *, const unsigned char *, size_t);
-extern int (*sym_fido_assert_set_rp)(fido_assert_t *, const char *);
-extern int (*sym_fido_assert_set_up)(fido_assert_t *, fido_opt_t);
-extern int (*sym_fido_assert_set_uv)(fido_assert_t *, fido_opt_t);
-extern size_t (*sym_fido_cbor_info_extensions_len)(const fido_cbor_info_t *);
-extern char **(*sym_fido_cbor_info_extensions_ptr)(const fido_cbor_info_t *);
-extern void (*sym_fido_cbor_info_free)(fido_cbor_info_t **);
-extern fido_cbor_info_t* (*sym_fido_cbor_info_new)(void);
-extern size_t (*sym_fido_cbor_info_options_len)(const fido_cbor_info_t *);
-extern char** (*sym_fido_cbor_info_options_name_ptr)(const fido_cbor_info_t *);
-extern const bool* (*sym_fido_cbor_info_options_value_ptr)(const fido_cbor_info_t *);
-extern void (*sym_fido_cred_free)(fido_cred_t **);
-extern size_t (*sym_fido_cred_id_len)(const fido_cred_t *);
-extern const unsigned char* (*sym_fido_cred_id_ptr)(const fido_cred_t *);
-extern fido_cred_t* (*sym_fido_cred_new)(void);
-extern int (*sym_fido_cred_set_clientdata_hash)(fido_cred_t *, const unsigned char *, size_t);
-extern int (*sym_fido_cred_set_extensions)(fido_cred_t *, int);
-extern int (*sym_fido_cred_set_rk)(fido_cred_t *, fido_opt_t);
-extern int (*sym_fido_cred_set_rp)(fido_cred_t *, const char *, const char *);
-extern int (*sym_fido_cred_set_type)(fido_cred_t *, int);
-extern int (*sym_fido_cred_set_user)(fido_cred_t *, const unsigned char *, size_t, const char *, const char *, const char *);
-extern int (*sym_fido_cred_set_uv)(fido_cred_t *, fido_opt_t);
-extern void (*sym_fido_dev_free)(fido_dev_t **);
-extern int (*sym_fido_dev_get_assert)(fido_dev_t *, fido_assert_t *, const char *);
-extern int (*sym_fido_dev_get_cbor_info)(fido_dev_t *, fido_cbor_info_t *);
-extern void (*sym_fido_dev_info_free)(fido_dev_info_t **, size_t);
-extern int (*sym_fido_dev_info_manifest)(fido_dev_info_t *, size_t, size_t *);
-extern const char* (*sym_fido_dev_info_manufacturer_string)(const fido_dev_info_t *);
-extern const char* (*sym_fido_dev_info_product_string)(const fido_dev_info_t *);
-extern fido_dev_info_t* (*sym_fido_dev_info_new)(size_t);
-extern const char* (*sym_fido_dev_info_path)(const fido_dev_info_t *);
-extern const fido_dev_info_t* (*sym_fido_dev_info_ptr)(const fido_dev_info_t *, size_t);
-extern bool (*sym_fido_dev_is_fido2)(const fido_dev_t *);
-extern int (*sym_fido_dev_make_cred)(fido_dev_t *, fido_cred_t *, const char *);
-extern fido_dev_t* (*sym_fido_dev_new)(void);
-extern int (*sym_fido_dev_open)(fido_dev_t *, const char *);
-extern int (*sym_fido_dev_close)(fido_dev_t *);
-extern void (*sym_fido_init)(int);
-extern void (*sym_fido_set_log_handler)(fido_log_handler_t *);
-extern const char* (*sym_fido_strerr)(int);
+#include "dlfcn-util.h"
+
+DLSYM_PROTOTYPE(fido_assert_allow_cred);
+DLSYM_PROTOTYPE(fido_assert_free);
+DLSYM_PROTOTYPE(fido_assert_hmac_secret_len);
+DLSYM_PROTOTYPE(fido_assert_hmac_secret_ptr);
+DLSYM_PROTOTYPE(fido_assert_new);
+DLSYM_PROTOTYPE(fido_assert_set_clientdata_hash);
+DLSYM_PROTOTYPE(fido_assert_set_extensions);
+DLSYM_PROTOTYPE(fido_assert_set_hmac_salt);
+DLSYM_PROTOTYPE(fido_assert_set_rp);
+DLSYM_PROTOTYPE(fido_assert_set_up);
+DLSYM_PROTOTYPE(fido_assert_set_uv);
+DLSYM_PROTOTYPE(fido_cbor_info_extensions_len);
+DLSYM_PROTOTYPE(fido_cbor_info_extensions_ptr);
+DLSYM_PROTOTYPE(fido_cbor_info_free);
+DLSYM_PROTOTYPE(fido_cbor_info_new);
+DLSYM_PROTOTYPE(fido_cbor_info_options_len);
+DLSYM_PROTOTYPE(fido_cbor_info_options_name_ptr);
+DLSYM_PROTOTYPE(fido_cbor_info_options_value_ptr);
+DLSYM_PROTOTYPE(fido_cred_free);
+DLSYM_PROTOTYPE(fido_cred_id_len);
+DLSYM_PROTOTYPE(fido_cred_id_ptr);
+DLSYM_PROTOTYPE(fido_cred_new);
+DLSYM_PROTOTYPE(fido_cred_set_clientdata_hash);
+DLSYM_PROTOTYPE(fido_cred_set_extensions);
+DLSYM_PROTOTYPE(fido_cred_set_rk);
+DLSYM_PROTOTYPE(fido_cred_set_rp);
+DLSYM_PROTOTYPE(fido_cred_set_type);
+DLSYM_PROTOTYPE(fido_cred_set_user);
+DLSYM_PROTOTYPE(fido_cred_set_uv);
+DLSYM_PROTOTYPE(fido_dev_free);
+DLSYM_PROTOTYPE(fido_dev_get_assert);
+DLSYM_PROTOTYPE(fido_dev_get_cbor_info);
+DLSYM_PROTOTYPE(fido_dev_info_free);
+DLSYM_PROTOTYPE(fido_dev_info_manifest);
+DLSYM_PROTOTYPE(fido_dev_info_manufacturer_string);
+DLSYM_PROTOTYPE(fido_dev_info_product_string);
+DLSYM_PROTOTYPE(fido_dev_info_new);
+DLSYM_PROTOTYPE(fido_dev_info_path);
+DLSYM_PROTOTYPE(fido_dev_info_ptr);
+DLSYM_PROTOTYPE(fido_dev_is_fido2);
+DLSYM_PROTOTYPE(fido_dev_make_cred);
+DLSYM_PROTOTYPE(fido_dev_new);
+DLSYM_PROTOTYPE(fido_dev_open);
+DLSYM_PROTOTYPE(fido_dev_close);
+DLSYM_PROTOTYPE(fido_init);
+DLSYM_PROTOTYPE(fido_set_log_handler);
+DLSYM_PROTOTYPE(fido_strerr);
int dlopen_libfido2(void);
diff --git a/src/shared/meson.build b/src/shared/meson.build
index fe0c9c1f2f..d540631f21 100644
--- a/src/shared/meson.build
+++ b/src/shared/meson.build
@@ -55,7 +55,6 @@ shared_sources = files(
'device-nodes.c',
'discover-image.c',
'dissect-image.c',
- 'dlfcn-util.c',
'dm-util.c',
'dns-domain.c',
'dropin.c',
@@ -325,7 +324,7 @@ libshared_deps = [threads,
libgcrypt,
libiptc_cflags,
libkmod,
- liblz4,
+ liblz4_cflags,
libmount,
libopenssl,
libp11kit_cflags,
@@ -334,8 +333,8 @@ libshared_deps = [threads,
libseccomp,
libselinux,
libxenctrl_cflags,
- libxz,
- libzstd]
+ libxz_cflags,
+ libzstd_cflags]
libshared_sym_path = meson.current_source_dir() / 'libshared.sym'
libshared_build_dir = meson.current_build_dir()
diff --git a/src/shared/mount-setup.c b/src/shared/mount-setup.c
index a492e7127f..3c0132fd08 100644
--- a/src/shared/mount-setup.c
+++ b/src/shared/mount-setup.c
@@ -107,16 +107,6 @@ static const MountPoint mount_table[] = {
cg_is_unified_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
{ "cgroup2", "/sys/fs/cgroup", "cgroup2", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV,
cg_is_unified_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
- { "tmpfs", "/sys/fs/cgroup", "tmpfs", "mode=0755" TMPFS_LIMITS_SYS_FS_CGROUP, MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME,
- cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
- { "cgroup2", "/sys/fs/cgroup/unified", "cgroup2", "nsdelegate", MS_NOSUID|MS_NOEXEC|MS_NODEV,
- cg_is_hybrid_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
- { "cgroup2", "/sys/fs/cgroup/unified", "cgroup2", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV,
- cg_is_hybrid_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
- { "cgroup", "/sys/fs/cgroup/systemd", "cgroup", "none,name=systemd,xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV,
- cg_is_legacy_wanted, MNT_IN_CONTAINER },
- { "cgroup", "/sys/fs/cgroup/systemd", "cgroup", "none,name=systemd", MS_NOSUID|MS_NOEXEC|MS_NODEV,
- cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
#if ENABLE_PSTORE
{ "pstore", "/sys/fs/pstore", "pstore", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV,
NULL, MNT_NONE },
@@ -167,8 +157,11 @@ static int mount_one(const MountPoint *p, bool relabel) {
int r, priority;
assert(p);
+ assert(p->what);
+ assert(p->where);
+ assert(p->type);
- priority = (p->mode & MNT_FATAL) ? LOG_ERR : LOG_DEBUG;
+ priority = FLAGS_SET(p->mode, MNT_FATAL) ? LOG_ERR : LOG_DEBUG;
if (p->condition_fn && !p->condition_fn())
return 0;
@@ -180,13 +173,13 @@ static int mount_one(const MountPoint *p, bool relabel) {
r = path_is_mount_point_full(p->where, /* root = */ NULL, AT_SYMLINK_FOLLOW);
if (r < 0 && r != -ENOENT) {
log_full_errno(priority, r, "Failed to determine whether %s is a mount point: %m", p->where);
- return (p->mode & MNT_FATAL) ? r : 0;
+ return FLAGS_SET(p->mode, MNT_FATAL) ? r : 0;
}
if (r > 0)
return 0;
/* Skip securityfs in a container */
- if (!(p->mode & MNT_IN_CONTAINER) && detect_container() > 0)
+ if (!FLAGS_SET(p->mode, MNT_IN_CONTAINER) && detect_container() > 0)
return 0;
/* The access mode here doesn't really matter too much, since
@@ -207,39 +200,35 @@ static int mount_one(const MountPoint *p, bool relabel) {
else
r = mount_nofollow_verbose(priority, p->what, p->where, p->type, p->flags, p->options);
if (r < 0)
- return (p->mode & MNT_FATAL) ? r : 0;
+ return FLAGS_SET(p->mode, MNT_FATAL) ? r : 0;
/* Relabel again, since we now mounted something fresh here */
if (relabel)
(void) label_fix(p->where, 0);
- if (p->mode & MNT_CHECK_WRITABLE) {
+ if (FLAGS_SET(p->mode, MNT_CHECK_WRITABLE))
if (access(p->where, W_OK) < 0) {
r = -errno;
(void) umount2(p->where, UMOUNT_NOFOLLOW);
(void) rmdir(p->where);
- log_full_errno(priority, r, "Mount point %s not writable after mounting, undoing: %m", p->where);
- return (p->mode & MNT_FATAL) ? r : 0;
+ log_full_errno(priority, r, "Mount point '%s' not writable after mounting, undoing: %m", p->where);
+ return FLAGS_SET(p->mode, MNT_FATAL) ? r : 0;
}
- }
return 1;
}
static int mount_points_setup(size_t n, bool loaded_policy) {
- int ret = 0, r;
+ int r = 0;
assert(n <= ELEMENTSOF(mount_table));
- FOREACH_ARRAY(mp, mount_table, n) {
- r = mount_one(mp, loaded_policy);
- if (r != 0 && ret >= 0)
- ret = r;
- }
+ FOREACH_ARRAY(mp, mount_table, n)
+ RET_GATHER(r, mount_one(mp, loaded_policy));
- return ret;
+ return r;
}
int mount_setup_early(void) {
@@ -297,81 +286,6 @@ static int symlink_controller(const char *target, const char *alias) {
return 0;
}
-int mount_cgroup_controllers(void) {
- _cleanup_set_free_ Set *controllers = NULL;
- int r;
-
- if (!cg_is_legacy_wanted())
- return 0;
-
- /* Mount all available cgroup controllers that are built into the kernel. */
- r = cg_kernel_controllers(&controllers);
- if (r < 0)
- return log_error_errno(r, "Failed to enumerate cgroup controllers: %m");
-
- for (;;) {
- _cleanup_free_ char *options = NULL, *controller = NULL, *where = NULL;
- const char *other_controller;
- MountPoint p = {
- .what = "cgroup",
- .type = "cgroup",
- .flags = MS_NOSUID|MS_NOEXEC|MS_NODEV,
- .mode = MNT_IN_CONTAINER,
- };
-
- controller = set_steal_first(controllers);
- if (!controller)
- break;
-
- /* Check if we shall mount this together with another controller */
- other_controller = join_with(controller);
- if (other_controller) {
- _cleanup_free_ char *c = NULL;
-
- /* Check if the other controller is actually available in the kernel too */
- c = set_remove(controllers, other_controller);
- if (c) {
-
- /* Join the two controllers into one string, and maintain a stable ordering */
- if (strcmp(controller, other_controller) < 0)
- options = strjoin(controller, ",", other_controller);
- else
- options = strjoin(other_controller, ",", controller);
- if (!options)
- return log_oom();
- }
- }
-
- /* The simple case, where there's only one controller to mount together */
- if (!options)
- options = TAKE_PTR(controller);
-
- where = path_join("/sys/fs/cgroup", options);
- if (!where)
- return log_oom();
-
- p.where = where;
- p.options = options;
-
- r = mount_one(&p, true);
- if (r < 0)
- return r;
-
- /* Create symlinks from the individual controller names, in case we have a joined mount */
- if (controller)
- (void) symlink_controller(options, controller);
- if (other_controller)
- (void) symlink_controller(options, other_controller);
- }
-
- /* Now that we mounted everything, let's make the tmpfs the cgroup file systems are mounted into read-only. */
- (void) mount_nofollow("tmpfs", "/sys/fs/cgroup", "tmpfs",
- MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME|MS_RDONLY,
- "mode=0755" TMPFS_LIMITS_SYS_FS_CGROUP);
-
- return 0;
-}
-
#if HAVE_SELINUX || ENABLE_SMACK
static int relabel_cb(
RecurseDirEvent event,
@@ -415,34 +329,6 @@ static int relabel_tree(const char *path) {
return r;
}
-static int relabel_cgroup_filesystems(void) {
- int r;
- struct statfs st;
-
- r = cg_all_unified();
- if (r == 0) {
- /* Temporarily remount the root cgroup filesystem to give it a proper label. Do this
- only when the filesystem has been already populated by a previous instance of systemd
- running from initrd. Otherwise don't remount anything and leave the filesystem read-write
- for the cgroup filesystems to be mounted inside. */
- if (statfs("/sys/fs/cgroup", &st) < 0)
- return log_error_errno(errno, "Failed to determine mount flags for /sys/fs/cgroup: %m");
-
- if (st.f_flags & ST_RDONLY)
- (void) mount_nofollow(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT, NULL);
-
- (void) label_fix("/sys/fs/cgroup", 0);
- (void) relabel_tree("/sys/fs/cgroup");
-
- if (st.f_flags & ST_RDONLY)
- (void) mount_nofollow(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT|MS_RDONLY, NULL);
-
- } else if (r < 0)
- return log_error_errno(r, "Failed to determine whether we are in all unified mode: %m");
-
- return 0;
-}
-
static int relabel_extra(void) {
_cleanup_strv_free_ char **files = NULL;
int r, c = 0;
@@ -533,14 +419,12 @@ int mount_setup(bool loaded_policy, bool leave_propagation) {
FOREACH_STRING(i, "/dev", "/dev/shm", "/run")
(void) relabel_tree(i);
- (void) relabel_cgroup_filesystems();
-
n_extra = relabel_extra();
after_relabel = now(CLOCK_MONOTONIC);
- log_info("Relabeled /dev, /dev/shm, /run, /sys/fs/cgroup%s in %s.",
- n_extra > 0 ? ", additional files" : "",
+ log_info("Relabeled /dev/, /dev/shm/, /run/%s in %s.",
+ n_extra > 0 ? ", and additional files" : "",
FORMAT_TIMESPAN(after_relabel - before_relabel, 0));
}
#endif
@@ -589,3 +473,127 @@ int mount_setup(bool loaded_policy, bool leave_propagation) {
return 0;
}
+
+static const MountPoint cgroupv1_mount_table[] = {
+ { "tmpfs", "/sys/fs/cgroup", "tmpfs", "mode=0755" TMPFS_LIMITS_SYS_FS_CGROUP, MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME,
+ cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
+ { "cgroup2", "/sys/fs/cgroup/unified", "cgroup2", "nsdelegate", MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ cg_is_hybrid_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
+ { "cgroup2", "/sys/fs/cgroup/unified", "cgroup2", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ cg_is_hybrid_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
+ { "cgroup", "/sys/fs/cgroup/systemd", "cgroup", "none,name=systemd,xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ cg_is_legacy_wanted, MNT_IN_CONTAINER },
+ { "cgroup", "/sys/fs/cgroup/systemd", "cgroup", "none,name=systemd", MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
+};
+
+static void relabel_cgroup_legacy_hierarchy(void) {
+#if HAVE_SELINUX || ENABLE_SMACK
+ struct statfs st;
+
+ assert(cg_is_legacy_wanted());
+
+ /* Temporarily remount the root cgroup filesystem to give it a proper label. Do this
+ only when the filesystem has been already populated by a previous instance of systemd
+ running from initrd. Otherwise don't remount anything and leave the filesystem read-write
+ for the cgroup filesystems to be mounted inside. */
+ if (statfs("/sys/fs/cgroup", &st) < 0)
+ return (void) log_error_errno(errno, "Failed to determine mount flags for /sys/fs/cgroup/: %m");
+
+ if (st.f_flags & ST_RDONLY)
+ (void) mount_nofollow(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT, NULL);
+
+ (void) label_fix("/sys/fs/cgroup", 0);
+ (void) relabel_tree("/sys/fs/cgroup");
+
+ if (st.f_flags & ST_RDONLY)
+ (void) mount_nofollow(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT|MS_RDONLY, NULL);
+#endif
+}
+
+int mount_cgroup_legacy_controllers(bool loaded_policy) {
+ _cleanup_set_free_ Set *controllers = NULL;
+ int r;
+
+ if (!cg_is_legacy_wanted())
+ return 0;
+
+ if (!cg_is_legacy_force_enabled())
+ return -ERFKILL;
+
+ FOREACH_ARRAY(mp, cgroupv1_mount_table, ELEMENTSOF(cgroupv1_mount_table)) {
+ r = mount_one(mp, loaded_policy);
+ if (r < 0)
+ return r;
+ }
+
+ if (loaded_policy)
+ relabel_cgroup_legacy_hierarchy();
+
+ /* Mount all available cgroup controllers that are built into the kernel. */
+ r = cg_kernel_controllers(&controllers);
+ if (r < 0)
+ return log_error_errno(r, "Failed to enumerate cgroup controllers: %m");
+
+ for (;;) {
+ _cleanup_free_ char *options = NULL, *controller = NULL, *where = NULL;
+ const char *other_controller;
+ MountPoint p = {
+ .what = "cgroup",
+ .type = "cgroup",
+ .flags = MS_NOSUID|MS_NOEXEC|MS_NODEV,
+ .mode = MNT_IN_CONTAINER,
+ };
+
+ controller = set_steal_first(controllers);
+ if (!controller)
+ break;
+
+ /* Check if we shall mount this together with another controller */
+ other_controller = join_with(controller);
+ if (other_controller) {
+ _cleanup_free_ char *c = NULL;
+
+ /* Check if the other controller is actually available in the kernel too */
+ c = set_remove(controllers, other_controller);
+ if (c) {
+
+ /* Join the two controllers into one string, and maintain a stable ordering */
+ if (strcmp(controller, other_controller) < 0)
+ options = strjoin(controller, ",", other_controller);
+ else
+ options = strjoin(other_controller, ",", controller);
+ if (!options)
+ return log_oom();
+ }
+ }
+
+ /* The simple case, where there's only one controller to mount together */
+ if (!options)
+ options = TAKE_PTR(controller);
+
+ where = path_join("/sys/fs/cgroup", options);
+ if (!where)
+ return log_oom();
+
+ p.where = where;
+ p.options = options;
+
+ r = mount_one(&p, true);
+ if (r < 0)
+ return r;
+
+ /* Create symlinks from the individual controller names, in case we have a joined mount */
+ if (controller)
+ (void) symlink_controller(options, controller);
+ if (other_controller)
+ (void) symlink_controller(options, other_controller);
+ }
+
+ /* Now that we mounted everything, let's make the tmpfs the cgroup file systems are mounted into read-only. */
+ (void) mount_nofollow("tmpfs", "/sys/fs/cgroup", "tmpfs",
+ MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME|MS_RDONLY,
+ "mode=0755" TMPFS_LIMITS_SYS_FS_CGROUP);
+
+ return 1;
+}
diff --git a/src/shared/mount-setup.h b/src/shared/mount-setup.h
index 29bd62f6bf..9fc49331d9 100644
--- a/src/shared/mount-setup.h
+++ b/src/shared/mount-setup.h
@@ -3,10 +3,10 @@
#include <stdbool.h>
+bool mount_point_is_api(const char *path);
+bool mount_point_ignore(const char *path);
+
int mount_setup_early(void);
int mount_setup(bool loaded_policy, bool leave_propagation);
-int mount_cgroup_controllers(void);
-
-bool mount_point_is_api(const char *path);
-bool mount_point_ignore(const char *path);
+int mount_cgroup_legacy_controllers(bool loaded_policy);
diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c
index bff1bf9f49..72fa4fee43 100644
--- a/src/shared/mount-util.c
+++ b/src/shared/mount-util.c
@@ -453,6 +453,16 @@ int bind_remount_one_with_mountinfo(
return 0;
}
+int bind_remount_one(const char *path, unsigned long new_flags, unsigned long flags_mask) {
+ _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
+
+ proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
+ if (!proc_self_mountinfo)
+ return log_debug_errno(errno, "Failed to open /proc/self/mountinfo: %m");
+
+ return bind_remount_one_with_mountinfo(path, new_flags, flags_mask, proc_self_mountinfo);
+}
+
static int mount_switch_root_pivot(int fd_newroot, const char *path) {
assert(fd_newroot >= 0);
assert(path);
@@ -1204,7 +1214,9 @@ static int mount_in_namespace(
(void) mkdir_parents(dest, 0755);
if (img) {
- DissectImageFlags f = DISSECT_IMAGE_TRY_ATOMIC_MOUNT_EXCHANGE;
+ DissectImageFlags f =
+ DISSECT_IMAGE_TRY_ATOMIC_MOUNT_EXCHANGE |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
if (make_file_or_directory)
f |= DISSECT_IMAGE_MKDIR;
diff --git a/src/shared/mount-util.h b/src/shared/mount-util.h
index 2f9f394ab0..26d96b27b7 100644
--- a/src/shared/mount-util.h
+++ b/src/shared/mount-util.h
@@ -26,6 +26,7 @@ static inline int bind_remount_recursive(const char *prefix, unsigned long new_f
}
int bind_remount_one_with_mountinfo(const char *path, unsigned long new_flags, unsigned long flags_mask, FILE *proc_self_mountinfo);
+int bind_remount_one(const char *path, unsigned long new_flags, unsigned long flags_mask);
int mount_switch_root_full(const char *path, unsigned long mount_propagation_flag, bool force_ms_move);
static inline int mount_switch_root(const char *path, unsigned long mount_propagation_flag) {
diff --git a/src/shared/netif-naming-scheme.c b/src/shared/netif-naming-scheme.c
index 38c24760f0..2955b6e8d5 100644
--- a/src/shared/netif-naming-scheme.c
+++ b/src/shared/netif-naming-scheme.c
@@ -53,7 +53,7 @@ const NamingScheme* naming_scheme(void) {
return cache;
/* Acquire setting from the kernel command line */
- (void) proc_cmdline_get_key("net.naming-scheme", 0, &buffer);
+ (void) proc_cmdline_get_key("net.naming_scheme", 0, &buffer);
/* Also acquire it from an env var */
e = getenv("NET_NAMING_SCHEME");
diff --git a/src/shared/open-file.c b/src/shared/open-file.c
index 42772bdabe..beebb74cff 100644
--- a/src/shared/open-file.c
+++ b/src/shared/open-file.c
@@ -23,7 +23,7 @@ int open_file_parse(const char *v, OpenFile **ret) {
if (!of)
return -ENOMEM;
- r = extract_many_words(&v, ":", EXTRACT_DONT_COALESCE_SEPARATORS|EXTRACT_CUNESCAPE, &of->path, &of->fdname, &options, NULL);
+ r = extract_many_words(&v, ":", EXTRACT_DONT_COALESCE_SEPARATORS|EXTRACT_CUNESCAPE, &of->path, &of->fdname, &options);
if (r < 0)
return r;
if (r == 0)
diff --git a/src/shared/openssl-util.c b/src/shared/openssl-util.c
index e2386d0513..63c443cbfd 100644
--- a/src/shared/openssl-util.c
+++ b/src/shared/openssl-util.c
@@ -1366,38 +1366,25 @@ static int load_key_from_engine(const char *engine, const char *private_key_uri,
return 0;
}
-int openssl_load_key_from_token(const char *private_key_uri, EVP_PKEY **ret) {
- _cleanup_free_ char *provider = NULL;
- const char *colon, *e;
- int r;
-
- assert(private_key_uri);
+int openssl_load_key_from_token(
+ KeySourceType private_key_source_type,
+ const char *private_key_source,
+ const char *private_key,
+ EVP_PKEY **ret) {
- colon = strchr(private_key_uri, ':');
- if (!colon)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URI '%s'", private_key_uri);
+ assert(IN_SET(private_key_source_type, OPENSSL_KEY_SOURCE_ENGINE, OPENSSL_KEY_SOURCE_PROVIDER));
+ assert(private_key_source);
+ assert(private_key);
- provider = strndup(private_key_uri, colon - private_key_uri);
- if (!provider)
- return log_oom_debug();
+ switch (private_key_source_type) {
- e = secure_getenv("SYSTEMD_OPENSSL_KEY_LOADER");
- if (e) {
- if (streq(e, "provider"))
- r = load_key_from_provider(provider, private_key_uri, ret);
- else if (streq(e, "engine"))
- r = load_key_from_engine(provider, private_key_uri, ret);
- else
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value for SYSTEMD_OPENSSL_KEY_LOADER: %s", e);
- } else {
- r = load_key_from_provider(provider, private_key_uri, ret);
- if (r < 0) {
- log_debug_errno(r, "Failed to load key from provider '%s', falling back to engine", provider);
- r = load_key_from_engine(provider, private_key_uri, ret);
- }
+ case OPENSSL_KEY_SOURCE_ENGINE:
+ return load_key_from_engine(private_key_source, private_key, ret);
+ case OPENSSL_KEY_SOURCE_PROVIDER:
+ return load_key_from_provider(private_key_source, private_key, ret);
+ default:
+ assert_not_reached();
}
-
- return r;
}
#endif
@@ -1418,3 +1405,34 @@ int x509_fingerprint(X509 *cert, uint8_t buffer[static SHA256_DIGEST_SIZE]) {
return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "OpenSSL is not supported, cannot calculate X509 fingerprint: %m");
#endif
}
+
+int parse_openssl_key_source_argument(
+ const char *argument,
+ char **private_key_source,
+ KeySourceType *private_key_source_type) {
+
+ KeySourceType type;
+ const char *e = NULL;
+ int r;
+
+ assert(argument);
+ assert(private_key_source);
+ assert(private_key_source_type);
+
+ if (streq(argument, "file"))
+ type = OPENSSL_KEY_SOURCE_FILE;
+ else if ((e = startswith(argument, "engine:")))
+ type = OPENSSL_KEY_SOURCE_ENGINE;
+ else if ((e = startswith(argument, "provider:")))
+ type = OPENSSL_KEY_SOURCE_PROVIDER;
+ else
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid private key source '%s'", argument);
+
+ r = free_and_strdup_warn(private_key_source, e);
+ if (r < 0)
+ return r;
+
+ *private_key_source_type = type;
+
+ return 0;
+}
diff --git a/src/shared/openssl-util.h b/src/shared/openssl-util.h
index 8d7d4f8c9f..e5ecbad86d 100644
--- a/src/shared/openssl-util.h
+++ b/src/shared/openssl-util.h
@@ -5,6 +5,16 @@
#include "macro.h"
#include "sha256.h"
+typedef enum KeySourceType {
+ OPENSSL_KEY_SOURCE_FILE,
+ OPENSSL_KEY_SOURCE_ENGINE,
+ OPENSSL_KEY_SOURCE_PROVIDER,
+ _OPENSSL_KEY_SOURCE_MAX,
+ _OPENSSL_KEY_SOURCE_INVALID = -EINVAL,
+} KeySourceType;
+
+int parse_openssl_key_source_argument(const char *argument, char **private_key_source, KeySourceType *private_key_source_type);
+
#define X509_FINGERPRINT_SIZE SHA256_DIGEST_SIZE
#if HAVE_OPENSSL
@@ -123,7 +133,7 @@ int pubkey_fingerprint(EVP_PKEY *pk, const EVP_MD *md, void **ret, size_t *ret_s
int digest_and_sign(const EVP_MD *md, EVP_PKEY *privkey, const void *data, size_t size, void **ret, size_t *ret_size);
-int openssl_load_key_from_token(const char *private_key_uri, EVP_PKEY **ret);
+int openssl_load_key_from_token(KeySourceType private_key_source_type, const char *private_key_source, const char *private_key, EVP_PKEY **ret);
#else
@@ -140,7 +150,12 @@ static inline void *EVP_PKEY_free(EVP_PKEY *p) {
return NULL;
}
-static inline int openssl_load_key_from_token(const char *private_key_uri, EVP_PKEY **ret) {
+static inline int openssl_load_key_from_token(
+ KeySourceType private_key_source_type,
+ const char *private_key_source,
+ const char *private_key,
+ EVP_PKEY **ret) {
+
return -EOPNOTSUPP;
}
diff --git a/src/shared/pager.c b/src/shared/pager.c
index 19deefab56..9b8ae76700 100644
--- a/src/shared/pager.c
+++ b/src/shared/pager.c
@@ -175,7 +175,7 @@ void pager_open(PagerFlags flags) {
* pager. If they didn't, use secure mode when under euid is changed. If $SYSTEMD_PAGERSECURE
* wasn't explicitly set, and we autodetect the need for secure mode, only use the pager we
* know to be good. */
- int use_secure_mode = getenv_bool_secure("SYSTEMD_PAGERSECURE");
+ int use_secure_mode = secure_getenv_bool("SYSTEMD_PAGERSECURE");
bool trust_pager = use_secure_mode >= 0;
if (use_secure_mode == -ENXIO) {
uid_t uid;
diff --git a/src/shared/pam-util.c b/src/shared/pam-util.c
index fabe21f0cc..d626b2817b 100644
--- a/src/shared/pam-util.c
+++ b/src/shared/pam-util.c
@@ -97,7 +97,7 @@ static void pam_bus_data_destroy(pam_handle_t *handle, void *data, int error_sta
d->bus && bus_origin_changed(d->bus))
/* Please adjust test/units/end.sh when updating the log message. */
pam_syslog(handle, LOG_DEBUG,
- "Attempted to close sd-bus (%s) after fork whose connection is opened before the fork, this should not happen.",
+ "Warning: cannot close sd-bus connection (%s) after fork when it was opened before the fork.",
strna(d->cache_id));
pam_bus_data_free(data);
@@ -179,6 +179,8 @@ int pam_acquire_bus_connection(
if (r != PAM_SUCCESS)
return pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to set PAM bus data: @PAMERR@");
+ pam_syslog(handle, LOG_DEBUG, "New sd-bus connection (%s) opened.", d->cache_id);
+
success:
*ret_bus = sd_bus_ref(d->bus);
@@ -207,6 +209,32 @@ int pam_release_bus_connection(pam_handle_t *handle, const char *module_name) {
return PAM_SUCCESS;
}
+int pam_get_bus_data(
+ pam_handle_t *handle,
+ const char *module_name,
+ PamBusData **ret) {
+
+ PamBusData *d = NULL;
+ _cleanup_free_ char *cache_id = NULL;
+ int r;
+
+ assert(handle);
+ assert(module_name);
+ assert(ret);
+
+ cache_id = pam_make_bus_cache_id(module_name);
+ if (!cache_id)
+ return pam_log_oom(handle);
+
+ /* We cache the bus connection so that we can share it between the session and the authentication hooks */
+ r = pam_get_data(handle, cache_id, (const void**) &d);
+ if (!IN_SET(r, PAM_SUCCESS, PAM_NO_MODULE_DATA))
+ return pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to get bus connection: @PAMERR@");
+
+ *ret = d;
+ return PAM_SUCCESS;
+}
+
void pam_cleanup_free(pam_handle_t *handle, void *data, int error_status) {
/* A generic destructor for pam_set_data() that just frees the specified data */
free(data);
diff --git a/src/shared/pam-util.h b/src/shared/pam-util.h
index 3439d4246e..51bffc329e 100644
--- a/src/shared/pam-util.h
+++ b/src/shared/pam-util.h
@@ -37,6 +37,7 @@ void pam_bus_data_disconnectp(PamBusData **d);
* helps avoid a clash in the internal data structures of sd-bus. It will be used as key for cache items. */
int pam_acquire_bus_connection(pam_handle_t *handle, const char *module_name, sd_bus **ret_bus, PamBusData **ret_bus_data);
int pam_release_bus_connection(pam_handle_t *handle, const char *module_name);
+int pam_get_bus_data(pam_handle_t *handle, const char *module_name, PamBusData **ret);
void pam_cleanup_free(pam_handle_t *handle, void *data, int error_status);
diff --git a/src/shared/password-quality-util-passwdqc.c b/src/shared/password-quality-util-passwdqc.c
index adfc14d740..c32b493534 100644
--- a/src/shared/password-quality-util-passwdqc.c
+++ b/src/shared/password-quality-util-passwdqc.c
@@ -12,12 +12,12 @@
static void *passwdqc_dl = NULL;
-void (*sym_passwdqc_params_reset)(passwdqc_params_t *params);
-int (*sym_passwdqc_params_load)(passwdqc_params_t *params, char **reason, const char *pathname);
-int (*sym_passwdqc_params_parse)(passwdqc_params_t *params, char **reason, int argc, const char *const *argv);
-void (*sym_passwdqc_params_free)(passwdqc_params_t *params);
-const char *(*sym_passwdqc_check)(const passwdqc_params_qc_t *params, const char *newpass, const char *oldpass, const struct passwd *pw);
-char *(*sym_passwdqc_random)(const passwdqc_params_qc_t *params);
+DLSYM_FUNCTION(passwdqc_params_reset);
+DLSYM_FUNCTION(passwdqc_params_load);
+DLSYM_FUNCTION(passwdqc_params_parse);
+DLSYM_FUNCTION(passwdqc_params_free);
+DLSYM_FUNCTION(passwdqc_check);
+DLSYM_FUNCTION(passwdqc_random);
int dlopen_passwdqc(void) {
return dlopen_many_sym_or_warn(
diff --git a/src/shared/password-quality-util-passwdqc.h b/src/shared/password-quality-util-passwdqc.h
index 0d528d2089..11d756d255 100644
--- a/src/shared/password-quality-util-passwdqc.h
+++ b/src/shared/password-quality-util-passwdqc.h
@@ -6,12 +6,12 @@
#if HAVE_PASSWDQC
#include <passwdqc.h>
-extern void (*sym_passwdqc_params_reset)(passwdqc_params_t *params);
-extern int (*sym_passwdqc_params_load)(passwdqc_params_t *params, char **reason, const char *pathname);
-extern int (*sym_passwdqc_params_parse)(passwdqc_params_t *params, char **reason, int argc, const char *const *argv);
-extern void (*sym_passwdqc_params_free)(passwdqc_params_t *params);
-extern const char *(*sym_passwdqc_check)(const passwdqc_params_qc_t *params, const char *newpass, const char *oldpass, const struct passwd *pw);
-extern char *(*sym_passwdqc_random)(const passwdqc_params_qc_t *params);
+DLSYM_PROTOTYPE(passwdqc_params_reset);
+DLSYM_PROTOTYPE(passwdqc_params_load);
+DLSYM_PROTOTYPE(passwdqc_params_parse);
+DLSYM_PROTOTYPE(passwdqc_params_free);
+DLSYM_PROTOTYPE(passwdqc_check);
+DLSYM_PROTOTYPE(passwdqc_random);
int dlopen_passwdqc(void);
diff --git a/src/shared/password-quality-util-pwquality.c b/src/shared/password-quality-util-pwquality.c
index 80f7d58e5d..87e7d285c5 100644
--- a/src/shared/password-quality-util-pwquality.c
+++ b/src/shared/password-quality-util-pwquality.c
@@ -14,14 +14,14 @@
static void *pwquality_dl = NULL;
-int (*sym_pwquality_check)(pwquality_settings_t *pwq, const char *password, const char *oldpassword, const char *user, void **auxerror);
-pwquality_settings_t *(*sym_pwquality_default_settings)(void);
-void (*sym_pwquality_free_settings)(pwquality_settings_t *pwq);
-int (*sym_pwquality_generate)(pwquality_settings_t *pwq, int entropy_bits, char **password);
-int (*sym_pwquality_get_str_value)(pwquality_settings_t *pwq, int setting, const char **value);
-int (*sym_pwquality_read_config)(pwquality_settings_t *pwq, const char *cfgfile, void **auxerror);
-int (*sym_pwquality_set_int_value)(pwquality_settings_t *pwq, int setting, int value);
-const char* (*sym_pwquality_strerror)(char *buf, size_t len, int errcode, void *auxerror);
+DLSYM_FUNCTION(pwquality_check);
+DLSYM_FUNCTION(pwquality_default_settings);
+DLSYM_FUNCTION(pwquality_free_settings);
+DLSYM_FUNCTION(pwquality_generate);
+DLSYM_FUNCTION(pwquality_get_str_value);
+DLSYM_FUNCTION(pwquality_read_config);
+DLSYM_FUNCTION(pwquality_set_int_value);
+DLSYM_FUNCTION(pwquality_strerror);
int dlopen_pwquality(void) {
return dlopen_many_sym_or_warn(
diff --git a/src/shared/password-quality-util-pwquality.h b/src/shared/password-quality-util-pwquality.h
index a420b0df2c..4c2517b446 100644
--- a/src/shared/password-quality-util-pwquality.h
+++ b/src/shared/password-quality-util-pwquality.h
@@ -8,14 +8,16 @@
#include <sys/types.h>
#include <pwquality.h>
-extern int (*sym_pwquality_check)(pwquality_settings_t *pwq, const char *password, const char *oldpassword, const char *user, void **auxerror);
-extern pwquality_settings_t *(*sym_pwquality_default_settings)(void);
-extern void (*sym_pwquality_free_settings)(pwquality_settings_t *pwq);
-extern int (*sym_pwquality_generate)(pwquality_settings_t *pwq, int entropy_bits, char **password);
-extern int (*sym_pwquality_get_str_value)(pwquality_settings_t *pwq, int setting, const char **value);
-extern int (*sym_pwquality_read_config)(pwquality_settings_t *pwq, const char *cfgfile, void **auxerror);
-extern int (*sym_pwquality_set_int_value)(pwquality_settings_t *pwq, int setting, int value);
-extern const char* (*sym_pwquality_strerror)(char *buf, size_t len, int errcode, void *auxerror);
+#include "dlfcn-util.h"
+
+DLSYM_PROTOTYPE(pwquality_check);
+DLSYM_PROTOTYPE(pwquality_default_settings);
+DLSYM_PROTOTYPE(pwquality_free_settings);
+DLSYM_PROTOTYPE(pwquality_generate);
+DLSYM_PROTOTYPE(pwquality_get_str_value);
+DLSYM_PROTOTYPE(pwquality_read_config);
+DLSYM_PROTOTYPE(pwquality_set_int_value);
+DLSYM_PROTOTYPE(pwquality_strerror);
int dlopen_pwquality(void);
diff --git a/src/shared/pcre2-util.c b/src/shared/pcre2-util.c
index 578b02ddc0..4f33efc5fc 100644
--- a/src/shared/pcre2-util.c
+++ b/src/shared/pcre2-util.c
@@ -7,13 +7,13 @@
#if HAVE_PCRE2
static void *pcre2_dl = NULL;
-pcre2_match_data* (*sym_pcre2_match_data_create)(uint32_t, pcre2_general_context *);
-void (*sym_pcre2_match_data_free)(pcre2_match_data *);
-void (*sym_pcre2_code_free)(pcre2_code *);
-pcre2_code* (*sym_pcre2_compile)(PCRE2_SPTR, PCRE2_SIZE, uint32_t, int *, PCRE2_SIZE *, pcre2_compile_context *);
-int (*sym_pcre2_get_error_message)(int, PCRE2_UCHAR *, PCRE2_SIZE);
-int (*sym_pcre2_match)(const pcre2_code *, PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, pcre2_match_data *, pcre2_match_context *);
-PCRE2_SIZE* (*sym_pcre2_get_ovector_pointer)(pcre2_match_data *);
+DLSYM_FUNCTION(pcre2_match_data_create);
+DLSYM_FUNCTION(pcre2_match_data_free);
+DLSYM_FUNCTION(pcre2_code_free);
+DLSYM_FUNCTION(pcre2_compile);
+DLSYM_FUNCTION(pcre2_get_error_message);
+DLSYM_FUNCTION(pcre2_match);
+DLSYM_FUNCTION(pcre2_get_ovector_pointer);
DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(
pcre2_code_hash_ops_free,
diff --git a/src/shared/pcre2-util.h b/src/shared/pcre2-util.h
index f1e744d577..27e2b02f7d 100644
--- a/src/shared/pcre2-util.h
+++ b/src/shared/pcre2-util.h
@@ -6,16 +6,18 @@
#if HAVE_PCRE2
+#include "dlfcn-util.h"
+
#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
-extern pcre2_match_data* (*sym_pcre2_match_data_create)(uint32_t, pcre2_general_context *);
-extern void (*sym_pcre2_match_data_free)(pcre2_match_data *);
-extern void (*sym_pcre2_code_free)(pcre2_code *);
-extern pcre2_code* (*sym_pcre2_compile)(PCRE2_SPTR, PCRE2_SIZE, uint32_t, int *, PCRE2_SIZE *, pcre2_compile_context *);
-extern int (*sym_pcre2_get_error_message)(int, PCRE2_UCHAR *, PCRE2_SIZE);
-extern int (*sym_pcre2_match)(const pcre2_code *, PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, pcre2_match_data *, pcre2_match_context *);
-extern PCRE2_SIZE* (*sym_pcre2_get_ovector_pointer)(pcre2_match_data *);
+DLSYM_PROTOTYPE(pcre2_match_data_create);
+DLSYM_PROTOTYPE(pcre2_match_data_free);
+DLSYM_PROTOTYPE(pcre2_code_free);
+DLSYM_PROTOTYPE(pcre2_compile);
+DLSYM_PROTOTYPE(pcre2_get_error_message);
+DLSYM_PROTOTYPE(pcre2_match);
+DLSYM_PROTOTYPE(pcre2_get_ovector_pointer);
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(pcre2_match_data*, sym_pcre2_match_data_free, NULL);
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(pcre2_code*, sym_pcre2_code_free, NULL);
diff --git a/src/shared/pkcs11-util.c b/src/shared/pkcs11-util.c
index c330d9b6e0..e6feba44bd 100644
--- a/src/shared/pkcs11-util.c
+++ b/src/shared/pkcs11-util.c
@@ -43,22 +43,22 @@ bool pkcs11_uri_valid(const char *uri) {
static void *p11kit_dl = NULL;
-char *(*sym_p11_kit_module_get_name)(CK_FUNCTION_LIST *module);
-void (*sym_p11_kit_modules_finalize_and_release)(CK_FUNCTION_LIST **modules);
-CK_FUNCTION_LIST **(*sym_p11_kit_modules_load_and_initialize)(int flags);
-const char *(*sym_p11_kit_strerror)(CK_RV rv);
-int (*sym_p11_kit_uri_format)(P11KitUri *uri, P11KitUriType uri_type, char **string);
-void (*sym_p11_kit_uri_free)(P11KitUri *uri);
-CK_ATTRIBUTE_PTR (*sym_p11_kit_uri_get_attributes)(P11KitUri *uri, CK_ULONG *n_attrs);
-CK_ATTRIBUTE_PTR (*sym_p11_kit_uri_get_attribute)(P11KitUri *uri, CK_ATTRIBUTE_TYPE attr_type);
-int (*sym_p11_kit_uri_set_attribute)(P11KitUri *uri, CK_ATTRIBUTE_PTR attr);
-CK_INFO_PTR (*sym_p11_kit_uri_get_module_info)(P11KitUri *uri);
-CK_SLOT_INFO_PTR (*sym_p11_kit_uri_get_slot_info)(P11KitUri *uri);
-CK_TOKEN_INFO_PTR (*sym_p11_kit_uri_get_token_info)(P11KitUri *uri);
-int (*sym_p11_kit_uri_match_token_info)(const P11KitUri *uri, const CK_TOKEN_INFO *token_info);
-const char *(*sym_p11_kit_uri_message)(int code);
-P11KitUri *(*sym_p11_kit_uri_new)(void);
-int (*sym_p11_kit_uri_parse)(const char *string, P11KitUriType uri_type, P11KitUri *uri);
+DLSYM_FUNCTION(p11_kit_module_get_name);
+DLSYM_FUNCTION(p11_kit_modules_finalize_and_release);
+DLSYM_FUNCTION(p11_kit_modules_load_and_initialize);
+DLSYM_FUNCTION(p11_kit_strerror);
+DLSYM_FUNCTION(p11_kit_uri_format);
+DLSYM_FUNCTION(p11_kit_uri_free);
+DLSYM_FUNCTION(p11_kit_uri_get_attributes);
+DLSYM_FUNCTION(p11_kit_uri_get_attribute);
+DLSYM_FUNCTION(p11_kit_uri_set_attribute);
+DLSYM_FUNCTION(p11_kit_uri_get_module_info);
+DLSYM_FUNCTION(p11_kit_uri_get_slot_info);
+DLSYM_FUNCTION(p11_kit_uri_get_token_info);
+DLSYM_FUNCTION(p11_kit_uri_match_token_info);
+DLSYM_FUNCTION(p11_kit_uri_message);
+DLSYM_FUNCTION(p11_kit_uri_new);
+DLSYM_FUNCTION(p11_kit_uri_parse);
int dlopen_p11kit(void) {
return dlopen_many_sym_or_warn(
diff --git a/src/shared/pkcs11-util.h b/src/shared/pkcs11-util.h
index 6927a37113..23ab823c40 100644
--- a/src/shared/pkcs11-util.h
+++ b/src/shared/pkcs11-util.h
@@ -13,29 +13,29 @@
#endif
#include "ask-password-api.h"
+#include "dlfcn-util.h"
#include "macro.h"
#include "time-util.h"
bool pkcs11_uri_valid(const char *uri);
#if HAVE_P11KIT
-
-extern char *(*sym_p11_kit_module_get_name)(CK_FUNCTION_LIST *module);
-extern void (*sym_p11_kit_modules_finalize_and_release)(CK_FUNCTION_LIST **modules);
-extern CK_FUNCTION_LIST **(*sym_p11_kit_modules_load_and_initialize)(int flags);
-extern const char *(*sym_p11_kit_strerror)(CK_RV rv);
-extern int (*sym_p11_kit_uri_format)(P11KitUri *uri, P11KitUriType uri_type, char **string);
-extern void (*sym_p11_kit_uri_free)(P11KitUri *uri);
-extern CK_ATTRIBUTE_PTR (*sym_p11_kit_uri_get_attributes)(P11KitUri *uri, CK_ULONG *n_attrs);
-extern CK_ATTRIBUTE_PTR (*sym_p11_kit_uri_get_attribute)(P11KitUri *uri, CK_ATTRIBUTE_TYPE attr_type);
-extern int (*sym_p11_kit_uri_set_attribute)(P11KitUri *uri, CK_ATTRIBUTE_PTR attr);
-extern CK_INFO_PTR (*sym_p11_kit_uri_get_module_info)(P11KitUri *uri);
-extern CK_SLOT_INFO_PTR (*sym_p11_kit_uri_get_slot_info)(P11KitUri *uri);
-extern CK_TOKEN_INFO_PTR (*sym_p11_kit_uri_get_token_info)(P11KitUri *uri);
-extern int (*sym_p11_kit_uri_match_token_info)(const P11KitUri *uri, const CK_TOKEN_INFO *token_info);
-extern const char *(*sym_p11_kit_uri_message)(int code);
-extern P11KitUri *(*sym_p11_kit_uri_new)(void);
-extern int (*sym_p11_kit_uri_parse)(const char *string, P11KitUriType uri_type, P11KitUri *uri);
+DLSYM_PROTOTYPE(p11_kit_module_get_name);
+DLSYM_PROTOTYPE(p11_kit_modules_finalize_and_release);
+DLSYM_PROTOTYPE(p11_kit_modules_load_and_initialize);
+DLSYM_PROTOTYPE(p11_kit_strerror);
+DLSYM_PROTOTYPE(p11_kit_uri_format);
+DLSYM_PROTOTYPE(p11_kit_uri_free);
+DLSYM_PROTOTYPE(p11_kit_uri_get_attributes);
+DLSYM_PROTOTYPE(p11_kit_uri_get_attribute);
+DLSYM_PROTOTYPE(p11_kit_uri_set_attribute);
+DLSYM_PROTOTYPE(p11_kit_uri_get_module_info);
+DLSYM_PROTOTYPE(p11_kit_uri_get_slot_info);
+DLSYM_PROTOTYPE(p11_kit_uri_get_token_info);
+DLSYM_PROTOTYPE(p11_kit_uri_match_token_info);
+DLSYM_PROTOTYPE(p11_kit_uri_message);
+DLSYM_PROTOTYPE(p11_kit_uri_new);
+DLSYM_PROTOTYPE(p11_kit_uri_parse);
int uri_from_string(const char *p, P11KitUri **ret);
diff --git a/src/shared/pretty-print.c b/src/shared/pretty-print.c
index f3a8891a79..c551ed62e3 100644
--- a/src/shared/pretty-print.c
+++ b/src/shared/pretty-print.c
@@ -441,7 +441,7 @@ int terminal_tint_color(double hue, char **ret) {
else /* otherwise pump it up */
s = 75;
- v = MAX(30, v); /* Make sure we don't hide the color in black */
+ v = MAX(20, v); /* Make sure we don't hide the color in black */
uint8_t r8, g8, b8;
hsv_to_rgb(hue, s, v, &r8, &g8, &b8);
@@ -451,3 +451,72 @@ int terminal_tint_color(double hue, char **ret) {
return 0;
}
+
+void draw_progress_bar(const char *prefix, double percentage) {
+
+ fputc('\r', stderr);
+ if (prefix)
+ fputs(prefix, stderr);
+
+ if (!terminal_is_dumb()) {
+ size_t cols = columns();
+ size_t prefix_length = strlen_ptr(prefix);
+ size_t length = cols > prefix_length + 6 ? cols - prefix_length - 6 : 0;
+
+ if (length > 5 && percentage >= 0.0 && percentage <= 100.0) {
+ size_t p = (size_t) (length * percentage / 100.0);
+ bool separator_done = false;
+
+ fputs(ansi_highlight_green(), stderr);
+
+ for (size_t i = 0; i < length; i++) {
+
+ if (i <= p) {
+ if (get_color_mode() == COLOR_24BIT) {
+ uint8_t r8, g8, b8;
+ double z = i == 0 ? 0 : (((double) i / p) * 100);
+ hsv_to_rgb(145 /* green */, z, 33 + z*2/3, &r8, &g8, &b8);
+ fprintf(stderr, "\x1B[38;2;%u;%u;%um", r8, g8, b8);
+ }
+
+ fputs(special_glyph(SPECIAL_GLYPH_HORIZONTAL_FAT), stderr);
+ } else if (i+1 < length && !separator_done) {
+ fputs(ansi_normal(), stderr);
+ fputc(' ', stderr);
+ separator_done = true;
+ fputs(ansi_grey(), stderr);
+ } else
+ fputs(special_glyph(SPECIAL_GLYPH_HORIZONTAL_DOTTED), stderr);
+ }
+
+ fputs(ansi_normal(), stderr);
+ fputc(' ', stderr);
+ }
+ }
+
+ fprintf(stderr,
+ "%s%3.0f%%%s",
+ ansi_highlight(),
+ percentage,
+ ansi_normal());
+
+ if (!terminal_is_dumb())
+ fputs(ANSI_ERASE_TO_END_OF_LINE, stderr);
+
+ fputc('\r', stderr);
+ fflush(stderr);
+}
+
+void clear_progress_bar(const char *prefix) {
+
+ fputc('\r', stderr);
+
+ if (terminal_is_dumb())
+ fputs(strrepa(" ", strlen_ptr(prefix) + 4), /* 4: %3.0f%% */
+ stderr);
+ else
+ fputs(ANSI_ERASE_TO_END_OF_LINE, stderr);
+
+ fputc('\r', stderr);
+ fflush(stderr);
+}
diff --git a/src/shared/pretty-print.h b/src/shared/pretty-print.h
index 6069318be7..940d34775b 100644
--- a/src/shared/pretty-print.h
+++ b/src/shared/pretty-print.h
@@ -49,3 +49,6 @@ static inline const char *green_check_mark_internal(char buffer[static GREEN_CHE
#define COLOR_MARK_BOOL(b) ((b) ? GREEN_CHECK_MARK() : RED_CROSS_MARK())
int terminal_tint_color(double hue, char **ret);
+
+void draw_progress_bar(const char *prefix, double percentage);
+void clear_progress_bar(const char *prefix);
diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c
index df37325bd0..17c1549132 100644
--- a/src/shared/ptyfwd.c
+++ b/src/shared/ptyfwd.c
@@ -33,6 +33,7 @@ typedef enum AnsiColorState {
ANSI_COLOR_STATE_TEXT,
ANSI_COLOR_STATE_ESC,
ANSI_COLOR_STATE_CSI_SEQUENCE,
+ ANSI_COLOR_STATE_OSC_SEQUENCE,
ANSI_COLOR_STATE_NEWLINE,
ANSI_COLOR_STATE_CARRIAGE_RETURN,
_ANSI_COLOR_STATE_MAX,
@@ -92,8 +93,10 @@ struct PTYForward {
char *background_color;
AnsiColorState ansi_color_state;
char *csi_sequence;
+ char *osc_sequence;
- char *title;
+ char *title; /* Window title to show by default */
+ char *title_prefix; /* If terminal client overrides window title, prefix this string */
};
#define ESCAPE_USEC (1*USEC_PER_SEC)
@@ -145,6 +148,7 @@ static void pty_forward_disconnect(PTYForward *f) {
f->in_buffer_full = 0;
f->csi_sequence = mfree(f->csi_sequence);
+ f->osc_sequence = mfree(f->osc_sequence);
f->ansi_color_state = _ANSI_COLOR_STATE_INVALID;
}
@@ -266,7 +270,9 @@ static int insert_newline_color_erase(PTYForward *f, size_t offset) {
_cleanup_free_ char *s = NULL;
assert(f);
- assert(f->background_color);
+
+ if (!f->background_color)
+ return 0;
/* When we see a newline (ASCII 10) then this sets the background color to the desired one, and erase the rest
* of the line with it */
@@ -285,7 +291,9 @@ static int insert_carriage_return_color(PTYForward *f, size_t offset) {
_cleanup_free_ char *s = NULL;
assert(f);
- assert(f->background_color);
+
+ if (!f->background_color)
+ return 0;
/* When we see a carriage return (ASCII 13) this this sets only the background */
@@ -367,7 +375,9 @@ static int is_csi_background_reset_sequence(const char *seq) {
static int insert_background_fix(PTYForward *f, size_t offset) {
assert(f);
- assert(f->background_color);
+
+ if (!f->background_color)
+ return 0;
if (!is_csi_background_reset_sequence(strempty(f->csi_sequence)))
return 0;
@@ -380,13 +390,33 @@ static int insert_background_fix(PTYForward *f, size_t offset) {
return insert_string(f, offset, s);
}
+static int insert_window_title_fix(PTYForward *f, size_t offset) {
+ assert(f);
+
+ if (!f->title_prefix)
+ return 0;
+
+ if (!f->osc_sequence)
+ return 0;
+
+ const char *t = startswith(f->osc_sequence, "0;"); /* Set window title OSC sequence*/
+ if (!t)
+ return 0;
+
+ _cleanup_free_ char *joined = strjoin("\x1b]0;", f->title_prefix, t, "\a");
+ if (!joined)
+ return -ENOMEM;
+
+ return insert_string(f, offset, joined);
+}
+
static int pty_forward_ansi_process(PTYForward *f, size_t offset) {
int r;
assert(f);
assert(offset <= f->out_buffer_full);
- if (!f->background_color)
+ if (!f->background_color && !f->title_prefix)
return 0;
if (FLAGS_SET(f->flags, PTY_FORWARD_DUMB_TERMINAL))
@@ -427,6 +457,9 @@ static int pty_forward_ansi_process(PTYForward *f, size_t offset) {
if (c == '[') {
f->ansi_color_state = ANSI_COLOR_STATE_CSI_SEQUENCE;
continue;
+ } else if (c == ']') {
+ f->ansi_color_state = ANSI_COLOR_STATE_OSC_SEQUENCE;
+ continue;
}
break;
@@ -464,6 +497,39 @@ static int pty_forward_ansi_process(PTYForward *f, size_t offset) {
continue;
}
+ case ANSI_COLOR_STATE_OSC_SEQUENCE: {
+
+ if ((uint8_t) c >= ' ') {
+ if (strlen_ptr(f->osc_sequence) >= 64) {
+ /* Safety check: lets not accept unbounded OSC sequences */
+ f->osc_sequence = mfree(f->osc_sequence);
+ break;
+ } else if (!strextend(&f->osc_sequence, CHAR_TO_STR(c)))
+ return -ENOMEM;
+ } else {
+ /* Otherwise, the OSC sequence is over
+ *
+ * There are two allowed ways to end an OSC sequence:
+ * BEL '\x07'
+ * String Terminator (ST): <Esc>\ - "\x1b\x5c"
+ * since we cannot lookahead to see if the Esc is followed by a \
+ * we cut a corner here and assume it will be \. */
+
+ if (c == '\x07' || c == '\x1b') {
+ r = insert_window_title_fix(f, i+1);
+ if (r < 0)
+ return r;
+
+ i += r;
+ }
+
+ f->osc_sequence = mfree(f->osc_sequence);
+ f->ansi_color_state = ANSI_COLOR_STATE_TEXT;
+ }
+
+ continue;
+ }
+
default:
assert_not_reached();
}
@@ -888,6 +954,7 @@ PTYForward *pty_forward_free(PTYForward *f) {
pty_forward_disconnect(f);
free(f->background_color);
free(f->title);
+ free(f->title_prefix);
return mfree(f);
}
@@ -1060,3 +1127,9 @@ int pty_forward_set_titlef(PTYForward *f, const char *format, ...) {
return free_and_replace(f->title, title);
}
+
+int pty_forward_set_title_prefix(PTYForward *f, const char *title_prefix) {
+ assert(f);
+
+ return free_and_strdup(&f->title_prefix, title_prefix);
+}
diff --git a/src/shared/ptyfwd.h b/src/shared/ptyfwd.h
index f87becd030..248646d764 100644
--- a/src/shared/ptyfwd.h
+++ b/src/shared/ptyfwd.h
@@ -44,7 +44,10 @@ int pty_forward_set_priority(PTYForward *f, int64_t priority);
int pty_forward_set_width_height(PTYForward *f, unsigned width, unsigned height);
int pty_forward_set_background_color(PTYForward *f, const char *color);
+
int pty_forward_set_title(PTYForward *f, const char *title);
int pty_forward_set_titlef(PTYForward *f, const char *format, ...) _printf_(2,3);
+int pty_forward_set_title_prefix(PTYForward *f, const char *prefix);
+
DEFINE_TRIVIAL_CLEANUP_FUNC(PTYForward*, pty_forward_free);
diff --git a/src/shared/qrcode-util.c b/src/shared/qrcode-util.c
index b0dd90acd1..c087136bd2 100644
--- a/src/shared/qrcode-util.c
+++ b/src/shared/qrcode-util.c
@@ -18,8 +18,8 @@
static void *qrcode_dl = NULL;
-static QRcode* (*sym_QRcode_encodeString)(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive) = NULL;
-static void (*sym_QRcode_free)(QRcode *qrcode) = NULL;
+static DLSYM_FUNCTION(QRcode_encodeString);
+static DLSYM_FUNCTION(QRcode_free);
int dlopen_qrencode(void) {
int r;
diff --git a/src/shared/seccomp-util.c b/src/shared/seccomp-util.c
index 00a8cedcb8..2469e24253 100644
--- a/src/shared/seccomp-util.c
+++ b/src/shared/seccomp-util.c
@@ -298,7 +298,7 @@ bool is_seccomp_available(void) {
if (cached_enabled < 0) {
int b;
- b = getenv_bool_secure("SYSTEMD_SECCOMP");
+ b = secure_getenv_bool("SYSTEMD_SECCOMP");
if (b != 0) {
if (b < 0 && b != -ENXIO) /* ENXIO: env var unset */
log_debug_errno(b, "Failed to parse $SYSTEMD_SECCOMP value, ignoring.");
diff --git a/src/shared/tpm2-util.c b/src/shared/tpm2-util.c
index c7ea57ab09..666dd970e6 100644
--- a/src/shared/tpm2-util.c
+++ b/src/shared/tpm2-util.c
@@ -41,67 +41,67 @@ static void *libtss2_esys_dl = NULL;
static void *libtss2_rc_dl = NULL;
static void *libtss2_mu_dl = NULL;
-static TSS2_RC (*sym_Esys_Create)(ESYS_CONTEXT *esysContext, ESYS_TR parentHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_SENSITIVE_CREATE *inSensitive, const TPM2B_PUBLIC *inPublic, const TPM2B_DATA *outsideInfo, const TPML_PCR_SELECTION *creationPCR, TPM2B_PRIVATE **outPrivate, TPM2B_PUBLIC **outPublic, TPM2B_CREATION_DATA **creationData, TPM2B_DIGEST **creationHash, TPMT_TK_CREATION **creationTicket) = NULL;
-static TSS2_RC (*sym_Esys_CreateLoaded)(ESYS_CONTEXT *esysContext, ESYS_TR parentHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_SENSITIVE_CREATE *inSensitive, const TPM2B_TEMPLATE *inPublic, ESYS_TR *objectHandle, TPM2B_PRIVATE **outPrivate, TPM2B_PUBLIC **outPublic) = NULL;
-static TSS2_RC (*sym_Esys_CreatePrimary)(ESYS_CONTEXT *esysContext, ESYS_TR primaryHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_SENSITIVE_CREATE *inSensitive, const TPM2B_PUBLIC *inPublic, const TPM2B_DATA *outsideInfo, const TPML_PCR_SELECTION *creationPCR, ESYS_TR *objectHandle, TPM2B_PUBLIC **outPublic, TPM2B_CREATION_DATA **creationData, TPM2B_DIGEST **creationHash, TPMT_TK_CREATION **creationTicket) = NULL;
-static TSS2_RC (*sym_Esys_EvictControl)(ESYS_CONTEXT *esysContext, ESYS_TR auth, ESYS_TR objectHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, TPMI_DH_PERSISTENT persistentHandle, ESYS_TR *newObjectHandle) = NULL;
-static void (*sym_Esys_Finalize)(ESYS_CONTEXT **context) = NULL;
-static TSS2_RC (*sym_Esys_FlushContext)(ESYS_CONTEXT *esysContext, ESYS_TR flushHandle) = NULL;
-static void (*sym_Esys_Free)(void *ptr) = NULL;
-static TSS2_RC (*sym_Esys_GetCapability)(ESYS_CONTEXT *esysContext, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, TPM2_CAP capability, UINT32 property, UINT32 propertyCount, TPMI_YES_NO *moreData, TPMS_CAPABILITY_DATA **capabilityData) = NULL;
-static TSS2_RC (*sym_Esys_GetRandom)(ESYS_CONTEXT *esysContext, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, UINT16 bytesRequested, TPM2B_DIGEST **randomBytes) = NULL;
-static TSS2_RC (*sym_Esys_Import)(ESYS_CONTEXT *esysContext, ESYS_TR parentHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_DATA *encryptionKey, const TPM2B_PUBLIC *objectPublic, const TPM2B_PRIVATE *duplicate, const TPM2B_ENCRYPTED_SECRET *inSymSeed, const TPMT_SYM_DEF_OBJECT *symmetricAlg, TPM2B_PRIVATE **outPrivate) = NULL;
-static TSS2_RC (*sym_Esys_Initialize)(ESYS_CONTEXT **esys_context, TSS2_TCTI_CONTEXT *tcti, TSS2_ABI_VERSION *abiVersion) = NULL;
-static TSS2_RC (*sym_Esys_Load)(ESYS_CONTEXT *esysContext, ESYS_TR parentHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_PRIVATE *inPrivate, const TPM2B_PUBLIC *inPublic, ESYS_TR *objectHandle) = NULL;
-static TSS2_RC (*sym_Esys_LoadExternal)(ESYS_CONTEXT *esysContext, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_SENSITIVE *inPrivate, const TPM2B_PUBLIC *inPublic, ESYS_TR hierarchy, ESYS_TR *objectHandle) = NULL;
-static TSS2_RC (*sym_Esys_NV_DefineSpace)(ESYS_CONTEXT *esysContext, ESYS_TR authHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_AUTH *auth, const TPM2B_NV_PUBLIC *publicInfo, ESYS_TR *nvHandle);
-static TSS2_RC (*sym_Esys_NV_UndefineSpace)(ESYS_CONTEXT *esysContext, ESYS_TR authHandle, ESYS_TR nvIndex, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3);
-static TSS2_RC (*sym_Esys_NV_Write)(ESYS_CONTEXT *esysContext, ESYS_TR authHandle, ESYS_TR nvIndex, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_MAX_NV_BUFFER *data, UINT16 offset);
-static TSS2_RC (*sym_Esys_PCR_Extend)(ESYS_CONTEXT *esysContext, ESYS_TR pcrHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPML_DIGEST_VALUES *digests) = NULL;
-static TSS2_RC (*sym_Esys_PCR_Read)(ESYS_CONTEXT *esysContext, ESYS_TR shandle1,ESYS_TR shandle2, ESYS_TR shandle3, const TPML_PCR_SELECTION *pcrSelectionIn, UINT32 *pcrUpdateCounter, TPML_PCR_SELECTION **pcrSelectionOut, TPML_DIGEST **pcrValues) = NULL;
-static TSS2_RC (*sym_Esys_PolicyAuthValue)(ESYS_CONTEXT *esysContext, ESYS_TR policySession, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3) = NULL;
-static TSS2_RC (*sym_Esys_PolicyAuthorize)(ESYS_CONTEXT *esysContext, ESYS_TR policySession, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_DIGEST *approvedPolicy, const TPM2B_NONCE *policyRef, const TPM2B_NAME *keySign, const TPMT_TK_VERIFIED *checkTicket) = NULL;
-static TSS2_RC (*sym_Esys_PolicyAuthorizeNV)(ESYS_CONTEXT *esysContext, ESYS_TR authHandle, ESYS_TR nvIndex, ESYS_TR policySession, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3);
-static TSS2_RC (*sym_Esys_PolicyGetDigest)(ESYS_CONTEXT *esysContext, ESYS_TR policySession, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, TPM2B_DIGEST **policyDigest) = NULL;
-static TSS2_RC (*sym_Esys_PolicyOR)(ESYS_CONTEXT *esysContext, ESYS_TR policySession, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPML_DIGEST *pHashList) = NULL;
-static TSS2_RC (*sym_Esys_PolicyPCR)(ESYS_CONTEXT *esysContext, ESYS_TR policySession, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_DIGEST *pcrDigest, const TPML_PCR_SELECTION *pcrs) = NULL;
-static TSS2_RC (*sym_Esys_ReadPublic)(ESYS_CONTEXT *esysContext, ESYS_TR objectHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, TPM2B_PUBLIC **outPublic, TPM2B_NAME **name, TPM2B_NAME **qualifiedName) = NULL;
-static TSS2_RC (*sym_Esys_StartAuthSession)(ESYS_CONTEXT *esysContext, ESYS_TR tpmKey, ESYS_TR bind, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_NONCE *nonceCaller, TPM2_SE sessionType, const TPMT_SYM_DEF *symmetric, TPMI_ALG_HASH authHash, ESYS_TR *sessionHandle) = NULL;
-static TSS2_RC (*sym_Esys_Startup)(ESYS_CONTEXT *esysContext, TPM2_SU startupType) = NULL;
-static TSS2_RC (*sym_Esys_TestParms)(ESYS_CONTEXT *esysContext, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPMT_PUBLIC_PARMS *parameters) = NULL;
-static TSS2_RC (*sym_Esys_TR_Close)(ESYS_CONTEXT *esys_context, ESYS_TR *rsrc_handle) = NULL;
-static TSS2_RC (*sym_Esys_TR_Deserialize)(ESYS_CONTEXT *esys_context, uint8_t const *buffer, size_t buffer_size, ESYS_TR *esys_handle) = NULL;
-static TSS2_RC (*sym_Esys_TR_FromTPMPublic)(ESYS_CONTEXT *esysContext, TPM2_HANDLE tpm_handle, ESYS_TR optionalSession1, ESYS_TR optionalSession2, ESYS_TR optionalSession3, ESYS_TR *object) = NULL;
-static TSS2_RC (*sym_Esys_TR_GetName)(ESYS_CONTEXT *esysContext, ESYS_TR handle, TPM2B_NAME **name) = NULL;
-static TSS2_RC (*sym_Esys_TR_GetTpmHandle)(ESYS_CONTEXT *esys_context, ESYS_TR esys_handle, TPM2_HANDLE *tpm_handle) = NULL;
-static TSS2_RC (*sym_Esys_TR_Serialize)(ESYS_CONTEXT *esys_context, ESYS_TR object, uint8_t **buffer, size_t *buffer_size) = NULL;
-static TSS2_RC (*sym_Esys_TR_SetAuth)(ESYS_CONTEXT *esysContext, ESYS_TR handle, TPM2B_AUTH const *authValue) = NULL;
-static TSS2_RC (*sym_Esys_TRSess_GetAttributes)(ESYS_CONTEXT *esysContext, ESYS_TR session, TPMA_SESSION *flags) = NULL;
-static TSS2_RC (*sym_Esys_TRSess_SetAttributes)(ESYS_CONTEXT *esysContext, ESYS_TR session, TPMA_SESSION flags, TPMA_SESSION mask) = NULL;
-static TSS2_RC (*sym_Esys_Unseal)(ESYS_CONTEXT *esysContext, ESYS_TR itemHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, TPM2B_SENSITIVE_DATA **outData) = NULL;
-static TSS2_RC (*sym_Esys_VerifySignature)(ESYS_CONTEXT *esysContext, ESYS_TR keyHandle, ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3, const TPM2B_DIGEST *digest, const TPMT_SIGNATURE *signature, TPMT_TK_VERIFIED **validation) = NULL;
-
-static TSS2_RC (*sym_Tss2_MU_TPM2_CC_Marshal)(TPM2_CC src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2_HANDLE_Marshal)(TPM2_HANDLE src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_DIGEST_Marshal)(TPM2B_DIGEST const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_ENCRYPTED_SECRET_Marshal)(TPM2B_ENCRYPTED_SECRET const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal)(uint8_t const buffer[], size_t buffer_size, size_t *offset, TPM2B_ENCRYPTED_SECRET *dest) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_NAME_Marshal)(TPM2B_NAME const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_PRIVATE_Marshal)(TPM2B_PRIVATE const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_PRIVATE_Unmarshal)(uint8_t const buffer[], size_t buffer_size, size_t *offset, TPM2B_PRIVATE *dest) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_PUBLIC_Marshal)(TPM2B_PUBLIC const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_PUBLIC_Unmarshal)(uint8_t const buffer[], size_t buffer_size, size_t *offset, TPM2B_PUBLIC *dest) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_SENSITIVE_Marshal)(TPM2B_SENSITIVE const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPML_PCR_SELECTION_Marshal)(TPML_PCR_SELECTION const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPMS_NV_PUBLIC_Marshal)(TPMS_NV_PUBLIC const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_NV_PUBLIC_Marshal)(TPM2B_NV_PUBLIC const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal)(uint8_t const buffer[], size_t buffer_size, size_t *offset, TPM2B_NV_PUBLIC *dest) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPMS_ECC_POINT_Marshal)(TPMS_ECC_POINT const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPMT_HA_Marshal)(TPMT_HA const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_TPMT_PUBLIC_Marshal)(TPMT_PUBLIC const *src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-static TSS2_RC (*sym_Tss2_MU_UINT32_Marshal)(UINT32 src, uint8_t buffer[], size_t buffer_size, size_t *offset) = NULL;
-
-static const char* (*sym_Tss2_RC_Decode)(TSS2_RC rc) = NULL;
+static DLSYM_FUNCTION(Esys_Create);
+static DLSYM_FUNCTION(Esys_CreateLoaded);
+static DLSYM_FUNCTION(Esys_CreatePrimary);
+static DLSYM_FUNCTION(Esys_EvictControl);
+static DLSYM_FUNCTION(Esys_Finalize);
+static DLSYM_FUNCTION(Esys_FlushContext);
+static DLSYM_FUNCTION(Esys_Free);
+static DLSYM_FUNCTION(Esys_GetCapability);
+static DLSYM_FUNCTION(Esys_GetRandom);
+static DLSYM_FUNCTION(Esys_Import);
+static DLSYM_FUNCTION(Esys_Initialize);
+static DLSYM_FUNCTION(Esys_Load);
+static DLSYM_FUNCTION(Esys_LoadExternal);
+static DLSYM_FUNCTION(Esys_NV_DefineSpace);
+static DLSYM_FUNCTION(Esys_NV_UndefineSpace);
+static DLSYM_FUNCTION(Esys_NV_Write);
+static DLSYM_FUNCTION(Esys_PCR_Extend);
+static DLSYM_FUNCTION(Esys_PCR_Read);
+static DLSYM_FUNCTION(Esys_PolicyAuthValue);
+static DLSYM_FUNCTION(Esys_PolicyAuthorize);
+static DLSYM_FUNCTION(Esys_PolicyAuthorizeNV);
+static DLSYM_FUNCTION(Esys_PolicyGetDigest);
+static DLSYM_FUNCTION(Esys_PolicyOR);
+static DLSYM_FUNCTION(Esys_PolicyPCR);
+static DLSYM_FUNCTION(Esys_ReadPublic);
+static DLSYM_FUNCTION(Esys_StartAuthSession);
+static DLSYM_FUNCTION(Esys_Startup);
+static DLSYM_FUNCTION(Esys_TestParms);
+static DLSYM_FUNCTION(Esys_TR_Close);
+static DLSYM_FUNCTION(Esys_TR_Deserialize);
+static DLSYM_FUNCTION(Esys_TR_FromTPMPublic);
+static DLSYM_FUNCTION(Esys_TR_GetName);
+static DLSYM_FUNCTION(Esys_TR_GetTpmHandle);
+static DLSYM_FUNCTION(Esys_TR_Serialize);
+static DLSYM_FUNCTION(Esys_TR_SetAuth);
+static DLSYM_FUNCTION(Esys_TRSess_GetAttributes);
+static DLSYM_FUNCTION(Esys_TRSess_SetAttributes);
+static DLSYM_FUNCTION(Esys_Unseal);
+static DLSYM_FUNCTION(Esys_VerifySignature);
+
+static DLSYM_FUNCTION(Tss2_MU_TPM2_CC_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2_HANDLE_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_DIGEST_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_ENCRYPTED_SECRET_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_NAME_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_PRIVATE_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_PRIVATE_Unmarshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_PUBLIC_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_PUBLIC_Unmarshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_SENSITIVE_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPML_PCR_SELECTION_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPMS_NV_PUBLIC_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_NV_PUBLIC_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal);
+static DLSYM_FUNCTION(Tss2_MU_TPMS_ECC_POINT_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPMT_HA_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_TPMT_PUBLIC_Marshal);
+static DLSYM_FUNCTION(Tss2_MU_UINT32_Marshal);
+
+static DLSYM_FUNCTION(Tss2_RC_Decode);
int dlopen_tpm2(void) {
int r;
diff --git a/src/shared/user-record-show.c b/src/shared/user-record-show.c
index 086d344c01..23a41534ba 100644
--- a/src/shared/user-record-show.c
+++ b/src/shared/user-record-show.c
@@ -575,6 +575,11 @@ void user_record_show(UserRecord *hr, bool show_full_group_info) {
if (hr->auto_login >= 0)
printf("Autom. Login: %s\n", yes_no(hr->auto_login));
+ if (hr->preferred_session_launcher)
+ printf("Sess. Launch: %s\n", hr->preferred_session_launcher);
+ if (hr->preferred_session_type)
+ printf("Session Type: %s\n", hr->preferred_session_type);
+
if (hr->kill_processes >= 0)
printf(" Kill Proc.: %s\n", yes_no(hr->kill_processes));
diff --git a/src/shared/user-record.c b/src/shared/user-record.c
index fc39194ac5..fe102b004a 100644
--- a/src/shared/user-record.c
+++ b/src/shared/user-record.c
@@ -189,6 +189,9 @@ static UserRecord* user_record_free(UserRecord *h) {
free(h->state);
free(h->service);
+ free(h->preferred_session_type);
+ free(h->preferred_session_launcher);
+
strv_free(h->pkcs11_token_uri);
for (size_t i = 0; i < h->n_pkcs11_encrypted_key; i++)
pkcs11_encrypted_key_done(h->pkcs11_encrypted_key + i);
@@ -1340,6 +1343,8 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp
{ "rateLimitBurst", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(UserRecord, ratelimit_burst), 0 },
{ "enforcePasswordPolicy", JSON_VARIANT_BOOLEAN, json_dispatch_tristate, offsetof(UserRecord, enforce_password_policy), 0 },
{ "autoLogin", JSON_VARIANT_BOOLEAN, json_dispatch_tristate, offsetof(UserRecord, auto_login), 0 },
+ { "preferredSessionType", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, preferred_session_type), JSON_SAFE },
+ { "preferredSessionLauncher", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, preferred_session_launcher), JSON_SAFE },
{ "stopDelayUSec", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(UserRecord, stop_delay_usec), 0 },
{ "killProcesses", JSON_VARIANT_BOOLEAN, json_dispatch_tristate, offsetof(UserRecord, kill_processes), 0 },
{ "passwordChangeMinUSec", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(UserRecord, password_change_min_usec), 0 },
@@ -1683,6 +1688,8 @@ int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_fla
{ "rateLimitBurst", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(UserRecord, ratelimit_burst), 0 },
{ "enforcePasswordPolicy", JSON_VARIANT_BOOLEAN, json_dispatch_tristate, offsetof(UserRecord, enforce_password_policy), 0 },
{ "autoLogin", JSON_VARIANT_BOOLEAN, json_dispatch_tristate, offsetof(UserRecord, auto_login), 0 },
+ { "preferredSessionType", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, preferred_session_type), JSON_SAFE },
+ { "preferredSessionLauncher", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, preferred_session_launcher), JSON_SAFE },
{ "stopDelayUSec", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(UserRecord, stop_delay_usec), 0 },
{ "killProcesses", JSON_VARIANT_BOOLEAN, json_dispatch_tristate, offsetof(UserRecord, kill_processes), 0 },
{ "passwordChangeMinUSec", _JSON_VARIANT_TYPE_INVALID, json_dispatch_uint64, offsetof(UserRecord, password_change_min_usec), 0 },
diff --git a/src/shared/user-record.h b/src/shared/user-record.h
index 1819f55489..cca112f5fe 100644
--- a/src/shared/user-record.h
+++ b/src/shared/user-record.h
@@ -351,6 +351,9 @@ typedef struct UserRecord {
int auto_login;
int drop_caches;
+ char *preferred_session_type;
+ char *preferred_session_launcher;
+
uint64_t stop_delay_usec; /* How long to leave systemd --user around on log-out */
int kill_processes; /* Whether to kill user processes forcibly on log-out */
diff --git a/src/shared/userdb.c b/src/shared/userdb.c
index 540573390c..d262c82d63 100644
--- a/src/shared/userdb.c
+++ b/src/shared/userdb.c
@@ -1455,7 +1455,7 @@ int userdb_block_nss_systemd(int b) {
return 0;
}
- call = (int (*)(bool b)) dlsym(dl, "_nss_systemd_block");
+ call = dlsym(dl, "_nss_systemd_block");
if (!call)
/* If the file is installed but lacks the symbol we expect, things are weird, let's complain */
return log_debug_errno(SYNTHETIC_ERRNO(ELIBBAD),
diff --git a/src/shared/varlink-idl.c b/src/shared/varlink-idl.c
index ad0c66d969..62a3e87dab 100644
--- a/src/shared/varlink-idl.c
+++ b/src/shared/varlink-idl.c
@@ -1379,7 +1379,8 @@ static int varlink_idl_validate_field_element_type(const VarlinkField *field, Js
break;
case VARLINK_INT:
- if (!json_variant_is_integer(v) && !json_variant_is_unsigned(v))
+ /* Allow strings here too, since integers with > 53 bits are often passed in as strings */
+ if (!json_variant_is_integer(v) && !json_variant_is_unsigned(v) && !json_variant_is_string(v))
return varlink_idl_log(SYNTHETIC_ERRNO(EMEDIUMTYPE), "Field '%s' should be an int, but it is not, refusing.", strna(field->name));
break;
diff --git a/src/shared/varlink-io.systemd.Network.c b/src/shared/varlink-io.systemd.Network.c
index 7477d42de8..986f2cfc69 100644
--- a/src/shared/varlink-io.systemd.Network.c
+++ b/src/shared/varlink-io.systemd.Network.c
@@ -2,20 +2,49 @@
#include "varlink-io.systemd.Network.h"
-static VARLINK_DEFINE_METHOD(GetStates,
- VARLINK_DEFINE_OUTPUT(AddressState, VARLINK_STRING, 0),
- VARLINK_DEFINE_OUTPUT(IPv4AddressState, VARLINK_STRING, 0),
- VARLINK_DEFINE_OUTPUT(IPv6AddressState, VARLINK_STRING, 0),
- VARLINK_DEFINE_OUTPUT(CarrierState, VARLINK_STRING, 0),
- VARLINK_DEFINE_OUTPUT(OnlineState, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_OUTPUT(OperationalState, VARLINK_STRING, 0));
+static VARLINK_DEFINE_METHOD(
+ GetStates,
+ VARLINK_DEFINE_OUTPUT(AddressState, VARLINK_STRING, 0),
+ VARLINK_DEFINE_OUTPUT(IPv4AddressState, VARLINK_STRING, 0),
+ VARLINK_DEFINE_OUTPUT(IPv6AddressState, VARLINK_STRING, 0),
+ VARLINK_DEFINE_OUTPUT(CarrierState, VARLINK_STRING, 0),
+ VARLINK_DEFINE_OUTPUT(OnlineState, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_OUTPUT(OperationalState, VARLINK_STRING, 0));
-static VARLINK_DEFINE_METHOD(GetNamespaceId,
- VARLINK_DEFINE_OUTPUT(NamespaceId, VARLINK_INT, 0),
- VARLINK_DEFINE_OUTPUT(NamespaceNSID, VARLINK_INT, VARLINK_NULLABLE));
+static VARLINK_DEFINE_METHOD(
+ GetNamespaceId,
+ VARLINK_DEFINE_OUTPUT(NamespaceId, VARLINK_INT, 0),
+ VARLINK_DEFINE_OUTPUT(NamespaceNSID, VARLINK_INT, VARLINK_NULLABLE));
+
+static VARLINK_DEFINE_STRUCT_TYPE(
+ LLDPNeighbor,
+ VARLINK_DEFINE_FIELD(ChassisID, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(RawChassisID, VARLINK_INT, VARLINK_ARRAY),
+ VARLINK_DEFINE_FIELD(PortID, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(RawPortID, VARLINK_INT, VARLINK_ARRAY),
+ VARLINK_DEFINE_FIELD(PortDescription, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(SystemName, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(SystemDescription, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(EnabledCapabilities, VARLINK_INT, VARLINK_NULLABLE));
+
+static VARLINK_DEFINE_STRUCT_TYPE(
+ LLDPNeighborsByInterface,
+ VARLINK_DEFINE_FIELD(InterfaceIndex, VARLINK_INT, 0),
+ VARLINK_DEFINE_FIELD(InterfaceName, VARLINK_STRING, 0),
+ VARLINK_DEFINE_FIELD(InterfaceAlternativeNames, VARLINK_STRING, VARLINK_ARRAY|VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD_BY_TYPE(Neighbors, LLDPNeighbor, VARLINK_ARRAY));
+
+static VARLINK_DEFINE_METHOD(
+ GetLLDPNeighbors,
+ VARLINK_DEFINE_INPUT(InterfaceIndex, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_INPUT(InterfaceName, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_OUTPUT_BY_TYPE(Neighbors, LLDPNeighborsByInterface, VARLINK_ARRAY));
VARLINK_DEFINE_INTERFACE(
io_systemd_Network,
"io.systemd.Network",
&vl_method_GetStates,
- &vl_method_GetNamespaceId);
+ &vl_method_GetNamespaceId,
+ &vl_method_GetLLDPNeighbors,
+ &vl_type_LLDPNeighbor,
+ &vl_type_LLDPNeighborsByInterface);
diff --git a/src/shared/varlink-io.systemd.PCRLock.c b/src/shared/varlink-io.systemd.PCRLock.c
index 3b2c408bc9..32270eaf9b 100644
--- a/src/shared/varlink-io.systemd.PCRLock.c
+++ b/src/shared/varlink-io.systemd.PCRLock.c
@@ -12,7 +12,7 @@ static VARLINK_DEFINE_METHOD(
static VARLINK_DEFINE_METHOD(
RemovePolicy);
-VARLINK_DEFINE_ERROR(
+static VARLINK_DEFINE_ERROR(
NoChange);
VARLINK_DEFINE_INTERFACE(
diff --git a/src/shared/varlink-io.systemd.Resolve.Monitor.c b/src/shared/varlink-io.systemd.Resolve.Monitor.c
index e46d1975d7..ba928fa2cf 100644
--- a/src/shared/varlink-io.systemd.Resolve.Monitor.c
+++ b/src/shared/varlink-io.systemd.Resolve.Monitor.c
@@ -2,79 +2,22 @@
#include "varlink-io.systemd.Resolve.Monitor.h"
-VARLINK_DEFINE_STRUCT_TYPE(
- ResourceKey,
- VARLINK_DEFINE_FIELD(class, VARLINK_INT, 0),
- VARLINK_DEFINE_FIELD(type, VARLINK_INT, 0),
- VARLINK_DEFINE_FIELD(name, VARLINK_STRING, 0));
-
-VARLINK_DEFINE_STRUCT_TYPE(
- ResourceRecord,
- VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0),
- VARLINK_DEFINE_FIELD(priority, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(weight, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(port, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(name, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(cpu, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(os, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(items, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY),
- VARLINK_DEFINE_FIELD(address, VARLINK_INT, VARLINK_NULLABLE|VARLINK_ARRAY),
- VARLINK_DEFINE_FIELD(mname, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(rname, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(serial, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(refresh, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(expire, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(minimum, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(exchange, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(version, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(size, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(horiz_pre, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(vert_pre, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(latitude, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(longitude, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(altitude, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(keyTag, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(algorithm, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(digestType, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(digest, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(fptype, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(fingerprint, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(flags, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(protocol, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(dnskey, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(signer, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(typeCovered, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(labels, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(originalTtl, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(expiration, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(inception, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(signature, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(nextDomain, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(types, VARLINK_INT, VARLINK_NULLABLE|VARLINK_ARRAY),
- VARLINK_DEFINE_FIELD(iterations, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(salt, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(hash, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(certUsage, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(selector, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(matchingType, VARLINK_INT, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(data, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(tag, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(value, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(target, VARLINK_STRING, VARLINK_NULLABLE),
- VARLINK_DEFINE_FIELD(params, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY));
-
-VARLINK_DEFINE_STRUCT_TYPE(
+/* We want to reuse the ResourceKey and ResourceRecord structures from the io.systemd.Resolve interface,
+ * hence import them here. */
+#include "varlink-io.systemd.Resolve.h"
+
+static VARLINK_DEFINE_STRUCT_TYPE(
ResourceRecordArray,
VARLINK_DEFINE_FIELD_BY_TYPE(rr, ResourceRecord, VARLINK_NULLABLE),
VARLINK_DEFINE_FIELD(raw, VARLINK_STRING, 0));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
Answer,
VARLINK_DEFINE_FIELD_BY_TYPE(rr, ResourceRecord, VARLINK_NULLABLE),
VARLINK_DEFINE_FIELD(raw, VARLINK_STRING, 0),
VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE));
-VARLINK_DEFINE_METHOD(
+static VARLINK_DEFINE_METHOD(
SubscribeQueryResults,
/* First reply */
VARLINK_DEFINE_OUTPUT(ready, VARLINK_BOOL, VARLINK_NULLABLE),
@@ -89,14 +32,14 @@ VARLINK_DEFINE_METHOD(
VARLINK_DEFINE_OUTPUT_BY_TYPE(collectedQuestions, ResourceKey, VARLINK_NULLABLE|VARLINK_ARRAY),
VARLINK_DEFINE_OUTPUT_BY_TYPE(answer, Answer, VARLINK_NULLABLE|VARLINK_ARRAY));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
CacheEntry,
VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0),
VARLINK_DEFINE_FIELD_BY_TYPE(rrs, ResourceRecordArray, VARLINK_NULLABLE|VARLINK_ARRAY),
VARLINK_DEFINE_FIELD(type, VARLINK_STRING, VARLINK_NULLABLE),
VARLINK_DEFINE_FIELD(until, VARLINK_INT, 0));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
ScopeCache,
VARLINK_DEFINE_FIELD(protocol, VARLINK_STRING, 0),
VARLINK_DEFINE_FIELD(family, VARLINK_INT, VARLINK_NULLABLE),
@@ -104,11 +47,11 @@ VARLINK_DEFINE_STRUCT_TYPE(
VARLINK_DEFINE_FIELD(ifname, VARLINK_STRING, VARLINK_NULLABLE),
VARLINK_DEFINE_FIELD_BY_TYPE(cache, CacheEntry, VARLINK_ARRAY));
-VARLINK_DEFINE_METHOD(
+static VARLINK_DEFINE_METHOD(
DumpCache,
VARLINK_DEFINE_OUTPUT_BY_TYPE(dump, ScopeCache, VARLINK_ARRAY));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
ServerState,
VARLINK_DEFINE_FIELD(Server, VARLINK_STRING, 0),
VARLINK_DEFINE_FIELD(Type, VARLINK_STRING, 0),
@@ -127,11 +70,11 @@ VARLINK_DEFINE_STRUCT_TYPE(
VARLINK_DEFINE_FIELD(PacketInvalid, VARLINK_BOOL, 0),
VARLINK_DEFINE_FIELD(PacketDoOff, VARLINK_BOOL, 0));
-VARLINK_DEFINE_METHOD(
+static VARLINK_DEFINE_METHOD(
DumpServerState,
VARLINK_DEFINE_OUTPUT_BY_TYPE(dump, ServerState, VARLINK_ARRAY));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
TransactionStatistics,
VARLINK_DEFINE_FIELD(currentTransactions, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(totalTransactions, VARLINK_INT, 0),
@@ -140,26 +83,26 @@ VARLINK_DEFINE_STRUCT_TYPE(
VARLINK_DEFINE_FIELD(totalFailedResponses, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(totalFailedResponsesServedStale, VARLINK_INT, 0));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
CacheStatistics,
VARLINK_DEFINE_FIELD(size, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(hits, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(misses, VARLINK_INT, 0));
-VARLINK_DEFINE_STRUCT_TYPE(
+static VARLINK_DEFINE_STRUCT_TYPE(
DnssecStatistics,
VARLINK_DEFINE_FIELD(secure, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(insecure, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(bogus, VARLINK_INT, 0),
VARLINK_DEFINE_FIELD(indeterminate, VARLINK_INT, 0));
-VARLINK_DEFINE_METHOD(
+static VARLINK_DEFINE_METHOD(
DumpStatistics,
VARLINK_DEFINE_OUTPUT_BY_TYPE(transactions, TransactionStatistics, 0),
VARLINK_DEFINE_OUTPUT_BY_TYPE(cache, CacheStatistics, 0),
VARLINK_DEFINE_OUTPUT_BY_TYPE(dnssec, DnssecStatistics, 0));
-VARLINK_DEFINE_METHOD(ResetStatistics);
+static VARLINK_DEFINE_METHOD(ResetStatistics);
VARLINK_DEFINE_INTERFACE(
io_systemd_Resolve_Monitor,
diff --git a/src/shared/varlink-io.systemd.Resolve.c b/src/shared/varlink-io.systemd.Resolve.c
index 12111b2404..a6c501ab01 100644
--- a/src/shared/varlink-io.systemd.Resolve.c
+++ b/src/shared/varlink-io.systemd.Resolve.c
@@ -2,6 +2,73 @@
#include "varlink-io.systemd.Resolve.h"
+VARLINK_DEFINE_STRUCT_TYPE(
+ ResourceKey,
+ VARLINK_DEFINE_FIELD(class, VARLINK_INT, 0),
+ VARLINK_DEFINE_FIELD(type, VARLINK_INT, 0),
+ VARLINK_DEFINE_FIELD(name, VARLINK_STRING, 0));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+ ResourceRecord,
+ VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0),
+ VARLINK_DEFINE_FIELD(priority, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(weight, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(port, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(name, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(cpu, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(os, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(items, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY),
+ VARLINK_DEFINE_FIELD(address, VARLINK_INT, VARLINK_NULLABLE|VARLINK_ARRAY),
+ VARLINK_DEFINE_FIELD(mname, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(rname, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(serial, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(refresh, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(expire, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(minimum, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(exchange, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(version, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(size, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(horiz_pre, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(vert_pre, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(latitude, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(longitude, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(altitude, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(keyTag, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(algorithm, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(digestType, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(digest, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(fptype, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(fingerprint, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(flags, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(protocol, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(dnskey, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(signer, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(typeCovered, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(labels, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(originalTtl, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(expiration, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(inception, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(signature, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(nextDomain, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(types, VARLINK_INT, VARLINK_NULLABLE|VARLINK_ARRAY),
+ VARLINK_DEFINE_FIELD(iterations, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(salt, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(hash, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(certUsage, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(selector, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(matchingType, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(data, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(tag, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(value, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(target, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(params, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY),
+ VARLINK_DEFINE_FIELD(order, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(preference, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(naptrFlags, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(services, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(regexp, VARLINK_STRING, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(replacement, VARLINK_STRING, VARLINK_NULLABLE));
+
static VARLINK_DEFINE_STRUCT_TYPE(
ResolvedAddress,
VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE),
@@ -60,6 +127,22 @@ static VARLINK_DEFINE_METHOD(
VARLINK_DEFINE_OUTPUT_BY_TYPE(canonical, ResolvedCanonical, 0),
VARLINK_DEFINE_OUTPUT(flags, VARLINK_INT, 0));
+static VARLINK_DEFINE_STRUCT_TYPE(
+ ResolvedRecord,
+ VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, 0),
+ VARLINK_DEFINE_FIELD_BY_TYPE(rr, ResourceRecord, VARLINK_NULLABLE),
+ VARLINK_DEFINE_FIELD(raw, VARLINK_STRING, 0));
+
+static VARLINK_DEFINE_METHOD(
+ ResolveRecord,
+ VARLINK_DEFINE_INPUT(ifindex, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_INPUT(name, VARLINK_STRING, 0),
+ VARLINK_DEFINE_INPUT(class, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_INPUT(type, VARLINK_INT, 0),
+ VARLINK_DEFINE_INPUT(flags, VARLINK_INT, VARLINK_NULLABLE),
+ VARLINK_DEFINE_OUTPUT_BY_TYPE(rrs, ResolvedRecord, VARLINK_ARRAY),
+ VARLINK_DEFINE_OUTPUT(flags, VARLINK_INT, 0));
+
static VARLINK_DEFINE_ERROR(NoNameServers);
static VARLINK_DEFINE_ERROR(NoSuchResourceRecord);
static VARLINK_DEFINE_ERROR(QueryTimedOut);
@@ -83,6 +166,9 @@ static VARLINK_DEFINE_ERROR(
VARLINK_DEFINE_FIELD(extendedDNSErrorMessage, VARLINK_STRING, VARLINK_NULLABLE));
static VARLINK_DEFINE_ERROR(CNAMELoop);
static VARLINK_DEFINE_ERROR(BadAddressSize);
+static VARLINK_DEFINE_ERROR(ResourceRecordTypeInvalidForQuery);
+static VARLINK_DEFINE_ERROR(ZoneTransfersNotPermitted);
+static VARLINK_DEFINE_ERROR(ResourceRecordTypeObsolete);
VARLINK_DEFINE_INTERFACE(
io_systemd_Resolve,
@@ -90,10 +176,14 @@ VARLINK_DEFINE_INTERFACE(
&vl_method_ResolveHostname,
&vl_method_ResolveAddress,
&vl_method_ResolveService,
+ &vl_method_ResolveRecord,
&vl_type_ResolvedAddress,
&vl_type_ResolvedName,
&vl_type_ResolvedService,
&vl_type_ResolvedCanonical,
+ &vl_type_ResourceKey,
+ &vl_type_ResourceRecord,
+ &vl_type_ResolvedRecord,
&vl_error_NoNameServers,
&vl_error_NoSuchResourceRecord,
&vl_error_QueryTimedOut,
@@ -108,4 +198,7 @@ VARLINK_DEFINE_INTERFACE(
&vl_error_StubLoop,
&vl_error_DNSError,
&vl_error_CNAMELoop,
- &vl_error_BadAddressSize);
+ &vl_error_BadAddressSize,
+ &vl_error_ResourceRecordTypeInvalidForQuery,
+ &vl_error_ZoneTransfersNotPermitted,
+ &vl_error_ResourceRecordTypeObsolete);
diff --git a/src/shared/varlink-io.systemd.Resolve.h b/src/shared/varlink-io.systemd.Resolve.h
index 5c7ed39d0d..48a9241ef4 100644
--- a/src/shared/varlink-io.systemd.Resolve.h
+++ b/src/shared/varlink-io.systemd.Resolve.h
@@ -3,4 +3,7 @@
#include "varlink-idl.h"
+extern const VarlinkSymbol vl_type_ResourceKey;
+extern const VarlinkSymbol vl_type_ResourceRecord;
+
extern const VarlinkInterface vl_interface_io_systemd_Resolve;
diff --git a/src/sleep/battery-capacity.c b/src/sleep/battery-capacity.c
index 7627a97b28..a2bcb958a6 100644
--- a/src/sleep/battery-capacity.c
+++ b/src/sleep/battery-capacity.c
@@ -123,7 +123,7 @@ static int get_battery_discharge_rate(sd_device *dev, int *ret) {
break;
p = line;
- r = extract_many_words(&p, NULL, 0, &stored_hash_id, &stored_discharge_rate, NULL);
+ r = extract_many_words(&p, NULL, 0, &stored_hash_id, &stored_discharge_rate);
if (r < 0)
return log_debug_errno(r, "Failed to parse hash_id and discharge_rate read from " DISCHARGE_RATE_FILEPATH ": %m");
if (r != 2)
diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
index f1b6f1bcdc..0f619ce0f5 100644
--- a/src/sleep/sleep.c
+++ b/src/sleep/sleep.c
@@ -23,10 +23,12 @@
#include "build.h"
#include "bus-error.h"
#include "bus-locator.h"
+#include "bus-unit-util.h"
#include "bus-util.h"
#include "constants.h"
#include "devnum-util.h"
#include "efivars.h"
+#include "env-util.h"
#include "exec-util.h"
#include "fd-util.h"
#include "fileio.h"
@@ -444,38 +446,11 @@ static int custom_timer_suspend(const SleepConfig *sleep_config) {
return 1;
}
-/* Freeze when invoked and thaw on cleanup */
-static int freeze_thaw_user_slice(const char **method) {
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
- int r;
-
- if (!method || !*method)
- return 0;
-
- r = bus_connect_system_systemd(&bus);
- if (r < 0)
- return log_debug_errno(r, "Failed to open connection to systemd: %m");
-
- (void) sd_bus_set_method_call_timeout(bus, FREEZE_TIMEOUT);
-
- r = bus_call_method(bus, bus_systemd_mgr, *method, &error, NULL, "s", SPECIAL_USER_SLICE);
- if (r < 0)
- return log_debug_errno(r, "Failed to execute operation: %s", bus_error_message(&error, r));
-
- return 1;
-}
-
static int execute_s2h(const SleepConfig *sleep_config) {
- _unused_ _cleanup_(freeze_thaw_user_slice) const char *auto_method_thaw = "ThawUnit";
int r;
assert(sleep_config);
- r = freeze_thaw_user_slice(&(const char*) { "FreezeUnit" });
- if (r < 0)
- log_warning_errno(r, "Failed to freeze unit user.slice, ignoring: %m");
-
/* Only check if we have automated battery alarms if HibernateDelaySec= is not set, as in that case
* we'll busy poll for the configured interval instead */
if (!timestamp_is_set(sleep_config->hibernate_delay_usec)) {
@@ -599,6 +574,7 @@ static int parse_argv(int argc, char *argv[]) {
}
static int run(int argc, char *argv[]) {
+ _cleanup_(unit_freezer_done_thaw) UnitFreezer user_slice_freezer = {};
_cleanup_(sleep_config_freep) SleepConfig *sleep_config = NULL;
int r;
@@ -617,6 +593,22 @@ static int run(int argc, char *argv[]) {
"Sleep operation \"%s\" is disabled by configuration, refusing.",
sleep_operation_to_string(arg_operation));
+ /* Freeze the user sessions */
+ r = getenv_bool("SYSTEMD_SLEEP_FREEZE_USER_SESSIONS");
+ if (r < 0 && r != -ENXIO)
+ log_warning_errno(r, "Cannot parse value of $SYSTEMD_SLEEP_FREEZE_USER_SESSIONS, ignoring.");
+ if (r != 0) {
+ r = unit_freezer_new_freeze(SPECIAL_USER_SLICE, &user_slice_freezer);
+ if (r < 0)
+ log_warning_errno(r, "Failed to freeze user sessions, ignoring: %m");
+ else
+ log_info("Froze user sessions");
+ } else
+ log_notice("User sessions remain unfrozen on explicit request "
+ "($SYSTEMD_SLEEP_FREEZE_USER_SESSIONS is set to false). This is not recommended, "
+ "and might result in unexpected behavior, particularly in suspend-then-hibernate "
+ "operations or setups with encrypted home directories.");
+
switch (arg_operation) {
case SLEEP_SUSPEND_THEN_HIBERNATE:
diff --git a/src/ssh-generator/ssh-generator.c b/src/ssh-generator/ssh-generator.c
index 2c4cf5a16a..08532690a9 100644
--- a/src/ssh-generator/ssh-generator.c
+++ b/src/ssh-generator/ssh-generator.c
@@ -184,10 +184,11 @@ static int add_vsock_socket(
assert(dest);
assert(generated_sshd_template_unit);
- Virtualization v = detect_vm();
+ Virtualization v = detect_virtualization();
if (v < 0)
return log_error_errno(v, "Failed to detect if we run in a VM: %m");
- if (v == VIRTUALIZATION_NONE) {
+ if (!VIRTUALIZATION_IS_VM(v)) {
+ /* NB: if we are running in a container inside a VM, then we'll *not* do AF_VSOCK stuff */
log_debug("Not running in a VM, not listening on AF_VSOCK.");
return 0;
}
@@ -207,8 +208,14 @@ static int add_vsock_socket(
/* Determine the local CID so that we can log it to help users to connect to this VM */
unsigned local_cid;
r = vsock_get_local_cid(&local_cid);
- if (r < 0)
+ if (r < 0) {
+ if (ERRNO_IS_DEVICE_ABSENT(r)) {
+ log_debug("Not creating AF_VSOCK ssh listener, since /dev/vsock is not available (even though AF_VSOCK is).");
+ return 0;
+ }
+
return log_error_errno(r, "Failed to query local AF_VSOCK CID: %m");
+ }
r = make_sshd_template_unit(
dest,
@@ -451,7 +458,7 @@ static int run(const char *dest, const char *dest_early, const char *dest_late)
if (r < 0)
return log_error_errno(r, "Failed to determine if sshd is installed: %m");
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
r = lookup_paths_init_or_warn(&lp, RUNTIME_SCOPE_SYSTEM, LOOKUP_PATHS_EXCLUDE_GENERATED, /* root_dir= */ NULL);
if (r < 0)
return r;
diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c
index 6c1bfdb77e..2329081992 100644
--- a/src/sysext/sysext.c
+++ b/src/sysext/sysext.c
@@ -39,15 +39,27 @@
#include "pager.h"
#include "parse-argument.h"
#include "parse-util.h"
+#include "path-util.h"
#include "pretty-print.h"
#include "process-util.h"
+#include "rm-rf.h"
#include "sort-util.h"
+#include "string-util.h"
#include "terminal-util.h"
#include "user-util.h"
#include "varlink.h"
#include "varlink-io.systemd.sysext.h"
#include "verbs.h"
+typedef enum MutableMode {
+ MUTABLE_YES,
+ MUTABLE_NO,
+ MUTABLE_AUTO,
+ MUTABLE_IMPORT,
+ _MUTABLE_MAX,
+ _MUTABLE_INVALID = -EINVAL,
+} MutableMode;
+
static char **arg_hierarchies = NULL; /* "/usr" + "/opt" by default for sysext and /etc by default for confext */
static char *arg_root = NULL;
static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
@@ -58,6 +70,7 @@ static bool arg_no_reload = false;
static int arg_noexec = -1;
static ImagePolicy *arg_image_policy = NULL;
static bool arg_varlink = false;
+static MutableMode arg_mutable = MUTABLE_NO;
/* Is set to IMAGE_CONFEXT when systemd is called with the confext functionality instead of the default */
static ImageClass arg_image_class = IMAGE_SYSEXT;
@@ -252,11 +265,22 @@ static int unmerge_hierarchy(
ImageClass image_class,
const char *p) {
+ _cleanup_free_ char *dot_dir = NULL, *work_dir_info_file = NULL;
int r;
assert(p);
+ dot_dir = path_join(p, image_class_info[image_class].dot_directory_name);
+ if (!dot_dir)
+ return log_oom();
+
+ work_dir_info_file = path_join(dot_dir, "work_dir");
+ if (!work_dir_info_file)
+ return log_oom();
+
for (;;) {
+ _cleanup_free_ char *escaped_work_dir_in_root = NULL, *work_dir = NULL;
+
/* We only unmount /usr/ if it is a mount point and really one of ours, in order not to break
* systems where /usr/ is a mount point of its own already. */
@@ -266,9 +290,40 @@ static int unmerge_hierarchy(
if (r == 0)
break;
+ r = read_one_line_file(work_dir_info_file, &escaped_work_dir_in_root);
+ if (r < 0) {
+ if (r != -ENOENT)
+ return log_error_errno(r, "Failed to read '%s': %m", work_dir_info_file);
+ } else {
+ _cleanup_free_ char *work_dir_in_root = NULL;
+ ssize_t l;
+
+ l = cunescape_length(escaped_work_dir_in_root, r, 0, &work_dir_in_root);
+ if (l < 0)
+ return log_error_errno(l, "Failed to unescape work directory path: %m");
+ work_dir = path_join(arg_root, work_dir_in_root);
+ if (!work_dir)
+ return log_oom();
+ }
+
+ r = umount_verbose(LOG_DEBUG, dot_dir, MNT_DETACH|UMOUNT_NOFOLLOW);
+ if (r < 0) {
+ /* EINVAL is possibly "not a mount point". Let it slide as it's expected to occur if
+ * the whole hierarchy was read-only, so the dot directory inside it was not
+ * bind-mounted as read-only. */
+ if (r != -EINVAL)
+ return log_error_errno(r, "Failed to unmount '%s': %m", dot_dir);
+ }
+
r = umount_verbose(LOG_ERR, p, MNT_DETACH|UMOUNT_NOFOLLOW);
if (r < 0)
- return log_error_errno(r, "Failed to unmount file system '%s': %m", p);
+ return r;
+
+ if (work_dir) {
+ r = rm_rf(work_dir, REMOVE_ROOT | REMOVE_MISSING_OK | REMOVE_PHYSICAL);
+ if (r < 0)
+ return log_error_errno(r, "Failed to remove '%s': %m", work_dir);
+ }
log_info("Unmerged '%s'.", p);
}
@@ -478,11 +533,38 @@ static int verb_status(int argc, char **argv, void *userdata) {
return ret;
}
+static int append_overlayfs_path_option(
+ char **options,
+ const char *separator,
+ const char *option,
+ const char *path) {
+
+ _cleanup_free_ char *escaped = NULL;
+
+ assert(options);
+ assert(separator);
+ assert(path);
+
+ escaped = shell_escape(path, ",:");
+ if (!escaped)
+ return log_oom();
+
+ if (option) {
+ if (!strextend(options, separator, option, "=", escaped))
+ return log_oom();
+ } else if (!strextend(options, separator, escaped))
+ return log_oom();
+
+ return 0;
+}
+
static int mount_overlayfs(
ImageClass image_class,
int noexec,
const char *where,
- char **layers) {
+ char **layers,
+ const char *upper_dir,
+ const char *work_dir) {
_cleanup_free_ char *options = NULL;
bool separator = false;
@@ -490,20 +572,16 @@ static int mount_overlayfs(
int r;
assert(where);
+ assert((upper_dir && work_dir) || (!upper_dir && !work_dir));
options = strdup("lowerdir=");
if (!options)
return log_oom();
STRV_FOREACH(l, layers) {
- _cleanup_free_ char *escaped = NULL;
-
- escaped = shell_escape(*l, ",:");
- if (!escaped)
- return log_oom();
-
- if (!strextend(&options, separator ? ":" : "", escaped))
- return log_oom();
+ r = append_overlayfs_path_option(&options, separator ? ":" : "", NULL, *l);
+ if (r < 0)
+ return r;
separator = true;
}
@@ -512,6 +590,22 @@ static int mount_overlayfs(
if (noexec >= 0)
SET_FLAG(flags, MS_NOEXEC, noexec);
+ if (upper_dir && work_dir) {
+ r = append_overlayfs_path_option(&options, ",", "upperdir", upper_dir);
+ if (r < 0)
+ return r;
+
+ flags &= ~MS_RDONLY;
+
+ r = append_overlayfs_path_option(&options, ",", "workdir", work_dir);
+ if (r < 0)
+ return r;
+ /* redirect_dir=on and noatime prevent unnecessary upcopies, metacopy=off prevents broken
+ * files from partial upcopies after umount. */
+ if (!strextend(&options, ",redirect_dir=on,noatime,metacopy=off"))
+ return log_oom();
+ }
+
/* Now mount the actual overlayfs */
r = mount_nofollow_verbose(LOG_ERR, image_class_info[image_class].short_identifier, where, "overlay", flags, options);
if (r < 0)
@@ -520,129 +614,644 @@ static int mount_overlayfs(
return 0;
}
-static int merge_hierarchy(
- ImageClass image_class,
+static char *hierarchy_as_single_path_component(const char *hierarchy) {
+ /* We normally expect hierarchy to be /usr, /opt or /etc, but for debugging purposes the hierarchy
+ * could very well be like /foo/bar/baz/. So for a given hierarchy we generate a directory name by
+ * stripping the leading and trailing separators and replacing the rest of separators with dots. This
+ * makes the generated name to be the same for /foo/bar/baz and for /foo/bar.baz, but, again,
+ * specifying a different hierarchy is a debugging feature, so non-unique mapping should not be an
+ * issue in general case. */
+ const char *stripped = hierarchy;
+ _cleanup_free_ char *dir_name = NULL;
+
+ assert(hierarchy);
+
+ stripped += strspn(stripped, "/");
+
+ dir_name = strdup(stripped);
+ if (!dir_name)
+ return NULL;
+ delete_trailing_chars(dir_name, "/");
+ string_replace_char(dir_name, '/', '.');
+ return TAKE_PTR(dir_name);
+}
+
+static char *determine_mutable_directory_path_for_hierarchy(const char *hierarchy) {
+ _cleanup_free_ char *dir_name = NULL;
+
+ assert(hierarchy);
+ dir_name = hierarchy_as_single_path_component(hierarchy);
+ if (!dir_name)
+ return NULL;
+
+ return path_join("/var/lib/extensions.mutable", dir_name);
+}
+
+static int paths_on_same_fs(const char *path1, const char *path2) {
+ struct stat st1, st2;
+
+ assert(path1);
+ assert(path2);
+
+ if (stat(path1, &st1))
+ return log_error_errno(errno, "Failed to stat '%s': %m", path1);
+
+ if (stat(path2, &st2))
+ return log_error_errno(errno, "Failed to stat '%s': %m", path2);
+
+ return st1.st_dev == st2.st_dev;
+}
+
+static int work_dir_for_hierarchy(
const char *hierarchy,
- int noexec,
- char **extensions,
- char **paths,
- const char *meta_path,
- const char *overlay_path) {
+ const char *resolved_upper_dir,
+ char **ret_work_dir) {
- _cleanup_free_ char *resolved_hierarchy = NULL, *f = NULL, *buf = NULL;
- _cleanup_strv_free_ char **layers = NULL;
- struct stat st;
+ _cleanup_free_ char *parent = NULL;
int r;
assert(hierarchy);
- assert(meta_path);
- assert(overlay_path);
+ assert(resolved_upper_dir);
+ assert(ret_work_dir);
- /* Resolve the path of the host's version of the hierarchy, i.e. what we want to use as lowest layer
- * in the overlayfs stack. */
- r = chase(hierarchy, arg_root, CHASE_PREFIX_ROOT, &resolved_hierarchy, NULL);
- if (r == -ENOENT)
- log_debug_errno(r, "Hierarchy '%s' on host doesn't exist, not merging.", hierarchy);
- else if (r < 0)
- return log_error_errno(r, "Failed to resolve host hierarchy '%s': %m", hierarchy);
- else {
- r = dir_is_empty(resolved_hierarchy, /* ignore_hidden_or_backup= */ false);
- if (r < 0)
- return log_error_errno(r, "Failed to check if host hierarchy '%s' is empty: %m", resolved_hierarchy);
- if (r > 0) {
- log_debug("Host hierarchy '%s' is empty, not merging.", resolved_hierarchy);
- resolved_hierarchy = mfree(resolved_hierarchy);
- }
- }
+ r = path_extract_directory(resolved_upper_dir, &parent);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get parent directory of upperdir '%s': %m", resolved_upper_dir);
- /* Let's generate a metadata file that lists all extensions we took into account for this
- * hierarchy. We include this in the final fs, to make things nicely discoverable and
- * recognizable. */
- f = path_join(meta_path, image_class_info[image_class].dot_directory_name, image_class_info[image_class].short_identifier_plural);
+ /* TODO: paths_in_same_superblock? partition? device? */
+ r = paths_on_same_fs(resolved_upper_dir, parent);
+ if (r < 0)
+ return r;
+ if (!r)
+ return log_error_errno(SYNTHETIC_ERRNO(EXDEV), "Unable to find a suitable workdir location for upperdir '%s' for host hierarchy '%s' - parent directory of the upperdir is in a different filesystem", resolved_upper_dir, hierarchy);
+
+ _cleanup_free_ char *f = NULL, *dir_name = NULL;
+
+ f = hierarchy_as_single_path_component(hierarchy);
if (!f)
return log_oom();
+ dir_name = strjoin(".systemd-", f, "-workdir");
+ if (!dir_name)
+ return log_oom();
- buf = strv_join(extensions, "\n");
- if (!buf)
+ free(f);
+ f = path_join(parent, dir_name);
+ if (!f)
return log_oom();
- r = write_string_file(f, buf, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_MKDIR_0755);
+ *ret_work_dir = TAKE_PTR(f);
+ return 0;
+}
+
+typedef struct OverlayFSPaths {
+ char *hierarchy;
+ char *resolved_hierarchy;
+ char *resolved_mutable_directory;
+
+ /* NULL if merged fs is read-only */
+ char *upper_dir;
+ /* NULL if merged fs is read-only */
+ char *work_dir;
+ /* lowest index is top lowerdir, highest index is bottom lowerdir */
+ char **lower_dirs;
+} OverlayFSPaths;
+
+static OverlayFSPaths *overlayfs_paths_free(OverlayFSPaths *op) {
+ if (!op)
+ return NULL;
+
+ free(op->hierarchy);
+ free(op->resolved_hierarchy);
+ free(op->resolved_mutable_directory);
+
+ free(op->upper_dir);
+ free(op->work_dir);
+ strv_free(op->lower_dirs);
+
+ free(op);
+ return NULL;
+}
+DEFINE_TRIVIAL_CLEANUP_FUNC(OverlayFSPaths *, overlayfs_paths_free);
+
+static int resolve_hierarchy(const char *hierarchy, char **ret_resolved_hierarchy) {
+ _cleanup_free_ char *resolved_path = NULL;
+ int r;
+
+ assert(hierarchy);
+ assert(ret_resolved_hierarchy);
+
+ r = chase(hierarchy, arg_root, CHASE_PREFIX_ROOT, &resolved_path, NULL);
+ if (r < 0 && r != -ENOENT)
+ return log_error_errno(r, "Failed to resolve hierarchy '%s': %m", hierarchy);
+
+ *ret_resolved_hierarchy = TAKE_PTR(resolved_path);
+ return 0;
+}
+
+static int resolve_mutable_directory(const char *hierarchy, char **ret_resolved_mutable_directory) {
+ _cleanup_free_ char *path = NULL, *resolved_path = NULL;
+ int r;
+
+ assert(hierarchy);
+ assert(ret_resolved_mutable_directory);
+
+ if (arg_mutable == MUTABLE_NO) {
+ log_debug("Mutability for hierarchy '%s' is disabled, not resolving mutable directory.", hierarchy);
+ *ret_resolved_mutable_directory = NULL;
+ return 0;
+ }
+
+ path = determine_mutable_directory_path_for_hierarchy(hierarchy);
+ if (!path)
+ return log_oom();
+
+ if (arg_mutable == MUTABLE_YES) {
+ _cleanup_free_ char *path_in_root = NULL;
+
+ path_in_root = path_join(arg_root, path);
+ if (!path_in_root)
+ return log_oom();
+
+ r = mkdir_p(path_in_root, 0700);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create a directory '%s': %m", path_in_root);
+ }
+
+ r = chase(path, arg_root, CHASE_PREFIX_ROOT, &resolved_path, NULL);
+ if (r < 0 && r != -ENOENT)
+ return log_error_errno(r, "Failed to resolve mutable directory '%s': %m", path);
+
+ *ret_resolved_mutable_directory = TAKE_PTR(resolved_path);
+ return 0;
+}
+
+static int overlayfs_paths_new(const char *hierarchy, OverlayFSPaths **ret_op) {
+ _cleanup_free_ char *hierarchy_copy = NULL, *resolved_hierarchy = NULL, *resolved_mutable_directory = NULL;
+ int r;
+
+ assert (hierarchy);
+ assert (ret_op);
+
+ hierarchy_copy = strdup(hierarchy);
+ if (!hierarchy_copy)
+ return log_oom();
+
+ r = resolve_hierarchy(hierarchy, &resolved_hierarchy);
if (r < 0)
- return log_error_errno(r, "Failed to write extension meta file '%s': %m", f);
+ return r;
+ r = resolve_mutable_directory(hierarchy, &resolved_mutable_directory);
+ if (r < 0)
+ return r;
+
+ OverlayFSPaths *op;
+ op = new(OverlayFSPaths, 1);
+ if (!op)
+ return log_oom();
+
+ *op = (OverlayFSPaths) {
+ .hierarchy = TAKE_PTR(hierarchy_copy),
+ .resolved_hierarchy = TAKE_PTR(resolved_hierarchy),
+ .resolved_mutable_directory = TAKE_PTR(resolved_mutable_directory),
+ };
+
+ *ret_op = TAKE_PTR(op);
+ return 0;
+}
+
+static int determine_top_lower_dirs(OverlayFSPaths *op, const char *meta_path) {
+ int r;
+
+ assert(op);
+ assert(meta_path);
/* Put the meta path (i.e. our synthesized stuff) at the top of the layer stack */
- layers = strv_new(meta_path);
- if (!layers)
+ r = strv_extend(&op->lower_dirs, meta_path);
+ if (r < 0)
return log_oom();
+ /* If importing mutable layer and it actually exists, add it just below the meta path */
+ if (arg_mutable == MUTABLE_IMPORT && op->resolved_mutable_directory) {
+ r = strv_extend(&op->lower_dirs, op->resolved_mutable_directory);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+
+static int determine_middle_lower_dirs(OverlayFSPaths *op, char **paths, size_t *ret_extensions_used) {
+ size_t n = 0;
+ int r;
+
+ assert(op);
+ assert(paths);
+ assert(ret_extensions_used);
+
/* Put the extensions in the middle */
STRV_FOREACH(p, paths) {
_cleanup_free_ char *resolved = NULL;
- r = chase(hierarchy, *p, CHASE_PREFIX_ROOT, &resolved, NULL);
+ r = chase(op->hierarchy, *p, CHASE_PREFIX_ROOT, &resolved, NULL);
if (r == -ENOENT) {
- log_debug_errno(r, "Hierarchy '%s' in extension '%s' doesn't exist, not merging.", hierarchy, *p);
+ log_debug_errno(r, "Hierarchy '%s' in extension '%s' doesn't exist, not merging.", op->hierarchy, *p);
continue;
}
if (r < 0)
- return log_error_errno(r, "Failed to resolve hierarchy '%s' in extension '%s': %m", hierarchy, *p);
+ return log_error_errno(r, "Failed to resolve hierarchy '%s' in extension '%s': %m", op->hierarchy, *p);
r = dir_is_empty(resolved, /* ignore_hidden_or_backup= */ false);
if (r < 0)
return log_error_errno(r, "Failed to check if hierarchy '%s' in extension '%s' is empty: %m", resolved, *p);
if (r > 0) {
- log_debug("Hierarchy '%s' in extension '%s' is empty, not merging.", hierarchy, *p);
+ log_debug("Hierarchy '%s' in extension '%s' is empty, not merging.", op->hierarchy, *p);
continue;
}
- r = strv_consume(&layers, TAKE_PTR(resolved));
+ r = strv_consume(&op->lower_dirs, TAKE_PTR(resolved));
if (r < 0)
return log_oom();
+ ++n;
+ }
+
+ *ret_extensions_used = n;
+ return 0;
+}
+
+static int hierarchy_as_lower_dir(OverlayFSPaths *op) {
+ int r;
+
+ /* return 0 if hierarchy should be used as lower dir, >0, if not */
+
+ assert(op);
+
+ if (!op->resolved_hierarchy) {
+ log_debug("Host hierarchy '%s' does not exist, will not be used as lowerdir", op->hierarchy);
+ return 1;
}
- if (!layers[1]) /* No extension with files in this hierarchy? Then don't do anything. */
+ r = dir_is_empty(op->resolved_hierarchy, /* ignore_hidden_or_backup= */ false);
+ if (r < 0)
+ return log_error_errno(r, "Failed to check if host hierarchy '%s' is empty: %m", op->resolved_hierarchy);
+ if (r > 0) {
+ log_debug("Host hierarchy '%s' is empty, will not be used as lower dir.", op->resolved_hierarchy);
+ return 1;
+ }
+
+ if (arg_mutable == MUTABLE_IMPORT) {
+ log_debug("Mutability for host hierarchy '%s' is disabled, so it will be a lowerdir", op->resolved_hierarchy);
return 0;
+ }
- if (resolved_hierarchy) {
- /* Add the host hierarchy as last (lowest) layer in the stack */
- r = strv_consume(&layers, TAKE_PTR(resolved_hierarchy));
+ if (!op->resolved_mutable_directory) {
+ log_debug("No mutable directory found, so host hierarchy '%s' will be used as lowerdir", op->resolved_hierarchy);
+ return 0;
+ }
+
+ if (path_equal(op->resolved_hierarchy, op->resolved_mutable_directory)) {
+ log_debug("Host hierarchy '%s' will serve as upperdir.", op->resolved_hierarchy);
+ return 1;
+ }
+ r = inode_same(op->resolved_hierarchy, op->resolved_mutable_directory, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to check inode equality of hierarchy %s and its mutable directory %s: %m", op->resolved_hierarchy, op->resolved_mutable_directory);
+ if (r > 0) {
+ log_debug("Host hierarchy '%s' will serve as upperdir.", op->resolved_hierarchy);
+ return 1;
+ }
+
+ return 0;
+}
+
+static int determine_bottom_lower_dirs(OverlayFSPaths *op) {
+ int r;
+
+ assert(op);
+
+ r = hierarchy_as_lower_dir(op);
+ if (r < 0)
+ return r;
+ if (!r) {
+ r = strv_extend(&op->lower_dirs, op->resolved_hierarchy);
if (r < 0)
- return log_oom();
+ return r;
+ }
+
+ return 0;
+}
+
+static int determine_lower_dirs(
+ OverlayFSPaths *op,
+ char **paths,
+ const char *meta_path,
+ size_t *ret_extensions_used) {
+
+ int r;
+
+ assert(op);
+ assert(paths);
+ assert(meta_path);
+ assert(ret_extensions_used);
+
+ r = determine_top_lower_dirs(op, meta_path);
+ if (r < 0)
+ return r;
+
+ r = determine_middle_lower_dirs(op, paths, ret_extensions_used);
+ if (r < 0)
+ return r;
+
+ r = determine_bottom_lower_dirs(op);
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+
+static int determine_upper_dir(OverlayFSPaths *op) {
+ int r;
+
+ assert(op);
+ assert(!op->upper_dir);
+
+ if (arg_mutable == MUTABLE_IMPORT) {
+ log_debug("Mutability is disabled, there will be no upperdir for host hierarchy '%s'", op->hierarchy);
+ return 0;
+ }
+
+ if (!op->resolved_mutable_directory) {
+ log_debug("No mutable directory found for host hierarchy '%s', there will be no upperdir", op->hierarchy);
+ return 0;
}
+ /* Require upper dir to be on writable filesystem if it's going to be used as an actual overlayfs
+ * upperdir, instead of a lowerdir as an imported path. */
+ r = path_is_read_only_fs(op->resolved_mutable_directory);
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine if mutable directory '%s' is on read-only filesystem: %m", op->resolved_mutable_directory);
+ if (r > 0)
+ return log_error_errno(SYNTHETIC_ERRNO(EROFS), "Can't use '%s' as an upperdir as it is read-only.", op->resolved_mutable_directory);
+
+ op->upper_dir = strdup(op->resolved_mutable_directory);
+ if (!op->upper_dir)
+ return log_oom();
+
+ return 0;
+}
+
+static int determine_work_dir(OverlayFSPaths *op) {
+ _cleanup_free_ char *work_dir = NULL;
+ int r;
+
+ assert(op);
+ assert(!op->work_dir);
+
+ if (!op->upper_dir)
+ return 0;
+
+ if (arg_mutable == MUTABLE_IMPORT)
+ return 0;
+
+ r = work_dir_for_hierarchy(op->hierarchy, op->upper_dir, &work_dir);
+ if (r < 0)
+ return r;
+
+ op->work_dir = TAKE_PTR(work_dir);
+ return 0;
+}
+
+static int mount_overlayfs_with_op(
+ OverlayFSPaths *op,
+ ImageClass image_class,
+ int noexec,
+ const char *overlay_path,
+ const char *meta_path) {
+
+ int r;
+
+ assert(op);
+ assert(overlay_path);
+
r = mkdir_p(overlay_path, 0700);
if (r < 0)
return log_error_errno(r, "Failed to make directory '%s': %m", overlay_path);
- r = mount_overlayfs(image_class, noexec, overlay_path, layers);
+ r = mkdir_p(meta_path, 0700);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make directory '%s': %m", meta_path);
+
+ if (op->upper_dir && op->work_dir) {
+ r = mkdir_p(op->work_dir, 0700);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make directory '%s': %m", op->work_dir);
+ }
+
+ r = mount_overlayfs(image_class, noexec, overlay_path, op->lower_dirs, op->upper_dir, op->work_dir);
if (r < 0)
return r;
- /* The overlayfs superblock is read-only. Let's also mark the bind mount read-only. Extra turbo safety 😎 */
- r = bind_remount_recursive(overlay_path, MS_RDONLY, MS_RDONLY, NULL);
+ return 0;
+}
+
+static int write_extensions_file(ImageClass image_class, char **extensions, const char *meta_path) {
+ _cleanup_free_ char *f = NULL, *buf = NULL;
+ int r;
+
+ assert(extensions);
+ assert(meta_path);
+
+ /* Let's generate a metadata file that lists all extensions we took into account for this
+ * hierarchy. We include this in the final fs, to make things nicely discoverable and
+ * recognizable. */
+ f = path_join(meta_path, image_class_info[image_class].dot_directory_name, image_class_info[image_class].short_identifier_plural);
+ if (!f)
+ return log_oom();
+
+ buf = strv_join(extensions, "\n");
+ if (!buf)
+ return log_oom();
+
+ r = write_string_file(f, buf, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_MKDIR_0755);
if (r < 0)
- return log_error_errno(r, "Failed to make bind mount '%s' read-only: %m", overlay_path);
+ return log_error_errno(r, "Failed to write extension meta file '%s': %m", f);
+
+ return 0;
+}
+
+static int write_dev_file(ImageClass image_class, const char *meta_path, const char *overlay_path) {
+ _cleanup_free_ char *f = NULL;
+ struct stat st;
+ int r;
+
+ assert(meta_path);
+ assert(overlay_path);
/* Now we have mounted the new file system. Let's now figure out its .st_dev field, and make that
* available in the metadata directory. This is useful to detect whether the metadata dir actually
* belongs to the fs it is found on: if .st_dev of the top-level mount matches it, it's pretty likely
* we are looking at a live tree, and not an unpacked tar or so of one. */
if (stat(overlay_path, &st) < 0)
- return log_error_errno(r, "Failed to stat mount '%s': %m", overlay_path);
+ return log_error_errno(errno, "Failed to stat mount '%s': %m", overlay_path);
- free(f);
f = path_join(meta_path, image_class_info[image_class].dot_directory_name, "dev");
if (!f)
return log_oom();
+ /* Modifying the underlying layers while the overlayfs is mounted is technically undefined, but at
+ * least it won't crash or deadlock, as per the kernel docs about overlayfs:
+ * https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html#changes-to-underlying-filesystems */
r = write_string_file(f, FORMAT_DEVNUM(st.st_dev), WRITE_STRING_FILE_CREATE);
if (r < 0)
return log_error_errno(r, "Failed to write '%s': %m", f);
+ return 0;
+}
+
+static int write_work_dir_file(ImageClass image_class, const char *meta_path, const char *work_dir) {
+ _cleanup_free_ char *escaped_work_dir_in_root = NULL, *f = NULL;
+ char *work_dir_in_root = NULL;
+ int r;
+
+ assert(meta_path);
+
+ if (!work_dir)
+ return 0;
+
+ work_dir_in_root = path_startswith(work_dir, empty_to_root(arg_root));
+ if (!work_dir_in_root)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Workdir '%s' must not be outside root '%s'", work_dir, empty_to_root(arg_root));
+
+ f = path_join(meta_path, image_class_info[image_class].dot_directory_name, "work_dir");
+ if (!f)
+ return log_oom();
+
+ /* Paths can have newlines for whatever reason, so better escape them to really get a single
+ * line file. */
+ escaped_work_dir_in_root = cescape(work_dir_in_root);
+ if (!escaped_work_dir_in_root)
+ return log_oom();
+ r = write_string_file(f, escaped_work_dir_in_root, WRITE_STRING_FILE_CREATE);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write '%s': %m", f);
+
+ return 0;
+}
+
+static int store_info_in_meta(
+ ImageClass image_class,
+ char **extensions,
+ const char *meta_path,
+ const char *overlay_path,
+ const char *work_dir) {
+
+ int r;
+
+ assert(extensions);
+ assert(meta_path);
+ assert(overlay_path);
+ /* work_dir may be NULL */
+
+ r = write_extensions_file(image_class, extensions, meta_path);
+ if (r < 0)
+ return r;
+
+ r = write_dev_file(image_class, meta_path, overlay_path);
+ if (r < 0)
+ return r;
+
+ r = write_work_dir_file(image_class, meta_path, work_dir);
+ if (r < 0)
+ return r;
+
/* Make sure the top-level dir has an mtime marking the point we established the merge */
if (utimensat(AT_FDCWD, meta_path, NULL, AT_SYMLINK_NOFOLLOW) < 0)
return log_error_errno(r, "Failed fix mtime of '%s': %m", meta_path);
+ return 0;
+}
+
+static int make_mounts_read_only(ImageClass image_class, const char *overlay_path, bool mutable) {
+ int r;
+
+ assert(overlay_path);
+
+ if (mutable) {
+ /* Bind mount the meta path as read-only on mutable overlays to avoid accidental
+ * modifications of the contents of meta directory, which could lead to systemd thinking that
+ * this hierarchy is not our mount. */
+ _cleanup_free_ char *f = NULL;
+
+ f = path_join(overlay_path, image_class_info[image_class].dot_directory_name);
+ if (!f)
+ return log_oom();
+
+ r = mount_nofollow_verbose(LOG_ERR, f, f, NULL, MS_BIND, NULL);
+ if (r < 0)
+ return r;
+
+ r = bind_remount_one(f, MS_RDONLY, MS_RDONLY);
+ if (r < 0)
+ return log_error_errno(r, "Failed to remount '%s' as read-only: %m", f);
+ } else {
+ /* The overlayfs superblock is read-only. Let's also mark the bind mount read-only. Extra
+ * turbo safety 😎 */
+ r = bind_remount_recursive(overlay_path, MS_RDONLY, MS_RDONLY, NULL);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make bind mount '%s' read-only: %m", overlay_path);
+ }
+
+ return 0;
+}
+
+static int merge_hierarchy(
+ ImageClass image_class,
+ const char *hierarchy,
+ int noexec,
+ char **extensions,
+ char **paths,
+ const char *meta_path,
+ const char *overlay_path) {
+
+ _cleanup_(overlayfs_paths_freep) OverlayFSPaths *op = NULL;
+ size_t extensions_used = 0;
+ int r;
+
+ assert(hierarchy);
+ assert(extensions);
+ assert(paths);
+ assert(meta_path);
+ assert(overlay_path);
+
+ r = overlayfs_paths_new(hierarchy, &op);
+ if (r < 0)
+ return r;
+
+ r = determine_lower_dirs(op, paths, meta_path, &extensions_used);
+ if (r < 0)
+ return r;
+
+ if (extensions_used == 0) /* No extension with files in this hierarchy? Then don't do anything. */
+ return 0;
+
+ r = determine_upper_dir(op);
+ if (r < 0)
+ return r;
+
+ r = determine_work_dir(op);
+ if (r < 0)
+ return r;
+
+ r = mount_overlayfs_with_op(op, image_class, noexec, overlay_path, meta_path);
+ if (r < 0)
+ return r;
+
+ r = store_info_in_meta(image_class, extensions, meta_path, overlay_path, op->work_dir);
+ if (r < 0)
+ return r;
+
+ r = make_mounts_read_only(image_class, overlay_path, op->upper_dir && op->work_dir);
+ if (r < 0)
+ return r;
+
return 1;
}
@@ -773,7 +1382,8 @@ static int merge_subprocess(
DISSECT_IMAGE_MOUNT_ROOT_ONLY |
DISSECT_IMAGE_USR_NO_ROOT |
DISSECT_IMAGE_ADD_PARTITION_DEVICES |
- DISSECT_IMAGE_PIN_PARTITION_DEVICES;
+ DISSECT_IMAGE_PIN_PARTITION_DEVICES |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY;
r = verity_settings_load(&verity_settings, img->path, NULL, NULL);
if (r < 0)
@@ -966,7 +1576,8 @@ static int merge_subprocess(
if (r < 0)
return log_error_errno(r, "Failed to create hierarchy mount point '%s': %m", resolved);
- r = mount_nofollow_verbose(LOG_ERR, p, resolved, NULL, MS_BIND, NULL);
+ /* Using MS_REC to potentially bring in our read-only bind mount of metadata. */
+ r = mount_nofollow_verbose(LOG_ERR, p, resolved, NULL, MS_BIND|MS_REC, NULL);
if (r < 0)
return r;
@@ -1419,6 +2030,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_IMAGE_POLICY,
ARG_NOEXEC,
ARG_NO_RELOAD,
+ ARG_MUTABLE,
};
static const struct option options[] = {
@@ -1432,6 +2044,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "image-policy", required_argument, NULL, ARG_IMAGE_POLICY },
{ "noexec", required_argument, NULL, ARG_NOEXEC },
{ "no-reload", no_argument, NULL, ARG_NO_RELOAD },
+ { "mutable", required_argument, NULL, ARG_MUTABLE },
{}
};
@@ -1495,6 +2108,19 @@ static int parse_argv(int argc, char *argv[]) {
arg_no_reload = true;
break;
+ case ARG_MUTABLE:
+ if (streq(optarg, "auto"))
+ arg_mutable = MUTABLE_AUTO;
+ else if (streq(optarg, "import"))
+ arg_mutable = MUTABLE_IMPORT;
+ else {
+ r = parse_boolean(optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse argument to --mutable=: %s", optarg);
+ arg_mutable = r ? MUTABLE_YES : MUTABLE_NO;
+ }
+ break;
+
case '?':
return -EINVAL;
diff --git a/src/systemctl/meson.build b/src/systemctl/meson.build
index 255c639b5f..257c362cea 100644
--- a/src/systemctl/meson.build
+++ b/src/systemctl/meson.build
@@ -56,10 +56,10 @@ executables += [
'link_with' : systemctl_link_with,
'dependencies' : [
libcap,
- liblz4,
+ liblz4_cflags,
libselinux,
- libxz,
- libzstd,
+ libxz_cflags,
+ libzstd_cflags,
threads,
],
},
diff --git a/src/systemctl/systemctl-edit.c b/src/systemctl/systemctl-edit.c
index c851c8546e..15398f8364 100644
--- a/src/systemctl/systemctl-edit.c
+++ b/src/systemctl/systemctl-edit.c
@@ -15,7 +15,7 @@
int verb_cat(int argc, char *argv[], void *userdata) {
_cleanup_hashmap_free_ Hashmap *cached_id_map = NULL, *cached_name_map = NULL;
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_strv_free_ char **names = NULL;
sd_bus *bus;
bool first = true;
@@ -198,7 +198,7 @@ static int find_paths_to_edit(
char **names) {
_cleanup_hashmap_free_ Hashmap *cached_id_map = NULL, *cached_name_map = NULL;
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_free_ char *drop_in_alloc = NULL, *suffix = NULL;
const char *drop_in;
int r;
diff --git a/src/systemctl/systemctl-enable.c b/src/systemctl/systemctl-enable.c
index 24a1b3d583..47a19cdd63 100644
--- a/src/systemctl/systemctl-enable.c
+++ b/src/systemctl/systemctl-enable.c
@@ -143,7 +143,7 @@ int verb_enable(int argc, char *argv[], void *userdata) {
bool warn_trigger_ignore_masked = true; /* suppress "used uninitialized" warning */
if (STR_IN_SET(verb, "mask", "unmask")) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
r = lookup_paths_init_or_warn(&lp, arg_runtime_scope, 0, arg_root);
if (r < 0)
diff --git a/src/systemctl/systemctl-mount.c b/src/systemctl/systemctl-mount.c
index d9ad332b2f..61af218a4b 100644
--- a/src/systemctl/systemctl-mount.c
+++ b/src/systemctl/systemctl-mount.c
@@ -86,7 +86,7 @@ int verb_mount_image(int argc, char *argv[], void *userdata) {
_cleanup_free_ char *partition = NULL, *mount_options = NULL;
const char *options = argv[4];
- r = extract_many_words(&options, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL);
+ r = extract_many_words(&options, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
if (r < 0)
return r;
/* Single set of options, applying to the root partition/single filesystem */
diff --git a/src/systemctl/systemctl-show.c b/src/systemctl/systemctl-show.c
index e81afee058..7926bfbeca 100644
--- a/src/systemctl/systemctl-show.c
+++ b/src/systemctl/systemctl-show.c
@@ -2200,96 +2200,6 @@ static int show_one(
return 0;
}
-static int get_unit_dbus_path_by_pid_fallback(
- sd_bus *bus,
- uint32_t pid,
- char **ret_path,
- char **ret_unit) {
-
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- _cleanup_free_ char *path = NULL, *unit = NULL;
- char *p;
- int r;
-
- assert(bus);
- assert(ret_path);
- assert(ret_unit);
-
- r = bus_call_method(bus, bus_systemd_mgr, "GetUnitByPID", &error, &reply, "u", pid);
- if (r < 0)
- return log_error_errno(r, "Failed to get unit for PID %"PRIu32": %s", pid, bus_error_message(&error, r));
-
- r = sd_bus_message_read(reply, "o", &p);
- if (r < 0)
- return bus_log_parse_error(r);
-
- path = strdup(p);
- if (!path)
- return log_oom();
-
- r = unit_name_from_dbus_path(path, &unit);
- if (r < 0)
- return log_oom();
-
- *ret_unit = TAKE_PTR(unit);
- *ret_path = TAKE_PTR(path);
-
- return 0;
-}
-
-static int get_unit_dbus_path_by_pid(
- sd_bus *bus,
- uint32_t pid,
- char **ret_path,
- char **ret_unit) {
-
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- _cleanup_free_ char *path = NULL, *unit = NULL;
- _cleanup_close_ int pidfd = -EBADF;
- char *p, *u;
- int r;
-
- assert(bus);
- assert(ret_path);
- assert(ret_unit);
-
- /* First, try to send a PIDFD across the wire, so that we can pin the process and there's no race
- * condition possible while we wait for the D-Bus reply. If we either don't have PIDFD support in
- * the kernel or the new D-Bus method is not available, then fallback to the older method that
- * sends the numeric PID. */
-
- pidfd = pidfd_open(pid, 0);
- if (pidfd < 0 && ERRNO_IS_NOT_SUPPORTED(errno))
- return get_unit_dbus_path_by_pid_fallback(bus, pid, ret_path, ret_unit);
- if (pidfd < 0)
- return log_error_errno(errno, "Failed to open PID %"PRIu32": %m", pid);
-
- r = bus_call_method(bus, bus_systemd_mgr, "GetUnitByPIDFD", &error, &reply, "h", pidfd);
- if (r < 0 && sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD))
- return get_unit_dbus_path_by_pid_fallback(bus, pid, ret_path, ret_unit);
- if (r < 0)
- return log_error_errno(r, "Failed to get unit for PID %"PRIu32": %s", pid, bus_error_message(&error, r));
-
- r = sd_bus_message_read(reply, "os", &p, &u);
- if (r < 0)
- return bus_log_parse_error(r);
-
- path = strdup(p);
- if (!path)
- return log_oom();
-
- unit = strdup(u);
- if (!unit)
- return log_oom();
-
- *ret_unit = TAKE_PTR(unit);
- *ret_path = TAKE_PTR(path);
-
- return 0;
-}
-
static int show_all(
sd_bus *bus,
SystemctlShowMode show_mode,
@@ -2461,9 +2371,9 @@ int verb_show(int argc, char *argv[], void *userdata) {
} else {
/* Interpret as PID */
- r = get_unit_dbus_path_by_pid(bus, id, &path, &unit);
+ r = lookup_unit_by_pidref(bus, (pid_t) id, &unit, &path);
if (r < 0) {
- ret = r;
+ RET_GATHER(ret, r);
continue;
}
}
diff --git a/src/systemctl/systemctl-sysv-compat.c b/src/systemctl/systemctl-sysv-compat.c
index 2aa1ec6d83..8ee16eb13f 100644
--- a/src/systemctl/systemctl-sysv-compat.c
+++ b/src/systemctl/systemctl-sysv-compat.c
@@ -111,7 +111,7 @@ int enable_sysv_units(const char *verb, char **args) {
int r = 0;
#if HAVE_SYSV_COMPAT
- _cleanup_(lookup_paths_free) LookupPaths paths = {};
+ _cleanup_(lookup_paths_done) LookupPaths paths = {};
unsigned f = 0;
SysVUnitEnableState enable_state = SYSV_UNIT_NOT_FOUND;
diff --git a/src/systemctl/systemctl-util.c b/src/systemctl/systemctl-util.c
index de6f53aafe..c3da750d64 100644
--- a/src/systemctl/systemctl-util.c
+++ b/src/systemctl/systemctl-util.c
@@ -18,6 +18,8 @@
#include "glob-util.h"
#include "macro.h"
#include "path-util.h"
+#include "pidref.h"
+#include "process-util.h"
#include "reboot-util.h"
#include "set.h"
#include "spawn-ask-password-agent.h"
@@ -762,9 +764,7 @@ int maybe_extend_with_unit_dependencies(sd_bus *bus, char ***list) {
if (r < 0)
return log_error_errno(r, "Failed to append unit dependencies: %m");
- strv_free(*list);
- *list = TAKE_PTR(list_with_deps);
- return 0;
+ return strv_free_and_replace(*list, list_with_deps);
}
int unit_get_dependencies(sd_bus *bus, const char *name, char ***ret) {
@@ -987,3 +987,149 @@ int halt_now(enum action a) {
assert_not_reached();
}
}
+
+int get_unit_by_pid(sd_bus *bus, pid_t pid, char **ret_unit, char **ret_path) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ int r;
+
+ assert(bus);
+ assert(pid >= 0); /* 0 is accepted by GetUnitByPID for querying our own process. */
+
+ r = bus_call_method(bus, bus_systemd_mgr, "GetUnitByPID", &error, &reply, "u", (uint32_t) pid);
+ if (r < 0) {
+ if (sd_bus_error_has_name(&error, BUS_ERROR_NO_UNIT_FOR_PID))
+ return log_error_errno(r, "%s", bus_error_message(&error, r));
+
+ return log_error_errno(r,
+ "Failed to get unit that PID " PID_FMT " belongs to: %s",
+ pid > 0 ? pid : getpid_cached(),
+ bus_error_message(&error, r));
+ }
+
+ _cleanup_free_ char *u = NULL, *p = NULL;
+ const char *path;
+
+ r = sd_bus_message_read_basic(reply, 'o', &path);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ if (ret_unit) {
+ r = unit_name_from_dbus_path(path, &u);
+ if (r < 0)
+ return log_error_errno(r,
+ "Failed to extract unit name from D-Bus object path '%s': %m",
+ path);
+ }
+
+ if (ret_path) {
+ p = strdup(path);
+ if (!p)
+ return log_oom();
+ }
+
+ if (ret_unit)
+ *ret_unit = TAKE_PTR(u);
+ if (ret_path)
+ *ret_path = TAKE_PTR(p);
+
+ return 0;
+}
+
+static int get_unit_by_pidfd(sd_bus *bus, const PidRef *pid, char **ret_unit, char **ret_path) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+ int r;
+
+ assert(bus);
+ assert(pidref_is_set(pid));
+
+ if (pid->fd < 0)
+ return -EOPNOTSUPP;
+
+ r = bus_call_method(bus, bus_systemd_mgr, "GetUnitByPIDFD", &error, &reply, "h", pid->fd);
+ if (r < 0) {
+ if (sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD))
+ return -EOPNOTSUPP;
+
+ if (sd_bus_error_has_names(&error, BUS_ERROR_NO_UNIT_FOR_PID, BUS_ERROR_NO_SUCH_PROCESS))
+ return log_error_errno(r, "%s", bus_error_message(&error, r));
+
+ return log_error_errno(r,
+ "Failed to get unit that PID " PID_FMT " belongs to: %s",
+ pid->pid, bus_error_message(&error, r));
+ }
+
+ _cleanup_free_ char *u = NULL, *p = NULL;
+ const char *path, *unit;
+
+ r = sd_bus_message_read(reply, "os", &path, &unit);
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ if (ret_unit) {
+ u = strdup(unit);
+ if (!u)
+ return log_oom();
+ }
+
+ if (ret_path) {
+ p = strdup(path);
+ if (!p)
+ return log_oom();
+ }
+
+ if (ret_unit)
+ *ret_unit = TAKE_PTR(u);
+ if (ret_path)
+ *ret_path = TAKE_PTR(p);
+
+ return 0;
+}
+
+int lookup_unit_by_pidref(sd_bus *bus, pid_t pid, char **ret_unit, char **ret_path) {
+ int r;
+
+ assert(bus);
+ assert(pid >= 0); /* 0 means our own process */
+
+ if (arg_transport != BUS_TRANSPORT_LOCAL)
+ return get_unit_by_pid(bus, pid, ret_unit, ret_path);
+
+ static bool use_pidfd = true;
+ _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
+
+ r = pidref_set_pid(&pidref, pid);
+ if (r < 0)
+ return log_error_errno(r,
+ r == -ESRCH ?
+ "PID " PID_FMT " doesn't exist or is already gone." :
+ "Failed to create reference to PID " PID_FMT ": %m",
+ pid);
+
+ if (use_pidfd) {
+ r = get_unit_by_pidfd(bus, &pidref, ret_unit, ret_path);
+ if (r != -EOPNOTSUPP)
+ return r;
+
+ use_pidfd = false;
+ log_debug_errno(r, "Unable to look up process using pidfd, falling back to pid.");
+ }
+
+ _cleanup_free_ char *u = NULL, *p = NULL;
+
+ r = get_unit_by_pid(bus, pidref.pid, ret_unit ? &u : NULL, ret_path ? &p : NULL);
+ if (r < 0)
+ return r;
+
+ r = pidref_verify(&pidref);
+ if (r < 0)
+ return log_error_errno(r, "Failed to verify our reference to PID " PID_FMT ": %m", pidref.pid);
+
+ if (ret_unit)
+ *ret_unit = TAKE_PTR(u);
+ if (ret_path)
+ *ret_path = TAKE_PTR(p);
+
+ return 0;
+}
diff --git a/src/systemctl/systemctl-util.h b/src/systemctl/systemctl-util.h
index 17975e110d..a950dde515 100644
--- a/src/systemctl/systemctl-util.h
+++ b/src/systemctl/systemctl-util.h
@@ -58,3 +58,6 @@ int mangle_names(const char *operation, char * const *original_names, char ***re
UnitFileFlags unit_file_flags_from_args(void);
int halt_now(enum action a);
+
+int get_unit_by_pid(sd_bus *bus, pid_t pid, char **ret_unit, char **ret_path);
+int lookup_unit_by_pidref(sd_bus *bus, pid_t pid, char **ret_unit, char **ret_path);
diff --git a/src/systemctl/systemctl-whoami.c b/src/systemctl/systemctl-whoami.c
index bac72c8973..607f2db047 100644
--- a/src/systemctl/systemctl-whoami.c
+++ b/src/systemctl/systemctl-whoami.c
@@ -1,149 +1,14 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#include "bus-common-errors.h"
-#include "bus-error.h"
-#include "bus-locator.h"
#include "format-util.h"
#include "parse-util.h"
-#include "pidref.h"
-#include "process-util.h"
#include "systemctl.h"
#include "systemctl-util.h"
#include "systemctl-whoami.h"
-static int get_unit_by_pid(sd_bus *bus, pid_t pid, char **ret) {
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- _cleanup_free_ char *unit = NULL;
- const char *path;
- int r;
-
- assert(bus);
- assert(pid >= 0); /* 0 is accepted by GetUnitByPID for querying our own process. */
- assert(ret);
-
- r = bus_call_method(bus, bus_systemd_mgr, "GetUnitByPID", &error, &reply, "u", (uint32_t) pid);
- if (r < 0) {
- if (sd_bus_error_has_name(&error, BUS_ERROR_NO_UNIT_FOR_PID))
- return log_error_errno(r, "%s", bus_error_message(&error, r));
-
- return log_error_errno(r,
- "Failed to get unit that PID " PID_FMT " belongs to: %s",
- pid > 0 ? pid : getpid_cached(),
- bus_error_message(&error, r));
- }
-
- r = sd_bus_message_read_basic(reply, 'o', &path);
- if (r < 0)
- return bus_log_parse_error(r);
-
- r = unit_name_from_dbus_path(path, &unit);
- if (r < 0)
- return log_error_errno(r, "Failed to extract unit name from D-Bus object path '%s': %m", path);
-
- *ret = TAKE_PTR(unit);
- return 0;
-}
-
-static int lookup_pidfd(sd_bus *bus, const PidRef *pid, char **ret) {
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- const char *unit;
- int r;
-
- assert(bus);
- assert(pidref_is_set(pid));
- assert(ret);
-
- if (pid->fd < 0)
- return -EOPNOTSUPP;
-
- r = bus_call_method(bus, bus_systemd_mgr, "GetUnitByPIDFD", &error, &reply, "h", pid->fd);
- if (r < 0) {
- if (sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD))
- return -EOPNOTSUPP;
-
- if (sd_bus_error_has_names(&error, BUS_ERROR_NO_UNIT_FOR_PID, BUS_ERROR_NO_SUCH_PROCESS))
- return log_error_errno(r, "%s", bus_error_message(&error, r));
-
- return log_error_errno(r,
- "Failed to get unit that PID " PID_FMT " belongs to: %s",
- pid->pid, bus_error_message(&error, r));
- }
-
- r = sd_bus_message_read(reply, "os", NULL, &unit);
- if (r < 0)
- return bus_log_parse_error(r);
-
- char *u = strdup(unit);
- if (!u)
- return log_oom();
-
- *ret = TAKE_PTR(u);
-
- return 0;
-}
-
-static int lookup_pid(sd_bus *bus, const char *pidstr) {
- _cleanup_free_ char *unit = NULL;
- int r;
-
- assert(bus);
- assert(pidstr);
-
- if (arg_transport == BUS_TRANSPORT_LOCAL) {
- static bool use_pidfd = true;
- _cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
-
- r = pidref_set_pidstr(&pid, pidstr);
- if (r < 0)
- return log_error_errno(r,
- r == -ESRCH ?
- "PID %s doesn't exist or is already gone." :
- "Failed to create reference to PID %s: %m",
- pidstr);
-
- if (use_pidfd) {
- r = lookup_pidfd(bus, &pid, &unit);
- if (r == -EOPNOTSUPP) {
- use_pidfd = false;
- log_debug_errno(r, "Unable to look up process using pidfd, ignoring.");
- } else if (r < 0)
- return r;
- }
-
- if (!use_pidfd) {
- assert(!unit);
-
- r = get_unit_by_pid(bus, pid.pid, &unit);
- if (r < 0)
- return r;
-
- r = pidref_verify(&pid);
- if (r < 0)
- return log_error_errno(r,
- "Failed to verify our reference to PID " PID_FMT ": %m",
- pid.pid);
- }
- } else {
- pid_t pid;
-
- r = parse_pid(pidstr, &pid);
- if (r < 0)
- return log_error_errno(r, "Failed to parse PID %s: %m", pidstr);
-
- r = get_unit_by_pid(bus, pid, &unit);
- if (r < 0)
- return r;
- }
-
- puts(unit);
- return 0;
-}
-
int verb_whoami(int argc, char *argv[], void *userdata) {
sd_bus *bus;
- int r;
+ int r, ret = 0;
r = acquire_bus(BUS_FULL, &bus);
if (r < 0)
@@ -153,11 +18,12 @@ int verb_whoami(int argc, char *argv[], void *userdata) {
_cleanup_free_ char *unit = NULL;
if (arg_transport != BUS_TRANSPORT_LOCAL)
- return log_error_errno(SYNTHETIC_ERRNO(EREMOTE), "Refusing to look up our local PID on remote host.");
+ return log_error_errno(SYNTHETIC_ERRNO(EREMOTE),
+ "Refusing to look up our local PID on remote host.");
- /* Our own process can never go away while querying, hence no need to open pidfd. */
+ /* Our own process can never go away while querying, hence no need to go through pidfd. */
- r = get_unit_by_pid(bus, 0, &unit);
+ r = get_unit_by_pid(bus, 0, &unit, /* ret_path = */ NULL);
if (r < 0)
return r;
@@ -165,10 +31,20 @@ int verb_whoami(int argc, char *argv[], void *userdata) {
return 0;
}
- r = 0;
+ STRV_FOREACH(pidstr, strv_skip(argv, 1)) {
+ _cleanup_free_ char *unit = NULL;
+ pid_t pid;
+
+ r = parse_pid(*pidstr, &pid);
+ if (r < 0)
+ return log_error_errno(r, "Invalid PID specified: %s", *pidstr);
- STRV_FOREACH(pid, strv_skip(argv, 1))
- RET_GATHER(r, lookup_pid(bus, *pid));
+ r = lookup_unit_by_pidref(bus, pid, &unit, /* ret_path = */ NULL);
+ if (r < 0)
+ RET_GATHER(ret, r);
+ else
+ puts(unit);
+ }
- return r;
+ return ret;
}
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 1ac7edbdd2..5241af5bfa 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1270,7 +1270,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_GENERIC_ROOT |
DISSECT_IMAGE_REQUIRE_ROOT |
DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_VALIDATE_OS,
+ DISSECT_IMAGE_VALIDATE_OS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/systemd/sd-dhcp-client-id.h b/src/systemd/sd-dhcp-client-id.h
index c128efc84d..d6174c6747 100644
--- a/src/systemd/sd-dhcp-client-id.h
+++ b/src/systemd/sd-dhcp-client-id.h
@@ -3,7 +3,6 @@
#define foosddhcpclientidhfoo
/***
- Copyright © 2013 Intel Corporation. All rights reserved.
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
diff --git a/src/systemd/sd-dhcp-duid.h b/src/systemd/sd-dhcp-duid.h
index b1d2772a3e..555b40e9d8 100644
--- a/src/systemd/sd-dhcp-duid.h
+++ b/src/systemd/sd-dhcp-duid.h
@@ -3,7 +3,6 @@
#define foosddhcpduidhfoo
/***
- Copyright © 2013 Intel Corporation. All rights reserved.
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
diff --git a/src/systemd/sd-dhcp-option.h b/src/systemd/sd-dhcp-option.h
index 1486ec7f11..2c31ec2d57 100644
--- a/src/systemd/sd-dhcp-option.h
+++ b/src/systemd/sd-dhcp-option.h
@@ -3,7 +3,6 @@
#define foosddhcpoptionhfoo
/***
- Copyright © 2013 Intel Corporation. All rights reserved.
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
diff --git a/src/systemd/sd-dhcp-server-lease.h b/src/systemd/sd-dhcp-server-lease.h
index 754f71953b..b5c9ba70d3 100644
--- a/src/systemd/sd-dhcp-server-lease.h
+++ b/src/systemd/sd-dhcp-server-lease.h
@@ -3,7 +3,6 @@
#define foosddhcpserverleasehfoo
/***
- Copyright © 2013 Intel Corporation. All rights reserved.
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
diff --git a/src/systemd/sd-lldp-rx.h b/src/systemd/sd-lldp-rx.h
index 504d7f59c1..a7e1a9f376 100644
--- a/src/systemd/sd-lldp-rx.h
+++ b/src/systemd/sd-lldp-rx.h
@@ -68,7 +68,6 @@ int sd_lldp_rx_set_filter_address(sd_lldp_rx *lldp_rx, const struct ether_addr *
int sd_lldp_rx_get_neighbors(sd_lldp_rx *lldp_rx, sd_lldp_neighbor ***neighbors);
-int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t raw_size);
sd_lldp_neighbor *sd_lldp_neighbor_ref(sd_lldp_neighbor *n);
sd_lldp_neighbor *sd_lldp_neighbor_unref(sd_lldp_neighbor *n);
@@ -76,7 +75,6 @@ sd_lldp_neighbor *sd_lldp_neighbor_unref(sd_lldp_neighbor *n);
int sd_lldp_neighbor_get_source_address(sd_lldp_neighbor *n, struct ether_addr* address);
int sd_lldp_neighbor_get_destination_address(sd_lldp_neighbor *n, struct ether_addr* address);
int sd_lldp_neighbor_get_timestamp(sd_lldp_neighbor *n, clockid_t clock, uint64_t *ret);
-int sd_lldp_neighbor_get_raw(sd_lldp_neighbor *n, const void **ret, size_t *size);
/* High-level, direct, parsed out field access. These fields exist at most once, hence may be queried directly. */
int sd_lldp_neighbor_get_chassis_id(sd_lldp_neighbor *n, uint8_t *type, const void **ret, size_t *size);
diff --git a/src/systemd/sd-ndisc-protocol.h b/src/systemd/sd-ndisc-protocol.h
index 93c5d20861..c6064b6795 100644
--- a/src/systemd/sd-ndisc-protocol.h
+++ b/src/systemd/sd-ndisc-protocol.h
@@ -3,8 +3,6 @@
#define foosdndiscprotocolfoo
/***
- Copyright © 2014 Intel Corporation. All rights reserved.
-
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
diff --git a/src/systemd/sd-ndisc-router.h b/src/systemd/sd-ndisc-router.h
index 7f1a0229e8..57dbb12817 100644
--- a/src/systemd/sd-ndisc-router.h
+++ b/src/systemd/sd-ndisc-router.h
@@ -3,8 +3,6 @@
#define foosdndiscrouterfoo
/***
- Copyright © 2014 Intel Corporation. All rights reserved.
-
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
@@ -36,10 +34,8 @@ _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_ndisc_router, sd_ndisc_router_unref);
int sd_ndisc_router_get_address(sd_ndisc_router *rt, struct in6_addr *ret);
int sd_ndisc_router_get_timestamp(sd_ndisc_router *rt, clockid_t clock, uint64_t *ret);
-int sd_ndisc_router_get_raw(sd_ndisc_router *rt, const void **ret, size_t *ret_size);
int sd_ndisc_router_get_hop_limit(sd_ndisc_router *rt, uint8_t *ret);
-int sd_ndisc_router_get_icmp6_ratelimit(sd_ndisc_router *rt, uint64_t *ret);
int sd_ndisc_router_get_flags(sd_ndisc_router *rt, uint64_t *ret);
int sd_ndisc_router_get_preference(sd_ndisc_router *rt, unsigned *ret);
int sd_ndisc_router_get_lifetime(sd_ndisc_router *rt, uint64_t *ret);
diff --git a/src/systemd/sd-ndisc.h b/src/systemd/sd-ndisc.h
index 1bc7c73889..5f4f6caf8d 100644
--- a/src/systemd/sd-ndisc.h
+++ b/src/systemd/sd-ndisc.h
@@ -43,7 +43,7 @@ __extension__ typedef enum sd_ndisc_event_t {
_SD_ENUM_FORCE_S64(NDISC_EVENT)
} sd_ndisc_event_t;
-typedef void (*sd_ndisc_callback_t)(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router *rt, void *userdata);
+typedef void (*sd_ndisc_callback_t)(sd_ndisc *nd, sd_ndisc_event_t event, void *message, void *userdata);
int sd_ndisc_new(sd_ndisc **ret);
sd_ndisc *sd_ndisc_ref(sd_ndisc *nd);
@@ -62,6 +62,7 @@ int sd_ndisc_set_callback(sd_ndisc *nd, sd_ndisc_callback_t cb, void *userdata);
int sd_ndisc_set_ifindex(sd_ndisc *nd, int interface_index);
int sd_ndisc_set_ifname(sd_ndisc *nd, const char *interface_name);
int sd_ndisc_get_ifname(sd_ndisc *nd, const char **ret);
+int sd_ndisc_set_link_local_address(sd_ndisc *nd, const struct in6_addr *addr);
int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr);
_SD_END_DECLARATIONS;
diff --git a/src/sysupdate/sysupdate-resource.c b/src/sysupdate/sysupdate-resource.c
index 96422626f4..5b7aee2b54 100644
--- a/src/sysupdate/sysupdate-resource.c
+++ b/src/sysupdate/sysupdate-resource.c
@@ -6,6 +6,7 @@
#include "alloc-util.h"
#include "blockdev-util.h"
+#include "build-path.h"
#include "chase.h"
#include "device-util.h"
#include "devnum-util.h"
@@ -300,7 +301,7 @@ static int download_manifest(
/* Child */
const char *cmdline[] = {
- "systemd-pull",
+ SYSTEMD_PULL_PATH,
"raw",
"--direct", /* just download the specified URL, don't download anything else */
"--verify", verify_signature ? "signature" : "no", /* verify the manifest file */
@@ -309,8 +310,8 @@ static int download_manifest(
NULL
};
- execv(pull_binary_path(), (char *const*) cmdline);
- log_error_errno(errno, "Failed to execute %s tool: %m", pull_binary_path());
+ r = invoke_callout_binary(SYSTEMD_PULL_PATH, (char *const*) cmdline);
+ log_error_errno(r, "Failed to execute %s tool: %m", SYSTEMD_PULL_PATH);
_exit(EXIT_FAILURE);
};
diff --git a/src/sysupdate/sysupdate-transfer.c b/src/sysupdate/sysupdate-transfer.c
index f8f4a154f9..b350f83065 100644
--- a/src/sysupdate/sysupdate-transfer.c
+++ b/src/sysupdate/sysupdate-transfer.c
@@ -4,6 +4,7 @@
#include "alloc-util.h"
#include "blockdev-util.h"
+#include "build-path.h"
#include "chase.h"
#include "conf-parser.h"
#include "dirent-util.h"
@@ -782,25 +783,23 @@ static void compile_pattern_fields(
memcpy(ret->sha256sum, i->metadata.sha256sum, sizeof(ret->sha256sum));
}
-static int run_helper(
+static int run_callout(
const char *name,
- const char *path,
- const char * const cmdline[]) {
+ char *cmdline[]) {
int r;
assert(name);
- assert(path);
assert(cmdline);
+ assert(cmdline[0]);
r = safe_fork(name, FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_LOG|FORK_WAIT, NULL);
if (r < 0)
return r;
if (r == 0) {
/* Child */
-
- execv(path, (char *const*) cmdline);
- log_error_errno(errno, "Failed to execute %s tool: %m", path);
+ r = invoke_callout_binary(cmdline[0], (char *const*) cmdline);
+ log_error_errno(r, "Failed to execute %s tool: %m", cmdline[0]);
_exit(EXIT_FAILURE);
}
@@ -907,36 +906,30 @@ int transfer_acquire_instance(Transfer *t, Instance *i) {
* importer has some tricks up its sleeve, such as sparse file generation, which we
* want to take benefit of, too.) */
- r = run_helper("(sd-import-raw)",
- import_binary_path(),
- (const char* const[]) {
- "systemd-import",
+ r = run_callout("(sd-import-raw)",
+ STRV_MAKE(
+ SYSTEMD_IMPORT_PATH,
"raw",
"--direct", /* just copy/unpack the specified file, don't do anything else */
arg_sync ? "--sync=yes" : "--sync=no",
i->path,
- t->temporary_path,
- NULL
- });
+ t->temporary_path));
break;
case RESOURCE_PARTITION:
/* regular file → partition */
- r = run_helper("(sd-import-raw)",
- import_binary_path(),
- (const char* const[]) {
- "systemd-import",
+ r = run_callout("(sd-import-raw)",
+ STRV_MAKE(
+ SYSTEMD_IMPORT_PATH,
"raw",
"--direct", /* just copy/unpack the specified file, don't do anything else */
"--offset", offset,
"--size-max", max_size,
arg_sync ? "--sync=yes" : "--sync=no",
i->path,
- t->target.path,
- NULL
- });
+ t->target.path));
break;
default:
@@ -951,18 +944,15 @@ int transfer_acquire_instance(Transfer *t, Instance *i) {
/* directory/subvolume → directory/subvolume */
- r = run_helper("(sd-import-fs)",
- import_fs_binary_path(),
- (const char* const[]) {
- "systemd-import-fs",
+ r = run_callout("(sd-import-fs)",
+ STRV_MAKE(
+ SYSTEMD_IMPORT_FS_PATH,
"run",
"--direct", /* just untar the specified file, don't do anything else */
arg_sync ? "--sync=yes" : "--sync=no",
t->target.type == RESOURCE_SUBVOLUME ? "--btrfs-subvol=yes" : "--btrfs-subvol=no",
i->path,
- t->temporary_path,
- NULL
- });
+ t->temporary_path));
break;
case RESOURCE_TAR:
@@ -970,18 +960,15 @@ int transfer_acquire_instance(Transfer *t, Instance *i) {
/* tar → directory/subvolume */
- r = run_helper("(sd-import-tar)",
- import_binary_path(),
- (const char* const[]) {
- "systemd-import",
+ r = run_callout("(sd-import-tar)",
+ STRV_MAKE(
+ SYSTEMD_IMPORT_PATH,
"tar",
"--direct", /* just untar the specified file, don't do anything else */
arg_sync ? "--sync=yes" : "--sync=no",
t->target.type == RESOURCE_SUBVOLUME ? "--btrfs-subvol=yes" : "--btrfs-subvol=no",
i->path,
- t->temporary_path,
- NULL
- });
+ t->temporary_path));
break;
case RESOURCE_URL_FILE:
@@ -992,28 +979,24 @@ int transfer_acquire_instance(Transfer *t, Instance *i) {
/* url file → regular file */
- r = run_helper("(sd-pull-raw)",
- pull_binary_path(),
- (const char* const[]) {
- "systemd-pull",
+ r = run_callout("(sd-pull-raw)",
+ STRV_MAKE(
+ SYSTEMD_PULL_PATH,
"raw",
"--direct", /* just download the specified URL, don't download anything else */
"--verify", digest, /* validate by explicit SHA256 sum */
arg_sync ? "--sync=yes" : "--sync=no",
i->path,
- t->temporary_path,
- NULL
- });
+ t->temporary_path));
break;
case RESOURCE_PARTITION:
/* url file → partition */
- r = run_helper("(sd-pull-raw)",
- pull_binary_path(),
- (const char* const[]) {
- "systemd-pull",
+ r = run_callout("(sd-pull-raw)",
+ STRV_MAKE(
+ SYSTEMD_PULL_PATH,
"raw",
"--direct", /* just download the specified URL, don't download anything else */
"--verify", digest, /* validate by explicit SHA256 sum */
@@ -1021,9 +1004,7 @@ int transfer_acquire_instance(Transfer *t, Instance *i) {
"--size-max", max_size,
arg_sync ? "--sync=yes" : "--sync=no",
i->path,
- t->target.path,
- NULL
- });
+ t->target.path));
break;
default:
@@ -1035,19 +1016,16 @@ int transfer_acquire_instance(Transfer *t, Instance *i) {
case RESOURCE_URL_TAR:
assert(IN_SET(t->target.type, RESOURCE_DIRECTORY, RESOURCE_SUBVOLUME));
- r = run_helper("(sd-pull-tar)",
- pull_binary_path(),
- (const char*const[]) {
- "systemd-pull",
+ r = run_callout("(sd-pull-tar)",
+ STRV_MAKE(
+ SYSTEMD_PULL_PATH,
"tar",
"--direct", /* just download the specified URL, don't download anything else */
"--verify", digest, /* validate by explicit SHA256 sum */
t->target.type == RESOURCE_SUBVOLUME ? "--btrfs-subvol=yes" : "--btrfs-subvol=no",
arg_sync ? "--sync=yes" : "--sync=no",
i->path,
- t->temporary_path,
- NULL
- });
+ t->temporary_path));
break;
default:
diff --git a/src/sysupdate/sysupdate.c b/src/sysupdate/sysupdate.c
index 023eaac586..2b88785e9f 100644
--- a/src/sysupdate/sysupdate.c
+++ b/src/sysupdate/sysupdate.c
@@ -882,7 +882,8 @@ static int process_image(
DISSECT_IMAGE_RELAX_VAR_CHECK |
DISSECT_IMAGE_USR_NO_ROOT |
DISSECT_IMAGE_GENERIC_ROOT |
- DISSECT_IMAGE_REQUIRE_ROOT,
+ DISSECT_IMAGE_REQUIRE_ROOT |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/sysupdate/sysupdate.h b/src/sysupdate/sysupdate.h
index 6d387b7a5d..cba9bf489f 100644
--- a/src/sysupdate/sysupdate.h
+++ b/src/sysupdate/sysupdate.h
@@ -7,15 +7,3 @@
extern bool arg_sync;
extern uint64_t arg_instances_max;
extern char *arg_root;
-
-static inline const char* import_binary_path(void) {
- return secure_getenv("SYSTEMD_IMPORT_PATH") ?: SYSTEMD_IMPORT_PATH;
-}
-
-static inline const char* import_fs_binary_path(void) {
- return secure_getenv("SYSTEMD_IMPORT_FS_PATH") ?: SYSTEMD_IMPORT_FS_PATH;
-}
-
-static inline const char *pull_binary_path(void) {
- return secure_getenv("SYSTEMD_PULL_PATH") ?: SYSTEMD_PULL_PATH;
-}
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
index 6e28b1cf8f..b071623780 100644
--- a/src/sysusers/sysusers.c
+++ b/src/sysusers/sysusers.c
@@ -569,7 +569,7 @@ static int write_temporary_passwd(
static usec_t epoch_or_now(void) {
uint64_t epoch;
- if (getenv_uint64_secure("SOURCE_DATE_EPOCH", &epoch) >= 0) {
+ if (secure_getenv_uint64("SOURCE_DATE_EPOCH", &epoch) >= 0) {
if (epoch > UINT64_MAX/USEC_PER_SEC) /* Overflow check */
return USEC_INFINITY;
return (usec_t) epoch * USEC_PER_SEC;
@@ -1701,7 +1701,7 @@ static int parse_line(
/* Parse columns */
p = buffer;
r = extract_many_words(&p, NULL, EXTRACT_UNQUOTE,
- &action, &name, &id, &description, &home, &shell, NULL);
+ &action, &name, &id, &description, &home, &shell);
if (r < 0)
return log_syntax(NULL, LOG_ERR, fname, line, r, "Syntax error.");
if (r < 2)
@@ -2247,7 +2247,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_VALIDATE_OS |
DISSECT_IMAGE_RELAX_VAR_CHECK |
DISSECT_IMAGE_FSCK |
- DISSECT_IMAGE_GROWFS,
+ DISSECT_IMAGE_GROWFS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index 5689a60d78..f3b447095a 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -894,7 +894,7 @@ finish:
static int run(const char *dest, const char *dest_early, const char *dest_late) {
_cleanup_(free_sysvstub_hashmapp) Hashmap *all_services = NULL;
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
SysvStub *service;
int r;
diff --git a/src/test/meson.build b/src/test/meson.build
index ef741388d5..426a54fd29 100644
--- a/src/test/meson.build
+++ b/src/test/meson.build
@@ -14,6 +14,7 @@ test_env = environment()
test_env.set('SYSTEMD_LANGUAGE_FALLBACK_MAP', language_fallback_map)
test_env.set('PATH', project_build_root + ':' + path)
test_env.set('PROJECT_BUILD_ROOT', project_build_root)
+test_env.set('SYSTEMD_SLOW_TESTS', slow_tests ? '1' : '0')
if efi_addon != ''
test_env.set('EFI_ADDON', efi_addon)
@@ -50,6 +51,7 @@ simple_tests += files(
'test-bitmap.c',
'test-blockdev-util.c',
'test-bootspec.c',
+ 'test-build-path.c',
'test-bus-util.c',
'test-calendarspec.c',
'test-cgroup-setup.c',
@@ -245,18 +247,12 @@ executables += [
},
test_template + {
'sources' : files('test-compress-benchmark.c'),
- 'link_with' : [
- libbasic_compress,
- libshared,
- ],
+ 'link_with' : [libshared],
'timeout' : 90,
},
test_template + {
'sources' : files('test-compress.c'),
- 'link_with' : [
- libbasic_compress,
- libshared,
- ],
+ 'link_with' : [libshared],
},
test_template + {
'sources' : files('test-cryptolib.c'),
@@ -379,6 +375,10 @@ executables += [
'dependencies' : threads,
},
test_template + {
+ 'sources' : files('test-progress-bar.c'),
+ 'type' : 'manual',
+ },
+ test_template + {
'sources' : files('test-qrcode-util.c'),
'dependencies' : libdl,
},
diff --git a/src/test/test-af-list.c b/src/test/test-af-list.c
index 45655d792e..8c86b72dc0 100644
--- a/src/test/test-af-list.c
+++ b/src/test/test-af-list.c
@@ -22,6 +22,7 @@ TEST(af_list) {
}
assert_se(af_to_name(af_max()) == NULL);
+ assert_se(af_to_name(0) == NULL);
assert_se(af_to_name(-1) == NULL);
assert_se(af_from_name("huddlduddl") == -EINVAL);
assert_se(af_from_name("") == -EINVAL);
diff --git a/src/test/test-async.c b/src/test/test-async.c
index 75bc4d8238..e9f10fdae3 100644
--- a/src/test/test-async.c
+++ b/src/test/test-async.c
@@ -71,7 +71,7 @@ TEST(asynchronous_rm_rf) {
/* child */
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
assert_se(make_reaper_process(true) >= 0);
assert_se(mkdtemp_malloc(NULL, &tt) >= 0);
diff --git a/src/test/test-build-path.c b/src/test/test-build-path.c
new file mode 100644
index 0000000000..661b5fc9e6
--- /dev/null
+++ b/src/test/test-build-path.c
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "build-path.h"
+#include "log.h"
+#include "string-util.h"
+
+int main(int argc, char* argv[]) {
+ _cleanup_free_ char *p = NULL;
+ int r;
+
+ r = get_build_exec_dir(&p);
+ if (r == -ENOEXEC)
+ log_info("Not run from build dir.");
+ else if (r < 0)
+ log_error_errno(r, "Failed to find build dir: %m");
+ else
+ log_info("%s", strna(p));
+
+ return 0;
+}
diff --git a/src/test/test-cgroup-setup.c b/src/test/test-cgroup-setup.c
index e669e9b5ab..ada32cbeb5 100644
--- a/src/test/test-cgroup-setup.c
+++ b/src/test/test-cgroup-setup.c
@@ -16,10 +16,8 @@ static void test_is_wanted_print_one(bool header) {
log_info("-- %s --", __func__);
assert_se(proc_cmdline(&cmdline) >= 0);
log_info("cmdline: %s", cmdline);
- if (header) {
- log_info("default-hierarchy=" DEFAULT_HIERARCHY_NAME);
+ if (header)
(void) system("findmnt -n /sys/fs/cgroup");
- }
log_info("is_unified_wanted() → %s", yes_no(cg_is_unified_wanted()));
log_info("is_hybrid_wanted() → %s", yes_no(cg_is_hybrid_wanted()));
diff --git a/src/test/test-compress.c b/src/test/test-compress.c
index 2f20d00116..57cd77d4e5 100644
--- a/src/test/test-compress.c
+++ b/src/test/test-compress.c
@@ -6,6 +6,7 @@
#include <lz4.h>
#endif
+#include "dlfcn-util.h"
#include "alloc-util.h"
#include "compress.h"
#include "fd-util.h"
@@ -241,16 +242,16 @@ static void test_lz4_decompress_partial(void) {
memset(&huge[STRLEN("HUGE=")], 'x', HUGE_SIZE - STRLEN("HUGE=") - 1);
huge[HUGE_SIZE - 1] = '\0';
- r = LZ4_compress_default(huge, buf, HUGE_SIZE, buf_size);
+ r = sym_LZ4_compress_default(huge, buf, HUGE_SIZE, buf_size);
assert_se(r >= 0);
compressed = r;
log_info("Compressed %i → %zu", HUGE_SIZE, compressed);
- r = LZ4_decompress_safe(buf, huge, r, HUGE_SIZE);
+ r = sym_LZ4_decompress_safe(buf, huge, r, HUGE_SIZE);
assert_se(r >= 0);
log_info("Decompressed → %i", r);
- r = LZ4_decompress_safe_partial(buf, huge,
+ r = sym_LZ4_decompress_safe_partial(buf, huge,
compressed,
12, HUGE_SIZE);
assert_se(r >= 0);
@@ -258,10 +259,10 @@ static void test_lz4_decompress_partial(void) {
for (size_t size = 1; size < sizeof(buf2); size++) {
/* This failed in older lz4s but works in newer ones. */
- r = LZ4_decompress_safe_partial(buf, buf2, compressed, size, size);
+ r = sym_LZ4_decompress_safe_partial(buf, buf2, compressed, size, size);
log_info("Decompressed partial %zu/%zu → %i (%s)", size, size, r,
r < 0 ? "bad" : "good");
- if (r >= 0 && LZ4_versionNumber() >= 10803)
+ if (r >= 0 && sym_LZ4_versionNumber() >= 10803)
/* lz4 <= 1.8.2 should fail that test, let's only check for newer ones */
assert_se(memcmp(buf2, huge, r) == 0);
}
@@ -316,28 +317,30 @@ int main(int argc, char *argv[]) {
#endif
#if HAVE_LZ4
- test_compress_decompress("LZ4", compress_blob_lz4, decompress_blob_lz4,
- text, sizeof(text), false);
- test_compress_decompress("LZ4", compress_blob_lz4, decompress_blob_lz4,
- data, sizeof(data), true);
-
- test_decompress_startswith("LZ4",
- compress_blob_lz4, decompress_startswith_lz4,
- text, sizeof(text), false);
- test_decompress_startswith("LZ4",
- compress_blob_lz4, decompress_startswith_lz4,
- data, sizeof(data), true);
- test_decompress_startswith("LZ4",
- compress_blob_lz4, decompress_startswith_lz4,
- huge, HUGE_SIZE, true);
-
- test_compress_stream("LZ4", "lz4cat",
- compress_stream_lz4, decompress_stream_lz4, srcfile);
-
- test_lz4_decompress_partial();
-
- test_decompress_startswith_short("LZ4", compress_blob_lz4, decompress_startswith_lz4);
-
+ if (dlopen_lz4() >= 0) {
+ test_compress_decompress("LZ4", compress_blob_lz4, decompress_blob_lz4,
+ text, sizeof(text), false);
+ test_compress_decompress("LZ4", compress_blob_lz4, decompress_blob_lz4,
+ data, sizeof(data), true);
+
+ test_decompress_startswith("LZ4",
+ compress_blob_lz4, decompress_startswith_lz4,
+ text, sizeof(text), false);
+ test_decompress_startswith("LZ4",
+ compress_blob_lz4, decompress_startswith_lz4,
+ data, sizeof(data), true);
+ test_decompress_startswith("LZ4",
+ compress_blob_lz4, decompress_startswith_lz4,
+ huge, HUGE_SIZE, true);
+
+ test_compress_stream("LZ4", "lz4cat",
+ compress_stream_lz4, decompress_stream_lz4, srcfile);
+
+ test_lz4_decompress_partial();
+
+ test_decompress_startswith_short("LZ4", compress_blob_lz4, decompress_startswith_lz4);
+ } else
+ log_error("/* Can't load liblz4 */");
#else
log_info("/* LZ4 test skipped */");
#endif
diff --git a/src/test/test-cpu-set-util.c b/src/test/test-cpu-set-util.c
index a0660f579e..0c2304e2c0 100644
--- a/src/test/test-cpu-set-util.c
+++ b/src/test/test-cpu-set-util.c
@@ -25,6 +25,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "0"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "1"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Simple range (from CPUAffinity example) */
@@ -43,6 +47,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "1-2 4"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "16"));
+ str = mfree(str);
cpu_set_reset(&c);
/* A more interesting range */
@@ -61,6 +69,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "0-3 8-11"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "f0f"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Quoted strings */
@@ -76,6 +88,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "8-11"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "f00"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Use commas as separators */
@@ -106,6 +122,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "0-7 63"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "80000000,000000ff"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Ranges */
@@ -120,6 +140,28 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_string: %s", str);
str = mfree(str);
cpu_set_reset(&c);
+ assert_se(parse_cpu_set_full("36-39,44-47", &c, true, NULL, "fake", 1, "CPUAffinity") >= 0);
+ assert_se(c.allocated >= DIV_ROUND_UP(sizeof(__cpu_mask), 8));
+ assert_se(CPU_COUNT_S(c.allocated, c.set) == 8);
+ for (cpu = 36; cpu < 40; cpu++)
+ assert_se(CPU_ISSET_S(cpu, c.allocated, c.set));
+ for (cpu = 44; cpu < 48; cpu++)
+ assert_se(CPU_ISSET_S(cpu, c.allocated, c.set));
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "f0f0,00000000"));
+ str = mfree(str);
+ cpu_set_reset(&c);
+ assert_se(parse_cpu_set_full("64-71", &c, true, NULL, "fake", 1, "CPUAffinity") >= 0);
+ assert_se(c.allocated >= DIV_ROUND_UP(sizeof(__cpu_mask), 8));
+ assert_se(CPU_COUNT_S(c.allocated, c.set) == 8);
+ for (cpu = 64; cpu < 72; cpu++)
+ assert_se(CPU_ISSET_S(cpu, c.allocated, c.set));
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "ff,00000000,00000000"));
+ str = mfree(str);
+ cpu_set_reset(&c);
/* Ranges with trailing comma, space */
assert_se(parse_cpu_set_full("0-3 8-11, ", &c, true, NULL, "fake", 1, "CPUAffinity") >= 0);
@@ -136,12 +178,20 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "0-3 8-11"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "f0f"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Negative range (returns empty cpu_set) */
assert_se(parse_cpu_set_full("3-0", &c, true, NULL, "fake", 1, "CPUAffinity") >= 0);
assert_se(c.allocated >= DIV_ROUND_UP(sizeof(__cpu_mask), 8));
assert_se(CPU_COUNT_S(c.allocated, c.set) == 0);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "0"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Overlapping ranges */
@@ -157,6 +207,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "0-11"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "fff"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Mix ranges and individual CPUs */
@@ -174,6 +228,10 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "0 2 4-11"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "ff5"));
+ str = mfree(str);
cpu_set_reset(&c);
/* Garbage */
@@ -190,6 +248,10 @@ TEST(parse_cpu_set) {
assert_se(parse_cpu_set_full("", &c, true, NULL, "fake", 1, "CPUAffinity") == 0);
assert_se(!c.set); /* empty string returns NULL */
assert_se(c.allocated == 0);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ assert_se(streq(str, "0"));
+ str = mfree(str);
/* Runaway quoted string */
assert_se(parse_cpu_set_full("0 1 2 3 \"4 5 6 7 ", &c, true, NULL, "fake", 1, "CPUAffinity") == -EINVAL);
@@ -206,6 +268,23 @@ TEST(parse_cpu_set) {
log_info("cpu_set_to_range_string: %s", str);
assert_se(streq(str, "8000-8191"));
str = mfree(str);
+ assert_se(str = cpu_set_to_mask_string(&c));
+ log_info("cpu_set_to_mask_string: %s", str);
+ for (size_t i = 0; i < strlen(str); i++) {
+ if (i < 54) {
+ if (i >= 8 && (i + 1) % 9 == 0)
+ assert_se(str[i] == ',');
+ else
+ assert_se(str[i] == 'f');
+ }
+ else {
+ if (i >= 8 && (i + 1) % 9 == 0)
+ assert_se(str[i] == ',');
+ else
+ assert_se(str[i] == '0');
+ }
+ }
+ str = mfree(str);
cpu_set_reset(&c);
}
diff --git a/src/test/test-dlopen-so.c b/src/test/test-dlopen-so.c
index d2dbe72981..3232506d5a 100644
--- a/src/test/test-dlopen-so.c
+++ b/src/test/test-dlopen-so.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include "bpf-dlopen.h"
+#include "compress.h"
#include "cryptsetup-util.h"
#include "elf-util.h"
#include "idn-util.h"
@@ -75,6 +76,18 @@ static int run(int argc, char **argv) {
assert_se(dlopen_libarchive() >= 0);
#endif
+#if HAVE_LZ4
+ assert_se(dlopen_lz4() >= 0);
+#endif
+
+#if HAVE_ZSTD
+ assert_se(dlopen_zstd() >= 0);
+#endif
+
+#if HAVE_XZ
+ assert_se(dlopen_lzma() >= 0);
+#endif
+
return 0;
}
diff --git a/src/test/test-execute.c b/src/test/test-execute.c
index 4f6ad5dcae..76659fe071 100644
--- a/src/test/test-execute.c
+++ b/src/test/test-execute.c
@@ -28,6 +28,7 @@
#include "signal-util.h"
#include "static-destruct.h"
#include "stat-util.h"
+#include "sysctl-util.h"
#include "tests.h"
#include "tmpfile-util.h"
#include "unit.h"
@@ -60,6 +61,11 @@ static void wait_for_service_finish(Manager *m, Unit *unit) {
assert_se(m);
assert_se(unit);
+ /* Bump the timeout when running in plain QEMU, as some more involved tests might start hitting the
+ * default 2m timeout (like exec-dynamicuser-statedir.service) */
+ if (detect_virtualization() == VIRTUALIZATION_QEMU)
+ timeout *= 2;
+
service = SERVICE(unit);
printf("%s\n", unit->id);
exec_context_dump(&service->exec_context, stdout, "\t");
@@ -218,10 +224,30 @@ static void start_parent_slices(Unit *unit) {
}
}
+static bool apparmor_restrict_unprivileged_userns(void) {
+ _cleanup_free_ char *v = NULL;
+ int r;
+
+ /* If kernel.apparmor_restrict_unprivileged_userns=1, then we cannot
+ * use unprivileged user namespaces. */
+ r = sysctl_read("kernel/apparmor_restrict_unprivileged_userns", &v);
+ if (r < 0) {
+ if (r != -ENOENT)
+ log_debug_errno(r, "Failed to read kernel.apparmor_restrict_unprivileged_userns sysctl, ignoring: %m");
+
+ return false;
+ }
+
+ return streq(v, "1");
+}
+
static bool have_userns_privileges(void) {
pid_t pid;
int r;
+ if (apparmor_restrict_unprivileged_userns())
+ return false;
+
r = safe_fork("(sd-test-check-userns)",
FORK_RESET_SIGNALS |
FORK_CLOSE_ALL_FDS |
@@ -652,7 +678,7 @@ static int find_libraries(const char *exec, char ***ret) {
assert_se(exec);
assert_se(ret);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
assert_se(pipe2(outpipe, O_NONBLOCK|O_CLOEXEC) == 0);
assert_se(pipe2(errpipe, O_NONBLOCK|O_CLOEXEC) == 0);
diff --git a/src/test/test-extract-word.c b/src/test/test-extract-word.c
index 6e12fbe2c6..32c01b99fd 100644
--- a/src/test/test-extract-word.c
+++ b/src/test/test-extract-word.c
@@ -684,7 +684,7 @@ TEST(extract_many_words) {
char *a, *b, *c, *d, *e, *f;
p = original = "foobar waldi piep";
- assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3);
+ assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c) == 3);
assert_se(isempty(p));
assert_se(streq_ptr(a, "foobar"));
assert_se(streq_ptr(b, "waldi"));
@@ -694,12 +694,12 @@ TEST(extract_many_words) {
free(c);
p = original = "foobar:waldi:piep ba1:ba2";
- assert_se(extract_many_words(&p, ":" WHITESPACE, 0, &a, &b, &c, NULL) == 3);
+ assert_se(extract_many_words(&p, ":" WHITESPACE, 0, &a, &b, &c) == 3);
assert_se(!isempty(p));
assert_se(streq_ptr(a, "foobar"));
assert_se(streq_ptr(b, "waldi"));
assert_se(streq_ptr(c, "piep"));
- assert_se(extract_many_words(&p, ":" WHITESPACE, 0, &d, &e, &f, NULL) == 2);
+ assert_se(extract_many_words(&p, ":" WHITESPACE, 0, &d, &e, &f) == 2);
assert_se(isempty(p));
assert_se(streq_ptr(d, "ba1"));
assert_se(streq_ptr(e, "ba2"));
@@ -712,7 +712,7 @@ TEST(extract_many_words) {
free(f);
p = original = "'foobar' wa\"ld\"i ";
- assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2);
+ assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c) == 2);
assert_se(isempty(p));
assert_se(streq_ptr(a, "'foobar'"));
assert_se(streq_ptr(b, "wa\"ld\"i"));
@@ -721,7 +721,7 @@ TEST(extract_many_words) {
free(b);
p = original = "'foobar' wa\"ld\"i ";
- assert_se(extract_many_words(&p, NULL, EXTRACT_UNQUOTE, &a, &b, &c, NULL) == 2);
+ assert_se(extract_many_words(&p, NULL, EXTRACT_UNQUOTE, &a, &b, &c) == 2);
assert_se(isempty(p));
assert_se(streq_ptr(a, "foobar"));
assert_se(streq_ptr(b, "waldi"));
@@ -730,31 +730,31 @@ TEST(extract_many_words) {
free(b);
p = original = "";
- assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
+ assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c) == 0);
assert_se(isempty(p));
assert_se(streq_ptr(a, NULL));
assert_se(streq_ptr(b, NULL));
assert_se(streq_ptr(c, NULL));
p = original = " ";
- assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
+ assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c) == 0);
assert_se(isempty(p));
assert_se(streq_ptr(a, NULL));
assert_se(streq_ptr(b, NULL));
assert_se(streq_ptr(c, NULL));
p = original = "foobar";
- assert_se(extract_many_words(&p, NULL, 0, NULL) == 0);
+ assert_se(extract_many_words(&p, NULL, 0) == 0);
assert_se(p == original);
p = original = "foobar waldi";
- assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
+ assert_se(extract_many_words(&p, NULL, 0, &a) == 1);
assert_se(p == original+7);
assert_se(streq_ptr(a, "foobar"));
free(a);
p = original = " foobar ";
- assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
+ assert_se(extract_many_words(&p, NULL, 0, &a) == 1);
assert_se(isempty(p));
assert_se(streq_ptr(a, "foobar"));
free(a);
diff --git a/src/test/test-locale-util.c b/src/test/test-locale-util.c
index dd9a8134bf..ab2d1f5746 100644
--- a/src/test/test-locale-util.c
+++ b/src/test/test-locale-util.c
@@ -82,7 +82,7 @@ TEST(keymaps) {
#define dump_glyph(x) log_info(STRINGIFY(x) ": %s", special_glyph(x))
TEST(dump_special_glyphs) {
- assert_cc(SPECIAL_GLYPH_BLUE_CIRCLE + 1 == _SPECIAL_GLYPH_MAX);
+ assert_cc(SPECIAL_GLYPH_GREEN_CIRCLE + 1 == _SPECIAL_GLYPH_MAX);
log_info("is_locale_utf8: %s", yes_no(is_locale_utf8()));
@@ -92,6 +92,8 @@ TEST(dump_special_glyphs) {
dump_glyph(SPECIAL_GLYPH_TREE_SPACE);
dump_glyph(SPECIAL_GLYPH_TREE_TOP);
dump_glyph(SPECIAL_GLYPH_VERTICAL_DOTTED);
+ dump_glyph(SPECIAL_GLYPH_HORIZONTAL_DOTTED);
+ dump_glyph(SPECIAL_GLYPH_HORIZONTAL_FAT);
dump_glyph(SPECIAL_GLYPH_TRIANGULAR_BULLET);
dump_glyph(SPECIAL_GLYPH_BLACK_CIRCLE);
dump_glyph(SPECIAL_GLYPH_WHITE_CIRCLE);
@@ -130,6 +132,7 @@ TEST(dump_special_glyphs) {
dump_glyph(SPECIAL_GLYPH_RED_CIRCLE);
dump_glyph(SPECIAL_GLYPH_YELLOW_CIRCLE);
dump_glyph(SPECIAL_GLYPH_BLUE_CIRCLE);
+ dump_glyph(SPECIAL_GLYPH_GREEN_CIRCLE);
}
DEFINE_TEST_MAIN(LOG_INFO);
diff --git a/src/test/test-loopback.c b/src/test/test-loopback.c
index 48869ae337..db6ee0f32d 100644
--- a/src/test/test-loopback.c
+++ b/src/test/test-loopback.c
@@ -19,6 +19,8 @@ TEST_RET(loopback_setup) {
}
r = loopback_setup();
+ if (ERRNO_IS_NEG_PRIVILEGE(r))
+ return log_tests_skipped("lacking privileges");
if (r < 0)
return log_error_errno(r, "loopback: %m");
diff --git a/src/test/test-mempress.c b/src/test/test-mempress.c
index 23d09813d9..1c3f6463b2 100644
--- a/src/test/test-mempress.c
+++ b/src/test/test-mempress.c
@@ -233,7 +233,7 @@ TEST(real_pressure) {
_exit(EXIT_SUCCESS);
}
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
assert_se(sd_event_add_child(e, &cs, pid, WEXITED, real_pressure_child_callback, NULL) >= 0);
assert_se(sd_event_source_set_child_process_own(cs, true) >= 0);
diff --git a/src/test/test-mount-util.c b/src/test/test-mount-util.c
index 3e22ac67fc..77fce983b9 100644
--- a/src/test/test-mount-util.c
+++ b/src/test/test-mount-util.c
@@ -213,6 +213,25 @@ TEST(bind_remount_one) {
_exit(EXIT_SUCCESS);
}
+ assert_se(wait_for_terminate_and_check("test-remount-one-with-mountinfo", pid, WAIT_LOG) == EXIT_SUCCESS);
+
+ pid = fork();
+ assert_se(pid >= 0);
+
+ if (pid == 0) {
+ /* child */
+
+ assert_se(detach_mount_namespace() >= 0);
+
+ assert_se(bind_remount_one("/run", MS_RDONLY, MS_RDONLY) >= 0);
+ assert_se(bind_remount_one("/run", MS_NOEXEC, MS_RDONLY|MS_NOEXEC) >= 0);
+ assert_se(bind_remount_one("/proc/idontexist", MS_RDONLY, MS_RDONLY) == -ENOENT);
+ assert_se(bind_remount_one("/proc/self", MS_RDONLY, MS_RDONLY) == -EINVAL);
+ assert_se(bind_remount_one("/", MS_RDONLY, MS_RDONLY) >= 0);
+
+ _exit(EXIT_SUCCESS);
+ }
+
assert_se(wait_for_terminate_and_check("test-remount-one", pid, WAIT_LOG) == EXIT_SUCCESS);
}
diff --git a/src/test/test-nss-hosts.c b/src/test/test-nss-hosts.c
index 7758f0adc9..2f1810d93b 100644
--- a/src/test/test-nss-hosts.c
+++ b/src/test/test-nss-hosts.c
@@ -140,7 +140,7 @@ static void test_gethostbyname4_r(void *handle, const char *module, const char *
assert_se(status == NSS_STATUS_SUCCESS);
assert_se(n == socket_ipv6_is_enabled() + 1);
- } else if (streq(module, "resolve") && getenv_bool_secure("SYSTEMD_NSS_RESOLVE_SYNTHESIZE") != 0) {
+ } else if (streq(module, "resolve") && secure_getenv_bool("SYSTEMD_NSS_RESOLVE_SYNTHESIZE") != 0) {
assert_se(status == NSS_STATUS_SUCCESS);
if (socket_ipv6_is_enabled())
assert_se(n == 2);
@@ -451,7 +451,11 @@ static int parse_argv(int argc, char **argv,
} else {
_cleanup_free_ char *hostname = NULL;
assert_se(hostname = gethostname_malloc());
- assert_se(names = strv_new("localhost", "_gateway", "_outbound", "foo_no_such_host", hostname));
+ assert_se(names = strv_new("localhost",
+ "_gateway",
+ "_outbound",
+ hostname,
+ slow_tests_enabled() ? "foo_no_such_host" : NULL));
n = make_addresses(&addrs);
assert_se(n >= 0);
diff --git a/src/test/test-path-lookup.c b/src/test/test-path-lookup.c
index 431a85965d..cb13fad7c5 100644
--- a/src/test/test-path-lookup.c
+++ b/src/test/test-path-lookup.c
@@ -13,8 +13,8 @@
static void test_paths_one(RuntimeScope scope) {
_cleanup_(rm_rf_physical_and_freep) char *tmp = NULL;
- _cleanup_(lookup_paths_free) LookupPaths lp_without_env = {};
- _cleanup_(lookup_paths_free) LookupPaths lp_with_env = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp_without_env = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp_with_env = {};
char *systemd_unit_path;
assert_se(mkdtemp_malloc("/tmp/test-path-lookup.XXXXXXX", &tmp) >= 0);
@@ -40,7 +40,7 @@ TEST(paths) {
}
TEST(user_and_global_paths) {
- _cleanup_(lookup_paths_free) LookupPaths lp_global = {}, lp_user = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp_global = {}, lp_user = {};
char **u, **g;
unsigned k = 0;
diff --git a/src/test/test-progress-bar.c b/src/test/test-progress-bar.c
new file mode 100644
index 0000000000..b47adf0c28
--- /dev/null
+++ b/src/test/test-progress-bar.c
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "pretty-print.h"
+#include "random-util.h"
+#include "tests.h"
+
+#define PROGRESS_PREFIX "test: "
+
+TEST(progress_bar) {
+
+ draw_progress_bar(PROGRESS_PREFIX, 0);
+
+ bool paused = false;
+
+ for (double d = 0; d <= 100; d += 0.5) {
+ usleep_safe(random_u64_range(20 * USEC_PER_MSEC));
+ draw_progress_bar(PROGRESS_PREFIX, d);
+
+ if (!paused && d >= 50) {
+ clear_progress_bar(PROGRESS_PREFIX);
+ fputs("Sleeping for 1s...", stdout);
+ fflush(stdout);
+ usleep_safe(USEC_PER_SEC);
+ paused = true;
+ }
+ }
+
+ draw_progress_bar(PROGRESS_PREFIX, 100);
+ usleep_safe(300 * MSEC_PER_SEC);
+ clear_progress_bar(PROGRESS_PREFIX);
+ fputs("Done.\n", stdout);
+}
+
+DEFINE_TEST_MAIN(LOG_INFO);
diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c
index e78e299ed2..92f1083a4c 100644
--- a/src/test/test-string-util.c
+++ b/src/test/test-string-util.c
@@ -299,8 +299,13 @@ TEST(ascii_strlower) {
TEST(strshorten) {
char s[] = "foobar";
+ assert_se(strlen(strshorten(s, SIZE_MAX)) == 6);
+ assert_se(strlen(strshorten(s, SIZE_MAX-1)) == 6);
+ assert_se(strlen(strshorten(s, SIZE_MAX-2)) == 6);
assert_se(strlen(strshorten(s, 6)) == 6);
+ assert_se(strlen(strshorten(s, 7)) == 6);
assert_se(strlen(strshorten(s, 12)) == 6);
+ assert_se(strlen(strshorten(s, 5)) == 5);
assert_se(strlen(strshorten(s, 2)) == 2);
assert_se(strlen(strshorten(s, 0)) == 0);
}
diff --git a/src/test/test-uid-range.c b/src/test/test-uid-range.c
index 10ed8cc784..e8799e7810 100644
--- a/src/test/test-uid-range.c
+++ b/src/test/test-uid-range.c
@@ -20,6 +20,8 @@ TEST(uid_range) {
assert_se(uid_range_covers(p, 0, 0));
assert_se(!uid_range_covers(p, 0, 1));
assert_se(!uid_range_covers(p, 100, UINT32_MAX));
+ assert_se(!uid_range_covers(p, UINT32_MAX, 1));
+ assert_se(!uid_range_covers(p, UINT32_MAX - 10, 11));
assert_se(uid_range_add_str(&p, "500-999") >= 0);
assert_se(p);
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index 9f8787b492..220802e350 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -26,7 +26,7 @@ TEST(unit_validate_alias_symlink_and_warn) {
}
TEST(unit_file_build_name_map) {
- _cleanup_(lookup_paths_free) LookupPaths lp = {};
+ _cleanup_(lookup_paths_done) LookupPaths lp = {};
_cleanup_hashmap_free_ Hashmap *unit_ids = NULL;
_cleanup_hashmap_free_ Hashmap *unit_names = NULL;
const char *k, *dst;
diff --git a/src/test/test-varlink-idl.c b/src/test/test-varlink-idl.c
index d80fd70529..3ca36a07a4 100644
--- a/src/test/test-varlink-idl.c
+++ b/src/test/test-varlink-idl.c
@@ -385,7 +385,7 @@ TEST(validate_method_call) {
assert_se(varlink_callb(v, "xyz.TestMethod", &reply, &error_id,
JSON_BUILD_OBJECT(
- JSON_BUILD_PAIR_STRING("foo", "wuff"),
+ JSON_BUILD_PAIR_BOOLEAN("foo", true),
JSON_BUILD_PAIR_UNSIGNED("bar", 9))) >= 0);
assert_se(streq_ptr(error_id, VARLINK_ERROR_INVALID_PARAMETER));
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c
index 418faa5054..46ec6b31bc 100644
--- a/src/timedate/timedatectl.c
+++ b/src/timedate/timedatectl.c
@@ -888,6 +888,7 @@ static int help(void) {
" -p --property=NAME Show only properties by this name\n"
" -a --all Show all properties, including empty ones\n"
" --value When showing properties, only print the value\n"
+ " -P NAME Equivalent to --value --property=NAME\n"
"\nSee the %s for details.\n",
program_invocation_short_name,
ansi_highlight(),
@@ -902,7 +903,6 @@ static int verb_help(int argc, char **argv, void *userdata) {
}
static int parse_argv(int argc, char *argv[]) {
-
enum {
ARG_VERSION = 0x100,
ARG_NO_PAGER,
@@ -922,8 +922,8 @@ static int parse_argv(int argc, char *argv[]) {
{ "adjust-system-clock", no_argument, NULL, ARG_ADJUST_SYSTEM_CLOCK },
{ "monitor", no_argument, NULL, ARG_MONITOR },
{ "property", required_argument, NULL, 'p' },
- { "all", no_argument, NULL, 'a' },
{ "value", no_argument, NULL, ARG_VALUE },
+ { "all", no_argument, NULL, 'a' },
{}
};
@@ -932,8 +932,7 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "hH:M:p:a", options, NULL)) >= 0)
-
+ while ((c = getopt_long(argc, argv, "hH:M:p:P:a", options, NULL)) >= 0)
switch (c) {
case 'h':
@@ -968,26 +967,27 @@ static int parse_argv(int argc, char *argv[]) {
arg_monitor = true;
break;
- case 'p': {
+ case 'p':
+ case 'P':
r = strv_extend(&arg_property, optarg);
if (r < 0)
return log_oom();
- /* If the user asked for a particular
- * property, show it to them, even if it is
- * empty. */
+ /* If the user asked for a particular property, show it to them, even if empty. */
SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_SHOW_EMPTY, true);
- break;
- }
- case 'a':
- SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_SHOW_EMPTY, true);
- break;
+ if (c == 'p')
+ break;
+ _fallthrough_;
case ARG_VALUE:
SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_ONLY_VALUE, true);
break;
+ case 'a':
+ SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_SHOW_EMPTY, true);
+ break;
+
case '?':
return -EINVAL;
diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c
index 1d8ebecc91..5c308a04bc 100644
--- a/src/timesync/timesyncd.c
+++ b/src/timesync/timesyncd.c
@@ -174,7 +174,7 @@ static int run(int argc, char *argv[]) {
return log_error_errno(r, "Failed to drop privileges: %m");
}
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGRTMIN+18, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGRTMIN+18) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/timesync/wait-sync.c b/src/timesync/wait-sync.c
index 832e117096..b6c167b0f9 100644
--- a/src/timesync/wait-sync.c
+++ b/src/timesync/wait-sync.c
@@ -184,7 +184,7 @@ static int run(int argc, char * argv[]) {
};
int r;
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0);
r = sd_event_default(&event);
if (r < 0)
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index e4854f31b5..ec6d8dcfa1 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -1257,60 +1257,47 @@ static int parse_acls_from_arg(Item *item) {
#if HAVE_ACL
static int parse_acl_cond_exec(
const char *path,
- acl_t access, /* could be empty (NULL) */
- acl_t cond_exec,
const struct stat *st,
+ acl_t cond_exec,
+ acl_t access, /* could be empty (NULL) */
bool append,
acl_t *ret) {
- _cleanup_(acl_freep) acl_t parsed = NULL;
acl_entry_t entry;
acl_permset_t permset;
bool has_exec;
int r;
assert(path);
- assert(ret);
assert(st);
+ assert(cond_exec);
+ assert(ret);
- parsed = access ? acl_dup(access) : acl_init(0);
- if (!parsed)
- return -errno;
-
- /* Since we substitute 'X' with 'x' in parse_acl(), we just need to copy the entries over
- * for directories */
- if (S_ISDIR(st->st_mode)) {
- for (r = acl_get_entry(cond_exec, ACL_FIRST_ENTRY, &entry);
- r > 0;
- r = acl_get_entry(cond_exec, ACL_NEXT_ENTRY, &entry)) {
-
- acl_entry_t parsed_entry;
-
- if (acl_create_entry(&parsed, &parsed_entry) < 0)
- return -errno;
-
- if (acl_copy_entry(parsed_entry, entry) < 0)
- return -errno;
- }
- if (r < 0)
- return -errno;
-
- goto finish;
- }
-
- has_exec = st->st_mode & S_IXUSR;
-
- if (!has_exec && append) {
+ if (!S_ISDIR(st->st_mode)) {
_cleanup_(acl_freep) acl_t old = NULL;
old = acl_get_file(path, ACL_TYPE_ACCESS);
if (!old)
return -errno;
+ has_exec = false;
+
for (r = acl_get_entry(old, ACL_FIRST_ENTRY, &entry);
r > 0;
r = acl_get_entry(old, ACL_NEXT_ENTRY, &entry)) {
+ acl_tag_t tag;
+
+ if (acl_get_tag_type(entry, &tag) < 0)
+ return -errno;
+
+ if (tag == ACL_MASK)
+ continue;
+
+ /* If not appending, skip ACL definitions */
+ if (!append && IN_SET(tag, ACL_USER, ACL_GROUP))
+ continue;
+
if (acl_get_permset(entry, &permset) < 0)
return -errno;
@@ -1324,28 +1311,33 @@ static int parse_acl_cond_exec(
}
if (r < 0)
return -errno;
- }
- /* Check if we're about to set the execute bit in acl_access */
- if (!has_exec && access) {
- for (r = acl_get_entry(access, ACL_FIRST_ENTRY, &entry);
- r > 0;
- r = acl_get_entry(access, ACL_NEXT_ENTRY, &entry)) {
+ /* Check if we're about to set the execute bit in acl_access */
+ if (!has_exec && access) {
+ for (r = acl_get_entry(access, ACL_FIRST_ENTRY, &entry);
+ r > 0;
+ r = acl_get_entry(access, ACL_NEXT_ENTRY, &entry)) {
- if (acl_get_permset(entry, &permset) < 0)
- return -errno;
+ if (acl_get_permset(entry, &permset) < 0)
+ return -errno;
- r = acl_get_perm(permset, ACL_EXECUTE);
+ r = acl_get_perm(permset, ACL_EXECUTE);
+ if (r < 0)
+ return -errno;
+ if (r > 0) {
+ has_exec = true;
+ break;
+ }
+ }
if (r < 0)
return -errno;
- if (r > 0) {
- has_exec = true;
- break;
- }
}
- if (r < 0)
- return -errno;
- }
+ } else
+ has_exec = true;
+
+ _cleanup_(acl_freep) acl_t parsed = access ? acl_dup(access) : acl_init(0);
+ if (!parsed)
+ return -errno;
for (r = acl_get_entry(cond_exec, ACL_FIRST_ENTRY, &entry);
r > 0;
@@ -1359,6 +1351,7 @@ static int parse_acl_cond_exec(
if (acl_copy_entry(parsed_entry, entry) < 0)
return -errno;
+ /* We substituted 'X' with 'x' in parse_acl(), so drop execute bit here if not applicable. */
if (!has_exec) {
if (acl_get_permset(parsed_entry, &permset) < 0)
return -errno;
@@ -1370,7 +1363,6 @@ static int parse_acl_cond_exec(
if (r < 0)
return -errno;
-finish:
if (!append) { /* want_mask = true */
r = calc_acl_mask_if_needed(&parsed);
if (r < 0)
@@ -1475,10 +1467,9 @@ static int fd_set_acls(
}
if (item->acl_access_exec) {
- r = parse_acl_cond_exec(FORMAT_PROC_FD_PATH(fd),
- item->acl_access,
+ r = parse_acl_cond_exec(FORMAT_PROC_FD_PATH(fd), st,
item->acl_access_exec,
- st,
+ item->acl_access,
item->append_or_force,
&access_with_exec_parsed);
if (r < 0)
@@ -3648,8 +3639,7 @@ static int parse_line(
&mode,
&user,
&group,
- &age,
- NULL);
+ &age);
if (r < 0) {
if (IN_SET(r, -EINVAL, -EBADSLT))
/* invalid quoting and such or an unknown specifier */
@@ -4626,7 +4616,8 @@ static int run(int argc, char *argv[]) {
DISSECT_IMAGE_VALIDATE_OS |
DISSECT_IMAGE_RELAX_VAR_CHECK |
DISSECT_IMAGE_FSCK |
- DISSECT_IMAGE_GROWFS,
+ DISSECT_IMAGE_GROWFS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
&mounted_dir,
/* ret_dir_fd= */ NULL,
&loop_device);
diff --git a/src/tpm2-setup/tpm2-generator.c b/src/tpm2-setup/tpm2-generator.c
index 723b31898a..f1d903ee81 100644
--- a/src/tpm2-setup/tpm2-generator.c
+++ b/src/tpm2-setup/tpm2-generator.c
@@ -20,10 +20,10 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
assert(key);
- if (proc_cmdline_key_streq(key, "systemd.tpm2-wait")) {
+ if (proc_cmdline_key_streq(key, "systemd.tpm2_wait")) {
r = value ? parse_boolean(value) : 1;
if (r < 0)
- log_warning_errno(r, "Failed to parse 'systemd.tpm2-wait' kernel command line argument, ignoring: %s", value);
+ log_warning_errno(r, "Failed to parse 'systemd.tpm2_wait=' kernel command line argument, ignoring: %s", value);
else
arg_tpm2_wait = r;
}
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index df979be5cd..31b284b502 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -356,7 +356,7 @@ static int process_and_watch_password_files(bool watch) {
(void) mkdir_p_label("/run/systemd/ask-password", 0755);
assert_se(sigemptyset(&mask) >= 0);
- assert_se(sigset_add_many(&mask, SIGTERM, -1) >= 0);
+ assert_se(sigset_add_many(&mask, SIGTERM) >= 0);
assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) >= 0);
if (watch) {
@@ -556,7 +556,7 @@ static int ask_on_this_console(const char *tty, pid_t *ret_pid, char **arguments
assert_se(sigaction(SIGCHLD, &sigchld, NULL) >= 0);
assert_se(sigaction(SIGHUP, &sighup, NULL) >= 0);
- assert_se(sigprocmask_many(SIG_UNBLOCK, NULL, SIGHUP, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_UNBLOCK, NULL, SIGHUP, SIGCHLD) >= 0);
r = safe_fork("(sd-passwd)", FORK_RESET_SIGNALS|FORK_LOG, ret_pid);
if (r < 0)
diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf
index 42d7cc7ee2..b77759d094 100644
--- a/src/udev/net/link-config-gperf.gperf
+++ b/src/udev/net/link-config-gperf.gperf
@@ -108,6 +108,7 @@ Link.RxMaxCoalescedHighFrames, config_parse_coalesce_u32,
Link.TxCoalesceHighSec, config_parse_coalesce_sec, 0, offsetof(LinkConfig, coalesce.tx_coalesce_usecs_high)
Link.TxMaxCoalescedHighFrames, config_parse_coalesce_u32, 0, offsetof(LinkConfig, coalesce.tx_max_coalesced_frames_high)
Link.CoalescePacketRateSampleIntervalSec, config_parse_coalesce_sec, 0, offsetof(LinkConfig, coalesce.rate_sample_interval)
+Link.ReceivePacketSteeringCPUMask, config_parse_rps_cpu_mask, 0, offsetof(LinkConfig, rps_cpu_mask)
Link.MDI, config_parse_mdi, 0, offsetof(LinkConfig, mdi)
Link.SR-IOVVirtualFunctions, config_parse_sr_iov_num_vfs, 0, offsetof(LinkConfig, sr_iov_num_vfs)
SR-IOV.VirtualFunction, config_parse_sr_iov_uint32, 0, offsetof(LinkConfig, sr_iov_by_section)
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 5320b84b1d..7f16b17467 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -73,6 +73,7 @@ static LinkConfig* link_config_free(LinkConfig *config) {
free(config->alias);
free(config->wol_password_file);
erase_and_free(config->wol_password);
+ cpu_set_free(config->rps_cpu_mask);
ordered_hashmap_free_with_destructor(config->sr_iov_by_section, sr_iov_free);
@@ -937,6 +938,49 @@ static int link_apply_sr_iov_config(Link *link, sd_netlink **rtnl) {
return 0;
}
+static int link_apply_rps_cpu_mask(Link *link) {
+ _cleanup_free_ char *mask_str = NULL;
+ LinkConfig *config;
+ int r;
+
+ assert(link);
+ config = ASSERT_PTR(link->config);
+
+ /* Skip if the config is not specified. */
+ if (!config->rps_cpu_mask)
+ return 0;
+
+ mask_str = cpu_set_to_mask_string(config->rps_cpu_mask);
+ if (!mask_str)
+ return log_oom();
+
+ log_link_debug(link, "Applying RPS CPU mask: %s", mask_str);
+
+ /* Currently, this will set CPU mask to all rx queue of matched device. */
+ FOREACH_DEVICE_SYSATTR(link->device, attr) {
+ const char *c;
+
+ c = path_startswith(attr, "queues/");
+ if (!c)
+ continue;
+
+ c = startswith(c, "rx-");
+ if (!c)
+ continue;
+
+ c += strcspn(c, "/");
+
+ if (!path_equal(c, "/rps_cpus"))
+ continue;
+
+ r = sd_device_set_sysattr_value(link->device, attr, mask_str);
+ if (r < 0)
+ log_link_warning_errno(link, r, "Failed to write %s sysfs attribute, ignoring: %m", attr);
+ }
+
+ return 0;
+}
+
static int link_apply_udev_properties(Link *link, bool test) {
LinkConfig *config;
sd_device *device;
@@ -1024,6 +1068,10 @@ int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link, boo
if (r < 0)
return r;
+ r = link_apply_rps_cpu_mask(link);
+ if (r < 0)
+ return r;
+
return 0;
}
@@ -1314,6 +1362,63 @@ int config_parse_wol_password(
return 0;
}
+int config_parse_rps_cpu_mask(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ _cleanup_(cpu_set_freep) CPUSet *allocated = NULL;
+ CPUSet *mask, **rps_cpu_mask = ASSERT_PTR(data);
+ int r;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+
+ if (isempty(rvalue)) {
+ *rps_cpu_mask = cpu_set_free(*rps_cpu_mask);
+ return 0;
+ }
+
+ if (*rps_cpu_mask)
+ mask = *rps_cpu_mask;
+ else {
+ allocated = new0(CPUSet, 1);
+ if (!allocated)
+ return log_oom();
+
+ mask = allocated;
+ }
+
+ if (streq(rvalue, "disable"))
+ cpu_set_reset(mask);
+
+ else if (streq(rvalue, "all")) {
+ r = cpu_mask_add_all(mask);
+ if (r < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Failed to create CPU affinity mask representing \"all\" cpus, ignoring: %m");
+ return 0;
+ }
+ } else {
+ r = parse_cpu_set_extend(rvalue, mask, /* warn= */ true, unit, filename, line, lvalue);
+ if (r < 0)
+ return 0;
+ }
+
+ if (allocated)
+ *rps_cpu_mask = TAKE_PTR(allocated);
+
+ return 0;
+}
+
static const char* const mac_address_policy_table[_MAC_ADDRESS_POLICY_MAX] = {
[MAC_ADDRESS_POLICY_PERSISTENT] = "persistent",
[MAC_ADDRESS_POLICY_RANDOM] = "random",
diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h
index 98cadc212e..f6abff89e8 100644
--- a/src/udev/net/link-config.h
+++ b/src/udev/net/link-config.h
@@ -6,6 +6,7 @@
#include "condition.h"
#include "conf-parser.h"
+#include "cpu-set-util.h"
#include "ethtool-util.h"
#include "hashmap.h"
#include "list.h"
@@ -84,6 +85,7 @@ struct LinkConfig {
int autoneg_flow_control;
netdev_coalesce_param coalesce;
uint8_t mdi;
+ CPUSet *rps_cpu_mask;
uint32_t sr_iov_num_vfs;
OrderedHashmap *sr_iov_by_section;
@@ -121,3 +123,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_wol_password);
CONFIG_PARSER_PROTOTYPE(config_parse_mac_address_policy);
CONFIG_PARSER_PROTOTYPE(config_parse_name_policy);
CONFIG_PARSER_PROTOTYPE(config_parse_alternative_names_policy);
+CONFIG_PARSER_PROTOTYPE(config_parse_rps_cpu_mask);
diff --git a/src/udev/scsi_id/scsi_id.c b/src/udev/scsi_id/scsi_id.c
index d7d4380851..0f7119cd70 100644
--- a/src/udev/scsi_id/scsi_id.c
+++ b/src/udev/scsi_id/scsi_id.c
@@ -151,7 +151,7 @@ static int get_file_options(const char *vendor, const char *model,
if (*buf == '#')
continue;
- r = extract_many_words(&buf, "=\",\n", 0, &key, &value, NULL);
+ r = extract_many_words(&buf, "=\",\n", 0, &key, &value);
if (r < 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Error parsing config file line %d '%s'", lineno, buffer);
@@ -159,7 +159,7 @@ static int get_file_options(const char *vendor, const char *model,
vendor_in = TAKE_PTR(value);
key = mfree(key);
- r = extract_many_words(&buf, "=\",\n", 0, &key, &value, NULL);
+ r = extract_many_words(&buf, "=\",\n", 0, &key, &value);
if (r < 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Error parsing config file line %d '%s'", lineno, buffer);
@@ -167,7 +167,7 @@ static int get_file_options(const char *vendor, const char *model,
model_in = TAKE_PTR(value);
key = mfree(key);
- r = extract_many_words(&buf, "=\",\n", 0, &key, &value, NULL);
+ r = extract_many_words(&buf, "=\",\n", 0, &key, &value);
if (r < 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Error parsing config file line %d '%s'", lineno, buffer);
}
diff --git a/src/udev/test-udev-rule-runner.c b/src/udev/test-udev-rule-runner.c
index fa6c59c762..f5aa38ac3e 100644
--- a/src/udev/test-udev-rule-runner.c
+++ b/src/udev/test-udev-rule-runner.c
@@ -144,7 +144,7 @@ static int run(int argc, char *argv[]) {
assert_se(event = udev_event_new(dev, NULL));
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD) >= 0);
/* do what devtmpfs usually provides us */
if (sd_device_get_devname(dev, &devname) >= 0) {
diff --git a/src/udev/test-udev-spawn.c b/src/udev/test-udev-spawn.c
index 8486676821..0102d8d707 100644
--- a/src/udev/test-udev-spawn.c
+++ b/src/udev/test-udev-spawn.c
@@ -97,7 +97,7 @@ int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG);
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
test_event_spawn_cat(true, SIZE_MAX);
test_event_spawn_cat(false, SIZE_MAX);
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index 2482436006..8ef3abada9 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -731,15 +731,15 @@ static int names_platform(sd_device *dev, const char *prefix, bool test) {
* The Vendor (3 or 4 char), followed by hexadecimal model number : instance id. */
if (r == 10 && p[7] == ':') {
/* 3 char vendor string */
- vendor = strndupa(p, 3);
- model_str = strndupa(p + 3, 4);
- instance_str = strndupa(p + 8, 2);
+ vendor = strndupa_safe(p, 3);
+ model_str = strndupa_safe(p + 3, 4);
+ instance_str = strndupa_safe(p + 8, 2);
validchars = UPPERCASE_LETTERS;
} else if (r == 11 && p[8] == ':') {
/* 4 char vendor string */
- vendor = strndupa(p, 4);
- model_str = strndupa(p + 4, 4);
- instance_str = strndupa(p + 9, 2);
+ vendor = strndupa_safe(p, 4);
+ model_str = strndupa_safe(p + 4, 4);
+ instance_str = strndupa_safe(p + 9, 2);
validchars = UPPERCASE_LETTERS DIGITS;
} else
return -EOPNOTSUPP;
diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c
index 31944c2247..0b6cfb1655 100644
--- a/src/udev/udev-manager.c
+++ b/src/udev/udev-manager.c
@@ -1308,7 +1308,7 @@ int manager_main(Manager *manager) {
udev_watch_restore(manager->inotify_fd);
/* block SIGCHLD for listening child events. */
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
r = sd_event_default(&manager->event);
if (r < 0)
diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c
index 4cd9ad4082..7c3c0cd202 100644
--- a/src/udev/udevadm-info.c
+++ b/src/udev/udevadm-info.c
@@ -759,7 +759,7 @@ static int parse_key_value_argument(const char *s, char **key, char **value) {
assert(key);
assert(value);
- r = extract_many_words(&s, "=", EXTRACT_DONT_COALESCE_SEPARATORS, &k, &v, NULL);
+ r = extract_many_words(&s, "=", EXTRACT_DONT_COALESCE_SEPARATORS, &k, &v);
if (r < 0)
return log_error_errno(r, "Failed to parse key/value pair %s: %m", s);
if (r < 2)
diff --git a/src/udev/udevadm-monitor.c b/src/udev/udevadm-monitor.c
index 27c4853c4d..b1124df76a 100644
--- a/src/udev/udevadm-monitor.c
+++ b/src/udev/udevadm-monitor.c
@@ -208,7 +208,7 @@ int monitor_main(int argc, char *argv[], void *userdata) {
goto finalize;
}
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT) >= 0);
(void) sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
(void) sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
diff --git a/src/ukify/test/test_ukify.py b/src/ukify/test/test_ukify.py
index f50e88d2f4..0e3f932890 100755
--- a/src/ukify/test/test_ukify.py
+++ b/src/ukify/test/test_ukify.py
@@ -36,6 +36,11 @@ sys.path.append(os.path.dirname(__file__) + '/..')
import ukify
build_root = os.getenv('PROJECT_BUILD_ROOT')
+try:
+ slow_tests = bool(int(os.getenv('SYSTEMD_SLOW_TESTS', '1')))
+except ValueError:
+ slow_tests = True
+
arg_tools = ['--tools', build_root] if build_root else []
def systemd_measure():
@@ -115,7 +120,7 @@ def test_apply_config(tmp_path):
assert ns.sign_kernel is False
assert ns._groups == ['NAME']
- assert ns.pcr_private_keys == [pathlib.Path('some/path7')]
+ assert ns.pcr_private_keys == ['some/path7']
assert ns.pcr_public_keys == [pathlib.Path('some/path8')]
assert ns.phase_path_groups == [['enter-initrd:leave-initrd:sysinit:ready:shutdown:final']]
@@ -138,7 +143,7 @@ def test_apply_config(tmp_path):
assert ns.sign_kernel is False
assert ns._groups == ['NAME']
- assert ns.pcr_private_keys == [pathlib.Path('some/path7')]
+ assert ns.pcr_private_keys == ['some/path7']
assert ns.pcr_public_keys == [pathlib.Path('some/path8')]
assert ns.phase_path_groups == [['enter-initrd:leave-initrd:sysinit:ready:shutdown:final']]
@@ -184,7 +189,7 @@ def test_parse_args_many_deprecated():
assert opts.pcrpkey == pathlib.Path('PATH')
assert opts.uname == '1.2.3'
assert opts.stub == pathlib.Path('STUBPATH')
- assert opts.pcr_private_keys == [pathlib.Path('PKEY1')]
+ assert opts.pcr_private_keys == ['PKEY1']
assert opts.pcr_public_keys == [pathlib.Path('PKEY2')]
assert opts.pcr_banks == ['SHA1', 'SHA256']
assert opts.signing_engine == 'ENGINE'
@@ -230,7 +235,7 @@ def test_parse_args_many():
assert opts.pcrpkey == pathlib.Path('PATH')
assert opts.uname == '1.2.3'
assert opts.stub == pathlib.Path('STUBPATH')
- assert opts.pcr_private_keys == [pathlib.Path('PKEY1')]
+ assert opts.pcr_private_keys == ['PKEY1']
assert opts.pcr_public_keys == [pathlib.Path('PKEY2')]
assert opts.pcr_banks == ['SHA1', 'SHA256']
assert opts.signing_engine == 'ENGINE'
@@ -337,8 +342,7 @@ def test_config_priority(tmp_path):
assert opts.pcrpkey == pathlib.Path('PATH')
assert opts.uname == '1.2.3'
assert opts.stub == pathlib.Path('STUBPATH')
- assert opts.pcr_private_keys == [pathlib.Path('PKEY1'),
- pathlib.Path('some/path7')]
+ assert opts.pcr_private_keys == ['PKEY1', 'some/path7']
assert opts.pcr_public_keys == [pathlib.Path('PKEY2'),
pathlib.Path('some/path8')]
assert opts.pcr_banks == ['SHA1', 'SHA256']
@@ -531,6 +535,7 @@ def test_uname_scraping(kernel_initrd):
uname = ukify.Uname.scrape(kernel_initrd[1])
assert re.match(r'\d+\.\d+\.\d+', uname)
+@pytest.mark.skipif(not slow_tests, reason='slow')
@pytest.mark.parametrize("days", [365*10, None])
def test_efi_signing_sbsign(days, kernel_initrd, tmp_path):
if kernel_initrd is None:
@@ -576,6 +581,7 @@ def test_efi_signing_sbsign(days, kernel_initrd, tmp_path):
shutil.rmtree(tmp_path)
+@pytest.mark.skipif(not slow_tests, reason='slow')
def test_efi_signing_pesign(kernel_initrd, tmp_path):
if kernel_initrd is None:
pytest.skip('linux+initrd not found')
@@ -635,16 +641,22 @@ def test_inspect(kernel_initrd, tmp_path, capsys):
uname_arg='1.2.3'
osrel_arg='Linux'
cmdline_arg='ARG1 ARG2 ARG3'
- opts = ukify.parse_args([
+
+ args = [
'build',
*kernel_initrd,
f'--cmdline={cmdline_arg}',
f'--os-release={osrel_arg}',
f'--uname={uname_arg}',
f'--output={output}',
- f'--secureboot-certificate={cert.name}',
- f'--secureboot-private-key={key.name}',
- ])
+ ]
+ if slow_tests:
+ args += [
+ f'--secureboot-certificate={cert.name}',
+ f'--secureboot-private-key={key.name}',
+ ]
+
+ opts = ukify.parse_args(args)
ukify.check_inputs(opts)
ukify.make_uki(opts)
@@ -668,6 +680,7 @@ def test_inspect(kernel_initrd, tmp_path, capsys):
shutil.rmtree(tmp_path)
+@pytest.mark.skipif(not slow_tests, reason='slow')
def test_pcr_signing(kernel_initrd, tmp_path):
if kernel_initrd is None:
pytest.skip('linux+initrd not found')
@@ -734,6 +747,7 @@ def test_pcr_signing(kernel_initrd, tmp_path):
shutil.rmtree(tmp_path)
+@pytest.mark.skipif(not slow_tests, reason='slow')
def test_pcr_signing2(kernel_initrd, tmp_path):
if kernel_initrd is None:
pytest.skip('linux+initrd not found')
diff --git a/src/ukify/ukify.py b/src/ukify/ukify.py
index e5724c8ac2..2e89ba17d9 100755
--- a/src/ukify/ukify.py
+++ b/src/ukify/ukify.py
@@ -40,6 +40,7 @@ import subprocess
import sys
import tempfile
import textwrap
+import struct
from hashlib import sha256
from typing import (Any,
Callable,
@@ -50,7 +51,7 @@ from typing import (Any,
import pefile # type: ignore
-__version__ = '{{PROJECT_VERSION_FULL}} ({{GIT_VERSION}})'
+__version__ = '{{PROJECT_VERSION_FULL}} ({{VERSION_TAG}})'
EFI_ARCH_MAP = {
# host_arch glob : [efi_arch, 32_bit_efi_arch if mixed mode is supported]
@@ -128,6 +129,45 @@ def try_import(modname, name=None):
except ImportError as e:
raise ValueError(f'Kernel is compressed with {name or modname}, but module unavailable') from e
+def get_zboot_kernel(f):
+ """Decompress zboot efistub kernel if compressed. Return contents."""
+ # See linux/drivers/firmware/efi/libstub/Makefile.zboot
+ # and linux/drivers/firmware/efi/libstub/zboot-header.S
+
+ # 4 bytes at offset 0x08 contain the starting offset of compressed data
+ f.seek(8)
+ _start = f.read(4)
+ start = struct.unpack('<i', _start)[0]
+
+ # Reading 4 bytes from address 0x0c is the size of compressed data,
+ # but it needs to be corrected according to the compressed type.
+ f.seek(0xc)
+ _sizes = f.read(4)
+ size = struct.unpack('<i', _sizes)[0]
+
+ # Read 6 bytes from address 0x18, which is a nul-terminated
+ # string representing the compressed type.
+ f.seek(0x18)
+ comp_type = f.read(6)
+ f.seek(start)
+ if comp_type.startswith(b'gzip'):
+ gzip = try_import('gzip')
+ return gzip.open(f).read(size)
+ elif comp_type.startswith(b'lz4'):
+ lz4 = try_import('lz4.frame', 'lz4')
+ return lz4.frame.decompress(f.read(size))
+ elif comp_type.startswith(b'lzma'):
+ lzma = try_import('lzma')
+ return lzma.open(f).read(size)
+ elif comp_type.startswith(b'lzo'):
+ raise NotImplementedError('lzo decompression not implemented')
+ elif comp_type.startswith(b'xzkern'):
+ raise NotImplementedError('xzkern decompression not implemented')
+ elif comp_type.startswith(b'zstd22'):
+ zstd = try_import('zstd')
+ return zstd.uncompress(f.read(size))
+ else:
+ raise NotImplementedError(f'unknown compressed type: {comp_type}')
def maybe_decompress(filename):
"""Decompress file if compressed. Return contents."""
@@ -140,8 +180,14 @@ def maybe_decompress(filename):
return f.read()
if start.startswith(b'MZ'):
- # not compressed aarch64 and riscv64
- return f.read()
+ f.seek(4)
+ img_type = f.read(4)
+ if img_type.startswith(b'zimg'):
+ # zboot efistub kernel
+ return get_zboot_kernel(f)
+ else:
+ # not compressed aarch64 and riscv64
+ return f.read()
if start.startswith(b'\x1f\x8b'):
gzip = try_import('gzip')
@@ -403,7 +449,7 @@ def check_cert_and_keys_nonexistent(opts):
*((priv_key, pub_key)
for priv_key, pub_key, _ in key_path_groups(opts)))
for path in paths:
- if path and path.exists():
+ if path and pathlib.Path(path).exists():
raise ValueError(f'{path} is present')
@@ -493,7 +539,11 @@ def call_systemd_measure(uki, linux, opts):
for priv_key, pub_key, group in key_path_groups(opts):
extra = [f'--private-key={priv_key}']
- if pub_key:
+ if opts.signing_engine is not None:
+ assert pub_key
+ extra += [f'--private-key-source=engine:{opts.signing_engine}']
+ extra += [f'--certificate={pub_key}']
+ elif pub_key:
extra += [f'--public-key={pub_key}']
extra += [f'--phase={phase_path}' for phase_path in group or ()]
@@ -682,11 +732,13 @@ def sbsign_sign(sbsign_tool, input_f, output_f, opts=None):
sbsign_tool,
'--key', opts.sb_key,
'--cert', opts.sb_cert,
- input_f,
- '--output', output_f,
]
if opts.signing_engine is not None:
sign_invocation += ['--engine', opts.signing_engine]
+ sign_invocation += [
+ input_f,
+ '--output', output_f,
+ ]
signer_sign(sign_invocation)
def find_pesign(opts=None):
@@ -772,9 +824,23 @@ def make_uki(opts):
if pcrpkey is None:
if opts.pcr_public_keys and len(opts.pcr_public_keys) == 1:
pcrpkey = opts.pcr_public_keys[0]
+ # If we are getting a certificate when using an engine, we need to convert it to public key format
+ if opts.signing_engine is not None and pathlib.Path(pcrpkey).exists():
+ from cryptography.hazmat.primitives import serialization
+ from cryptography.x509 import load_pem_x509_certificate
+
+ try:
+ cert = load_pem_x509_certificate(pathlib.Path(pcrpkey).read_bytes())
+ except ValueError:
+ raise ValueError(f'{pcrpkey} must be an X.509 certificate when signing with an engine')
+ else:
+ pcrpkey = cert.public_key().public_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PublicFormat.SubjectPublicKeyInfo,
+ )
elif opts.pcr_private_keys and len(opts.pcr_private_keys) == 1:
from cryptography.hazmat.primitives import serialization
- privkey = serialization.load_pem_private_key(opts.pcr_private_keys[0].read_bytes(), password=None)
+ privkey = serialization.load_pem_private_key(pathlib.Path(opts.pcr_private_keys[0]).read_bytes(), password=None)
pcrpkey = privkey.public_key().public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo,
@@ -956,7 +1022,7 @@ def generate_keys(opts):
print(f'Writing private key for PCR signing to {priv_key}')
with temporary_umask(0o077):
- priv_key.write_bytes(priv_key_pem)
+ pathlib.Path(priv_key).write_bytes(priv_key_pem)
if pub_key:
print(f'Writing public key for PCR signing to {pub_key}')
pub_key.write_bytes(pub_key_pem)
@@ -1359,10 +1425,8 @@ CONFIG_ITEMS = [
ConfigItem(
'--pcr-private-key',
dest = 'pcr_private_keys',
- metavar = 'PATH',
- type = pathlib.Path,
action = 'append',
- help = 'private part of the keypair for signing PCR signatures',
+ help = 'private part of the keypair or engine-specific designation for signing PCR signatures',
config_key = 'PCRSignature:/PCRPrivateKey',
config_push = ConfigItem.config_set_group,
),
@@ -1372,7 +1436,7 @@ CONFIG_ITEMS = [
metavar = 'PATH',
type = pathlib.Path,
action = 'append',
- help = 'public part of the keypair for signing PCR signatures',
+ help = 'public part of the keypair or engine-specific designation for signing PCR signatures',
config_key = 'PCRSignature:/PCRPublicKey',
config_push = ConfigItem.config_set_group,
),
diff --git a/src/userdb/userdbd-manager.c b/src/userdb/userdbd-manager.c
index 73b6d72026..5925602e43 100644
--- a/src/userdb/userdbd-manager.c
+++ b/src/userdb/userdbd-manager.c
@@ -4,6 +4,7 @@
#include "sd-daemon.h"
+#include "build-path.h"
#include "common-signal.h"
#include "env-util.h"
#include "fd-util.h"
@@ -191,11 +192,14 @@ static int start_one_worker(Manager *m) {
_exit(EXIT_FAILURE);
}
- /* execl("/home/lennart/projects/systemd/build/systemd-userwork", "systemd-userwork", "xxxxxxxxxxxxxxxx", NULL); /\* With some extra space rename_process() can make use of *\/ */
- /* execl("/usr/bin/valgrind", "valgrind", "/home/lennart/projects/systemd/build/systemd-userwork", "systemd-userwork", "xxxxxxxxxxxxxxxx", NULL); /\* With some extra space rename_process() can make use of *\/ */
+ r = setenv_systemd_log_level();
+ if (r < 0) {
+ log_error_errno(r, "Failed to set $SYSTEMD_LOG_LEVEL: %m");
+ _exit(EXIT_FAILURE);
+ }
- execl(SYSTEMD_USERWORK_PATH, "systemd-userwork", "xxxxxxxxxxxxxxxx", NULL); /* With some extra space rename_process() can make use of */
- log_error_errno(errno, "Failed start worker process: %m");
+ r = invoke_callout_binary(SYSTEMD_USERWORK_PATH, STRV_MAKE(SYSTEMD_USERWORK_PATH, "xxxxxxxxxxxxxxxx")); /* With some extra space rename_process() can make use of */
+ log_error_errno(r, "Failed start worker process: %m");
_exit(EXIT_FAILURE);
}
diff --git a/src/userdb/userdbd.c b/src/userdb/userdbd.c
index 89ac9c7ba9..cbe4c8e4f8 100644
--- a/src/userdb/userdbd.c
+++ b/src/userdb/userdbd.c
@@ -37,7 +37,7 @@ static int run(int argc, char *argv[]) {
if (setenv("SYSTEMD_BYPASS_USERDB", "io.systemd.NameServiceSwitch:io.systemd.Multiplexer:io.systemd.DropIn", 1) < 0)
return log_error_errno(errno, "Failed to set $SYSTEMD_BYPASS_USERDB: %m");
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD) >= 0);
r = manager_new(&m);
if (r < 0)
diff --git a/src/version/version.h.in b/src/version/version.h.in
index 083779aab0..01ff697434 100644
--- a/src/version/version.h.in
+++ b/src/version/version.h.in
@@ -7,4 +7,4 @@
* - where a simplified machine-parsable form is more useful, for example
* pkgconfig files and version information written to binary files.
*/
-#define GIT_VERSION "@VCS_TAG@"
+#define GIT_VERSION VERSION_TAG "@VCS_TAG@"
diff --git a/src/vmspawn/meson.build b/src/vmspawn/meson.build
index a7b34bdbab..3cd9a3b69e 100644
--- a/src/vmspawn/meson.build
+++ b/src/vmspawn/meson.build
@@ -5,6 +5,7 @@ libvmspawn_core_sources = files(
'vmspawn-util.c',
'vmspawn-scope.c',
'vmspawn-mount.c',
+ 'vmspawn-register.c',
)
libvmspawn_core = static_library(
'vmspawn-core',
@@ -18,6 +19,10 @@ vmspawn_libs = [
libshared,
]
+vmspawn_test_template = test_template + {
+ 'link_with' : [vmspawn_libs],
+}
+
executables += [
executable_template + {
'name' : 'systemd-vmspawn',
@@ -26,5 +31,9 @@ executables += [
'sources' : files('vmspawn.c'),
'link_with' : vmspawn_libs,
'dependencies' : [libblkid]
- }
+ },
+ vmspawn_test_template + {
+ 'conditions': ['ENABLE_VMSPAWN'],
+ 'sources' : files('test-vmspawn-util.c'),
+ },
]
diff --git a/src/vmspawn/test-vmspawn-util.c b/src/vmspawn/test-vmspawn-util.c
new file mode 100644
index 0000000000..67e5c4cefc
--- /dev/null
+++ b/src/vmspawn/test-vmspawn-util.c
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <stdbool.h>
+
+#include "alloc-util.h"
+#include "string-util.h"
+#include "vmspawn-util.h"
+#include "tests.h"
+
+#define _ESCAPE_QEMU_VALUE_CHECK(str, correct, varname) \
+ do { \
+ _cleanup_free_ char* varname = NULL; \
+ varname = escape_qemu_value(str); \
+ assert(varname); \
+ assert_se(streq(varname, correct)); \
+ } while (0)
+
+#define ESCAPE_QEMU_VALUE_CHECK(str, correct) \
+ _ESCAPE_QEMU_VALUE_CHECK(str, correct, conf##__COUNTER__)
+
+TEST(escape_qemu_value) {
+ ESCAPE_QEMU_VALUE_CHECK("abcde", "abcde");
+ ESCAPE_QEMU_VALUE_CHECK("a,bcde", "a,,bcde");
+ ESCAPE_QEMU_VALUE_CHECK(",,,", ",,,,,,");
+ ESCAPE_QEMU_VALUE_CHECK("", "");
+}
+
+DEFINE_TEST_MAIN(LOG_INFO);
diff --git a/src/vmspawn/vmspawn-register.c b/src/vmspawn/vmspawn-register.c
new file mode 100644
index 0000000000..d04c3dafad
--- /dev/null
+++ b/src/vmspawn/vmspawn-register.c
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "sd-bus.h"
+#include "sd-id128.h"
+
+#include "bus-error.h"
+#include "bus-locator.h"
+#include "macro.h"
+#include "process-util.h"
+#include "string-util.h"
+#include "vmspawn-register.h"
+
+int register_machine(sd_bus *bus, const char *machine_name, sd_id128_t uuid, const char *service, const char *directory) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ int r;
+
+ assert(bus);
+ assert(machine_name);
+ assert(service);
+
+ r = bus_call_method(
+ bus,
+ bus_machine_mgr,
+ "RegisterMachine",
+ &error,
+ NULL,
+ "sayssus",
+ machine_name,
+ SD_BUS_MESSAGE_APPEND_ID128(uuid),
+ service,
+ "vm",
+ (uint32_t) getpid_cached(),
+ strempty(directory));
+ if (r < 0)
+ return log_error_errno(r, "Failed to register machine: %s", bus_error_message(&error, r));
+
+ return 0;
+}
+
+int unregister_machine(sd_bus *bus, const char *machine_name) {
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ int r;
+
+ assert(bus);
+
+ r = bus_call_method(bus, bus_machine_mgr, "UnregisterMachine", &error, NULL, "s", machine_name);
+ if (r < 0)
+ log_debug("Failed to unregister machine: %s", bus_error_message(&error, r));
+
+ return 0;
+}
diff --git a/src/vmspawn/vmspawn-register.h b/src/vmspawn/vmspawn-register.h
new file mode 100644
index 0000000000..7aa82ce849
--- /dev/null
+++ b/src/vmspawn/vmspawn-register.h
@@ -0,0 +1,7 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "sd-bus.h"
+#include "sd-id128.h"
+
+int register_machine(sd_bus *bus, const char *machine_name, sd_id128_t uuid, const char *service, const char *directory);
+int unregister_machine(sd_bus *bus, const char *machine_name);
diff --git a/src/vmspawn/vmspawn-scope.c b/src/vmspawn/vmspawn-scope.c
index 676dee0592..ff986b09d6 100644
--- a/src/vmspawn/vmspawn-scope.c
+++ b/src/vmspawn/vmspawn-scope.c
@@ -175,6 +175,9 @@ static int message_add_commands(sd_bus_message *m, const char *exec_type, char *
}
void socket_service_pair_done(SocketServicePair *p) {
+ assert(p);
+
+ p->exec_start_pre = strv_free(p->exec_start_pre);
p->exec_start = strv_free(p->exec_start);
p->exec_stop_post = strv_free(p->exec_stop_post);
p->unit_name_prefix = mfree(p->unit_name_prefix);
@@ -268,6 +271,12 @@ int start_socket_service_pair(sd_bus *bus, const char *scope, SocketServicePair
return bus_log_create_error(r);
}
+ if (p->exec_start_pre) {
+ r = message_add_commands(m, "ExecStartPre", &p->exec_start_pre, 1);
+ if (r < 0)
+ return r;
+ }
+
r = message_add_commands(m, "ExecStart", &p->exec_start, 1);
if (r < 0)
return r;
diff --git a/src/vmspawn/vmspawn-scope.h b/src/vmspawn/vmspawn-scope.h
index b807c3b203..74c75117f0 100644
--- a/src/vmspawn/vmspawn-scope.h
+++ b/src/vmspawn/vmspawn-scope.h
@@ -8,6 +8,7 @@
#include "macro.h"
typedef struct SocketServicePair {
+ char **exec_start_pre;
char **exec_start;
char **exec_stop_post;
char *unit_name_prefix;
diff --git a/src/vmspawn/vmspawn-settings.c b/src/vmspawn/vmspawn-settings.c
index cb1a463781..780df553aa 100644
--- a/src/vmspawn/vmspawn-settings.c
+++ b/src/vmspawn/vmspawn-settings.c
@@ -1,3 +1,13 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include "string-table.h"
#include "vmspawn-settings.h"
+
+static const char *const console_mode_table[_CONSOLE_MODE_MAX] = {
+ [CONSOLE_INTERACTIVE] = "interactive",
+ [CONSOLE_READ_ONLY] = "read-only",
+ [CONSOLE_NATIVE] = "native",
+ [CONSOLE_GUI] = "gui",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(console_mode, ConsoleMode);
diff --git a/src/vmspawn/vmspawn-settings.h b/src/vmspawn/vmspawn-settings.h
index 60ea10e6de..5446c20911 100644
--- a/src/vmspawn/vmspawn-settings.h
+++ b/src/vmspawn/vmspawn-settings.h
@@ -1,12 +1,28 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include <errno.h>
#include <stdint.h>
+#include "macro.h"
+
+typedef enum ConsoleMode {
+ CONSOLE_INTERACTIVE, /* ptyfwd */
+ CONSOLE_READ_ONLY, /* ptyfwd, but in read-only mode */
+ CONSOLE_NATIVE, /* qemu's native TTY handling */
+ CONSOLE_GUI, /* qemu's graphical UI */
+ _CONSOLE_MODE_MAX,
+ _CONSOLE_MODE_INVALID = -EINVAL,
+} ConsoleMode;
+
typedef enum SettingsMask {
SETTING_START_MODE = UINT64_C(1) << 0,
+ SETTING_MACHINE_ID = UINT64_C(1) << 6,
SETTING_BIND_MOUNTS = UINT64_C(1) << 11,
SETTING_DIRECTORY = UINT64_C(1) << 26,
SETTING_CREDENTIALS = UINT64_C(1) << 30,
_SETTING_FORCE_ENUM_WIDTH = UINT64_MAX
} SettingsMask;
+
+const char *console_mode_to_string(ConsoleMode m) _const_;
+ConsoleMode console_mode_from_string(const char *s) _pure_;
diff --git a/src/vmspawn/vmspawn-util.c b/src/vmspawn/vmspawn-util.c
index 42c7bbfac6..a98040a213 100644
--- a/src/vmspawn/vmspawn-util.c
+++ b/src/vmspawn/vmspawn-util.c
@@ -7,6 +7,7 @@
#include "architecture.h"
#include "conf-files.h"
#include "errno-util.h"
+#include "escape.h"
#include "fd-util.h"
#include "fileio.h"
#include "json.h"
@@ -36,7 +37,7 @@ OvmfConfig* ovmf_config_free(OvmfConfig *config) {
return mfree(config);
}
-DEFINE_STRING_TABLE_LOOKUP(qemu_network_stack, QemuNetworkStack);
+DEFINE_STRING_TABLE_LOOKUP(network_stack, NetworkStack);
int qemu_check_kvm_support(void) {
if (access("/dev/kvm", F_OK) >= 0)
@@ -433,3 +434,36 @@ int vsock_fix_child_cid(int vhost_device_fd, unsigned *machine_cid, const char *
return log_debug_errno(SYNTHETIC_ERRNO(EADDRNOTAVAIL), "Failed to assign a CID to the guest vsock");
}
+
+char* escape_qemu_value(const char *s) {
+ const char *f;
+ char *e, *t;
+ size_t n;
+
+ assert(s);
+
+ /* QEMU requires that commas in arguments be escaped by doubling up the commas.
+ * See https://www.qemu.org/docs/master/system/qemu-manpage.html#options
+ * for more information.
+ *
+ * This function performs this escaping, returning an allocated string with the escaped value, or NULL if allocation failed. */
+
+ n = strlen(s);
+
+ if (n > (SIZE_MAX - 1) / 2)
+ return NULL;
+
+ e = new(char, n*2 + 1);
+ if (!e)
+ return NULL;
+
+ for (f = s, t = e; f < s + n; f++) {
+ *t++ = *f;
+ if (*f == ',')
+ *t++ = ',';
+ }
+
+ *t = 0;
+
+ return e;
+}
diff --git a/src/vmspawn/vmspawn-util.h b/src/vmspawn/vmspawn-util.h
index 90cb97ec00..cd1f91d032 100644
--- a/src/vmspawn/vmspawn-util.h
+++ b/src/vmspawn/vmspawn-util.h
@@ -63,22 +63,22 @@ static inline const char *ovmf_config_vars_format(const OvmfConfig *c) {
OvmfConfig* ovmf_config_free(OvmfConfig *ovmf_config);
DEFINE_TRIVIAL_CLEANUP_FUNC(OvmfConfig*, ovmf_config_free);
-typedef enum QemuNetworkStack {
- QEMU_NET_TAP,
- QEMU_NET_USER,
- QEMU_NET_NONE,
- _QEMU_NET_MAX,
- _QEMU_NET_INVALID = -EINVAL,
-} QemuNetworkStack;
+typedef enum NetworkStack {
+ NETWORK_STACK_TAP,
+ NETWORK_STACK_USER,
+ NETWORK_STACK_NONE,
+ _NETWORK_STACK_MAX,
+ _NETWORK_STACK_INVALID = -EINVAL,
+} NetworkStack;
-static const char* const qemu_network_stack_table[_QEMU_NET_MAX] = {
- [QEMU_NET_TAP] = "tap",
- [QEMU_NET_USER] = "user",
- [QEMU_NET_NONE] = "none",
+static const char* const network_stack_table[_NETWORK_STACK_MAX] = {
+ [NETWORK_STACK_TAP] = "tap",
+ [NETWORK_STACK_USER] = "user",
+ [NETWORK_STACK_NONE] = "none",
};
-const char* qemu_network_stack_to_string(QemuNetworkStack type) _const_;
-QemuNetworkStack qemu_network_stack_from_string(const char *s) _pure_;
+const char* network_stack_to_string(NetworkStack type) _const_;
+NetworkStack network_stack_from_string(const char *s) _pure_;
int qemu_check_kvm_support(void);
int qemu_check_vsock_support(void);
@@ -87,3 +87,5 @@ int load_ovmf_config(const char *path, OvmfConfig **ret);
int find_ovmf_config(int search_sb, OvmfConfig **ret);
int find_qemu_binary(char **ret_qemu_binary);
int vsock_fix_child_cid(int vsock_fd, unsigned *machine_cid, const char *machine);
+
+char* escape_qemu_value(const char *s);
diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c
index 07ea2abd3a..6197f00a3c 100644
--- a/src/vmspawn/vmspawn.c
+++ b/src/vmspawn/vmspawn.c
@@ -46,6 +46,7 @@
#include "path-util.h"
#include "pretty-print.h"
#include "process-util.h"
+#include "ptyfwd.h"
#include "random-util.h"
#include "rm-rf.h"
#include "signal-util.h"
@@ -56,6 +57,7 @@
#include "tmpfile-util.h"
#include "unit-name.h"
#include "vmspawn-mount.h"
+#include "vmspawn-register.h"
#include "vmspawn-scope.h"
#include "vmspawn-settings.h"
#include "vmspawn-util.h"
@@ -65,16 +67,16 @@ static PagerFlags arg_pager_flags = 0;
static char *arg_directory = NULL;
static char *arg_image = NULL;
static char *arg_machine = NULL;
-static char *arg_qemu_smp = NULL;
-static uint64_t arg_qemu_mem = UINT64_C(2) * U64_GB;
-static int arg_qemu_kvm = -1;
-static int arg_qemu_vsock = -1;
+static char *arg_cpus = NULL;
+static uint64_t arg_ram = UINT64_C(2) * U64_GB;
+static int arg_kvm = -1;
+static int arg_vsock = -1;
static unsigned arg_vsock_cid = VMADDR_CID_ANY;
static int arg_tpm = -1;
static char *arg_linux = NULL;
static char **arg_initrds = NULL;
-static bool arg_qemu_gui = false;
-static QemuNetworkStack arg_network_stack = QEMU_NET_NONE;
+static ConsoleMode arg_console_mode = CONSOLE_INTERACTIVE;
+static NetworkStack arg_network_stack = NETWORK_STACK_NONE;
static int arg_secure_boot = -1;
static MachineCredentialContext arg_credentials = {};
static uid_t arg_uid_shift = UID_INVALID, arg_uid_range = 0x10000U;
@@ -85,12 +87,16 @@ static char *arg_runtime_directory = NULL;
static char *arg_forward_journal = NULL;
static bool arg_runtime_directory_created = false;
static bool arg_privileged = false;
+static bool arg_register = false;
+static sd_id128_t arg_uuid = {};
static char **arg_kernel_cmdline_extra = NULL;
+static char **arg_extra_drives = NULL;
+static char *arg_background = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_directory, freep);
STATIC_DESTRUCTOR_REGISTER(arg_image, freep);
STATIC_DESTRUCTOR_REGISTER(arg_machine, freep);
-STATIC_DESTRUCTOR_REGISTER(arg_qemu_smp, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_cpus, freep);
STATIC_DESTRUCTOR_REGISTER(arg_runtime_directory, freep);
STATIC_DESTRUCTOR_REGISTER(arg_credentials, machine_credential_context_done);
STATIC_DESTRUCTOR_REGISTER(arg_firmware, freep);
@@ -99,6 +105,8 @@ STATIC_DESTRUCTOR_REGISTER(arg_initrds, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_runtime_mounts, runtime_mount_context_done);
STATIC_DESTRUCTOR_REGISTER(arg_forward_journal, freep);
STATIC_DESTRUCTOR_REGISTER(arg_kernel_cmdline_extra, strv_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_extra_drives, strv_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_background, freep);
static int help(void) {
_cleanup_free_ char *link = NULL;
@@ -120,21 +128,23 @@ static int help(void) {
" -D --directory=PATH Root directory for the VM\n"
" -i --image=FILE|DEVICE Root file system disk image or device for the VM\n"
"\n%3$sHost Configuration:%4$s\n"
- " --qemu-smp=SMP Configure guest's SMP settings\n"
- " --qemu-mem=MEM Configure guest's RAM size\n"
- " --qemu-kvm=BOOL Enable use of KVM\n"
- " --qemu-vsock=BOOL Override autodetection of VSock support in QEMU\n"
- " --vsock-cid=CID Specify the CID to use for the qemu guest's VSock\n"
+ " --cpus=CPUS Configure number of CPUs in guest\n"
+ " --ram=BYTES Configure guest's RAM size\n"
+ " --kvm=BOOL Enable use of KVM\n"
+ " --vsock=BOOL Override autodetection of VSOCK support\n"
+ " --vsock-cid=CID Specify the CID to use for the guest's VSOCK support\n"
" --tpm=BOOL Enable use of a virtual TPM\n"
" --linux=PATH Specify the linux kernel for direct kernel boot\n"
" --initrd=PATH Specify the initrd for direct kernel boot\n"
- " --qemu-gui Start QEMU in graphical mode\n"
- " -n --network-tap Create a TAP device for networking with QEMU\n"
- " --network-user-mode Use user mode networking with QEMU\n"
+ " -n --network-tap Create a TAP device for networking\n"
+ " --network-user-mode Use user mode networking\n"
" --secure-boot=BOOL Enable searching for firmware supporting SecureBoot\n"
" --firmware=PATH|list Select firmware definition file (or list available)\n"
"\n%3$sSystem Identity:%4$s\n"
" -M --machine=NAME Set the machine name for the VM\n"
+ " --uuid=UUID Set a specific machine UUID for the VM\n"
+ "\n%3$sProperties:%4$s\n"
+ " --register=BOOLEAN Register VM with systemd-machined\n"
"\n%3$sUser Namespacing:%4$s\n"
" --private-users=UIDBASE[:NUIDS]\n"
" Configure the UID/GID range to map into the\n"
@@ -144,9 +154,13 @@ static int help(void) {
" Mount a file or directory from the host into the VM\n"
" --bind-ro=SOURCE[:TARGET]\n"
" Mount a file or directory, but read-only\n"
+ " --extra-drive=PATH Adds an additional disk to the virtual machine\n"
"\n%3$sIntegration:%4$s\n"
" --forward-journal=FILE|DIR\n"
" Forward the VM's journal to the host\n"
+ "\n%3$sInput/Output:%4$s\n"
+ " --console=MODE Console mode (interactive, native, gui)\n"
+ " --background=COLOR Set ANSI color for background\n"
"\n%3$sCredentials:%4$s\n"
" --set-credential=ID:VALUE\n"
" Pass a credential with literal value to the VM\n"
@@ -168,24 +182,29 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_VERSION = 0x100,
ARG_NO_PAGER,
- ARG_QEMU_SMP,
- ARG_QEMU_MEM,
- ARG_QEMU_KVM,
- ARG_QEMU_VSOCK,
+ ARG_CPUS,
+ ARG_RAM,
+ ARG_KVM,
+ ARG_VSOCK,
ARG_VSOCK_CID,
ARG_TPM,
ARG_LINUX,
ARG_INITRD,
ARG_QEMU_GUI,
ARG_NETWORK_USER_MODE,
+ ARG_UUID,
+ ARG_REGISTER,
ARG_BIND,
ARG_BIND_RO,
+ ARG_EXTRA_DRIVE,
ARG_SECURE_BOOT,
ARG_PRIVATE_USERS,
ARG_FORWARD_JOURNAL,
ARG_SET_CREDENTIAL,
ARG_LOAD_CREDENTIAL,
ARG_FIRMWARE,
+ ARG_CONSOLE,
+ ARG_BACKGROUND,
};
static const struct option options[] = {
@@ -196,25 +215,34 @@ static int parse_argv(int argc, char *argv[]) {
{ "image", required_argument, NULL, 'i' },
{ "directory", required_argument, NULL, 'D' },
{ "machine", required_argument, NULL, 'M' },
- { "qemu-smp", required_argument, NULL, ARG_QEMU_SMP },
- { "qemu-mem", required_argument, NULL, ARG_QEMU_MEM },
- { "qemu-kvm", required_argument, NULL, ARG_QEMU_KVM },
- { "qemu-vsock", required_argument, NULL, ARG_QEMU_VSOCK },
+ { "cpus", required_argument, NULL, ARG_CPUS },
+ { "qemu-smp", required_argument, NULL, ARG_CPUS }, /* Compat alias */
+ { "ram", required_argument, NULL, ARG_RAM },
+ { "qemu-mem", required_argument, NULL, ARG_RAM }, /* Compat alias */
+ { "kvm", required_argument, NULL, ARG_KVM },
+ { "qemu-kvm", required_argument, NULL, ARG_KVM }, /* Compat alias */
+ { "vsock", required_argument, NULL, ARG_VSOCK },
+ { "qemu-vsock", required_argument, NULL, ARG_VSOCK }, /* Compat alias */
{ "vsock-cid", required_argument, NULL, ARG_VSOCK_CID },
{ "tpm", required_argument, NULL, ARG_TPM },
{ "linux", required_argument, NULL, ARG_LINUX },
{ "initrd", required_argument, NULL, ARG_INITRD },
- { "qemu-gui", no_argument, NULL, ARG_QEMU_GUI },
+ { "console", required_argument, NULL, ARG_CONSOLE },
+ { "qemu-gui", no_argument, NULL, ARG_QEMU_GUI }, /* compat option */
{ "network-tap", no_argument, NULL, 'n' },
{ "network-user-mode", no_argument, NULL, ARG_NETWORK_USER_MODE },
+ { "uuid", required_argument, NULL, ARG_UUID },
+ { "register", required_argument, NULL, ARG_REGISTER },
{ "bind", required_argument, NULL, ARG_BIND },
{ "bind-ro", required_argument, NULL, ARG_BIND_RO },
+ { "extra-drive", required_argument, NULL, ARG_EXTRA_DRIVE },
{ "secure-boot", required_argument, NULL, ARG_SECURE_BOOT },
{ "private-users", required_argument, NULL, ARG_PRIVATE_USERS },
{ "forward-journal", required_argument, NULL, ARG_FORWARD_JOURNAL },
{ "set-credential", required_argument, NULL, ARG_SET_CREDENTIAL },
{ "load-credential", required_argument, NULL, ARG_LOAD_CREDENTIAL },
{ "firmware", required_argument, NULL, ARG_FIRMWARE },
+ { "background", required_argument, NULL, ARG_BACKGROUND },
{}
};
@@ -270,28 +298,28 @@ static int parse_argv(int argc, char *argv[]) {
arg_pager_flags |= PAGER_DISABLE;
break;
- case ARG_QEMU_SMP:
- r = free_and_strdup_warn(&arg_qemu_smp, optarg);
+ case ARG_CPUS:
+ r = free_and_strdup_warn(&arg_cpus, optarg);
if (r < 0)
return r;
break;
- case ARG_QEMU_MEM:
- r = parse_size(optarg, 1024, &arg_qemu_mem);
+ case ARG_RAM:
+ r = parse_size(optarg, 1024, &arg_ram);
if (r < 0)
- return log_error_errno(r, "Failed to parse --qemu-mem=%s: %m", optarg);
+ return log_error_errno(r, "Failed to parse --ram=%s: %m", optarg);
break;
- case ARG_QEMU_KVM:
- r = parse_tristate(optarg, &arg_qemu_kvm);
+ case ARG_KVM:
+ r = parse_tristate(optarg, &arg_kvm);
if (r < 0)
- return log_error_errno(r, "Failed to parse --qemu-kvm=%s: %m", optarg);
+ return log_error_errno(r, "Failed to parse --kvm=%s: %m", optarg);
break;
- case ARG_QEMU_VSOCK:
- r = parse_tristate(optarg, &arg_qemu_vsock);
+ case ARG_VSOCK:
+ r = parse_tristate(optarg, &arg_vsock);
if (r < 0)
- return log_error_errno(r, "Failed to parse --qemu-vsock=%s: %m", optarg);
+ return log_error_errno(r, "Failed to parse --vsock=%s: %m", optarg);
break;
case ARG_VSOCK_CID:
@@ -335,16 +363,43 @@ static int parse_argv(int argc, char *argv[]) {
break;
}
+ case ARG_CONSOLE:
+ arg_console_mode = console_mode_from_string(optarg);
+ if (arg_console_mode < 0)
+ return log_error_errno(arg_console_mode, "Failed to parse specified console mode: %s", optarg);
+
+ break;
+
case ARG_QEMU_GUI:
- arg_qemu_gui = true;
+ arg_console_mode = CONSOLE_GUI;
break;
case 'n':
- arg_network_stack = QEMU_NET_TAP;
+ arg_network_stack = NETWORK_STACK_TAP;
break;
case ARG_NETWORK_USER_MODE:
- arg_network_stack = QEMU_NET_USER;
+ arg_network_stack = NETWORK_STACK_USER;
+ break;
+
+ case ARG_UUID:
+ r = id128_from_string_nonzero(optarg, &arg_uuid);
+ if (r == -ENXIO)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Machine UUID may not be all zeroes.");
+ if (r < 0)
+ return log_error_errno(r, "Invalid UUID: %s", optarg);
+
+ arg_settings_mask |= SETTING_MACHINE_ID;
+ break;
+
+ case ARG_REGISTER:
+ r = parse_boolean(optarg);
+ if (r < 0) {
+ log_error("Failed to parse --register= argument: %s", optarg);
+ return r;
+ }
+
+ arg_register = r;
break;
case ARG_BIND:
@@ -356,6 +411,19 @@ static int parse_argv(int argc, char *argv[]) {
arg_settings_mask |= SETTING_BIND_MOUNTS;
break;
+ case ARG_EXTRA_DRIVE: {
+ _cleanup_free_ char *drive_path = NULL;
+
+ r = parse_path_argument(optarg, /* suppress_root= */ false, &drive_path);
+ if (r < 0)
+ return r;
+
+ r = strv_consume(&arg_extra_drives, TAKE_PTR(drive_path));
+ if (r < 0)
+ return log_oom();
+ break;
+ }
+
case ARG_SECURE_BOOT:
r = parse_tristate(optarg, &arg_secure_boot);
if (r < 0)
@@ -416,6 +484,12 @@ static int parse_argv(int argc, char *argv[]) {
break;
+ case ARG_BACKGROUND:
+ r = free_and_strdup_warn(&arg_background, optarg);
+ if (r < 0)
+ return r;
+ break;
+
case '?':
return -EINVAL;
@@ -449,11 +523,11 @@ static int open_vsock(void) {
r = bind(vsock_fd, &bind_addr.sa, sizeof(bind_addr.vm));
if (r < 0)
- return log_error_errno(errno, "Failed to bind to vsock to address %u:%u: %m", bind_addr.vm.svm_cid, bind_addr.vm.svm_port);
+ return log_error_errno(errno, "Failed to bind to VSOCK address %u:%u: %m", bind_addr.vm.svm_cid, bind_addr.vm.svm_port);
r = listen(vsock_fd, SOMAXCONN_DELUXE);
if (r < 0)
- return log_error_errno(errno, "Failed to listen on vsock: %m");
+ return log_error_errno(errno, "Failed to listen on VSOCK: %m");
return TAKE_FD(vsock_fd);
}
@@ -527,13 +601,13 @@ static int vmspawn_dispatch_vsock_connections(sd_event_source *source, int fd, u
assert(userdata);
if (revents != EPOLLIN) {
- log_warning("Got unexpected poll event for vsock fd.");
+ log_warning("Got unexpected poll event for VSOCK fd.");
return 0;
}
conn_fd = accept4(fd, NULL, NULL, SOCK_CLOEXEC|SOCK_NONBLOCK);
if (conn_fd < 0) {
- log_warning_errno(errno, "Failed to accept connection from vsock fd (%m), ignoring...");
+ log_warning_errno(errno, "Failed to accept connection from VSOCK fd (%m), ignoring...");
return 0;
}
@@ -617,7 +691,12 @@ static int cmdline_add_vsock(char ***cmdline, int vsock_fd) {
return 0;
}
-static int start_tpm(sd_bus *bus, const char *scope, const char *tpm, const char **ret_state_tempdir) {
+static int start_tpm(
+ sd_bus *bus,
+ const char *scope,
+ const char *swtpm,
+ char **ret_state_tempdir) {
+
_cleanup_(rm_rf_physical_and_freep) char *state_dir = NULL;
_cleanup_free_ char *scope_prefix = NULL;
_cleanup_(socket_service_pair_done) SocketServicePair ssp = {
@@ -627,7 +706,7 @@ static int start_tpm(sd_bus *bus, const char *scope, const char *tpm, const char
assert(bus);
assert(scope);
- assert(tpm);
+ assert(swtpm);
assert(ret_state_tempdir);
r = unit_name_to_prefix(scope, &scope_prefix);
@@ -652,7 +731,16 @@ static int start_tpm(sd_bus *bus, const char *scope, const char *tpm, const char
if (!ssp.listen_address)
return log_oom();
- ssp.exec_start = strv_new(tpm, "socket", "--tpm2", "--tpmstate");
+ _cleanup_free_ char *swtpm_setup = NULL;
+ r = find_executable("swtpm_setup", &swtpm_setup);
+ if (r < 0)
+ return log_error_errno(r, "Failed to find swtpm_setup binary: %m");
+
+ ssp.exec_start_pre = strv_new(swtpm_setup, "--tpm-state", state_dir, "--tpm2", "--pcr-banks", "sha256");
+ if (!ssp.exec_start_pre)
+ return log_oom();
+
+ ssp.exec_start = strv_new(swtpm, "socket", "--tpm2", "--tpmstate");
if (!ssp.exec_start)
return log_oom();
@@ -669,7 +757,6 @@ static int start_tpm(sd_bus *bus, const char *scope, const char *tpm, const char
return r;
*ret_state_tempdir = TAKE_PTR(state_dir);
-
return 0;
}
@@ -995,6 +1082,25 @@ static int merge_initrds(char **ret) {
return 0;
}
+static void set_window_title(PTYForward *f) {
+ _cleanup_free_ char *hn = NULL, *dot = NULL;
+
+ assert(f);
+
+ (void) gethostname_strict(&hn);
+
+ if (emoji_enabled())
+ dot = strjoin(special_glyph(SPECIAL_GLYPH_GREEN_CIRCLE), " ");
+
+ if (hn)
+ (void) pty_forward_set_titlef(f, "%sVirtual Machine %s on %s", strempty(dot), arg_machine, hn);
+ else
+ (void) pty_forward_set_titlef(f, "%sVirtual Machine %s", strempty(dot), arg_machine);
+
+ if (dot)
+ (void) pty_forward_set_title_prefix(f, dot);
+}
+
static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
_cleanup_(ovmf_config_freep) OvmfConfig *ovmf_config = NULL;
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
@@ -1017,8 +1123,14 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (r < 0)
return r;
- bool use_kvm = arg_qemu_kvm > 0;
- if (arg_qemu_kvm < 0) {
+ if (arg_register) {
+ r = register_machine(bus, arg_machine, arg_uuid, trans_scope, arg_directory);
+ if (r < 0)
+ return r;
+ }
+
+ bool use_kvm = arg_kvm > 0;
+ if (arg_kvm < 0) {
r = qemu_check_kvm_support();
if (r < 0)
return log_error_errno(r, "Failed to check for KVM support: %m");
@@ -1064,13 +1176,13 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (r < 0)
return log_error_errno(r, "Failed to find QEMU binary: %m");
- if (asprintf(&mem, "%" PRIu64 "M", DIV_ROUND_UP(arg_qemu_mem, U64_MB)) < 0)
+ if (asprintf(&mem, "%" PRIu64 "M", DIV_ROUND_UP(arg_ram, U64_MB)) < 0)
return log_oom();
cmdline = strv_new(
qemu_binary,
"-machine", machine,
- "-smp", arg_qemu_smp ?: "1",
+ "-smp", arg_cpus ?: "1",
"-m", mem,
"-object", "rng-random,filename=/dev/urandom,id=rng0",
"-device", "virtio-rng-pci,rng=rng0,id=rng-device0"
@@ -1078,6 +1190,10 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (!cmdline)
return log_oom();
+ if (!sd_id128_is_null(arg_uuid))
+ if (strv_extend_many(&cmdline, "-uuid", SD_ID128_TO_UUID_STRING(arg_uuid)) < 0)
+ return log_oom();
+
/* if we are going to be starting any units with state then create our runtime dir */
if (arg_tpm != 0 || arg_directory || arg_runtime_mounts.n_mounts != 0) {
r = runtime_directory(&arg_runtime_directory, arg_privileged ? RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER, "systemd/vmspawn");
@@ -1092,9 +1208,9 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
}
}
- if (arg_network_stack == QEMU_NET_TAP)
+ if (arg_network_stack == NETWORK_STACK_TAP)
r = strv_extend_many(&cmdline, "-nic", "tap,script=no,model=virtio-net-pci");
- else if (arg_network_stack == QEMU_NET_USER)
+ else if (arg_network_stack == NETWORK_STACK_USER)
r = strv_extend_many(&cmdline, "-nic", "user,model=virtio-net-pci");
else
r = strv_extend_many(&cmdline, "-nic", "none");
@@ -1112,11 +1228,11 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
return log_oom();
}
- bool use_vsock = arg_qemu_vsock > 0 && ARCHITECTURE_SUPPORTS_SMBIOS;
- if (arg_qemu_vsock < 0) {
+ bool use_vsock = arg_vsock > 0 && ARCHITECTURE_SUPPORTS_SMBIOS;
+ if (arg_vsock < 0) {
r = qemu_check_vsock_support();
if (r < 0)
- return log_error_errno(r, "Failed to check for VSock support: %m");
+ return log_error_errno(r, "Failed to check for VSOCK support: %m");
use_vsock = r;
}
@@ -1167,7 +1283,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
r = vsock_fix_child_cid(device_fd, &child_cid, arg_machine);
if (r < 0)
- return log_error_errno(r, "Failed to fix CID for the guest vsock socket: %m");
+ return log_error_errno(r, "Failed to fix CID for the guest VSOCK socket: %m");
r = strv_extend(&cmdline, "-device");
if (r < 0)
@@ -1187,12 +1303,54 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (r < 0)
return log_oom();
- if (arg_qemu_gui)
+ _cleanup_close_ int master = -EBADF;
+ PTYForwardFlags ptyfwd_flags = 0;
+ switch (arg_console_mode) {
+
+ case CONSOLE_READ_ONLY:
+ ptyfwd_flags |= PTY_FORWARD_READ_ONLY;
+
+ _fallthrough_;
+
+ case CONSOLE_INTERACTIVE: {
+ _cleanup_free_ char *pty_path = NULL;
+
+ master = posix_openpt(O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
+ if (master < 0)
+ return log_error_errno(errno, "Failed to acquire pseudo tty: %m");
+
+ r = ptsname_malloc(master, &pty_path);
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine tty name: %m");
+
+ if (unlockpt(master) < 0)
+ return log_error_errno(errno, "Failed to unlock tty: %m");
+
+ if (strv_extend_many(
+ &cmdline,
+ "-nographic",
+ "-nodefaults",
+ "-chardev") < 0)
+ return log_oom();
+
+ if (strv_extendf(&cmdline,
+ "serial,id=console,path=%s", pty_path) < 0)
+ return log_oom();
+
+ r = strv_extend_many(
+ &cmdline,
+ "-serial", "chardev:console");
+ break;
+ }
+
+ case CONSOLE_GUI:
r = strv_extend_many(
&cmdline,
"-vga",
"virtio");
- else
+ break;
+
+ case CONSOLE_NATIVE:
r = strv_extend_many(
&cmdline,
"-nographic",
@@ -1200,6 +1358,11 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
"-chardev", "stdio,mux=on,id=console,signal=off",
"-serial", "chardev:console",
"-mon", "console");
+ break;
+
+ default:
+ assert_not_reached();
+ }
if (r < 0)
return log_oom();
@@ -1207,13 +1370,18 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "if=pflash,format=%s,readonly=on,file=%s", ovmf_config_format(ovmf_config), ovmf_config->path);
+ _cleanup_free_ char *escaped_ovmf_config_path = escape_qemu_value(ovmf_config->path);
+ if (!escaped_ovmf_config_path)
+ return log_oom();
+
+ r = strv_extendf(&cmdline, "if=pflash,format=%s,readonly=on,file=%s", ovmf_config_format(ovmf_config), escaped_ovmf_config_path);
if (r < 0)
return log_oom();
_cleanup_(unlink_and_freep) char *ovmf_vars_to = NULL;
if (ovmf_config->supports_sb) {
const char *ovmf_vars_from = ovmf_config->vars;
+ _cleanup_free_ char *escaped_ovmf_vars_to = NULL;
_cleanup_close_ int source_fd = -EBADF, target_fd = -EBADF;
r = tempfn_random_child(NULL, "vmspawn-", &ovmf_vars_to);
@@ -1245,7 +1413,27 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "file=%s,if=pflash,format=%s", ovmf_vars_to, ovmf_config_format(ovmf_config));
+ escaped_ovmf_vars_to = escape_qemu_value(ovmf_vars_to);
+ if (!escaped_ovmf_vars_to)
+ return log_oom();
+
+ r = strv_extendf(&cmdline, "file=%s,if=pflash,format=%s", escaped_ovmf_vars_to, ovmf_config_format(ovmf_config));
+ if (r < 0)
+ return log_oom();
+ }
+
+ STRV_FOREACH(drive, arg_extra_drives) {
+ _cleanup_free_ char *escaped_drive = NULL;
+
+ r = strv_extend(&cmdline, "-drive");
+ if (r < 0)
+ return log_oom();
+
+ escaped_drive = escape_qemu_value(*drive);
+ if (!escaped_drive)
+ return log_oom();
+
+ r = strv_extendf(&cmdline, "format=raw,cache=unsafe,file=%s", escaped_drive);
if (r < 0)
return log_oom();
}
@@ -1265,13 +1453,19 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
}
if (arg_image) {
+ _cleanup_free_ char *escaped_image = NULL;
+
assert(!arg_directory);
r = strv_extend(&cmdline, "-drive");
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "if=none,id=mkosi,file=%s,format=raw", arg_image);
+ escaped_image = escape_qemu_value(arg_image);
+ if (!escaped_image)
+ log_oom();
+
+ r = strv_extendf(&cmdline, "if=none,id=mkosi,file=%s,format=raw", escaped_image);
if (r < 0)
return log_oom();
@@ -1283,16 +1477,21 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
}
if (arg_directory) {
- _cleanup_free_ char *sock_path = NULL, *sock_name = NULL;
+ _cleanup_free_ char *sock_path = NULL, *sock_name = NULL, *escaped_sock_path = NULL;
+
r = start_virtiofsd(bus, trans_scope, arg_directory, /* uidmap= */ true, &sock_path, &sock_name);
if (r < 0)
return r;
+ escaped_sock_path = escape_qemu_value(sock_path);
+ if (!escaped_sock_path)
+ log_oom();
+
r = strv_extend(&cmdline, "-chardev");
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "socket,id=%1$s,path=%2$s/%1$s", sock_name, sock_path);
+ r = strv_extendf(&cmdline, "socket,id=%1$s,path=%2$s/%1$s", sock_name, escaped_sock_path);
if (r < 0)
return log_oom();
@@ -1314,16 +1513,20 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
return log_oom();
FOREACH_ARRAY(mount, arg_runtime_mounts.mounts, arg_runtime_mounts.n_mounts) {
- _cleanup_free_ char *sock_path = NULL, *sock_name = NULL, *clean_target = NULL;
+ _cleanup_free_ char *sock_path = NULL, *sock_name = NULL, *clean_target = NULL, *escaped_sock_path = NULL;
r = start_virtiofsd(bus, trans_scope, mount->source, /* uidmap= */ false, &sock_path, &sock_name);
if (r < 0)
return r;
+ escaped_sock_path = escape_qemu_value(sock_path);
+ if (!escaped_sock_path)
+ log_oom();
+
r = strv_extend(&cmdline, "-chardev");
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "socket,id=%1$s,path=%2$s/%1$s", sock_name, sock_path);
+ r = strv_extendf(&cmdline, "socket,id=%1$s,path=%2$s/%1$s", sock_name, escaped_sock_path);
if (r < 0)
return log_oom();
@@ -1346,7 +1549,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
}
if (ARCHITECTURE_SUPPORTS_SMBIOS) {
- _cleanup_free_ char *kcl = strv_join(arg_kernel_cmdline_extra, " ");
+ _cleanup_free_ char *kcl = strv_join(arg_kernel_cmdline_extra, " "), *escaped_kcl = NULL;
if (!kcl)
return log_oom();
@@ -1356,11 +1559,15 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
return log_oom();
} else {
if (ARCHITECTURE_SUPPORTS_SMBIOS) {
+ escaped_kcl = escape_qemu_value(kcl);
+ if (!escaped_kcl)
+ log_oom();
+
r = strv_extend(&cmdline, "-smbios");
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "type=11,value=io.systemd.stub.kernel-cmdline-extra=%s", kcl);
+ r = strv_extendf(&cmdline, "type=11,value=io.systemd.stub.kernel-cmdline-extra=%s", escaped_kcl);
if (r < 0)
return log_oom();
} else
@@ -1391,7 +1598,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
}
}
- _cleanup_free_ const char *tpm_state_tempdir = NULL;
+ _cleanup_free_ char *tpm_state_tempdir = NULL;
if (swtpm) {
r = start_tpm(bus, trans_scope, swtpm, &tpm_state_tempdir);
if (r < 0) {
@@ -1400,12 +1607,20 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
return log_error_errno(r, "Failed to start tpm: %m");
log_debug_errno(r, "Failed to start tpm, ignoring: %m");
}
+ }
+
+ if (tpm_state_tempdir) {
+ _cleanup_free_ char *escaped_state_dir = NULL;
+
+ escaped_state_dir = escape_qemu_value(tpm_state_tempdir);
+ if (!escaped_state_dir)
+ log_oom();
r = strv_extend(&cmdline, "-chardev");
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "socket,id=chrtpm,path=%s/sock", tpm_state_tempdir);
+ r = strv_extendf(&cmdline, "socket,id=chrtpm,path=%s/sock", escaped_state_dir);
if (r < 0)
return log_oom();
@@ -1481,13 +1696,13 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (use_vsock) {
notify_sock_fd = open_vsock();
if (notify_sock_fd < 0)
- return log_error_errno(notify_sock_fd, "Failed to open vsock: %m");
+ return log_error_errno(notify_sock_fd, "Failed to open VSOCK: %m");
r = cmdline_add_vsock(&cmdline, notify_sock_fd);
if (r == -ENOMEM)
return log_oom();
if (r < 0)
- return log_error_errno(r, "Failed to call getsockname on vsock: %m");
+ return log_error_errno(r, "Failed to call getsockname on VSOCK: %m");
}
if (DEBUG_LOGGING) {
@@ -1498,7 +1713,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
log_debug("Executing: %s", joined);
}
- assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
+ assert_se(sigprocmask_many(SIG_BLOCK, /* old_sigset=*/ NULL, SIGCHLD, SIGWINCH) >= 0);
_cleanup_(sd_event_source_unrefp) sd_event_source *notify_event_source = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
@@ -1538,7 +1753,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
if (use_vsock) {
r = setup_notify_parent(event, notify_sock_fd, &exit_status, &notify_event_source);
if (r < 0)
- return log_error_errno(r, "Failed to setup event loop to handle vsock notify events: %m");
+ return log_error_errno(r, "Failed to setup event loop to handle VSOCK notify events: %m");
}
/* shutdown qemu when we are shutdown */
@@ -1550,13 +1765,36 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
/* Exit when the child exits */
(void) event_add_child_pidref(event, NULL, &child_pidref, WEXITED, on_child_exit, NULL);
+ _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
+ if (master >= 0) {
+ r = pty_forward_new(event, master, ptyfwd_flags, &forward);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create PTY forwarder: %m");
+
+ if (!arg_background) {
+ _cleanup_free_ char *bg = NULL;
+
+ r = terminal_tint_color(130 /* green */, &bg);
+ if (r < 0)
+ log_debug_errno(r, "Failed to determine terminal background color, not tinting.");
+ else
+ (void) pty_forward_set_background_color(forward, bg);
+ } else if (!isempty(arg_background))
+ (void) pty_forward_set_background_color(forward, arg_background);
+
+ set_window_title(forward);
+ }
+
r = sd_event_loop(event);
if (r < 0)
return log_error_errno(r, "Failed to run event loop: %m");
+ if (arg_register)
+ (void) unregister_machine(bus, arg_machine);
+
if (use_vsock) {
if (exit_status == INT_MAX) {
- log_debug("Couldn't retrieve inner EXIT_STATUS from vsock");
+ log_debug("Couldn't retrieve inner EXIT_STATUS from VSOCK");
return EXIT_SUCCESS;
}
if (exit_status != 0)
@@ -1626,12 +1864,15 @@ static int determine_names(void) {
}
static int verify_arguments(void) {
- if (arg_network_stack == QEMU_NET_TAP && !arg_privileged)
+ if (arg_network_stack == NETWORK_STACK_TAP && !arg_privileged)
return log_error_errno(SYNTHETIC_ERRNO(EPERM), "--network-tap requires root privileges, refusing.");
if (!strv_isempty(arg_initrds) && !arg_linux)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Option --initrd= cannot be used without --linux=.");
+ if (arg_register && !arg_privileged)
+ return log_error_errno(SYNTHETIC_ERRNO(EPERM), "--register= requires root privileges, refusing.");
+
return 0;
}
@@ -1643,6 +1884,9 @@ static int run(int argc, char *argv[]) {
arg_privileged = getuid() == 0;
+ /* don't attempt to register as a machine when running as a user */
+ arg_register = arg_privileged;
+
r = parse_argv(argc, argv);
if (r <= 0)
return r;
@@ -1655,15 +1899,20 @@ static int run(int argc, char *argv[]) {
if (r < 0)
return r;
- if (!arg_quiet) {
+ if (!arg_quiet && arg_console_mode != CONSOLE_GUI) {
_cleanup_free_ char *u = NULL;
const char *vm_path = arg_image ?: arg_directory;
(void) terminal_urlify_path(vm_path, vm_path, &u);
- log_info("%s %sSpawning VM %s on %s.%s\n"
- "%s %sPress %sCtrl-a x%s to kill VM.%s",
- special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), arg_machine, u ?: vm_path, ansi_normal(),
- special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), ansi_highlight(), ansi_grey(), ansi_normal());
+ log_info("%s %sSpawning VM %s on %s.%s",
+ special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), arg_machine, u ?: vm_path, ansi_normal());
+
+ if (arg_console_mode == CONSOLE_INTERACTIVE)
+ log_info("%s %sPress %sCtrl-]%s three times within 1s to kill VM.%s",
+ special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), ansi_highlight(), ansi_grey(), ansi_normal());
+ else if (arg_console_mode == CONSOLE_NATIVE)
+ log_info("%s %sPress %sCtrl-a x%s to kill VM.%s",
+ special_glyph(SPECIAL_GLYPH_LIGHT_SHADE), ansi_grey(), ansi_highlight(), ansi_grey(), ansi_normal());
}
r = sd_listen_fds_with_names(true, &names);
diff --git a/test/README.testsuite b/test/README.testsuite
index 9174e1695f..48c871f5e8 100644
--- a/test/README.testsuite
+++ b/test/README.testsuite
@@ -170,7 +170,18 @@ places:
if jobs are started and running but no status is visible on the PR, then it is
likely that reporting back is not working
-For infrastructure help, reaching out to Canonical via the #ubuntu-devel channel
+The CI job needs a PPA in order to be accepted, and the upstream-systemd-ci/systemd-ci
+PPA is used. Note that this is necessary even when there are no packages to backport,
+but by default a PPA won't have a repository for a release if there are no packages
+built for it. To work around this problem, when a new empty release is needed the
+mark-suite-dirty tool from the https://git.launchpad.net/ubuntu-archive-tools can
+be used to force the PPA to publish an empty repository, for example:
+
+ $ ./mark-suite-dirty -A ppa:upstream-systemd-ci/ubuntu/systemd-ci -s noble
+
+will create an empty 'noble' repository that can be used for 'noble' CI jobs.
+
+For infrastructure help, reaching out to Canonical via the #ubuntu-quality channel
on libera.chat is an effective way to receive support in general.
Manually running a part of the Ubuntu CI test suite
diff --git a/test/TEST-69-SHUTDOWN/test.sh b/test/TEST-69-SHUTDOWN/test.sh
index 8fdbaf81fe..0e12857618 100755
--- a/test/TEST-69-SHUTDOWN/test.sh
+++ b/test/TEST-69-SHUTDOWN/test.sh
@@ -38,6 +38,7 @@ EOF
inst /usr/bin/screen
echo "PS1='screen\$WINDOW # '" >>"$workspace/root/.bashrc"
+ echo "TERM=linux" >>"$workspace/root/.bash_profile"
echo 'startup_message off' >"$workspace/etc/screenrc"
echo 'bell_msg ""' >>"$workspace/etc/screenrc"
}
diff --git a/test/fuzz/fuzz-execute-serialize/initial b/test/fuzz/fuzz-execute-serialize/initial
index 403cf085a4..4d9103c3ab 100644
--- a/test/fuzz/fuzz-execute-serialize/initial
+++ b/test/fuzz/fuzz-execute-serialize/initial
@@ -31,7 +31,6 @@ exec-context-protect-home=
exec-context-protect-system=
exec-context-mount-api-vfs=
exec-context-same-pgrp=
-exec-context-cpu-sched-reset-on-fork=
exec-context-non-blocking=
exec-context-ignore-sigpipe=
exec-context-memory-deny-write-execute=
diff --git a/test/test-functions b/test/test-functions
index f99d177e2f..b99580bfd8 100644
--- a/test/test-functions
+++ b/test/test-functions
@@ -222,7 +222,6 @@ BASICTOOLS=(
rm
rmdir
rmmod
- route
script
sed
seq
diff --git a/test/test-network/conf/21-macvlan.netdev b/test/test-network/conf/21-macvlan.netdev
index fdc81ea6d6..d742f64626 100644
--- a/test/test-network/conf/21-macvlan.netdev
+++ b/test/test-network/conf/21-macvlan.netdev
@@ -3,3 +3,7 @@
Name=macvlan99
Kind=macvlan
MTUBytes=2000
+
+[MACVLAN]
+BroadcastMulticastQueueLength=1234
+BroadcastQueueThreshold=2147483647
diff --git a/test/test-network/conf/24-rps-cpu-disable.link b/test/test-network/conf/24-rps-cpu-disable.link
new file mode 100644
index 0000000000..fb3451ac3c
--- /dev/null
+++ b/test/test-network/conf/24-rps-cpu-disable.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=disable
diff --git a/test/test-network/conf/24-rps-cpu-empty.link b/test/test-network/conf/24-rps-cpu-empty.link
new file mode 100644
index 0000000000..fc1342bb8c
--- /dev/null
+++ b/test/test-network/conf/24-rps-cpu-empty.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=
diff --git a/test/test-network/conf/24-rps-cpu-invalid.link b/test/test-network/conf/24-rps-cpu-invalid.link
new file mode 100644
index 0000000000..76d6713b54
--- /dev/null
+++ b/test/test-network/conf/24-rps-cpu-invalid.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=0 3 8-invalid
diff --git a/test/test-network/conf/25-agent-client-peer.network b/test/test-network/conf/25-agent-client-peer.network
index e31108b341..4d7d758d29 100644
--- a/test/test-network/conf/25-agent-client-peer.network
+++ b/test/test-network/conf/25-agent-client-peer.network
@@ -5,7 +5,7 @@ Name=client-peer
[Network]
Address=192.168.6.2/24
DHCPServer=yes
-IPForward=ipv4
+IPv4Forwarding=yes
IPv6AcceptRA=no
[DHCPServer]
diff --git a/test/test-network/conf/25-agent-client.network b/test/test-network/conf/25-agent-client.network
index cfa7e5a17d..219d40a9b7 100644
--- a/test/test-network/conf/25-agent-client.network
+++ b/test/test-network/conf/25-agent-client.network
@@ -4,5 +4,5 @@ Name=client
[Network]
DHCP=yes
-IPForward=ipv4
+IPv4Forwarding=yes
IPv6AcceptRA=no
diff --git a/test/test-network/conf/25-agent-server-peer.network b/test/test-network/conf/25-agent-server-peer.network
index 1f6fa4b5bb..5e005c79ec 100644
--- a/test/test-network/conf/25-agent-server-peer.network
+++ b/test/test-network/conf/25-agent-server-peer.network
@@ -4,5 +4,5 @@ Name=server-peer
[Network]
Address=192.168.5.2/24
-IPForward=ipv4
+IPv4Forwarding=yes
IPv6AcceptRA=no
diff --git a/test/test-network/conf/25-agent-server.network b/test/test-network/conf/25-agent-server.network
index 905508f55f..0108039e6f 100644
--- a/test/test-network/conf/25-agent-server.network
+++ b/test/test-network/conf/25-agent-server.network
@@ -4,7 +4,7 @@ Name=server
[Network]
Address=192.168.5.1/24
-IPForward=ipv4
+IPv4Forwarding=yes
DHCPServer=yes
IPv6AcceptRA=no
diff --git a/test/test-network/conf/25-bond-property.netdev b/test/test-network/conf/25-bond-property.netdev
index 6e4043fcd6..3954689587 100644
--- a/test/test-network/conf/25-bond-property.netdev
+++ b/test/test-network/conf/25-bond-property.netdev
@@ -7,3 +7,4 @@ Mode=active-backup
PrimaryReselectPolicy=always
MIIMonitorSec=1s
ARPMissedMax=10
+PeerNotifyDelaySec=300s
diff --git a/test/test-network/conf/25-ipv6-proxy-ndp.network b/test/test-network/conf/25-ipv6-proxy-ndp.network
index 81302abf9d..d01a633952 100644
--- a/test/test-network/conf/25-ipv6-proxy-ndp.network
+++ b/test/test-network/conf/25-ipv6-proxy-ndp.network
@@ -9,7 +9,6 @@ IPv6ProxyNDPAddress=2607:5300:203:5215:3::1
IPv6ProxyNDPAddress=2607:5300:203:5215:2::1
IPv6ProxyNDPAddress=2607:5300:203:5215:1::1
IPv6AcceptRA=no
-IPForward=yes
Address=66.70.129.136/32
Address=66.70.129.142/32
Address=66.70.129.143/32
diff --git a/test/test-network/conf/25-rps-cpu-0-1.link b/test/test-network/conf/25-rps-cpu-0-1.link
new file mode 100644
index 0000000000..d026248b39
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-0-1.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=0 1
diff --git a/test/test-network/conf/25-rps-cpu-0-empty.link b/test/test-network/conf/25-rps-cpu-0-empty.link
new file mode 100644
index 0000000000..b25b417f47
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-0-empty.link
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=0
+ReceivePacketSteeringCPUMask=
diff --git a/test/test-network/conf/25-rps-cpu-0-invalid.link b/test/test-network/conf/25-rps-cpu-0-invalid.link
new file mode 100644
index 0000000000..26147a098e
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-0-invalid.link
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=0
+ReceivePacketSteeringCPUMask=invalid
diff --git a/test/test-network/conf/25-rps-cpu-0.link b/test/test-network/conf/25-rps-cpu-0.link
new file mode 100644
index 0000000000..b1f4bc2c20
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-0.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=0
diff --git a/test/test-network/conf/25-rps-cpu-1.link b/test/test-network/conf/25-rps-cpu-1.link
new file mode 100644
index 0000000000..d24d7135df
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-1.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=1
diff --git a/test/test-network/conf/25-rps-cpu-all.link b/test/test-network/conf/25-rps-cpu-all.link
new file mode 100644
index 0000000000..b7a8eda522
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-all.link
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=all
diff --git a/test/test-network/conf/25-rps-cpu-multi.link b/test/test-network/conf/25-rps-cpu-multi.link
new file mode 100644
index 0000000000..d7d4d04268
--- /dev/null
+++ b/test/test-network/conf/25-rps-cpu-multi.link
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+OriginalName=dummy98
+
+[Link]
+ReceivePacketSteeringCPUMask=0 1
+ReceivePacketSteeringCPUMask=2,3
diff --git a/test/test-network/conf/25-sysctl.network b/test/test-network/conf/25-sysctl.network
index ff1ded4ef0..759fe65fe8 100644
--- a/test/test-network/conf/25-sysctl.network
+++ b/test/test-network/conf/25-sysctl.network
@@ -3,7 +3,8 @@
Name=dummy98
[Network]
-IPForward=yes
+IPv4Forwarding=yes
+IPv6Forwarding=yes
IPv6DuplicateAddressDetection=3
IPv6HopLimit=5
IPv4ProxyARP=yes
diff --git a/test/test-network/conf/26-bridge-vlan-master-issue-20373.network b/test/test-network/conf/26-bridge-vlan-master-issue-20373.network
index 7a697571e8..67011ac6c4 100644
--- a/test/test-network/conf/26-bridge-vlan-master-issue-20373.network
+++ b/test/test-network/conf/26-bridge-vlan-master-issue-20373.network
@@ -4,7 +4,6 @@ Name=bridge99
[Network]
VLAN=vlan99
-IPForward=yes
ConfigureWithoutCarrier=yes
LLDP=yes
IPv6AcceptRA=false
diff --git a/test/test-network/conf/26-bridge-vlan-slave-issue-20373.network b/test/test-network/conf/26-bridge-vlan-slave-issue-20373.network
index 876219fca2..bc7c3b0501 100644
--- a/test/test-network/conf/26-bridge-vlan-slave-issue-20373.network
+++ b/test/test-network/conf/26-bridge-vlan-slave-issue-20373.network
@@ -4,7 +4,6 @@ Name=test1
[Network]
IPv6AcceptRA=no
-IPForward=yes
Bridge=bridge99
LinkLocalAddressing=no
EmitLLDP=nearest-bridge
diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py
index 466fa6cbf3..37dc69aafd 100755
--- a/test/test-network/systemd-networkd-tests.py
+++ b/test/test-network/systemd-networkd-tests.py
@@ -283,9 +283,6 @@ def compare_kernel_version(min_kernel_version):
return version.parse(kver) >= version.parse(min_kernel_version)
-def udev_reload():
- check_output(*udevadm_cmd, 'control', '--reload')
-
def copy_network_unit(*units, copy_dropins=True):
"""
Copy networkd unit files into the testbed.
@@ -316,7 +313,7 @@ def copy_network_unit(*units, copy_dropins=True):
has_link = True
if has_link:
- udev_reload()
+ udevadm_reload()
def copy_credential(src, target):
mkdir_p(credstore_dir)
@@ -338,7 +335,7 @@ def remove_network_unit(*units):
has_link = True
if has_link:
- udev_reload()
+ udevadm_reload()
def clear_network_units():
has_link = False
@@ -351,7 +348,7 @@ def clear_network_units():
rm_rf(network_unit_dir)
if has_link:
- udev_reload()
+ udevadm_reload()
def copy_networkd_conf_dropin(*dropins):
"""Copy networkd.conf dropin files into the testbed."""
@@ -798,6 +795,15 @@ def resolvectl(*args):
def timedatectl(*args):
return check_output(*(timedatectl_cmd + list(args)), env=env)
+def udevadm(*args):
+ return check_output(*(udevadm_cmd + list(args)))
+
+def udevadm_reload():
+ udevadm('control', '--reload')
+
+def udevadm_trigger(*args, action='add'):
+ udevadm('trigger', '--settle', f'--action={action}', *args)
+
def setup_common():
print()
@@ -1315,7 +1321,7 @@ class NetworkctlTests(unittest.TestCase, Utilities):
# This test may be run on the system that has older udevd than 70f32a260b5ebb68c19ecadf5d69b3844896ba55 (v249).
# In that case, the udev DB for the loopback network interface may already have ID_NET_LINK_FILE property.
# Let's reprocess the interface and drop the property.
- check_output(*udevadm_cmd, 'trigger', '--settle', '--action=add', '/sys/class/net/lo')
+ udevadm_trigger('/sys/class/net/lo')
output = networkctl_status('lo')
print(output)
self.assertIn('Link File: n/a', output)
@@ -1378,7 +1384,7 @@ class NetworkdMatchTests(unittest.TestCase, Utilities):
check_output('ip link set dev dummy98-1 down')
check_output('ip link set dev dummy98-1 name dummy98-2')
- check_output(*udevadm_cmd, 'trigger', '--action=add', '/sys/class/net/dummy98-2')
+ udevadm_trigger('/sys/class/net/dummy98-2')
self.wait_address('dummy98-2', '10.0.2.2/16', ipv='-4', timeout_sec=10)
self.wait_online('dummy98-2:routable')
@@ -1517,6 +1523,7 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
print(output)
self.check_link_attr('bond97', 'bonding', 'arp_missed_max', '10')
+ self.check_link_attr('bond97', 'bonding', 'peer_notif_delay', '300000')
def test_vlan(self):
copy_network_unit('21-vlan.netdev', '11-dummy.netdev',
@@ -1618,12 +1625,12 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
output = check_output('ip -d link show test1')
print(output)
- self.assertRegex(output, ' mtu 2000 ')
+ self.assertIn(' mtu 2000 ', output)
output = check_output('ip -d link show macvlan99')
print(output)
- self.assertRegex(output, ' mtu 2000 ')
- self.assertRegex(output, 'macvlan mode ' + mode + ' ')
+ self.assertIn(' mtu 2000 ', output)
+ self.assertIn(f' macvlan mode {mode} ', output)
remove_link('test1')
time.sleep(1)
@@ -1634,12 +1641,14 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
output = check_output('ip -d link show test1')
print(output)
- self.assertRegex(output, ' mtu 2000 ')
+ self.assertIn(' mtu 2000 ', output)
output = check_output('ip -d link show macvlan99')
print(output)
- self.assertRegex(output, ' mtu 2000 ')
- self.assertRegex(output, 'macvlan mode ' + mode + ' ')
+ self.assertIn(' mtu 2000 ', output)
+ self.assertIn(f' macvlan mode {mode} ', output)
+ self.assertIn(' bcqueuelen 1234 ', output)
+ self.assertIn(' bclim 2147483647 ', output)
@expectedFailureIfModuleIsNotAvailable('ipvlan')
def test_ipvlan(self):
@@ -2457,6 +2466,111 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
self.wait_online('ifb99:degraded')
+ @unittest.skipUnless(os.cpu_count() >= 2, reason="CPU count should be >= 2 to pass this test")
+ def test_rps_cpu_1(self):
+ copy_network_unit('12-dummy.netdev', '12-dummy.network', '25-rps-cpu-1.link')
+ start_networkd()
+
+ self.wait_online('dummy98:carrier')
+
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 2)
+
+ @unittest.skipUnless(os.cpu_count() >= 2, reason="CPU count should be >= 2 to pass this test")
+ def test_rps_cpu_0_1(self):
+ copy_network_unit('12-dummy.netdev', '12-dummy.network', '25-rps-cpu-0-1.link')
+ start_networkd()
+
+ self.wait_online('dummy98:carrier')
+
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 3)
+
+ @unittest.skipUnless(os.cpu_count() >= 4, reason="CPU count should be >= 4 to pass this test")
+ def test_rps_cpu_multi(self):
+ copy_network_unit('12-dummy.netdev', '12-dummy.network', '25-rps-cpu-multi.link')
+ start_networkd()
+
+ self.wait_online('dummy98:carrier')
+
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 15)
+
+ def test_rps_cpu(self):
+ cpu_count = os.cpu_count()
+
+ copy_network_unit('12-dummy.netdev', '12-dummy.network')
+ start_networkd()
+
+ self.wait_online('dummy98:carrier')
+
+ # 0
+ copy_network_unit('25-rps-cpu-0.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 1)
+ remove_network_unit('25-rps-cpu-0.link')
+
+ # all
+ copy_network_unit('25-rps-cpu-all.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}')
+ remove_network_unit('25-rps-cpu-all.link')
+
+ # disable
+ copy_network_unit('24-rps-cpu-disable.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 0)
+ remove_network_unit('24-rps-cpu-disable.link')
+
+ # set all again
+ copy_network_unit('25-rps-cpu-all.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}')
+ remove_network_unit('25-rps-cpu-all.link')
+
+ # empty -> unchanged
+ copy_network_unit('24-rps-cpu-empty.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}')
+ remove_network_unit('24-rps-cpu-empty.link')
+
+ # 0, then empty -> unchanged
+ copy_network_unit('25-rps-cpu-0-empty.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}')
+ remove_network_unit('25-rps-cpu-0-empty.link')
+
+ # 0, then invalid -> 0
+ copy_network_unit('25-rps-cpu-0-invalid.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 1)
+ remove_network_unit('25-rps-cpu-0-invalid.link')
+
+ # invalid -> unchanged
+ copy_network_unit('24-rps-cpu-invalid.link')
+ udevadm_trigger('/sys/class/net/dummy98')
+ output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus')
+ print(output)
+ self.assertEqual(int(output.replace(',', ''), base=16), 1)
+ remove_network_unit('24-rps-cpu-invalid.link')
+
class NetworkdL2TPTests(unittest.TestCase, Utilities):
def setUp(self):
@@ -5120,8 +5234,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities):
with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f:
f.write('[Link]\nSR-IOVVirtualFunctions=4\n')
- udev_reload()
- check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}')
+ udevadm_reload()
+ udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}')
output = check_output('ip link show dev eni99np1')
print(output)
@@ -5136,8 +5250,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities):
with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f:
f.write('[Link]\nSR-IOVVirtualFunctions=\n')
- udev_reload()
- check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}')
+ udevadm_reload()
+ udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}')
output = check_output('ip link show dev eni99np1')
print(output)
@@ -5152,8 +5266,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities):
with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f:
f.write('[Link]\nSR-IOVVirtualFunctions=2\n')
- udev_reload()
- check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}')
+ udevadm_reload()
+ udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}')
output = check_output('ip link show dev eni99np1')
print(output)
@@ -5168,8 +5282,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities):
with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f:
f.write('[Link]\nSR-IOVVirtualFunctions=\n')
- udev_reload()
- check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}')
+ udevadm_reload()
+ udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}')
output = check_output('ip link show dev eni99np1')
print(output)
@@ -5200,11 +5314,101 @@ class NetworkdLLDPTests(unittest.TestCase, Utilities):
output = networkctl('lldp')
print(output)
- if re.search(r'veth99 .* veth-peer', output):
+ if re.search(r'veth99 .* veth-peer .* .......a...', output):
break
else:
self.fail()
+ # With interface name
+ output = networkctl('lldp', 'veth99');
+ print(output)
+ self.assertRegex(output, r'veth99 .* veth-peer .* .......a...')
+
+ # With interface name pattern
+ output = networkctl('lldp', 've*9');
+ print(output)
+ self.assertRegex(output, r'veth99 .* veth-peer .* .......a...')
+
+ # json format
+ output = networkctl('--json=short', 'lldp')
+ print(output)
+ self.assertIn('"InterfaceName":"veth99"', output)
+ self.assertIn('"PortID":"veth-peer"', output)
+ self.assertIn('"EnabledCapabilities":128', output)
+
+ # json format with interface name
+ output = networkctl('--json=short', 'lldp', 'veth99')
+ print(output)
+ self.assertIn('"InterfaceName":"veth99"', output)
+ self.assertIn('"PortID":"veth-peer"', output)
+ self.assertIn('"EnabledCapabilities":128', output)
+
+ # json format with interface name pattern
+ output = networkctl('--json=short', 'lldp', 've*9')
+ print(output)
+ self.assertIn('"InterfaceName":"veth99"', output)
+ self.assertIn('"PortID":"veth-peer"', output)
+ self.assertIn('"EnabledCapabilities":128', output)
+
+ # LLDP neighbors in status
+ output = networkctl_status('veth99')
+ print(output)
+ self.assertRegex(output, r'Connected To: .* on port veth-peer')
+
+ # enable forwarding, to enable the Router flag
+ with open(os.path.join(network_unit_dir, '23-emit-lldp.network'), mode='a', encoding='utf-8') as f:
+ f.write('[Network]\nIPv4Forwarding=yes\n')
+
+ networkctl_reload()
+ self.wait_online('veth-peer:degraded')
+
+ for trial in range(10):
+ if trial > 0:
+ time.sleep(1)
+
+ output = networkctl('lldp')
+ print(output)
+ if re.search(r'veth99 .* veth-peer .* ....r......', output):
+ break
+ else:
+ self.fail()
+
+ # With interface name
+ output = networkctl('lldp', 'veth99');
+ print(output)
+ self.assertRegex(output, r'veth99 .* veth-peer .* ....r......')
+
+ # With interface name pattern
+ output = networkctl('lldp', 've*9');
+ print(output)
+ self.assertRegex(output, r'veth99 .* veth-peer .* ....r......')
+
+ # json format
+ output = networkctl('--json=short', 'lldp')
+ print(output)
+ self.assertIn('"InterfaceName":"veth99"', output)
+ self.assertIn('"PortID":"veth-peer"', output)
+ self.assertIn('"EnabledCapabilities":16', output)
+
+ # json format with interface name
+ output = networkctl('--json=short', 'lldp', 'veth99')
+ print(output)
+ self.assertIn('"InterfaceName":"veth99"', output)
+ self.assertIn('"PortID":"veth-peer"', output)
+ self.assertIn('"EnabledCapabilities":16', output)
+
+ # json format with interface name pattern
+ output = networkctl('--json=short', 'lldp', 've*9')
+ print(output)
+ self.assertIn('"InterfaceName":"veth99"', output)
+ self.assertIn('"PortID":"veth-peer"', output)
+ self.assertIn('"EnabledCapabilities":16', output)
+
+ # LLDP neighbors in status
+ output = networkctl_status('veth99')
+ print(output)
+ self.assertRegex(output, r'Connected To: .* on port veth-peer')
+
class NetworkdRATests(unittest.TestCase, Utilities):
def setUp(self):
@@ -5221,6 +5425,9 @@ class NetworkdRATests(unittest.TestCase, Utilities):
start_networkd()
self.wait_online('veth99:routable', 'veth-peer:degraded')
+ # IPv6SendRA=yes implies IPv6Forwarding.
+ self.check_ipv6_sysctl_attr('veth-peer', 'forwarding', '1')
+
output = resolvectl('dns', 'veth99')
print(output)
self.assertRegex(output, 'fe80::')
@@ -5572,7 +5779,7 @@ class NetworkdDHCPServerRelayAgentTests(unittest.TestCase, Utilities):
print(output)
self.assertRegex(output, r'Address: 192.168.5.150 \(DHCP4 via 192.168.5.1\)')
- def test_replay_agent_on_bridge(self):
+ def test_relay_agent_on_bridge(self):
copy_network_unit('25-agent-bridge.netdev',
'25-agent-veth-client.netdev',
'25-agent-bridge.network',
diff --git a/test/units/end.sh b/test/units/end.sh
index 412e0a96a2..4c6c0afa0e 100755
--- a/test/units/end.sh
+++ b/test/units/end.sh
@@ -6,8 +6,8 @@ set -o pipefail
(! journalctl -q -o short-monotonic --grep "didn't pass validation" >>/failed)
-# Here, the redundant '[.]' at the end is for making not the logged self command hit the grep.
-(! journalctl -q -o short-monotonic --grep 'Attempted to close sd-bus (.*) after fork whose connection is opened before the fork, this should not happen[.]' >>/failed)
+# Here, the redundant '[ ]' in the pattern is required in order not to match the logged command itself.
+(! journalctl -q -o short-monotonic --grep 'Warning: cannot close sd-bus connection[ ].*after fork' >>/failed)
systemctl poweroff --no-block
exit 0
diff --git a/test/units/testsuite-13.importctl.sh b/test/units/testsuite-13.importctl.sh
new file mode 100755
index 0000000000..a13e3fd1fd
--- /dev/null
+++ b/test/units/testsuite-13.importctl.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# shellcheck disable=SC2016
+set -eux
+set -o pipefail
+
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
+
+export PAGER=
+
+at_exit() {
+ set +e
+ umount -l -R /var/lib/confexts
+ rm -f /var/tmp/importtest /var/tmp/importtest2 /var/tmp/importtest.tar.gz /var/tmp/importtest2.tar.gz
+}
+
+trap at_exit EXIT
+
+systemctl service-log-level systemd-importd debug
+
+# Mount tmpfs over /var/lib/confexts to not pollute the image
+mkdir -p /var/lib/confexts
+mount -t tmpfs tmpfs /var/lib/confexts -o mode=755
+
+importctl
+importctl --no-pager --help
+importctl --version
+importctl list-transfers
+importctl list-transfers --no-legend --no-ask-password
+importctl list-transfers -j
+importctl list-images
+importctl list-images --no-legend --no-ask-password
+importctl list-images -j
+
+(! importctl cancel-transfer 4711)
+
+dd if=/dev/urandom of=/var/tmp/importtest bs=4096 count=10
+
+importctl import-raw --class=confext /var/tmp/importtest
+cmp /var/tmp/importtest /var/lib/confexts/importtest.raw
+importctl export-raw --class=confext importtest /var/tmp/importtest2
+cmp /var/tmp/importtest /var/tmp/importtest2
+
+(! importctl pull-raw --class=confext file:///var/tmp/importtest)
+importctl pull-raw --verify=no --class=confext file:///var/tmp/importtest importtest3
+cmp /var/tmp/importtest /var/lib/confexts/importtest3.raw
+
+tar czf /var/tmp/importtest.tar.gz -C /var/tmp importtest
+
+importctl import-tar --class=confext /var/tmp/importtest.tar.gz importtest4
+cmp /var/tmp/importtest /var/lib/confexts/importtest4/importtest
+
+importctl export-tar --class=confext importtest4 /var/tmp/importtest2.tar.gz
+importctl import-tar --class=confext /var/tmp/importtest2.tar.gz importtest5
+cmp /var/tmp/importtest /var/lib/confexts/importtest5/importtest
+
+importctl import-fs --class=confext /var/lib/confexts/importtest5 importtest6
+cmp /var/tmp/importtest /var/lib/confexts/importtest6/importtest
+
+(! importctl pull-tar --class=confext file:///var/tmp/importtest.tar.gz importtest7)
+importctl pull-tar --class=confext --verify=no file:///var/tmp/importtest.tar.gz importtest7
+cmp /var/tmp/importtest /var/lib/confexts/importtest7/importtest
+
+importctl list-images
+importctl list-images -j
diff --git a/test/units/testsuite-13.machinectl.sh b/test/units/testsuite-13.machinectl.sh
index b5f90f6d0c..c3bfde2768 100755
--- a/test/units/testsuite-13.machinectl.sh
+++ b/test/units/testsuite-13.machinectl.sh
@@ -20,6 +20,9 @@ at_exit() {
trap at_exit EXIT
+systemctl service-log-level systemd-machined debug
+systemctl service-log-level systemd-importd debug
+
# Mount tmpfs over /var/lib/machines to not pollute the image
mkdir -p /var/lib/machines
mount -t tmpfs tmpfs /var/lib/machines
diff --git a/test/units/testsuite-46.sh b/test/units/testsuite-46.sh
index d097ccdac8..e28a1562bf 100755
--- a/test/units/testsuite-46.sh
+++ b/test/units/testsuite-46.sh
@@ -446,51 +446,54 @@ for opt in json multiplexer output synthesize with-dropin with-nss with-varlink;
done
# FIXME: sshd seems to crash inside asan currently, skip the actual ssh test hence
-if command -v ssh &> /dev/null && command -v sshd &> /dev/null && ! [[ -v ASAN_OPTIONS ]]; then
-
+if command -v ssh &>/dev/null && command -v sshd &>/dev/null && ! [[ -v ASAN_OPTIONS ]]; then
at_exit() {
- systemctl stop mysshserver.socket
- rm -f /tmp/homed.id_rsa /run/systemd/system/mysshserver.socket /run/systemd/system/mysshserver@.service
+ set +e
+
+ systemctl is-active -q mysshserver.socket && systemctl stop mysshserver.socket
+ rm -f /tmp/homed.id_ecdsa /run/systemd/system/mysshserver{@.service,.socket}
systemctl daemon-reload
- homectl remove homedsshtest ||:
- mv /etc/pam.d/sshd.save46 /etc/pam.d/sshd
+ homectl remove homedsshtest
+ mv /etc/pam.d/sshd.bak /etc/pam.d/sshd
}
trap at_exit EXIT
# Test that SSH logins work with delayed unlocking
- ssh-keygen -N '' -C '' -t rsa -f /tmp/homed.id_rsa
+ ssh-keygen -N '' -C '' -t ecdsa -f /tmp/homed.id_ecdsa
NEWPASSWORD=hunter4711 homectl create \
--disk-size=min \
--luks-discard=yes \
--luks-pbkdf-type=pbkdf2 \
--luks-pbkdf-time-cost=1ms \
--enforce-password-policy=no \
- --ssh-authorized-keys=@/tmp/homed.id_rsa.pub \
+ --ssh-authorized-keys=@/tmp/homed.id_ecdsa.pub \
--stop-delay=0 \
homedsshtest
+ homectl inspect homedsshtest
mkdir -p /etc/ssh
- test -f /etc/ssh/ssh_host_rsa_key || ssh-keygen -t rsa -C '' -N '' -f /etc/ssh/ssh_host_rsa_key
-
- # ssh wants this dir around, but distros cannot agree on a common name for it, let's just create all that are aware of distros use
- mkdir -p /usr/share/empty.sshd /var/empty /var/empty/sshd
+ test -f /etc/ssh/ssh_host_ecdsa_key || ssh-keygen -t ecdsa -C '' -N '' -f /etc/ssh/ssh_host_ecdsa_key
- mv /etc/pam.d/sshd /etc/pam.d/sshd.save46
+ # ssh wants this dir around, but distros cannot agree on a common name for it, let's just create all that
+ # are aware of distros use
+ mkdir -p /usr/share/empty.sshd /var/empty /var/empty/sshd /run/sshd
- cat > /etc/pam.d/sshd <<EOF
+ mv /etc/pam.d/sshd /etc/pam.d/sshd.bak
+ cat >/etc/pam.d/sshd <<EOF
auth sufficient pam_unix.so nullok
-auth sufficient pam_systemd_home.so
+auth sufficient pam_systemd_home.so debug
auth required pam_deny.so
-account sufficient pam_systemd_home.so
+account sufficient pam_systemd_home.so debug
account sufficient pam_unix.so
account required pam_permit.so
-session optional pam_systemd_home.so
+session optional pam_systemd_home.so debug
session optional pam_systemd.so
session required pam_unix.so
EOF
- cat >> /etc/ssh/sshd_config <<EOF
+ mkdir -p /etc/sshd/
+ cat >/etc/ssh/sshd_config <<EOF
AuthorizedKeysCommand /usr/bin/userdbctl ssh-authorized-keys %u
AuthorizedKeysCommandUser root
UsePAM yes
@@ -498,13 +501,13 @@ AcceptEnv PASSWORD
LogLevel DEBUG3
EOF
- cat > /run/systemd/system/mysshserver.socket <<EOF
+ cat >/run/systemd/system/mysshserver.socket <<EOF
[Socket]
ListenStream=4711
Accept=yes
EOF
- cat > /run/systemd/system/mysshserver@.service <<EOF
+ cat >/run/systemd/system/mysshserver@.service <<EOF
[Service]
ExecStart=-/usr/sbin/sshd -i -d -e
StandardInput=socket
@@ -517,15 +520,17 @@ EOF
userdbctl user -j homedsshtest
- ssh -t -t -4 -p 4711 -i /tmp/homed.id_rsa -o "SetEnv PASSWORD=hunter4711" -o "StrictHostKeyChecking no" homedsshtest@localhost echo zzz | tail -n 1 | tr -d '\r' > /tmp/homedsshtest.out
- cat /tmp/homedsshtest.out
- test "$(cat /tmp/homedsshtest.out)" = "zzz"
+ ssh -t -t -4 -p 4711 -i /tmp/homed.id_ecdsa \
+ -o "SetEnv PASSWORD=hunter4711" -o "StrictHostKeyChecking no" \
+ homedsshtest@localhost echo zzz | tr -d '\r' | tee /tmp/homedsshtest.out
+ grep -E "^zzz$" /tmp/homedsshtest.out
rm /tmp/homedsshtest.out
- ssh -t -t -4 -p 4711 -i /tmp/homed.id_rsa -o "SetEnv PASSWORD=hunter4711" -o "StrictHostKeyChecking no" homedsshtest@localhost env
+ ssh -t -t -4 -p 4711 -i /tmp/homed.id_ecdsa \
+ -o "SetEnv PASSWORD=hunter4711" -o "StrictHostKeyChecking no" \
+ homedsshtest@localhost env
wait_for_state homedsshtest inactive
- homectl remove homedsshtest
fi
systemd-analyze log-level info
diff --git a/test/units/testsuite-50.sh b/test/units/testsuite-50.sh
index e34cbd915b..370e8f01ed 100755
--- a/test/units/testsuite-50.sh
+++ b/test/units/testsuite-50.sh
@@ -8,10 +8,7 @@ set -o pipefail
export SYSTEMD_LOG_LEVEL=debug
-# shellcheck disable=SC2317
-cleanup() {(
- set +ex
-
+cleanup_image_dir() {
if [ -z "${image_dir}" ]; then
return
fi
@@ -20,6 +17,39 @@ cleanup() {(
umount "${image_dir}/app-nodistro"
umount "${image_dir}/service-scoped-test"
rm -rf "${image_dir}"
+}
+
+fake_roots_dir=/fake-roots
+
+cleanup_fake_rootfses() {
+ local tries=10 e
+ local -a lines fake_roots_mounts
+
+ while [[ ${tries} -gt 0 ]]; do
+ tries=$((tries - 1))
+ mapfile -t lines < <(mount | awk '{ print $3 }')
+ fake_roots_mounts=()
+ for e in "${lines[@]}"; do
+ if [[ ${e} = "${fake_roots_dir}"/* ]]; then
+ fake_roots_mounts+=( "${e}" )
+ fi
+ done
+ if [[ ${#fake_roots_mounts[@]} -eq 0 ]]; then
+ break
+ fi
+ for e in "${fake_roots_mounts[@]}"; do
+ umount "${e}"
+ done
+ done
+ rm -rf "${fake_roots_dir}"
+}
+
+# shellcheck disable=SC2317
+cleanup() {(
+ set +ex
+
+ cleanup_image_dir
+ cleanup_fake_rootfses
)}
udevadm control --log-level=debug
@@ -765,4 +795,690 @@ fi
(! systemd-run -P -p RootImage="/this/should/definitely/not/exist.img" false)
(! systemd-run -P -p ExtensionDirectories="/foo/bar /foo/baz" false)
+# general systemd-sysext tests
+
+shopt -s extglob
+
+die() {
+ echo "${*}"
+ exit 1
+}
+
+prep_root() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ mkdir -p "${r}${h}" "${r}/usr/lib" "${r}/var/lib/extensions" "${r}/var/lib/extensions.mutable"
+}
+
+gen_os_release() {
+ local r=${1}; shift
+
+ {
+ echo "ID=testtest"
+ echo "VERSION=1.2.3"
+ } >"${r}/usr/lib/os-release"
+}
+
+gen_test_ext_image() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ local n d f
+
+ n='test-extension'
+ d="${r}/var/lib/extensions/${n}"
+ f="${d}/usr/lib/extension-release.d/extension-release.${n}"
+ mkdir -p "$(dirname "${f}")"
+ echo "ID=_any" >"${f}"
+ mkdir -p "${d}/${h}"
+ touch "${d}${h}/preexisting-file-in-extension-image"
+}
+
+hierarchy_ext_mut_path() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ # /a/b/c -> a.b.c
+ local n=${h}
+ n="${n##+(/)}"
+ n="${n%%+(/)}"
+ n="${n//\//.}"
+
+ printf '%s' "${r}/var/lib/extensions.mutable/${n}"
+}
+
+prep_ext_mut() {
+ local p=${1}; shift
+
+ mkdir -p "${p}"
+ touch "${p}/preexisting-file-in-extensions-mutable"
+}
+
+make_ro() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ mount -o bind "${r}${h}" "${r}${h}"
+ mount -o bind,remount,ro "${r}${h}"
+}
+
+prep_hierarchy() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ touch "${r}${h}/preexisting-file-in-hierarchy"
+}
+
+prep_ro_hierarchy() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ prep_hierarchy "${r}" "${h}"
+ make_ro "${r}" "${h}"
+}
+
+# extra args:
+# "e" for checking for the preexisting file in extension
+# "h" for checking for the preexisting file in hierarchy
+# "u" for checking for the preexisting file in upperdir
+check_usual_suspects() {
+ local root=${1}; shift
+ local hierarchy=${1}; shift
+ local message=${1}; shift
+
+ local arg
+ # shellcheck disable=SC2034 # the variables below are used indirectly
+ local e='' h='' u=''
+
+ for arg; do
+ case ${arg} in
+ e|h|u)
+ local -n v=${arg}
+ v=x
+ unset -n v
+ ;;
+ *)
+ die "invalid arg to ${0}: ${arg@Q}"
+ ;;
+ esac
+ done
+
+ # var name, file name
+ local pairs=(
+ e:preexisting-file-in-extension-image
+ h:preexisting-file-in-hierarchy
+ u:preexisting-file-in-extensions-mutable
+ )
+ local pair name file desc full_path
+ for pair in "${pairs[@]}"; do
+ name=${pair%%:*}
+ file=${pair#*:}
+ desc=${file//-/ }
+ full_path="${root}${hierarchy}/${file}"
+ local -n v=${name}
+ if [[ -n ${v} ]]; then
+ test -f "${full_path}" || {
+ ls -la "$(dirname "${full_path}")"
+ die "${desc} is missing ${message}"
+ }
+ else
+ test ! -f "${full_path}" || {
+ ls -la "$(dirname "${full_path}")"
+ die "${desc} unexpectedly exists ${message}"
+ }
+ fi
+ unset -n v
+ done
+}
+
+check_usual_suspects_after_merge() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ check_usual_suspects "${r}" "${h}" "after merge" "${@}"
+}
+
+check_usual_suspects_after_unmerge() {
+ local r=${1}; shift
+ local h=${1}; shift
+
+ check_usual_suspects "${r}" "${h}" "after unmerge" "${@}"
+}
+
+
+#
+# no extension data in /var/lib/extensions.mutable/…, read-only hierarchy,
+# mutability disabled by default
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-read-only-with-read-only-hierarchy
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only after unmerge"
+
+#
+# no extension data in /var/lib/extensions.mutable/…, mutable hierarchy,
+# mutability disabled by default
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-read-only-with-mutable-hierarchy
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+prep_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-succeed-on-mutable-fs" || die "${fake_root}${hierarchy} is not mutable"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" merge
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+touch "${fake_root}${hierarchy}/should-succeed-on-mutable-fs-again" || die "${fake_root}${hierarchy} is not mutable after unmerge"
+
+
+#
+# no extension data in /var/lib/extensions.mutable/…, no hierarchy either,
+# mutability disabled by default
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-read-only-with-missing-hierarchy
+hierarchy=/opt
+
+prep_root "${fake_root}" "${hierarchy}"
+rmdir "${fake_root}/${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}"
+
+
+#
+# no extension data in /var/lib/extensions.mutable/…, an empty hierarchy,
+# mutability disabled by default
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-read-only-with-empty-hierarchy
+hierarchy=/opt
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+make_ro "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}"
+
+
+#
+# extension data in /var/lib/extensions.mutable/…, read-only hierarchy, mutability disabled-by-default
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-mutable-with-read-only-hierarchy-disabled
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+prep_ext_mut "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" merge
+
+touch "${fake_root}${hierarchy}/should-be-read-only" && die "${fake_root}${hierarchy} is not read-only"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+
+#
+# extension data in /var/lib/extensions.mutable/…, read-only hierarchy, auto-mutability
+#
+# mutable merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-mutable-with-read-only-hierarchy
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+prep_ext_mut "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/now-is-mutable" || die "${fake_root}${hierarchy} is not mutable"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h u
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test ! -f "${fake_root}${hierarchy}/now-is-mutable" || die "now-is-mutable did not disappear from hierarchy after unmerge"
+
+
+#
+# extension data in /var/lib/extensions.mutable/…, missing hierarchy,
+# auto-mutability
+#
+# mutable merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-mutable-with-missing-hierarchy
+hierarchy=/opt
+
+prep_root "${fake_root}" "${hierarchy}"
+rmdir "${fake_root}/${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+prep_ext_mut "${ext_data_path}"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/now-is-mutable" || die "${fake_root}${hierarchy} is not mutable"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e u
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}"
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test ! -f "${fake_root}${hierarchy}/now-is-mutable" || die "now-is-mutable did not disappear from hierarchy after unmerge"
+
+
+#
+# extension data in /var/lib/extensions.mutable/…, empty hierarchy, auto-mutability
+#
+# mutable merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-mutable-with-empty-hierarchy
+hierarchy=/opt
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+prep_ext_mut "${ext_data_path}"
+
+make_ro "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/now-is-mutable" || die "${fake_root}${hierarchy} is not mutable"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e u
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}"
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test ! -f "${fake_root}${hierarchy}/now-is-mutable" || die "now-is-mutable did not disappear from hierarchy after unmerge"
+
+
+#
+# /var/lib/extensions.mutable/… is a symlink to /some/other/dir, read-only
+# hierarchy, auto-mutability
+#
+# mutable merged
+#
+
+
+fake_root=${fake_roots_dir}/mutable-symlink-with-read-only-hierarchy
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+# generate extension writable data
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+real_ext_dir="${fake_root}/upperdir"
+prep_ext_mut "${real_ext_dir}"
+ln -sfTr "${real_ext_dir}" "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/now-is-mutable" || die "${fake_root}${hierarchy} is not mutable"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h u
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+test -f "${real_ext_dir}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test -f "${real_ext_dir}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test ! -f "${fake_root}${hierarchy}/now-is-mutable" || die "now-is-mutable did not disappear from hierarchy after unmerge"
+
+
+#
+# /var/lib/extensions.mutable/… is a symlink to the hierarchy itself, auto-mutability
+#
+# for this to work, hierarchy must be mutable
+#
+# mutable merged
+#
+
+
+fake_root=${fake_roots_dir}/mutable-self-upper
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+# generate extension writable data
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+real_ext_dir="${fake_root}${hierarchy}"
+prep_ext_mut "${real_ext_dir}"
+ln -sfTr "${real_ext_dir}" "${ext_data_path}"
+
+# prepare writable hierarchy
+touch "${fake_root}${hierarchy}/preexisting-file-in-hierarchy"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/now-is-mutable" || die "${fake_root}${hierarchy} is not mutable"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h u
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+test -f "${real_ext_dir}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h u
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test -f "${real_ext_dir}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+
+
+#
+# /var/lib/extensions.mutable/… is a symlink to the hierarchy itself, which is
+# read-only, auto-mutability
+#
+# expecting a failure here
+#
+
+
+fake_root=${fake_roots_dir}/failure-self-upper-ro
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+# generate extension writable data
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+real_ext_dir="${fake_root}${hierarchy}"
+prep_ext_mut "${real_ext_dir}"
+ln -sfTr "${real_ext_dir}" "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge || die "expected merge to fail"
+
+
+#
+# /var/lib/extensions.mutable/… is a dangling symlink, auto-mutability
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/read-only-mutable-dangling-symlink
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+ln -sfTr "/should/not/exist/" "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+
+#
+# /var/lib/extensions.mutable/… exists, but it's ignored, mutability disabled explicitly
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/disabled
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+prep_ext_mut "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=no merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+
+#
+# /var/lib/extensions.mutable/… exists, but it's imported instead
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/imported
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+prep_ext_mut "${ext_data_path}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=import merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h u
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+
+#
+# /var/lib/extensions.mutable/… does not exist, but mutability is enabled
+# explicitly
+#
+# mutable merged
+#
+
+
+fake_root=${fake_roots_dir}/enabled
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+ext_data_path=$(hierarchy_ext_mut_path "${fake_root}" "${hierarchy}")
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+test ! -d "${ext_data_path}" || die "extensions.mutable should not exist"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=yes merge
+
+test -d "${ext_data_path}" || die "extensions.mutable should exist now"
+touch "${fake_root}${hierarchy}/now-is-mutable" || die "${fake_root}${hierarchy} is not mutable"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable is not stored in expected location"
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+test -f "${ext_data_path}/now-is-mutable" || die "now-is-mutable disappeared from writable storage after unmerge"
+test ! -f "${fake_root}${hierarchy}/now-is-mutable" || die "now-is-mutable did not disappear from hierarchy after unmerge"
+
+
+#
+# /var/lib/extensions.mutable/… does not exist, auto-mutability
+#
+# read-only merged
+#
+
+
+fake_root=${fake_roots_dir}/simple-read-only-explicit
+hierarchy=/usr
+
+prep_root "${fake_root}" "${hierarchy}"
+gen_os_release "${fake_root}"
+gen_test_ext_image "${fake_root}" "${hierarchy}"
+
+prep_ro_hierarchy "${fake_root}" "${hierarchy}"
+
+touch "${fake_root}${hierarchy}/should-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+
+# run systemd-sysext
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" --mutable=auto merge
+
+touch "${fake_root}${hierarchy}/should-still-fail-on-read-only-fs" && die "${fake_root}${hierarchy} is not read-only"
+check_usual_suspects_after_merge "${fake_root}" "${hierarchy}" e h
+
+SYSTEMD_SYSEXT_HIERARCHIES="${hierarchy}" systemd-sysext --root="${fake_root}" unmerge
+
+check_usual_suspects_after_unmerge "${fake_root}" "${hierarchy}" h
+
+
+#
+# done
+#
+
+
touch /testok
diff --git a/test/units/testsuite-55.sh b/test/units/testsuite-55.sh
index b02dd29960..3e549dd7db 100755
--- a/test/units/testsuite-55.sh
+++ b/test/units/testsuite-55.sh
@@ -117,6 +117,7 @@ if systemctl status testsuite-55-testbloat.service; then exit 42; fi
if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
# Make sure we also work correctly on user units.
+loginctl enable-linger testuser
systemctl start --machine "testuser@.host" --user testsuite-55-testchill.service
systemctl start --machine "testuser@.host" --user testsuite-55-testbloat.service
@@ -144,6 +145,8 @@ done
if systemctl --machine "testuser@.host" --user status testsuite-55-testbloat.service; then exit 42; fi
if ! systemctl --machine "testuser@.host" --user status testsuite-55-testchill.service; then exit 24; fi
+loginctl disable-linger testuser
+
# only run this portion of the test if we can set xattrs
if cgroupfs_supports_user_xattrs; then
sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down
diff --git a/test/units/testsuite-74.socket.sh b/test/units/testsuite-74.socket.sh
index aa856e81bc..7ef85fae55 100755
--- a/test/units/testsuite-74.socket.sh
+++ b/test/units/testsuite-74.socket.sh
@@ -9,21 +9,20 @@ set -o pipefail
at_exit() {
systemctl stop per-source-limit.socket
- rm -f /run/systemd/system/per-source-limit.socket /run/systemd/system/per-source-limit@.service
- rm -f /tmp/foo.conn1 /tmp/foo.conn2 /tmp/foo.conn3 /tmp/foo.conn4
+ rm -f /run/systemd/system/per-source-limit{@.service,.socket} /run/foo.conn{1..4}
systemctl daemon-reload
}
trap at_exit EXIT
-cat > /run/systemd/system/per-source-limit.socket <<EOF
+cat >/run/systemd/system/per-source-limit.socket <<EOF
[Socket]
ListenStream=/run/per-source-limit.sk
MaxConnectionsPerSource=2
Accept=yes
EOF
-cat > /run/systemd/system/per-source-limit@.service <<EOF
+cat >/run/systemd/system/per-source-limit@.service <<EOF
[Unit]
BindsTo=per-source-limit.socket
After=per-source-limit.socket
@@ -36,17 +35,27 @@ EOF
systemctl daemon-reload
systemctl start per-source-limit.socket
+systemctl status per-source-limit.socket
# So these two should take up the first two connection slots
-socat - UNIX-CONNECT:/run/per-source-limit.sk > /tmp/foo.conn1 &
+socat -U - UNIX-CONNECT:/run/per-source-limit.sk | tee /tmp/foo.conn1 &
J1="$!"
-socat - UNIX-CONNECT:/run/per-source-limit.sk > /tmp/foo.conn2 &
+socat -U - UNIX-CONNECT:/run/per-source-limit.sk | tee /tmp/foo.conn2 &
J2="$!"
waitfor() {
- while ! grep -q "waldo" "$1" ; do
- sleep .2
+ local file="${1:?}"
+
+ for _ in {0..20}; do
+ if grep -q waldo "$file"; then
+ return 0
+ fi
+
+ sleep .5
done
+
+ echo >&2 "Timeout while waiting for the expected output"
+ return 1
}
# Wait until the word "waldo" shows in the output files
@@ -54,11 +63,11 @@ waitfor /tmp/foo.conn1
waitfor /tmp/foo.conn2
# The next connection should fail, because the limit is hit
-socat - UNIX-CONNECT:/run/per-source-limit.sk > /tmp/foo.conn3 &
+socat -U - UNIX-CONNECT:/run/per-source-limit.sk | tee /tmp/foo.conn3 &
J3="$!"
# But this one should work, because done under a different UID
-setpriv --reuid=1 socat - UNIX-CONNECT:/run/per-source-limit.sk > /tmp/foo.conn4 &
+setpriv --reuid=1 socat -U - UNIX-CONNECT:/run/per-source-limit.sk | tee /tmp/foo.conn4 &
J4="$!"
waitfor /tmp/foo.conn4
diff --git a/test/units/testsuite-74.ssh.sh b/test/units/testsuite-74.ssh.sh
index 3372ec0b06..70fb9ce56c 100755
--- a/test/units/testsuite-74.ssh.sh
+++ b/test/units/testsuite-74.ssh.sh
@@ -24,8 +24,6 @@ if [[ -v ASAN_OPTIONS ]] ; then
fi
ROOTID=$(mktemp -u)
-# Needed on Ubuntu/Debian as we copy binaries manually
-mkdir -p /run/sshd
removesshid() {
rm -f "$ROOTID" "$ROOTID".pub
@@ -49,7 +47,7 @@ echo "LogLevel DEBUG3" >> /etc/ssh/sshd_config
test -f /etc/ssh/ssh_config || echo 'Include /etc/ssh/ssh_config.d/*.conf' > /etc/ssh/ssh_config
# ssh wants this dir around, but distros cannot agree on a common name for it, let's just create all that are aware of distros use
-mkdir -p /usr/share/empty.sshd /var/empty /var/empty/sshd
+mkdir -p /usr/share/empty.sshd /var/empty /var/empty/sshd /run/sshd
ssh -o StrictHostKeyChecking=no -v -i "$ROOTID" .host cat /etc/machine-id | cmp - /etc/machine-id
ssh -o StrictHostKeyChecking=no -v -i "$ROOTID" unix/run/ssh-unix-local/socket cat /etc/machine-id | cmp - /etc/machine-id
diff --git a/test/units/testsuite-75.sh b/test/units/testsuite-75.sh
index b92ebf6b33..7bfc067e05 100755
--- a/test/units/testsuite-75.sh
+++ b/test/units/testsuite-75.sh
@@ -305,16 +305,16 @@ knotc reload
TIMESTAMP=$(date '+%F %T')
# Issue: https://github.com/systemd/systemd/issues/23951
# With IPv6 enabled
-run getent -s resolve hosts ns1.unsigned.test
-grep -qE "^fd00:dead:beef:cafe::1\s+ns1\.unsigned\.test" "$RUN_OUT"
+run getent -s resolve ahosts ns1.unsigned.test
+grep -qE "^fd00:dead:beef:cafe::1\s+STREAM\s+ns1\.unsigned\.test" "$RUN_OUT"
monitor_check_rr "$TIMESTAMP" "ns1.unsigned.test IN AAAA fd00:dead:beef:cafe::1"
# With IPv6 disabled
# Issue: https://github.com/systemd/systemd/issues/23951
-# FIXME
-#disable_ipv6
-#run getent -s resolve hosts ns1.unsigned.test
-#grep -qE "^10\.0\.0\.1\s+ns1\.unsigned\.test" "$RUN_OUT"
-#monitor_check_rr "$TIMESTAMP" "ns1.unsigned.test IN A 10.0.0.1"
+disable_ipv6
+run getent -s resolve ahosts ns1.unsigned.test
+grep -qE "^10\.0\.0\.1\s+STREAM\s+ns1\.unsigned\.test" "$RUN_OUT"
+(! grep -qE "fd00:dead:beef:cafe::1" "$RUN_OUT")
+monitor_check_rr "$TIMESTAMP" "ns1.unsigned.test IN A 10.0.0.1"
enable_ipv6
# Issue: https://github.com/systemd/systemd/issues/18812
@@ -322,16 +322,17 @@ enable_ipv6
# Follow-up issue: https://github.com/systemd/systemd/issues/23152
# Follow-up PR: https://github.com/systemd/systemd/pull/23161
# With IPv6 enabled
-run getent -s resolve hosts localhost
-grep -qE "^::1\s+localhost" "$RUN_OUT"
-run getent -s myhostname hosts localhost
-grep -qE "^::1\s+localhost" "$RUN_OUT"
+run getent -s resolve ahosts localhost
+grep -qE "^::1\s+STREAM\s+localhost" "$RUN_OUT"
+run getent -s myhostname ahosts localhost
+grep -qE "^::1\s+STREAM\s+localhost" "$RUN_OUT"
# With IPv6 disabled
disable_ipv6
-run getent -s resolve hosts localhost
-grep -qE "^127\.0\.0\.1\s+localhost" "$RUN_OUT"
-run getent -s myhostname hosts localhost
-grep -qE "^127\.0\.0\.1\s+localhost" "$RUN_OUT"
+run getent -s resolve ahosts localhost
+grep -qE "^127\.0\.0\.1\s+STREAM\s+localhost" "$RUN_OUT"
+(! grep -qE "::1" "$RUN_OUT")
+run getent -s myhostname ahosts localhost
+grep -qE "^127\.0\.0\.1\s+STREAM\s+localhost" "$RUN_OUT"
enable_ipv6
# Issue: https://github.com/systemd/systemd/issues/25088
@@ -522,9 +523,9 @@ monitor_check_rr "$TIMESTAMP" "follow13.almost.final.signed.test IN CNAME follow
monitor_check_rr "$TIMESTAMP" "follow14.final.signed.test IN A 10.0.0.14"
# Non-existing RR + CNAME chain
-run dig +dnssec AAAA cname-chain.signed.test
-grep -qF "status: NOERROR" "$RUN_OUT"
-grep -qE "^follow14\.final\.signed\.test\..+IN\s+NSEC\s+" "$RUN_OUT"
+#run dig +dnssec AAAA cname-chain.signed.test
+#grep -qF "status: NOERROR" "$RUN_OUT"
+#grep -qE "^follow14\.final\.signed\.test\..+IN\s+NSEC\s+" "$RUN_OUT"
: "--- ZONE: onlinesign.test (dynamic DNSSEC) ---"
@@ -845,6 +846,10 @@ run resolvectl reset-statistics --json=short
test "$(resolvectl --json=short query -t AAAA localhost)" == '{"key":{"class":1,"type":28,"name":"localhost"},"address":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]}'
test "$(resolvectl --json=short query -t A localhost)" == '{"key":{"class":1,"type":1,"name":"localhost"},"address":[127,0,0,1]}'
+# Test ResolveRecord RR resolving via Varlink
+test "$(varlinkctl call /run/systemd/resolve/io.systemd.Resolve io.systemd.Resolve.ResolveRecord '{"name":"localhost","type":1}' --json=short)" == '{"rrs":[{"ifindex":1,"rr":{"key":{"class":1,"type":1,"name":"localhost"},"address":[127,0,0,1]},"raw":"CWxvY2FsaG9zdAAAAQABAAAAAAAEfwAAAQ=="}],"flags":786945}'
+test "$(varlinkctl call /run/systemd/resolve/io.systemd.Resolve io.systemd.Resolve.ResolveRecord '{"name":"localhost","type":28}' --json=short)" == '{"rrs":[{"ifindex":1,"rr":{"key":{"class":1,"type":28,"name":"localhost"},"address":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]},"raw":"CWxvY2FsaG9zdAAAHAABAAAAAAAQAAAAAAAAAAAAAAAAAAAAAQ=="}],"flags":786945}'
+
# Check if resolved exits cleanly.
restart_resolved
diff --git a/tmpfiles.d/systemd-network.conf b/tmpfiles.d/systemd-network.conf
index b30bc914a5..24197555ee 100644
--- a/tmpfiles.d/systemd-network.conf
+++ b/tmpfiles.d/systemd-network.conf
@@ -10,4 +10,3 @@
d /run/systemd/netif 0755 systemd-network systemd-network -
d /run/systemd/netif/links 0755 systemd-network systemd-network -
d /run/systemd/netif/leases 0755 systemd-network systemd-network -
-d /run/systemd/netif/lldp 0755 systemd-network systemd-network -
diff --git a/tmpfiles.d/systemd.conf.in b/tmpfiles.d/systemd.conf.in
index 11a45a3f4b..d36f0694af 100644
--- a/tmpfiles.d/systemd.conf.in
+++ b/tmpfiles.d/systemd.conf.in
@@ -9,7 +9,7 @@
d /run/user 0755 root root -
{% if ENABLE_UTMP %}
-F! /run/utmp 0664 root utmp -
+f+! /run/utmp 0664 root utmp -
{% endif %}
d /run/systemd/ask-password 0755 root root -
@@ -26,16 +26,13 @@ Z /run/log/journal/%m ~2750 root systemd-journal - -
{% if HAVE_ACL %}
{% if ENABLE_ADM_GROUP and ENABLE_WHEEL_GROUP %}
a+ /run/log/journal - - - - d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x
-a+ /run/log/journal/%m - - - - d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x
-a+ /run/log/journal/%m/*.journal* - - - - group:adm:r--,group:wheel:r--
+A+ /run/log/journal/%m - - - - d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-X,group:wheel:r-X
{% elif ENABLE_ADM_GROUP %}
a+ /run/log/journal - - - - d:group::r-x,d:group:adm:r-x,group::r-x,group:adm:r-x
-a+ /run/log/journal/%m - - - - d:group:adm:r-x,group:adm:r-x
-a+ /run/log/journal/%m/*.journal* - - - - group:adm:r--
+A+ /run/log/journal/%m - - - - d:group:adm:r-x,group:adm:r-X
{% elif ENABLE_WHEEL_GROUP %}
a+ /run/log/journal - - - - d:group::r-x,d:group:wheel:r-x,group::r-x,group:wheel:r-x
-a+ /run/log/journal/%m - - - - d:group:wheel:r-x,group:wheel:r-x
-a+ /run/log/journal/%m/*.journal* - - - - group:wheel:r--
+A+ /run/log/journal/%m - - - - d:group:wheel:r-x,group:wheel:r-X
{% endif %}
{% endif %}
diff --git a/tools/meson-render-jinja2.py b/tools/meson-render-jinja2.py
index 3a3d912d8f..977de79378 100755
--- a/tools/meson-render-jinja2.py
+++ b/tools/meson-render-jinja2.py
@@ -33,12 +33,11 @@ def render(filename, defines):
def main():
defines = parse_config_h(sys.argv[1])
- defines.update(parse_config_h(sys.argv[2]))
- output = render(sys.argv[3], defines)
- with open(sys.argv[4], 'w') as f:
+ output = render(sys.argv[2], defines)
+ with open(sys.argv[3], 'w') as f:
f.write(output)
- info = os.stat(sys.argv[3])
- os.chmod(sys.argv[4], info.st_mode)
+ info = os.stat(sys.argv[2])
+ os.chmod(sys.argv[3], info.st_mode)
if __name__ == '__main__':
main()
diff --git a/tools/meson-vcs-tag.sh b/tools/meson-vcs-tag.sh
deleted file mode 100755
index 16cf11007d..0000000000
--- a/tools/meson-vcs-tag.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env bash
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-set -u
-set -o pipefail
-
-dir="${1:-.}"
-version_tag="${2:-}"
-
-if [ -n "${version_tag}" ]; then
- # If -Dversion_tag= was used, just use that without further changes.
- echo "${version_tag}"
-else
- read -r project_version <"${dir}/meson.version"
-
- # Check that we have either .git/ (a normal clone) or a .git file (a work-tree)
- # and that we don't get confused if a tarball is extracted in a higher-level
- # git repository.
- #
- # If the working tree has no tags (CI builds), the first git-describe will fail
- # and we fall back to project_version-commitid instead.
-
- c=''
- if [ -e "${dir}/.git" ]; then
- c="$(git -C "$dir" describe --abbrev=7 --dirty=^ 2>/dev/null)"
- if [ -n "$c" ]; then
- # git describe uses the most recent tag. However, for development versions (e.g. v256~devel), the
- # most recent tag will be v255 as there is no tag for development versions. To deal with this, we
- # replace the tag with the project version instead.
- c="${project_version}-${c#*-}"
- else
- # This call might still fail with permission issues
- suffix="$(git -C "$dir" describe --always --abbrev=7 --dirty=^ 2>/dev/null)"
- [ -n "$suffix" ] && c="${project_version}-${suffix}"
- fi
- fi
- [ -z "$c" ] && c="${project_version}"
- # Replace any hyphens with carets which are allowed in versions by pacman whereas hyphens are not. Git
- # versions with carets will also sort higher than their non-git version counterpart both in pacman
- # versioning and in version format specification versioning.
- echo "$c" | sed 's/^v//; s/-/^/g'
-fi
diff --git a/units/systemd-battery-check.service.in b/units/systemd-battery-check.service.in
index a5f532da70..0f82604107 100644
--- a/units/systemd-battery-check.service.in
+++ b/units/systemd-battery-check.service.in
@@ -12,7 +12,7 @@ Description=Check battery level during early boot
Documentation=man:systemd-battery-check.service(8)
ConditionVirtualization=no
ConditionDirectoryNotEmpty=/sys/class/power_supply/
-ConditionKernelCommandLine=!systemd.battery-check=0
+ConditionKernelCommandLine=!systemd.battery_check=0
AssertPathExists=/etc/initrd-release
DefaultDependencies=no
After=plymouth-start.service