# Generate /etc/resolv.conf
# Support resolvconf(8) if available
# We can merge other dhcpcd resolv.conf files into one like resolvconf,
# but resolvconf is preferred as other applications like VPN clients
# can readily hook into it.
# Also, resolvconf can configure local nameservers such as bind
# or dnsmasq. This is important as the libc resolver isn't that powerful.

resolv_conf_dir="$state_dir/resolv.conf"

build_resolv_conf()
{
	local cf="$state_dir/resolv.conf.$interface"
	local interfaces= header= search= srvs= servers= x=

	# Build a list of interfaces
	interfaces=$(list_interfaces "$resolv_conf_dir")

	# Build the resolv.conf
	if [ -n "$interfaces" ]; then
		# Build the header
		for x in ${interfaces}; do
			header="$header${header:+, }$x"
		done

		# Build the search list
		domain=$(cd "$resolv_conf_dir"; \
			key_get_value "domain " ${interfaces})
		search=$(cd "$resolv_conf_dir"; \
			key_get_value "search " ${interfaces})
		set -- ${domain}
		unset domain
		if [ -n "$2" ]; then
			search="$search $@"
		elif [ -n "$1" ]; then
			domain="domain $1\n"
		fi
		[ -n "$search" ] && search="search $(uniqify $search)\n"

		# Build the nameserver list
		srvs=$(cd "$resolv_conf_dir"; \
			key_get_value "nameserver " ${interfaces})
		for x in $(uniqify ${srvs}); do
			servers="${servers}nameserver $x\n"
		done
	fi
	header="$signature_base${header:+ $from }$header"

	# Assemble resolv.conf using our head and tail files
	[ -f "$cf" ] && rm -f "$cf"
	[ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir"
	echo "$header" > "$cf"
	if [ -f /etc/resolv.conf.head ]; then
		cat /etc/resolv.conf.head >> "$cf"
	else
		echo "# /etc/resolv.conf.head can replace this line" >> "$cf"
	fi
	printf "$domain$search$servers" >> "$cf"
	if [ -f /etc/resolv.conf.tail ]; then
		cat /etc/resolv.conf.tail >> "$cf"
	else
		echo "# /etc/resolv.conf.tail can replace this line" >> "$cf"
	fi
	cat "$cf" > /etc/resolv.conf
	chmod 644 /etc/resolv.conf
	rm -f "$cf"
}

add_resolv_conf()
{
	local x= conf="$signature\n"

	# If we don't have any configuration, remove it
	if [ -z "$new_domain_name_servers" -a \
		-z "$new_domain_name" -a \
		-z "$new_domain_search" ]; then
		remove_resolv_conf
		return $?
	fi

	if [ -n "$new_domain_name" ]; then
		set -- $new_domain_name
		new_domain_name="$1"
		conf="${conf}domain $new_domain_name\n"
		# Support RFC violating search in domain
		if [ -z "$new_domain_search" -a -n "$2" ]; then
			new_domain_search="$@"
		fi
	fi
	if [ -n "$new_domain_search" ]; then
		conf="${conf}search $new_domain_search\n"
	fi
	for x in ${new_domain_name_servers}; do
		conf="${conf}nameserver $x\n"
	done
	if type resolvconf >/dev/null 2>&1; then
		[ -n "$metric" ] && export IF_METRIC="$metric"
		printf "$conf" | resolvconf -a "$interface"
		return $?
	fi

	if [ -e "$resolv_conf_dir/$interface" ]; then
		rm -f "$resolv_conf_dir/$interface"
	fi
	[ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir"
	printf "$conf" > "$resolv_conf_dir/$interface"
	build_resolv_conf
}

remove_resolv_conf()
{
	if type resolvconf >/dev/null 2>&1; then
		resolvconf -d "$interface" -f
	else
		if [ -e "$resolv_conf_dir/$interface" ]; then
			rm -f "$resolv_conf_dir/$interface"
		fi
		build_resolv_conf
	fi
}

if $if_up; then
	add_resolv_conf
elif $if_down; then
	remove_resolv_conf
fi
