#!/bin/sh
set -e
# Start or stop sendmail
#
# Robert Leslie <rob@mars.org>
# Johnie Ingram <johnie@netgod.net>
# David Rocher <rocher@mail.dotcom.fr>
# Richard Nelson <cowboy@debain.org>

# How often to run the queue
Q="10m"

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/sendmail
COMMAND=/usr/sbin/sendmail
PIDFILE=/var/run/sendmail.pid
QUEUE=/var/spool/mqueue
START_CMD="start-stop-daemon \
	--pidfile $PIDFILE \
	--exec $DAEMON \
	--startas $COMMAND \
	--start"
STOP_CMD="start-stop-daemon \
	--pidfile $PIDFILE \
	--stop"
NAME=sendmail
FLAGS="defaults 50"

# Support for coexistance with smtpd package
SMTPD=/usr/sbin/smtpd

test -x $DAEMON -a -d /usr/share/sendmail || exit 0

#
# Clean sendmail queues (somewhat)
queue_clean () {
	# remove lock files left because of kill/crash
	# rm -f $QUEUE/[lnx]f* doesn't work with a plethora of files ;-{
	for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z; do
		rm -f [lnx]f${i}*
		done
	# remove zero length qf files
	for qffile in $QUEUE/qf*; do
		if [ -r "$qffile" -a ! -s "$qffile" ]; then
			echo -n "<zero: $qffile> "
			rm -f "$qffile"
			fi
		done
	# rename tf files to be qf if the qf does not exist
	for tffile in $QUEUE/tf*; do
		qffile=`echo "$tffile" | sed 's/t/q/'`
		if [ -r "$tffile" -a ! -f "$qffile" ]; then
			echo -n "<recovering: $tffile> "
			mv "$tffile" "$qffile"
		elif [ -f "$tffile" ]; then
			echo -n "<extra: $tffile> " 
			rm -f "$tffile"
			fi
		done
	# remove df files with no corresponding qf files
	for dffile in $QUEUE/df*; do
		qffile=`echo "$dffile" | sed 's/d/q/'`
		if [ -r "$dffile" -a ! -f "$qffile" ]; then
			echo -n "<incomplete: $dffile> "
			mv "$dffile" `echo $dffile | sed 's/d/D/'`
			fi
		done
	# announce files that have been saved during disaster recovery
	for xffile in $QUEUE/[A-Z]f*; do
		if [ -f "$xffile" ]; then
			echo -n "<panic: $xffile> "
			fi
		done
	}

#
# enhanced sendmail startup
start() {
	# cleanup queues
	queue_clean;

	# Skip daemon run for the following:
	#   * sendmail hasn't been configured
	#   * smptd, a firewall frontend for sendmail, is installed
	#   * If running a nullclient
	if [ ! -s /etc/mail/sendmail.mc ]; then
		echo "sendmail has not been configured, not started."
		echo "To configure sendmail, type sendmailconfig"
		exit 0
	elif [ -x $SMTPD ] ||  \
		egrep -qe "^[[:space:]]*FEATURE(nullclient)" \
		/etc/mail/sendmail.mc \
		; then
		echo "sendmail daemon not needed, not started."
		exit 0
		fi
	# Ok, really start the puppy
	cd /var/lib/sendmail
	$START_CMD -- -bd -q"$Q"
	}

#
# enhanced sendmail shutdown
stop () {
	$STOP_CMD --quiet --oknodo > /dev/null
	#
	#       Now we have to wait until sendmail has _really_ stopped.
	#
	sleep 2
	if $STOP_CMD --quiet > /dev/null; then
		echo -n "Waiting ."
		cnt=0
		while $STOP_CMD --quiet > /dev/null; do
			cnt=`expr $cnt + 1`
			if [ $cnt -gt 60 ]; then
				#
				#       Waited 120 seconds now. Fail.
				#
				echo -n " Failed "
				break
				fi
			sleep 2
			echo -n "."
			done
		echo -n " Done "
		fi
	}

case "$1" in
    start)
	echo -n "Starting mail transport agent: "
	start
	echo "$NAME."
    ;;

    stop)
	echo -n "Stopping mail transport agent: "
	stop
	echo "$NAME."
    ;;

    restart)
        $0 stop
        $0 start
    ;;
    
    reload)
	echo -n "Reloading $NAME configuration..."
	$STOP_CMD --signal HUP
	echo "done." 
    ;;

    force-reload)
        $0 reload
    ;;

    debug)
	echo -n "Dumping $NAME state..."
	$STOP_CMD --signal USR1
	echo "done."
    ;;

    *)
	echo "Usage: /etc/init.d/sendmail {start|stop|restart|reload|force-reload|debug}"
	exit 1
    ;;
esac

exit 0
