# Sample dhcpcd hook for ypbind
# This script is only suitable for the Linux version.

: ${ypbind_restart_cmd:=service_command ypbind restart}
: ${ypbind_stop_cmd:=service_condcommand ypbind stop}
ypbind_dir="$state_dir/ypbind"

best_domain()
{
	local i=

	for i in $interfaces; do
		if [ -e "$ypbind_dir/$i" ]; then
			cat "$ypbind_dir/$i"
		fi
	done
	return 1
}

make_yp_binding()
{
	[ -d "$ypbind_dir" ] || mkdir -p "$ypbind_dir"
	echo "$new_nis_domain" >"$ypbind_dir/$interface"
	local nd="$(best_domain)"

	local cf=/var/yp/binding/"$new_nis_domain".ypservers
	if [ -n "$new_nis_servers" ]; then
		local ncf="$cf.$interface" x=
		rm -f "$ncf"
		for x in $new_nis_servers; do
			echo "$x" >>"$ncf"
		done
		change_file "$cf" "$ncf"
	else
		# Because this is not an if .. fi then we can use $? below
		[ -e "$cf" ] && rm "$cf"
	fi

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

restore_yp_binding()
{
	rm -f "$ypbind_dir/$interface"
	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
		make_yp_binding
	elif [ -n "$old_nis_domain" ]; then
		restore_yp_binding
	fi
fi
