tmpfiles: Import eclass from upstream

This eclass is used by app-admin/sudo-1.8.25_p1-r1.

BUG=chromium:905444
TEST=Merged app-admin/sudo.

Change-Id: I915e04adfea3dd3aad6f6e91e7afd93b6422f42b
Reviewed-on: https://chromium-review.googlesource.com/1345310
Commit-Ready: Abe Levkoy <alevkoy@chromium.org>
Tested-by: Abe Levkoy <alevkoy@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/eclass/tmpfiles.eclass b/eclass/tmpfiles.eclass
new file mode 100644
index 0000000..a1f155e
--- /dev/null
+++ b/eclass/tmpfiles.eclass
@@ -0,0 +1,139 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: tmpfiles.eclass
+# @MAINTAINER:
+# Gentoo systemd project <systemd@gentoo.org>
+# William Hubbs <williamh@gentoo.org>
+# @AUTHOR:
+# Mike Gilbert <floppym@gentoo.org>
+# William Hubbs <williamh@gentoo.org>
+# @SUPPORTED_EAPIS: 5 6
+# @BLURB: Functions related to tmpfiles.d files
+# @DESCRIPTION:
+# This eclass provides functionality related to installing and
+# creating volatile and temporary files based on configuration files$and
+# locations defined at this URL:
+#
+# https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html
+#
+# The dotmpfiles and newtmpfiles functions are used to install
+# configuration files into /usr/lib/tmpfiles.d, then in pkg_postinst,
+# the tmpfiles_process function must be called to process the newly
+# installed tmpfiles.d entries.
+#
+# The tmpfiles.d files can be used by service managers to recreate/clean
+# up temporary directories on boot or periodically. Additionally,
+# the pkg_postinst() call ensures that the directories are created
+# on systems that do not support tmpfiles.d natively, without a need
+# for explicit fallback.
+#
+# @EXAMPLE:
+# Typical usage of this eclass:
+#
+# @CODE
+#	EAPI=6
+#	inherit tmpfiles
+#
+#	...
+#
+#	src_install() {
+#		...
+#		dotmpfiles "${FILESDIR}"/file1.conf "${FILESDIR}"/file2.conf
+#		newtmpfiles "${FILESDIR}"/file3.conf-${PV} file3.conf
+#		...
+#	}
+#
+#	pkg_postinst() {
+#		...
+#		tmpfiles_process file1.conf file2.conf file3.conf
+#		...
+#	}
+#
+# @CODE
+
+if [[ -z ${TMPFILES_ECLASS} ]]; then
+TMPFILES_ECLASS=1
+
+case "${EAPI}" in
+5|6) ;;
+*) die "API is undefined for EAPI ${EAPI}" ;;
+esac
+
+RDEPEND="virtual/tmpfiles"
+
+# @FUNCTION: dotmpfiles
+# @USAGE: dotmpfiles <tmpfiles.d_file> ...
+# @DESCRIPTION:
+# Install one or more tmpfiles.d files into /usr/lib/tmpfiles.d.
+dotmpfiles() {
+	debug-print-function "${FUNCNAME}" "$@"
+
+	local f
+	for f; do
+		if [[ ${f} != *.conf ]]; then
+			die "tmpfiles.d files must end with .conf"
+		fi
+	done
+
+	(
+		insopts -m 0644
+		insinto /usr/lib/tmpfiles.d
+		doins "$@"
+	)
+}
+
+# @FUNCTION: newtmpfiles
+# @USAGE: newtmpfiles <old-name> <new-name>.conf
+# @DESCRIPTION:
+# Install a tmpfiles.d file in /usr/lib/tmpfiles.d under a new name.
+newtmpfiles() {
+	debug-print-function "${FUNCNAME}" "$@"
+
+	if [[ $2 != *.conf ]]; then
+		die "tmpfiles.d files must end with .conf"
+	fi
+
+	(
+		insopts -m 0644
+		insinto /usr/lib/tmpfiles.d
+		newins "$@"
+	)
+}
+
+# @FUNCTION: tmpfiles_process
+# @USAGE: tmpfiles_process <filename> <filename> ...
+# @DESCRIPTION:
+# Call a tmpfiles.d implementation to create new volatile and temporary
+# files and directories.
+tmpfiles_process() {
+	debug-print-function "${FUNCNAME}" "$@"
+
+	[[ ${EBUILD_PHASE} == postinst ]] || die "${FUNCNAME}: Only valid in pkg_postinst"
+	[[ ${#} -gt 0 ]] || die "${FUNCNAME}: Must specify at least one filename"
+
+	# Only process tmpfiles for the currently running system
+	if [[ ${ROOT} != / ]]; then
+		ewarn "Warning: tmpfiles.d not processed on ROOT != /. If you do not use"
+		ewarn "a service manager supporting tmpfiles.d, you need to run"
+		ewarn "the following command after booting (or chroot-ing with all"
+		ewarn "appropriate filesystems mounted) into the ROOT:"
+		ewarn
+		ewarn "  tmpfiles --create"
+		ewarn
+		ewarn "Failure to do so may result in missing runtime directories"
+		ewarn "and failures to run programs or start services."
+		return
+	fi
+
+	if type systemd-tmpfiles &> /dev/null; then
+		systemd-tmpfiles --create "$@"
+	elif type tmpfiles &> /dev/null; then
+		tmpfiles --create "$@"
+	fi
+	if [[ $? -ne 0 ]]; then
+		ewarn "The tmpfiles processor exited with a non-zero exit code"
+	fi
+}
+
+fi