#!/bin/sh
# -d for description
# -s "iface iface" for SKIP iface in list
# -o "iface" - show ONLY iface in list
: ${distdir="/usr/local/cbsd"}
# MAIN
if [ -z "${workdir}" ]; then
	[ -z "${cbsd_workdir}" ] && . /etc/rc.conf
	[ -z "${cbsd_workdir}" ] && exit 0
	workdir="${cbsd_workdir}"
fi

[ ! -f "${workdir}/cmd.subr" ] && exit 1

. ${workdir}/cmd.subr

DESC=0
ALL=0
SKIP="ipfw ppp sl lp faith fwe fwip plip pfsync pflog tun vboxnet"

while getopts "ado:s:" opt; do
	case "${opt}" in
		a)
			ALL=1
			;;
		d)
			DESC=1
			;;
		o)
			ONLY_IF="${OPTARG}"
			;;
		s)
			SKIP="${SKIP} ${OPTARG}"
			;;
	esac
	shift $(($OPTIND - 1))
done

[ ${ALL} -eq 1 ] && SKIP=""

all_ifconfig_nic=

platform=$( uname -s )

case "${platform}" in
	Linux)
		for i in $( ls /sys/class/net ); do
			if [ -n "${all_ifconfig_nic}" ]; then
				all_ifconfig_nic="${all_ifconfig_nic} ${i}"
			else
				all_ifconfig_nic="${i}"
			fi
		done
		;;
	*)
		all_ifconfig_nic=$( ${IFCONFIG_CMD} -l )
		;;
esac

all_ifconfig_nic_sorted=$( for i in ${all_ifconfig_nic}; do
echo ${i}
done | sort )

unset all_ifconfig_nic

for i in ${all_ifconfig_nic_sorted}; do

	if_skip=0

	tif="${i%%[0-9]*}"

	for n in ${SKIP}; do
		[ "${n}" = "${tif}" ] && if_skip=1 && break
	done

	for n in ${ONLY_IF}; do
		[ "${n}" != "${tif}" ] && if_skip=1 && break
	done

	[ ${if_skip} -eq 1 ] && continue

	if [ ${DESC} -eq 1 ]; then
		#this need for rewrite to more stable and simple code
		case "${platform}" in
			Linux)
				uptest=$( ${CAT_CMD} /sys/class/net/${i}/operstate 2>/dev/null )
				;;
			*)
				uptest=$( ${IFCONFIG_CMD} ${i} | ${AWK_CMD} '/status: /{printf $2}' )
				;;
		esac

		case "${uptest}" in
			active|associated|up)
				STATUS="UP"
				;;
			no*|down)
				STATUS="DOWN"
				;;
			*)
				STATUS="NO STATE"
		esac

		case "${tif}" in
			lo)
				IDENT="software loopback"
				;;
			vtnet)
				IDENT="VirtIO Ethernet driver"
				;;
			*)
				case "${platform}" in
					Linux)
						_vendor=$( ${CAT_CMD} /sys/class/net/enp1s0f1/device/vendor )
						if [ -n "${_vendor}" ]; then
							_vendor_id=$( echo "${_vendor}" | ${SED_CMD} 's:0x::g' )
							IDENT=$( ${GREP_CMD} "^${_vendor_id} " /usr/share/hwdata/pci.ids )
						fi
						;;
					*)
						IDENT=$( /usr/sbin/pciconf -vl | ${GREP_CMD} -A4 ^${i} | ${GREP_CMD} -E "device*=*" | ${CUT_CMD} -d "=" -f 2 | ${XARGS_CMD} )
						;;
				esac
				;;
		esac
		[ -z "${IDENT}" ] && IDENT="Unknown vendor"
		# this is not work in msk0: its looks like:
		# mskc0@pci0:3:0:0:       class=0x020000 card=0x84391043 chip=0x438111ab rev=0x11 hdr=0x00
		# vendor     = 'Marvell Technology Group Ltd.'
		# device     = 'Yukon Optima 88E8059 [PCIe Gigabit Ethernet Controller with AVB]'
		# class      = network
		# subclass   = ethernet
		# - in pciconv, not msk0
		echo "${i}: $IDENT: ${STATUS}"
	else
		echo "${i}"
	fi

done
