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

# @ECLASS: s6.eclass
# @MAINTAINER:
# William Hubbs <williamh@gentoo.org>
# @SUPPORTED_EAPIS: 5 6 7
# @BLURB: helper functions to install s6 services
# @DESCRIPTION:
# This eclass provides helpers to install s6 services.
# @EXAMPLE:
#
# @CODE
# inherit s6
#
# src_install() {
#	...
#	s6_install_service myservice "${FILESDIR}"/run-s6 "${FILESDIR}"/finish-s6
#	...
#	If you want a service to be logged, install the log service as
#	shown here.
#	s6_install_service myservice/log "${FILESDIR}"/log-run-s6 \
#		"${FILESDIR}"/log-finish-s6
#	...
# }
# @CODE

case ${EAPI:-0} in
	5|6|7) ;;
	*) die "${ECLASS}.eclass: API in EAPI ${EAPI} not yet established" ;;
esac

# @FUNCTION: _s6_get_servicedir
# @INTERNAL
# @DESCRIPTION:
# Get unprefixed servicedir.
_s6_get_servicedir() {
	echo /var/svc.d
}

# @FUNCTION: s6_get_servicedir
# @DESCRIPTION:
# Output the path for the s6 service directory (not including ${D}).
s6_get_servicedir() {
	debug-print-function ${FUNCNAME} "${@}"

	echo "${EPREFIX}$(_s6_get_servicedir)"
}

# @FUNCTION: s6_install_service
# @USAGE: <servicename> <run> [finish]
# @DESCRIPTION:
# Install an s6 service.
# servicename is the name of the service.
# run is the run script for the service.
# finish is the optional finish script for the service.
s6_install_service() {
	debug-print-function ${FUNCNAME} "${@}"

	local name="$1"
	local run="$2"
	local finish="$3"

	[[ $name ]] ||
		die "${ECLASS}.eclass: you must specify the s6 service name"
	[[ $run ]] ||
		die "${ECLASS}.eclass: you must specify the s6 service run script"

	(
	local servicepath="$(_s6_get_servicedir)/$name"
	exeinto "$servicepath"
	newexe "$run" run
	[[ $finish ]] && newexe "$finish" finish
	)
}

# @FUNCTION: s6_service_down
# @USAGE: <servicename>
# @DESCRIPTION:
# Install the "down" flag so this service will not be started by
# default.
# servicename is the name of the service.
s6_service_down() {
	debug-print-function ${FUNCNAME} "${@}"

	local name="$1"

	[[ $name ]] ||
		die "${ECLASS}.eclass: you must specify the s6 service name"

	(
	touch "$T"/down || die
	local servicepath="$(_s6_get_servicedir)/$name"
	insinto "$servicepath"
	doins "$T"/down
	)
}

# @FUNCTION: s6_service_nosetsid
# @USAGE: <servicename>
# @DESCRIPTION:
# Install the "nosetsid" flag so this service will not be made a session
# leader.
# servicename is the name of the service.
s6_service_nosetsid() {
	debug-print-function ${FUNCNAME} "${@}"

	local name="$1"

	[[ $name ]] ||
		die "${ECLASS}.eclass: you must specify the s6 service name"

	(
	touch "$T"/nosetsid || die
	local servicepath="$(_s6_get_servicedir)/$name"
	insinto "$servicepath"
	doins "$T"/nosetsid
	)
}
