# Compatibility layer for netifrc to work with multiple init
# systems.
# shellcheck shell=sh disable=SC1008

# First check whether e* commands are present in the environment
if [ x$RC_GOT_FUNCTIONS = xyes -o -n "$(command -v ebegin 2>/dev/null)" ]; then
	:

# Then check for the presence of functions.sh
elif [ -f /lib/gentoo/functions.sh ]; then
	. /lib/gentoo/functions.sh

else
	echo "/lib/gentoo/functions.sh not found. Exiting"
	exit 1
fi

# runscript functions
# TODO: if another non-openrc system provides these in future, we have to
# change this structure.
if [ "$INIT" != "openrc" ]; then

	# OpenRC functions used in depend
	after() {
		:
	}
	before() {
		:
	}
	program() {
		:
	}
	need() {
		:
	}

	shell_var() {
		local output= sanitized_arg=
		for arg; do
			sanitized_arg=$arg
			while :; do
				case $sanitized_arg in
				*[!a-zA-Z0-9_]*)
					sanitized_arg=${sanitized_arg%%[!a-zA-Z0-9_]*}_${sanitized_arg#*[!a-zA-Z0-9_]}
					continue;;
				esac
				break
			done
			if [ x"$output" = x"" ] ; then
				output=$sanitized_arg
			else
				output="$output $sanitized_arg"
			fi
		done
		echo "$output"
	}

	net_fs_list="afs ceph cifs coda davfs fuse fuse.sshfs gfs glusterfs lustre ncpfs nfs nfs4 ocfs2 shfs smbfs"
	is_net_fs()
	{
		[ -z "$1" ] && return 1

		local fs=$(mount | grep " on $1 " | cut -f 5 -d ' ')
		for x in $fs; do
			for y in $net_fs_list; do
				[ "$x" = "$y" ] && return 0
			done
		done
		return 1
	}

	service_set_value() {
		local OPTION="$1" VALUE="$2"
		if [ -z "$OPTION" ]; then
			eerror "service_set_value requires parameter KEY"
			return
		fi
		local file="$OPTIONSDIR/${OPTION}"
		echo "$VALUE" > $file
	}
	service_get_value() {
		local OPTION="$1"
		if [ -z "$OPTION" ]; then
			eerror "service_get_value requires parameter KEY"
			return
		fi
		local file="$OPTIONSDIR/${OPTION}"
		cat $file 2>/dev/null
	}
	STATEFILE="${STATEDIR}/state"
	# Internal Function
	# Stores the state of netifrc in ${SVCDIR}/${SVCNAME}/state file
	_mark_service() {
		local state=$1
		echo $state > $STATEFILE
	}
	#Internal Function
	# Checks whether the state of netifrc is same as $1
	_service_state() {
		state=$(cat $STATEFILE 2>/dev/null)
		if [ state = $1 ]; then
			return 1
		fi
		return 0
	}

	mark_service_started() {
		_mark_service started
	}
	mark_service_inactive() {
		_mark_service inactive
	}
	mark_service_stopped() {
		_mark_service stopped
	}
	service_started() {
		_service_state started
		return $?
	}
	service_inactive() {
		_service_state inactive
		return $?
	}
fi

# Extracts the interface for the current invocation
get_interface() {
	case $INIT in
		openrc)
			printf ${RC_SVCNAME#*.};;
		systemd)
			printf ${RC_IFACE};;
		*)
			eerror "Init system not supported. Aborting"
			exit 1;;
	esac
}

# runs a command in a network namespace
_netns()
{
	local netns
	eval netns="\$netns_${IFVAR}"

	if [ -n "${netns}" ] && [ -e /run/netns/"${netns}" ]; then
		# we always want to use the system "ip" command, not the busybox internal
		local ip
		if ! ip=$(command -v ip 2>/dev/null) || [ ! -x "${ip}" ]; then
			eerror "Cannot use network namespaces without iproute2"
			exit 1
		fi
		# shellcheck disable=SC2016
		case "${1}" in
			ip)
				shift
				"${ip}" -n "${netns}" "${@}"
			;;
			glob) "${ip}" netns exec "${netns}" /bin/sh -c 'printf "%s\\n" ${@}' "${@}";;
			echo|printf) "${ip}" netns exec "${netns}" /bin/sh -c "${*}";;
			*) "${ip}" netns exec "${netns}" "${@}";;
		esac
	else
		# shellcheck disable=SC2048
		case "${1}" in
			ip)
				shift
				ip "${@}"
			;;
			glob)
				shift
				eval printf '%s\\n' "${@}"
			;;
			echo|printf) eval "${@}";;
			*) "${@}";;
		esac
	fi
}


# vim: ts=4 sw=4 noexpandtab