# Copyright 2011-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=6

if [[ ${PV} == 9999 ]]; then
	EGIT_REPO_URI="https://github.com/systemd/systemd.git"
	inherit git-r3
else
	SRC_URI="https://github.com/systemd/systemd-stable/archive/v${PV}.tar.gz -> systemd-stable-${PV}.tar.gz"
	KEYWORDS="*"
	S=${WORKDIR}/systemd-stable-${PV}
fi

PYTHON_COMPAT=( python{3_4,3_5,3_6,3_7} )

inherit bash-completion-r1 linux-info meson multilib-minimal ninja-utils pam python-any-r1 systemd toolchain-funcs udev user

DESCRIPTION="System and service manager for Linux"
HOMEPAGE="https://www.freedesktop.org/wiki/Software/systemd"

LICENSE="GPL-2 LGPL-2.1 MIT public-domain"
SLOT="0/2"

# lakitu: Added "doc" USE flag to conditionalize the installation of docs.
IUSE="acl apparmor audit build cryptsetup curl doc elfutils +gcrypt gnuefi http idn importd +kmod libidn2 +lz4 lzma nat pam pcre policykit qrcode +resolvconf +seccomp selinux +split-usr ssl +sysv-utils test vanilla vtconsole xkb predictable-interface-name +networkd-wait-online"

REQUIRED_USE="importd? ( curl gcrypt lzma )"
RESTRICT="!test? ( test )"

MINKV="3.11"

COMMON_DEPEND=">=sys-apps/util-linux-2.30:0=[${MULTILIB_USEDEP}]
	sys-libs/libcap:0=[${MULTILIB_USEDEP}]
	!<sys-libs/glibc-2.16
	acl? ( sys-apps/acl:0= )
	apparmor? ( sys-libs/libapparmor:0= )
	audit? ( >=sys-process/audit-2:0= )
	cryptsetup? ( >=sys-fs/cryptsetup-1.6:0= )
	curl? ( net-misc/curl:0= )
	elfutils? ( >=dev-libs/elfutils-0.158:0= )
	gcrypt? ( >=dev-libs/libgcrypt-1.4.5:0=[${MULTILIB_USEDEP}] )
	http? (
		>=net-libs/libmicrohttpd-0.9.33:0=
		ssl? ( >=net-libs/gnutls-3.1.4:0= )
	)
	idn? (
		libidn2? ( net-dns/libidn2:= )
		!libidn2? ( net-dns/libidn:= )
	)
	importd? (
		app-arch/bzip2:0=
		sys-libs/zlib:0=
	)
	kmod? ( >=sys-apps/kmod-15:0= )
	lz4? ( >=app-arch/lz4-0_p131:0=[${MULTILIB_USEDEP}] )
	lzma? ( >=app-arch/xz-utils-5.0.5-r1:0=[${MULTILIB_USEDEP}] )
	nat? ( net-firewall/iptables:0= )
	pam? ( virtual/pam:=[${MULTILIB_USEDEP}] )
	pcre? ( dev-libs/libpcre2 )
	qrcode? ( media-gfx/qrencode:0= )
	seccomp? ( >=sys-libs/libseccomp-2.3.3:0= )
	selinux? ( sys-libs/libselinux:0= )
	xkb? ( >=x11-libs/libxkbcommon-0.4.1:0= )"

# baselayout-2.2 has /run
RDEPEND="${COMMON_DEPEND}
	>=sys-apps/baselayout-2.2
	selinux? ( sec-policy/selinux-base-policy[systemd] )
	sysv-utils? ( !sys-apps/sysvinit )
	!sysv-utils? ( sys-apps/sysvinit )
	resolvconf? ( !net-dns/openresolv )
	!build? ( || (
		sys-apps/util-linux[kill(-)]
		sys-process/procps[kill(+)]
		sys-apps/coreutils[kill(-)]
	) )
	!sys-auth/nss-myhostname
	!<sys-kernel/dracut-044
	!sys-fs/eudev
	!sys-fs/udev"

# sys-apps/dbus: the daemon only (+ build-time lib dep for tests)
# The following PDEPENDs are present in Gentoo upstream but don't make sense for
# lakitu:
#     >=sys-fs/udev-init-scripts-25
# udev-init-scripts: startup scripts for OpenRC
PDEPEND=">=sys-apps/dbus-1.9.8[systemd]
	>=sys-apps/hwids-20150417[udev]
	policykit? ( sys-auth/polkit )
	!vanilla? ( sys-apps/gentoo-systemd-integration )"

