#!/bin/bash -efu

. shell-error
. shell-signal

message_time=1
pidfile="/var/run/$PROG.pid"
logfile="/var/log/$PROG.log"

exit_handler()
{
	local rc="$?"
	trap - EXIT
	rm -f -- "$pidfile"
	exit $rc
}

[ ! -f "$pidfile" ] ||
	fatal "already running"

set_cleanup_handler exit_handler
echo "$$" >"$pidfile"

. pipeline-sh-functions


[ "${RDLOG-}" != 'console' ] ||
	logfile=/dev/console

exec >"$logfile" 2>&1
message "Starting server ..."

mkdir -p -- "$mntdir"

mountpoint -q "$mntdir" ||
	mount -t tmpfs tmpfs "$mntdir" ||:

pipenum=0
pipe="$PIPELINE"
datadir=
destdir=

while [ -n "$pipe" ]; do
	name="${pipe%%,*}"
	exe="$handlerdir/$name"

	if [ -x "$exe" ]; then
		eval "callnum=\"\${callnum_$name:-0}\""

		datadir="$mntdir/src/pipe$pipenum"
		destdir="$mntdir/dst/pipe$pipenum"

		[ "$pipenum" != 0 ] ||
			prevdir=""

		mkdir -p -- "$datadir" "$destdir"

		if ! mountpoint -q "$destdir"; then
			message "[$callnum] Handler: $exe"

			export name callnum datadir destdir prevdir

			rc=0
			"$exe" || rc=$?

			if [ "$rc" != 0 ]; then
				[ "$rc" != 2 ] ||
					break
				message "[$callnum] Handler failed (rc=$rc)"
				sleep 1
				continue
			fi
		else
			message "[$callnum] Handler: $exe skipped"
		fi

		prevdir="$destdir"

		callnum=$(($callnum + 1))
		eval "callnum_$name=\"\$callnum\""
	fi

	pipe="${pipe#$name}"
	pipe="${pipe#,}"

	pipenum=$(($pipenum + 1))
done
