#!/usr/local/bin/cbsd
#v11.0.7
MYARG="ip"
MYOPTARG="mode skip"
MYDESC="Return network interface name by IP"
ADDHELP="
mode=route (default) - detect interface for routing\n\
mode=strict - match IP on local interface only (check for ip existance)\n\
skip= skip for interface(s), e.g: skip=\"bridge\"\n"

. ${subrdir}/nc.subr
skip=
. ${cbsdinit}
[ -z "${mode}" ] && mode="route"

ipwmask ${ip}
iptype ${IWM}
_inet=$?

[ ${_inet} -eq 0 ] && err 1 "not ip"

if [ -z "${skip}" ]; then
	ifs=$( ${miscdir}/nics-list | ${XARGS_CMD} )
else
	ifs=$( ${miscdir}/nics-list -s "${skip}" | ${XARGS_CMD} )
fi

iface=

# search on local iface first
for iface in ${ifs}; do
	case "${_inet}" in
		1)
			A=$( ${IFCONFIG_CMD} ${iface} | ${AWK_CMD} '/inet [0-9]+/{print $2}' | ${GREP_CMD} ^${IWM}$ 2>/dev/null )
			;;
		2)
			A=$( ${IFCONFIG_CMD} ${iface} |  ${AWK_CMD} '/inet6 *:*+/{print $2}'| ${GREP_CMD} -v %${iface}$ | ${GREP_CMD} ^${IWM}$ 2>/dev/null )
			;;
	esac
	[ -n "${A}" ] && break
done

if [ -n "${A}" ]; then
	err 0 "${iface}"
fi

# strict search end here ^^
[ "${mode}" = "strict" ] && exit 1

case ${_inet} in
	1)
		MODIF="-inet"
		;;
	2)
		MODIF="-inet6"
		;;
esac

IFACE=$( /sbin/route -n get ${MODIF} ${IWM} 2>/dev/null | ${AWK_CMD} '/interface:/{print $2}' )

# return default
[ -z ${IFACE} ] && IFACE="lo0"
err 0 ${IFACE}
