#!/bin/sh

prog="rpcinfo"

usage()
{
	cat >&2 <<EOF
Usage: $prog -T tcp host program [version]

A fake rpcinfo stub that succeeds for items in FAKE_RPCINFO_SERVICES,
depending on command-line options.

EOF
	exit 1
}

parse_options()
{
	while getopts "T:h?" opt; do
		case "$opt" in
		T) netid="$OPTARG" ;;
		\? | h) usage ;;
		esac
	done
	shift $((OPTIND - 1))

	[ "$netid" = "tcp" ] || usage

	host="$1"
	shift
	[ "$host" = "localhost" ] || [ "$host" = "127.0.0.1" ] || usage

	if [ $# -lt 1 ] || [ $# -gt 2 ]; then
		usage
	fi

	p="$1"
	v="$2"
}

parse_options "$@"

for i in ${FAKE_RPCINFO_SERVICES}; do
	# This is stupidly cumulative, but needs to happen after the
	# initial split of the list above.
	IFS="${IFS}:"
	# Want glob expansion
	# shellcheck disable=SC2086
	set -- $i
	# $1 = program, $2 = low version, $3 = high version

	if [ "$1" = "$p" ]; then
		if [ -n "$v" ]; then
			if [ "$2" -le "$v" ] && [ "$v" -le "$3" ]; then
				echo "program ${p} version ${v} ready and waiting"
				exit 0
			else
				echo "rpcinfo: RPC: Program/version mismatch; low version = ${2}, high version = ${3}" >&2
				echo "program ${p} version ${v} is not available"
				exit 1
			fi
		else
			for j in $(seq "$2" "$3"); do
				echo "program ${p} version ${j} ready and waiting"
			done
			exit 0
		fi
	fi
done

echo "rpcinfo: RPC: Program not registered" >&2
if [ -n "$v" ]; then
	echo "program ${p} version ${v} is not available"
else
	echo "program ${p} is not available"
fi

exit 1
