# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

# @ECLASS: s6.eclass
# @MAINTAINER:
# William Hubbs <williamh@gentoo.org>
# @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) ;;
	*) 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
	)
}