# Newer linux-headers needed by ia64, bug #480218
# lakitu: Added conditional doc dependency
DEPEND="${COMMON_DEPEND}
	app-arch/xz-utils:0
	dev-util/gperf
	>=dev-util/intltool-0.50
	>=sys-apps/coreutils-8.16
	>=sys-kernel/linux-headers-${MINKV}
	virtual/pkgconfig[${MULTILIB_USEDEP}]
	gnuefi? ( >=sys-boot/gnu-efi-3.0.2 )
	test? ( sys-apps/dbus )
	doc? (
		app-text/docbook-xml-dtd:4.2
		app-text/docbook-xml-dtd:4.5
		app-text/docbook-xsl-stylesheets
		dev-libs/libxslt:0
		$(python_gen_any_dep 'dev-python/lxml[${PYTHON_USEDEP}]')
	)
"

pkg_pretend() {
	if [[ ${MERGE_TYPE} != buildonly ]]; then
		local CONFIG_CHECK="~AUTOFS4_FS ~BLK_DEV_BSG ~CGROUPS
			~CHECKPOINT_RESTORE ~DEVTMPFS ~EPOLL ~FANOTIFY ~FHANDLE
			~INOTIFY_USER ~IPV6 ~NET ~NET_NS ~PROC_FS ~SIGNALFD ~SYSFS
			~TIMERFD ~TMPFS_XATTR ~UNIX
			~CRYPTO_HMAC ~CRYPTO_SHA256 ~CRYPTO_USER_API_HASH
			~!FW_LOADER_USER_HELPER_FALLBACK ~!GRKERNSEC_PROC ~!IDE ~!SYSFS_DEPRECATED
			~!SYSFS_DEPRECATED_V2"

		use acl && CONFIG_CHECK+=" ~TMPFS_POSIX_ACL"
		use seccomp && CONFIG_CHECK+=" ~SECCOMP ~SECCOMP_FILTER"
		kernel_is -lt 3 7 && CONFIG_CHECK+=" ~HOTPLUG"
		kernel_is -lt 4 7 && CONFIG_CHECK+=" ~DEVPTS_MULTIPLE_INSTANCES"
		kernel_is -ge 4 10 && CONFIG_CHECK+=" ~CGROUP_BPF"

		if linux_config_exists; then
			local uevent_helper_path=$(linux_chkconfig_string UEVENT_HELPER_PATH)
			if [[ -n ${uevent_helper_path} ]] && [[ ${uevent_helper_path} != '""' ]]; then
				ewarn "It's recommended to set an empty value to the following kernel config option:"
				ewarn "CONFIG_UEVENT_HELPER_PATH=${uevent_helper_path}"
			fi
			if linux_chkconfig_present X86; then
				CONFIG_CHECK+=" ~DMIID"
			fi
		fi

		if kernel_is -lt ${MINKV//./ }; then
			ewarn "Kernel version at least ${MINKV} required"
		fi

		check_extra_config
	fi
}

pkg_setup() {
	:
}

src_unpack() {
	default
	[[ ${PV} != 9999 ]] || git-r3_src_unpack
}

src_prepare() {
	# Do NOT add patches here
	local PATCHES=()

	[[ -d "${WORKDIR}"/patches ]] && PATCHES+=( "${WORKDIR}"/patches )

	# Add local patches here
	# lakitu: To want some gentoo patches if not vanilla and to keep the
	# code aligned with gentoo's ebuild file
	#if ! use vanilla; then
	#	PATCHES+=(
	#		"${FILESDIR}/gentoo-Dont-enable-audit-by-default.patch"
	#		"${FILESDIR}/gentoo-systemd-user-pam.patch"
	#		"${FILESDIR}/gentoo-uucp-group-r1.patch"
	#		"${FILESDIR}/gentoo-generator-path.patch"
	#	)
	#fi
	PATCHES+=(
			# Gentoo patches
			"${FILESDIR}/239-debug-extra.patch"
			"${FILESDIR}/CVE-2019-6454.patch"
			"${FILESDIR}/gentoo-uucp-group-r1.patch"
			"${FILESDIR}/gentoo-systemd-user-pam.patch"
			"${FILESDIR}/228-noclean-tmp.patch"
			# Lakitu patches
			# CL:*250967
			"${FILESDIR}"/232-tmpfiles-no-srv.patch
			# CL:*256679
			"${FILESDIR}"/225-Force-re-creation-of-etc-localtime-symlink.patch
			# This prevents the kernel from logging all audit messages to
			# both dmesg and audit log. b/29581598.
			"${FILESDIR}"/225-audit-set-pid.patch
			# Allow networkd => hostnamed communication w/o polkit.
			"${FILESDIR}"/225-allow-networkd-to-hostnamed.patch
			# Work around the 64 bit restriction of hostname length from
			# kernel. b/27702816.
			"${FILESDIR}"/232-single-label-hostname.patch
			# Make networkd default to not touch IP forwarding setting.
			# b/33257712
			"${FILESDIR}"/225-networkd-default-ip-forwarding-to-kernel.patch
			# Avoid render and kvm group
			"${FILESDIR}"/239-avoid-render-and-kvm-group.patch
			# Change paths for udev rules, init, halt, poweroff
			# shutdown and reboot to minimize the effect of systemd upgrade
			# TODO(vaibhavrustagi): Need to check to use default paths provided
			# by systemd or not
			"${FILESDIR}"/239-change-paths-for-udev-rules-init-reboot.patch
			# Disable LMNR and MDNS since COS does not support multicast.
			"${FILESDIR}"/239-resolved-conf-in.patch
			# Boot into multi-user.target instead of graphical.target.
			"${FILESDIR}"/239-default-target.patch
			# Fix a bug where DHCP was not restarted as expected (b/149344651).
			# Those patches are from
			# https://github.com/systemd/systemd/pull/9832, and
			# should be dropped after systemd upgrade to v240.
			"${FILESDIR}"/239-networkd-fixes.patch
			# Invalid mount units shouldn't result in leaked units.
			# Fixes b/152632012, from https://github.com/systemd/systemd/pull/10980.
			"${FILESDIR}"/239-mount-don-t-propagate-errors-from-mount_setup_unit-f.patch
			"${FILESDIR}"/239-Use-chronyd-as-the-default-NTP-service.patch
			# Cherry-pick of upstream commit:
			# https://github.com/systemd/systemd/commit/700805f6c546f2adb79059614f3747f7b5474325
			"${FILESDIR}"/242-meson-drop-misplaced-Wl-undefined-argument.patch
			# Cherry-pick of upsteam commit to fix b/171809082:
			# https://github.com/systemd/systemd/pull/9625/commits/987c138c19a45e9afe400d50ea797e64264f5fab
			"${FILESDIR}"/241-line-begins-match-full-string.patch
			# Backport of the upstream fix
			# https://github.com/systemd/systemd/commit/4df8fe8415eaf4abd5b93c3447452547c6ea9e5f
			"${FILESDIR}"/243-seccomp-old-libsec-fix.patch
			# Fixes b/182952897
			"${FILESDIR}"/246-basic-cap-list-parse-print-numerical-capabilities.patch
			# Do not stall network-wait-online when atleast one
			# protcol provides an address.
			# This is a mixture of
			# https://github.com/systemd/systemd/commit/552081a4992
			# and
			# https://github.com/systemd/systemd/commit/3cd5924c850.
			"${FILESDIR}"/239-no-stall-network-wait-online-for-ipv6.patch
	)
	default
}

src_configure() {
	# Prevent conflicts with i686 cross toolchain, bug 559726
	tc-export AR CC NM OBJCOPY RANLIB

	# lakitu: Need python setup only when doc USE flag is
	# enabled
	use doc && python_setup

	multilib-minimal_src_configure
}

meson_use() {
	usex "$1" true false
}

meson_multilib() {
	if multilib_is_native_abi; then
		echo true
	else
		echo false
	fi
}

meson_multilib_native_use() {
	if multilib_is_native_abi && use "$1"; then
		echo true
	else
		echo false
	fi
}

multilib_src_configure() {
	local myconf=(
		--localstatedir="${EPREFIX}/var"
		-Dpamlibdir="$(getpam_mod_dir)"
		# avoid bash-completion dep
		-Dbashcompletiondir="$(get_bashcompdir)"
		# lakitu: Do not want the "split-usr" USE flag
		# as it uses rootprefix as "/" and lakitu currently
		# uses "/usr"
		# make sure we get /bin:/sbin in PATH
		-Dsplit-usr=true
		-Drootprefix="$(usex split-usr "${EPREFIX:-/}" "${EPREFIX}/usr")"
		# lakitu: Install libraries at /usr/lib instead of /lib
		-Drootlibdir="$(usex split-usr "${EPREFIX:-/}" "${EPREFIX}/usr/$(get_libdir)")"
		-Dsysvinit-path=
		-Dsysvrcnd-path=
		# Avoid infinite exec recursion, bug 642724
		-Dtelinit-path="${EPREFIX}/lib/sysvinit/telinit"
		# no deps
		# lakitu: no efi
		# -Defi=$(meson_multilib)
		-Dima=true
		# Optional components/dependencies
		-Dacl=$(meson_multilib_native_use acl)
		-Dapparmor=$(meson_multilib_native_use apparmor)
		-Daudit=$(meson_multilib_native_use audit)
		-Dlibcryptsetup=$(meson_multilib_native_use cryptsetup)
		-Dlibcurl=$(meson_multilib_native_use curl)
		-Delfutils=$(meson_multilib_native_use elfutils)
		-Dgcrypt=$(meson_use gcrypt)
		-Dgnu-efi=$(meson_multilib_native_use gnuefi)
		-Defi-libdir="${EPREFIX}/usr/$(get_libdir)"
		-Dmicrohttpd=$(meson_multilib_native_use http)
		$(usex http -Dgnutls=$(meson_multilib_native_use ssl) -Dgnutls=false)
		-Dimportd=$(meson_multilib_native_use importd)
		-Dbzip2=$(meson_multilib_native_use importd)
		-Dzlib=$(meson_multilib_native_use importd)
		-Dkmod=$(meson_multilib_native_use kmod)
		-Dlz4=$(meson_use lz4)
		-Dxz=$(meson_use lzma)
		-Dlibiptc=$(meson_multilib_native_use nat)
		-Dpam=$(meson_use pam)
		-Dpcre2=$(meson_multilib_native_use pcre)
		-Dpolkit=$(meson_multilib_native_use policykit)
		-Dqrencode=$(meson_multilib_native_use qrcode)
		-Dseccomp=$(meson_multilib_native_use seccomp)
		-Dselinux=$(meson_multilib_native_use selinux)
		#-Dtests=$(meson_multilib_native_use test)
		-Ddbus=$(meson_multilib_native_use test)
		-Dxkbcommon=$(meson_multilib_native_use xkb)
		# hardcode a few paths to spare some deps
		-Dkill-path=/bin/kill
		# lakitu: specifying dbus policy dir path
		-Ddbuspolicydir="${EPREFIX}/etc/dbus-1/system.d"
		# Breaks screen, tmux, etc.
		-Ddefault-kill-user-processes=false
	)

	# lakitu specific enabled features
	myconf+=(
		-Dbinfmt=true
		-Dcoredump=true
		-Dhostnamed=true
		-Dldconfig=true
		-Dnetworkd=true
		-Dutmp=true
		-Dtimedated=true
		-Dtmpfiles=true
	)

	# lakitu: disable all features not used and not disabled by USE flags.
	# multilib options
	myconf+=(
		-Dbacklight=false
		-Defi=false
		-Denvironment-d=false
		-Dfirstboot=false
		-Dhibernate=false
		-Dhwdb=false
		-Dlocaled=false
		-Dmachined=false
		-Dman=false
		-Dquotacheck=false
		-Drandomseed=false
		-Drfkill=false
		-Dsysusers=false
		-Dtimesyncd=false
		-Dvconsole=false
	)

	if multilib_is_native_abi && use idn; then
		myconf+=(
			-Dlibidn2=$(usex libidn2 true false)
			-Dlibidn=$(usex libidn2 false true)
		)
	else
		myconf+=(
			-Dlibidn2=false
			-Dlibidn=false
		)
	fi

	meson_src_configure "${myconf[@]}"
}

multilib_src_compile() {
	eninja
}

multilib_src_test() {
	unset DBUS_SESSION_BUS_ADDRESS XDG_RUNTIME_DIR
	eninja test
}

multilib_src_install() {
	DESTDIR="${D}" eninja install
}

# lakitu specific src_install customizations.
lakitu_src_install() {
	dosym /usr/bin/udevadm sbin/udevadm
	dosym /usr/lib/systemd/systemd-udevd sbin/udevd
	dosym /run/systemd/resolve/resolv.conf etc/resolv.conf

	# Disable all sysctl settings. In ChromeOS sysctl.conf is
	# provided by chromeos-base.
	rm "${D}"/usr/lib/sysctl.d/*

	# Install our systemd-preset file.
	insinto /usr/lib/systemd/system-preset
	rm -f "${D}"/usr/lib/systemd/system-preset/*
	doins "${FILESDIR}"/00-lakitu.preset

	# lakitu: Disable getty on tty1 if VT console is not enabled.
	if ! use vtconsole; then
		rm  -f "${D}"/etc/systemd/system/getty.target.wants/getty@tty1.service
	fi

	# lakitu: Disable systemd-networkd-wait-line if networkd-wait-online is not enabled.
	# TODO: Remove this patch when we upgraded systemd to version greater
	# than 241.
	if ! use networkd-wait-online; then
		rm  -f "${D}"/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service
	fi

	# Install network files.
	insinto /usr/lib/systemd/network
	doins "${FILESDIR}"/*.network

	if ! use predictable-interface-name; then
		# Turn off Predictable Network Interface Names to minimize the
		# upgrade side-effects.
		# https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
		dosym /dev/null /etc/systemd/network/99-default.link
	fi

	# Enable accounting for all supported controllers (CPU, Memory and Block)
	sed -i 's/#DefaultCPUAccounting=no/DefaultCPUAccounting=yes/' "${ED}"/etc/systemd/system.conf
	sed -i 's/#DefaultBlockIOAccounting=no/DefaultBlockIOAccounting=yes/' "${ED}"/etc/systemd/system.conf
	sed -i 's/#DefaultMemoryAccounting=no/DefaultMemoryAccounting=yes/' "${ED}"/etc/systemd/system.conf

	# Set default log rotation policy: 100M for each journal; 1G total.
	sed -i 's/#SystemMaxUse=/SystemMaxUse=1G/' "${ED}"/etc/systemd/journald.conf
	sed -i 's/#SystemMaxFileSize=/SystemMaxFileSize=100M/' "${ED}"/etc/systemd/journald.conf

	# Enable persistent storage for the journal
	sed -i 's/#Storage=auto/Storage=persistent/' "${ED}"/etc/systemd/journald.conf
}

multilib_src_install_all() {
	local rootprefix=$(usex split-usr '' /usr)
	# meson doesn't know about docdir
	mv "${ED%/}"/usr/share/doc/{systemd,${PF}} || die

	use doc && einstalldocs

	# lakitu: Do not use nsswitch.conf
	# dodoc "${FILESDIR}"/nsswitch.conf

	if ! use resolvconf; then
		rm -f "${ED%/}${rootprefix}"/sbin/resolvconf || die
	fi

	if ! use sysv-utils; then
		rm "${ED%/}${rootprefix}"/sbin/{halt,init,poweroff,reboot,runlevel,shutdown,telinit} || die
		rm "${ED%/}"/usr/share/man/man1/init.1 || die
		rm "${ED%/}"/usr/share/man/man8/{halt,poweroff,reboot,runlevel,shutdown,telinit}.8 || die
	fi

	if ! use resolvconf && ! use sysv-utils; then
		rmdir "${ED%/}${rootprefix}"/sbin || die
	fi

	# Preserve empty dirs in /etc & /var, bug #437008
	keepdir /etc/{binfmt.d,modules-load.d,tmpfiles.d}
	keepdir /etc/systemd/{ntp-units.d,user} /var/lib/systemd
	# lakitu: Remove hwdb.d as it is not present at /etc/udev
	keepdir /etc/udev/rules.d
	keepdir /var/log/journal/remote

	# lakitu: Comment out this symlink since Lakitu board depends
	# on /etc/sysctl.d/00-sysctl.conf, and this is a broken link.
	# After our recent reflactoring, we can use 99-sysctl.conf in
	# the board only so that the board derivied from project-lakitu
	# can override the settings using board specific ones.
	# Symlink /etc/sysctl.conf for easy migration.
	# dosym ../sysctl.conf /etc/sysctl.d/99-sysctl.conf

	# lakitu: Following lines from Gentoo Upstream, but lakitu wants
	# networkd and resolved to start on boot
	# If we install these symlinks, there is no way for the sysadmin to remove them
	# permanently.
	#rm -f "${ED%/}"/etc/systemd/system/multi-user.target.wants/systemd-networkd.service || die
	#rm -f "${ED%/}"/etc/systemd/system/dbus-org.freedesktop.network1.service || die
	#rm -f "${ED%/}"/etc/systemd/system/multi-user.target.wants/systemd-resolved.service || die
	#rm -f "${ED%/}"/etc/systemd/system/dbus-org.freedesktop.resolve1.service || die
	#rm -fr "${ED%/}"/etc/systemd/system/network-online.target.wants || die
	#rm -fr "${ED%/}"/etc/systemd/system/sockets.target.wants || die
	#rm -fr "${ED%/}"/etc/systemd/system/sysinit.target.wants || die

	# lakitu specific
	lakitu_src_install

	# lakitu: Don't remove as these are present in systemd-232
	#local udevdir=/lib/udev
	#rm -r "${ED%/}${udevdir}/hwdb.d" || die

	if use split-usr; then
		# Avoid breaking boot/reboot
		dosym ../../../lib/systemd/systemd /usr/lib/systemd/systemd
		dosym ../../../lib/systemd/systemd-shutdown /usr/lib/systemd/systemd-shutdown
	fi
}

migrate_locale() {
	local envd_locale_def="${EROOT%/}/etc/env.d/02locale"
	local envd_locale=( "${EROOT%/}"/etc/env.d/??locale )
	local locale_conf="${EROOT%/}/etc/locale.conf"

	if [[ ! -L ${locale_conf} && ! -e ${locale_conf} ]]; then
		# If locale.conf does not exist...
		if [[ -e ${envd_locale} ]]; then
			# ...either copy env.d/??locale if there's one
			ebegin "Moving ${envd_locale} to ${locale_conf}"
			mv "${envd_locale}" "${locale_conf}"
			eend ${?} || FAIL=1
		else
			# ...or create a dummy default
			ebegin "Creating ${locale_conf}"
			cat > "${locale_conf}" <<-EOF
				# This file has been created by the sys-apps/systemd ebuild.
				# See locale.conf(5) and localectl(1).

				# LANG=${LANG}
			EOF
			eend ${?} || FAIL=1
		fi
	fi

	if [[ ! -L ${envd_locale} ]]; then
		# now, if env.d/??locale is not a symlink (to locale.conf)...
		if [[ -e ${envd_locale} ]]; then
			# ...warn the user that he has duplicate locale settings
			ewarn
			ewarn "To ensure consistent behavior, you should replace ${envd_locale}"
			ewarn "with a symlink to ${locale_conf}. Please migrate your settings"
			ewarn "and create the symlink with the following command:"
			ewarn "ln -s -n -f ../locale.conf ${envd_locale}"
			ewarn
		else
			# ...or just create the symlink if there's nothing here
			ebegin "Creating ${envd_locale_def} -> ../locale.conf symlink"
			ln -n -s ../locale.conf "${envd_locale_def}"
			eend ${?} || FAIL=1
		fi
	fi
}

pkg_postinst() {
	newusergroup() {
		enewgroup "$1"
		enewuser "$1" -1 -1 -1 "$1"
	}

	enewgroup input
	enewgroup systemd-journal
	newusergroup systemd-network
	newusergroup systemd-resolve
	newusergroup systemd-timesync

	# lakitu: disable groups not used
	# enewgroup kvm 78
	# enewgroup render
	# newusergroup systemd-bus-proxy
	# newusergroup systemd-coredump
	# newusergroup systemd-journal-gateway
	# newusergroup systemd-journal-remote
	# newusergroup systemd-journal-upload

	systemd_update_catalog

	# Keep this here in case the database format changes so it gets updated
	# when required. Despite that this file is owned by sys-apps/hwids.
	if has_version "sys-apps/hwids[udev]"; then
		udevadm hwdb --update --root="${EROOT%/}"
	fi

	udev_reload || FAIL=1

	# Bug 465468, make sure locales are respect, and ensure consistency
	# between OpenRC & systemd
	migrate_locale

	# lakitu: No need to reenable as the symlinks were not disabled above
	# systemd_reenable systemd-networkd.service systemd-resolved.service

	if [[ ${FAIL} ]]; then
		eerror "One of the postinst commands failed. Please check the postinst output"
		eerror "for errors. You may need to clean up your system and/or try installing"
		eerror "systemd again."
		eerror
	fi
}

pkg_prerm() {
	# If removing systemd completely, remove the catalog database.
	if [[ ! ${REPLACED_BY_VERSION} ]]; then
		rm -f -v "${EROOT}"/var/lib/systemd/catalog/database
	fi
}
