# Set the hostname from DHCP data if required

# Generally we should not set the system hostname to be fully qualified
: ${hostname_fqdn:=false}

# Some systems don't have hostname(1)
_hostname()
{
	local name=

	if [ -z "$1" ]; then
		if type hostname >/dev/null 2>&1; then
			hostname
		elif [ -r /proc/sys/kernel/hostname ]; then
			read name </proc/sys/kernel/hostname && echo "$name"
		elif sysctl kern.hostname >/dev/null 2>&1; then
			sysctl -n kern.hostname
		elif sysctl kernel.hostname >/dev/null 2>&1; then
			sysctl -n kernel.hostname
		else
			return 1
		fi
		return $?
	fi

	# Always prefer hostname(1) if we have it
	if type hostname >/dev/null 2>&1; then
		hostname "$1"
	elif [ -w /proc/sys/kernel/hostname ]; then
		echo "$1" >/proc/sys/kernel/hostname
	elif sysctl kern.hostname >/dev/null 2>&1; then
		sysctl -w "kern.hostname=$1"
	elif sysctl kernel.hostname >/dev/null 2>&1; then
		sysctl -w "kernel.hostname=$1"
	else
		# We know this will fail, but it will now fail
		# with an error to stdout
		hostname "$1"
	fi
}

need_hostname()
{
	local hostname hfqdn

	case "$force_hostname" in
	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) return 0;;
	esac

	hostname="$(_hostname)"
	case "$hostname" in
	""|"(none)"|localhost|localhost.localdomain) return 0;;
	esac
	
	case "$hostname_fqdn" in
	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1)	hfqdn=true;;
	*)					hfqdn=false;;
	esac

	if [ -n "$old_fqdn_name" ]; then
		if ${hfqdn}; then
			[ "$hostname" = "$old_fqdn_name" ]
		else	
			[ "$hostname" = "${old_fqdn_name%%.*}" ]
		fi
	elif [ -n "$old_host_name" ]; then
		if ${hfqdn}; then
			if [ -n "$old_domain_name" -a \
			    "$old_host_name" = "${old_host_name#*.}" ]
			then
				[ "$hostname" = \
				    "$old_host_name.$old_domain_name" ]
			else
				[ "$hostname" = "$old_host_name" ]
			fi
		else
			[ "$hostname" = "${old_host_name%%.*}" ]
		fi
	fi
}

try_hostname()
{

	if valid_domainname "$1"; then
		_hostname "$1"
	else
		syslog err "Invalid hostname: $1"
	fi
}

set_hostname()
{
	local hfqdn

	need_hostname || return

	case "$hostname_fqdn" in
	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1)	hfqdn=true;;
	*)					hfqdn=false;;
	esac

	if [ -n "$new_fqdn_name" ]; then
		if ${hfqdn}; then
			try_hostname "$new_fqdn_name"
		else
			try_hostname "${new_fqdn_name%%.*}"
		fi
	elif [ -n "$new_host_name" ]; then
		if ${hfqdn}; then
			if [ -n "$new_domain_name" -a \
			    "$new_host_name" = "${new_host_name#*.}" ]
			then
				try_hostname "$new_host_name.$new_domain_name"
			else
				try_hostname "$new_host_name"
			fi
		else
			try_hostname "${new_host_name%%.*}"
		fi
	fi
}

# For ease of use, map DHCP6 names onto our DHCP4 names
case "$reason" in
BOUND6|RENEW6|REBIND6|REBOOT6|INFORM6)
	new_fqdn_name="$new_dhcp6_fqdn"
	;;
esac

if $if_up; then
	set_hostname
fi
