#!/bin/bash
# Need bash because we use nullglob, extglob
#
# list-records
#
# Print, one per line, names of non-empty files in the current directory
# that match the shell glob patterns in /etc/resolvconf/interface-order

set -e

# Stores arguments (minus duplicates) in RSLT, separated by newlines
# Doesn't work properly if an argument itself contain whitespace
uniquify()
{
	RSLT=""
	while [ "$1" ] ; do
		for E in $RSLT ; do
			[ "$1" = "$E" ] && { shift ; continue 2 ; }
		done
		RSLT="${RSLT:+$RSLT
}$1"
		shift
	done
}

### Compile ordered list of resolv.conf-type files ###

# The following must be the content of the factory-provided interface-order file
PATTERNS="lo.inet6
lo.inet
lo.@(dnsmasq|pdnsd)
lo.!(pdns|pdns-recursor)
lo
tun*
tap*
hso*
em+([0-9])?(_+([0-9]))*
p+([0-9])p+([0-9])?(_+([0-9]))*
eth*([^.]).inet6
eth*([^.]).ip6.@(dhclient|dhcpcd|pump|udhcpc)
eth*([^.]).inet
eth*([^.]).@(dhclient|dhcpcd|pump|udhcpc)
eth*
@(ath|wifi|wlan)*([^.]).inet6
@(ath|wifi|wlan)*([^.]).ip6.@(dhclient|dhcpcd|pump|udhcpc)
@(ath|wifi|wlan)*([^.]).inet
@(ath|wifi|wlan)*([^.]).@(dhclient|dhcpcd|pump|udhcpc)
@(ath|wifi|wlan)*
ppp*
*"
if [ -r /etc/resolvconf/interface-order ] ; then
	PATTERNS="$(sed -e '
		s/^[[:space:]]\+//
		s/[[:space:]].*//
		s/#.*//
		/\//d
		/^~/d
		/^\./d
		/^$/d
		' /etc/resolvconf/interface-order)"
fi

shopt -s nullglob extglob
# The nullglob option isn't essential since the test -s below will eliminate
# any unexpanded patterns.  The extglob option makes the glob language of
# interface-order patterns as powerful as regexps.

# Pathname expansion occurs on the following line resulting, in general,
# in multiple instances of filenames; duplicates must be removed.
uniquify $PATTERNS
for FLNM in $RSLT ; do
	# Only list records of non-zero size
	[ -s "$FLNM" ] && echo "$FLNM"
done
exit 0
