#!/bin/sh

set -eu

get_iface_opts()
{
	local opts_start_cb="${1}"
	local opt_cb="${2}"
	local opts_end_cb="${3}"
	local script=
	local opts=
	local opt=

	script="$(printf '
		/^iface[ \t][ \t]*%s/,/^[^ \t]/{
			/^$/q;
			s/^[ \t][ \t]*%s-//p;
		}
		' "${IFACE}" "${0##*/}")"

	opts="$(sed -n "${script}" /var/run/net-ifaces)"
	if [ "x${opts}" = 'x' ]; then
		return 0
	fi

	${opts_start_cb}
	while read -r opt; do
		${opt_cb} ${opt}
	done <<-EOF
		${opts}
		EOF
	${opts_end_cb}

	return 0
}

wpa_opts_start_cb()
{
	exec 3>"/var/run/wpa_supplicant.${IFACE}.conf"
	printf 'ctrl_interface=DIR=/var/run/wpa_supplicant\ncountry=US\n\n' >&3
	printf 'network={\n' >&3
}

wpa_opt_cb()
{
	local field="${1}"
	shift 1
	local value="${*}"

	field="$(printf '%s\n' "${field}" | tr '-' '_')"
	case "${field}" in
		ssid)
			if printf '%s\n' "${value}" | grep -q '[^0-9A-Fa-f:]'
			then
				if [ "x${value#\"}" = "x${value}" ]; then
					value="\"${value}\""
				fi
			fi
			;;
		psk)
			if printf '%s\n' "${value}" | grep -q '[^0-9A-Fa-f]'
			then
				if [ "x${value#\"}" = "x${value}" ]; then
					value="\"${value}\""
				fi
			fi
			;;
	esac
	printf '\t%s=%s\n' "${field}" "${value}" >&3
}

wpa_opts_end_cb()
{
	printf '}\n' >&3
	exec &3>-
	wpa_supplicant -B -s -Dnl80211 -i"${IFACE}" \
		-c"/var/run/wpa_supplicant.${IFACE}.conf"
}

if [ "x${IFACE#wlan}" != "x${IFACE}" ]; then
	get_iface_opts wpa_opts_start_cb wpa_opt_cb wpa_opts_end
fi