# 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="/etc/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
		search=$(cd "${resolv_conf_dir}"; \
			key_get_value "search " ${interfaces})
		[ -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}"
	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 "${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
	mv -f "${cf}" /etc/resolv.conf
}

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_search}" ]; then
		conf="${conf}search ${new_domain_search}\n"
	elif [ -n "${new_domain_name}" ]; then
		conf="${conf}search ${new_domain_name}\n"
	fi
	for x in ${new_domain_name_servers}; do
		conf="${conf}nameserver ${x}\n"
	done
	if type resolvconf >/dev/null 2>&1; then
		printf "${conf}" | resolvconf -a "${interface}"
		return $?
	fi

	if [ -e "${resolv_conf_dir}/${interface}" ]; then
		rm -f "${resolv_conf_dir}/${interface}"
	fi
	if [ ! -d "${resolv_conf_dir}" ]; then
		mkdir -p "${resolv_conf_dir}"
	fi
	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
}

case "${reason}" in
BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT)	add_resolv_conf;;
PREINIT|EXPIRE|FAIL|IPV4LL|RELEASE|STOP)	remove_resolv_conf;;
esac
