#!/bin/sh
#
# $NetBSD: sendmail,v 1.21 2004/08/19 04:44:10 atatat Exp $
#

# PROVIDE: mail
# REQUIRE: LOGIN
#	we make mail start late, so that things like .forward's are not
#	processed until the system is fully operational

$_rc_subr_loaded . /etc/rc.subr

name="sendmail"
rcvar=$name
command="/usr/sbin/${name}"
pidfile="/var/run/${name}.pid"
required_files="/etc/mail/sendmail.cf"
start_precmd="sendmail_precmd"

sendmail_precmd()
{
	# Die if there's pre-8.10 custom configuration file.  This check is
	# mandatory for smooth upgrade.  See NetBSD PR 10100 for details.
	#
	if checkyesno sendmail && [ -f "/etc/${name}.cf" ]; then
		if ! cmp -s "/etc/mail/${name}.cf" "/etc/${name}.cf"; then
			warn \
    "${name} was not started; you have multiple copies of sendmail.cf."
			return 1
		fi
	fi

	# check modifications on /etc/mail/aliases
	if [ -f "/etc/mail/aliases.db" ]; then
		if [ ! "/etc/mail/aliases" -ot "/etc/mail/aliases.db" ]; then
			echo \
	    "${name}: /etc/mail/aliases newer than /etc/mail/aliases.db, regenerating"
			/usr/bin/newaliases
		fi
	else
		echo \
	    "${name}: /etc/mail/aliases.db not present, generating"
			/usr/bin/newaliases
	fi

	# check couple of common db files, too
	for f in access genericstable virtusertable domaintable mailertable; do
		if [ -r "/etc/mail/$f" -a \
		    ! "/etc/mail/$f" -ot "/etc/mail/$f.db" ]; then
			echo \
    "${name}: /etc/mail/$f newer than /etc/mail/$f.db, regenerating"
			/usr/sbin/makemap hash /etc/mail/$f < /etc/mail/$f
		fi
	done

	if checkyesno sendmail_suidroot; then
		_owner_fmt="%p %Su"
		_def_owner="104555 root"
		_sm_root="true"
	else
		_owner_fmt="%p %Su %Sg"
		_def_owner="102555 root smmsp"
		_sm_root="false"
	fi
	_def_version="10"
	_def_cqueuemode="40770 smmsp smmsp"

	_owner=$(stat -qf"${_owner_fmt}" /usr/libexec/sendmail/sendmail)
	_cfversion=$(sed -n 's/^V *\([0-9]*\).*/\1/p' /etc/mail/sendmail.cf)
	_cqueuemode="${_def_cqueuemode}"	# changed later, if needed

	# check owner and mode of real sendmail binary
	if [ "${_owner}" != "${_def_owner}" ]; then
		warn "/usr/libexec/sendmail/sendmail has wrong owner/mode"
	fi

	# check .cf file version
	if [ "${_cfversion}" != "${_def_version}" ]; then
		warn "${name}.cf has wrong version " \
			"(have ${_cfversion}, should be ${_def_version})"
	fi

	# check submit.cf existence
	if ${_sm_root}; then
		if [ -f "/etc/mail/submit.cf" ]; then
			warn "${name} is suid root, but submit.cf exists"
		fi
	else
		if [ ! -f "/etc/mail/submit.cf" ]; then
			warn "${name} is sgid smmsp, but submit.cf is missing"
		else
			_cqueue=$(awk 'match($0,"^O *QueueDirectory=") {
				print(substr($0, RSTART+RLENGTH))
				}' "/etc/mail/submit.cf")
			_cqueuemode=$(stat -qf"%p %Su %Sg" "${_cqueue}")
		fi
	fi
		
	# look at clientmqueue's owner, group, and mode
	if [ "${_cqueuemode}" != "${_def_cqueuemode}" ]; then
		warn "sendmail client queue ${_cqueue} has wrong owner/mode"
	fi
}

check_need_sendmail()
{
	_mta_path=$(awk '/^sendmail[ \t]/{print$2}' /etc/mailer.conf)
	_sendmail_path="/usr/libexec/sendmail/sendmail"
	_mta_host=$(sed -n '/^D{MTAHost}/s/.*\[\([^]\.]*\)\.*]/\1/p' \
	    /etc/mail/submit.cf 2>/dev/null | tr A-Z a-z)
	if [ "${sendmail}" != "check" ]; then
		echo "${sendmail}"
	elif [ "${_mta_path}" != "${_sendmail_path}" -o \
	    ! -x "${_sendmail_path}" -o \
	    $(checkyesno sendmail_suidroot; echo $?) = 0 -o \
	    "$(stat -qf "%Mp %Sg" "$_sendmail_path")" != "2 smmsp" ]; then
		echo NO
	else
		case "$_mta_host" in
		localhost|127.0.0.1|::1|localhost.*)
			echo YES;;
		*)
			echo NO;;
		esac
	fi
}

# force re-evaluation of /etc/rc.conf and resetting of $sendmail
_rc_conf_loaded=false
_rc_d_sendmail=check
load_rc_config $name
unset _rc_d_sendmail
sendmail=$(check_need_sendmail)
run_rc_command "$1"
