# Sample dhcpcd hook for ypbind
# This script is only suitable for the BSD versions.

: ${ypbind_restart_cmd:=service_command ypbind restart}
: ${ypbind_stop_cmd:=service_condcommand ypbind stop}
ypbind_dir="$state_dir/ypbind"
: ${ypdomain_dir:=@YPDOMAIN_DIR@}
: ${ypdomain_suffix:=@YPDOMAIN_SUFFIX@}


best_domain()
{
	local i=

	for i in "$ypbind_dir/$interface_order".*; do
		if [ -f "$i" ]; then
			cat "$i"
			return 0
		fi
	done
	return 1
}

make_yp_binding()
{
	[ -d "$ypbind_dir" ] || mkdir -p "$ypbind_dir"
	echo "$new_nis_domain" >"$ypbind_dir/$ifname"

	if [ -z "$ypdomain_dir" ]; then
		false
	else
		local cf="$ypdomain_dir/$new_nis_domain$ypdomain_suffix"
		if [ -n "$new_nis_servers" ]; then
			local ncf="$cf.$ifname" x=
			rm -f "$ncf"
			for x in $new_nis_servers; do
				echo "$x" >>"$ncf"
			done
			change_file "$cf" "$ncf"
		else
			[ -e "$cf" ] && rm "$cf"
		fi
	fi

	local nd="$(best_domain)"
	if [ $? = 0 -a "$nd" != "$(domainname)" ]; then
		domainname "$nd"
		if [ -n "$ypbind_restart_cmd" ]; then
			eval $ypbind_restart_cmd
		fi
	fi
}

restore_yp_binding()
{

	rm -f "$ypbind_dir/$ifname"
	local nd="$(best_domain)"
	# We need to stop ypbind if there is no best domain
	# otherwise it will just stall as we cannot set domainname
	# to blank :/
	if [ -z "$nd" ]; then
		if [ -n "$ypbind_stop_cmd" ]; then
			eval $ypbind_stop_cmd
		fi
	elif [ "$nd" != "$(domainname)" ]; then
		domainname "$nd"
		if [ -n "$ypbind_restart_cmd" ]; then
			eval $ypbind_restart_cmd
		fi
	fi
}

if [ "$reason" = PREINIT ]; then
	rm -f "$ypbind_dir/$interface".*
elif $if_up || $if_down; then
	if [ -n "$new_nis_domain" ]; then
		if valid_domainname "$new_nis_domain"; then
			make_yp_binding
		else
			syslog err "Invalid NIS domain name: $new_nis_domain"
		fi
	elif [ -n "$old_nis_domain" ]; then
		restore_yp_binding
	fi
fi
