#!/bin/busybox sh
#
# opkg - Multiarch support wrapper for opkg
#
# Copyright (C) 2020  Patrick McDermott
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

set -eu

BB='/bin/busybox'
BIN='/var/lib/opkg/bin'

save_bb()
{
	local file=
	local link=
	local name=
	local prio=

	"${BB}" mkdir "${BIN}" 2>/dev/null || :
	"${BB}" cp -p "${BB}" "${BIN}/busybox"

	while read file; do
		case "${file}" in
			/bin/busybox) ;;
			/bin/?* | /sbin/?* | /usr/bin/?* | /usr/sbin/?*)
				"${BB}" ln -sf 'busybox' "${BIN}/${file##*/}"
				;;
		esac
	done 0<<-EOF
		$(/usr/bin/opkg-cl files busybox)
		EOF

	while read link name prio; do
		"${BB}" ln -sf 'busybox' "${BIN}/${link##*/}"
	done 0</usr/share/busybox/alternatives

	export PATH="${PATH}:${BIN}"
	export OPKG_BUSYBOX_SAVED='1'

	return 0
}

unsave_bb()
{
	rm -f "${BIN}/"*
}

main()
{
	local first_arg=
	local arch_arg=
	local arg=

	first_arg=true
	arch_arg=''
	for arg in "${@}"; do
		if ${first_arg}; then
			set --
			if [ -e '/etc/opkg/opkg.conf' ]; then
				set -- "${@}" --conf '/etc/opkg/opkg.conf'
			fi
			set -- "${@}" \
				--add-arch all:100 \
				--add-arch "$(cat /etc/proteanos_arch):50" \
				--add-arch src:100
			first_arg=false
		elif [ -n "${arch_arg}" ]; then
			case "${arg}" in -* | '')
				printf '%s: Option "%s" requires an argument\n'\
					"${0}" "${arch_arg}" 1>&2
				return 1
			esac
			set -- "${@}" --add-arch "${arg}:100"
			arch_arg=''
			continue
		fi
		case "${arg}" in
			-a | --host-architecture)
				arch_arg="${arg}"
				continue
				;;
			-a*)
				arg="${arg#-a}"
				set -- "${@}" --add-arch "${arg}:100"
				continue
				;;
			--host-architecture=*)
				arch_arg="${arg%=*}"
				arg="${arg#--host-architecture=}"
				if [ -z "${arg}" ]; then
					printf '%s: Option "%s" requires '$(: \
						)'an argument\n' \
						"${0}" "${arch_arg}" 1>&2
					return 1
				fi
				set -- "${@}" --add-arch "${arg}:100"
				arch_arg=''
				continue
				;;
		esac
		set -- "${@}" "${arg}"
	done
	if [ -n "${arch_arg}" ]; then
		printf '%s: Option "%s" requires an argument\n' \
			"${0}" "${arch_arg}" 1>&2
		return 1
	fi

	save_bb

	if /usr/bin/opkg-cl "${@}"; then
		unsave_bb
		return 0
	else
		unsave_bb
		return ${?}
	fi
}

main "${@}"