#!/bin/sh
#
# chkconfig: 2345 48 30
# description: Simple Mail Transfer Protocol daemon
#    smtp_deliverd: deliver daemon
#    smtp_received: simple mail transfer protocol daemon
#    smtp_retryd  : retry deamon
#
# processname: smtp_deliverd, smtp_received, smtp_retryd

#source function library
. /etc/rc.d/init.d/functions

#source networking configuration
. /etc/sysconfig/network

if [ ! -f /etc/sysconfig/network ]; then
    exit 0
fi

# check that networking is up
[ ${NETWORKING} = "no" ] && exit 0

myname=`/usr/bin/whoami`
if [ $myname != "root" ]; then
	exit -1
fi

mails_status() {
    rcvd=""
    deld=""
    retd=""
    cd /var/run/mail
    if [ $? != "0" ]; then
      return 0
    fi
    for pid in * ; do
      if [ $pid == "*" ]; then
        return 0
      fi
      if [ -f /proc/$pid/cmdline ]; then
        cmd=`cat /proc/$pid/status | head -1 | awk '{ print $2 }'`
        if [ $cmd == "smtp_received" ]; then
	  if [ "$rcvd" == "" ]; then
	    rcvd=$pid
	  else
	    rcvd=`echo -n "$rcvd $pid"`
	  fi
	elif [ $cmd == "smtp_deliverd" ]; then
	  if [ "$deld" == "" ]; then
	    deld=$pid
	  else
	    deld=`echo -n "$deld $pid"`
	  fi
	elif [ $cmd == "smtp_retryd" ]; then
	  if [ "$retd" == "" ]; then
	    retd=$pid
	  else
	    retd=`echo -n "$retd $pid"`
	  fi
	else
           rm -f /var/run/mail/$pid
        fi
      else
        rm -f /var/run/mail/$pid
      fi
    done
    return -1
}

minetmsg=""

minetexec() {
    mkdir -p /var/tmp/minetd
    echo $minetmsg> /var/tmp/minetd/#smtpd.$$
    mv /var/tmp/minetd/#smtpd.$$ /var/tmp/minetd/smtpd.$$
    kill -USR1 `pidof minetd`
}

rcvd_stop() {
  echo -n "Shutting down smtp_received:"
  if [ "$rcvd" == "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_received stop"
  minetexec

  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$rcvd" == "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}



rcvd_start() {
  echo -n "Starting smtp_received:"
  if [ "$rcvd" != "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_received start"
  minetexec

  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$rcvd" != "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}




rcvd_reload() {
  echo -n "Reloading smtp_received:"
  if [ "$rcvd" = "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_received reload"
  minetexec

  usleep 500000
  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$rcvd" != "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}





deld_stop() {
  echo -n "Shutting down smtp_deliverd:"
  if [ "$deld" == "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_deliverd stop"
  minetexec

  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$deld" == "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}



deld_start() {
  echo -n "Starting smtp_deliverd:"
  if [ "$deld" != "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_deliverd start"
  minetexec

  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$deld" != "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}




deld_reload() {
  echo -n "Reloading smtp_deliverd:"
  if [ "$deld" = "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_deliverd reload"
  minetexec

  usleep 500000
  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$deld" != "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}

retd_stop() {
  echo -n "Shutting down smtp_retryd:"
  if [ "$retd" == "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_retryd stop"
  minetexec

  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$retd" == "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}



retd_start() {
  echo -n "Starting smtp_retryd:"
  if [ "$retd" != "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_retryd start"
  minetexec

  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$retd" != "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}


retd_reload() {
  echo -n "Reloading smtp_retryd:"
  if [ "$retd" = "" ]; then
    echo_failure
    echo ""
    return 0
  fi
  minetmsg="smtp_retryd reload"
  minetexec

  usleep 500000
  loop=1
  while [ $loop -le 50 ]; do
    mails_status
    if [ "$retd" != "" ]; then
      echo_success
      echo ""
      return 0
    fi
    usleep 300000
    let loop++
  done

  echo_failure
  echo ""
  return 0
}


mails_stop() {
  mails_status
  rcvd_stop
  deld_stop
  retd_stop
}


mails_start() {
  mails_status
  rcvd_start
  deld_start
  retd_start
}

mails_reload() {
  mails_status
  rcvd_reload
  deld_reload
  retd_reload
}



Usage() {
    echo "Usage: maild"
    echo "       maild: {start|stop|restart}"
    exit 1
}

# See how we were called.

case "$1" in
    start)
	STARTTYPE=0
        mails_start
        touch /var/lock/subsys/smtp_received
        touch /var/lock/subsys/smtp_deliverd
        touch /var/lock/subsys/smtp_retryd
        ;;
    stop)
        mails_stop
        rm -f /var/lock/subsys/smtp_received*
        rm -f /var/lock/subsys/smtp_deliverd*
        rm -f /var/lock/subsys/smtp_retryd*
        ;;
    status)
        mails_status
        if [ "$rcvd" = "" ]; then
            echo "smtp_received is not running"
        else
            echo "smtp_received (pid $rcvd) is running..."
        fi
        if [ "$deld" = "" ]; then
            echo "smtp_deliverd is not running"
        else
            echo "smtp_deliverd (pid $deld) is running..."
        fi
        if [ "$retd" = "" ]; then
            echo "smtp_retryd is not running"
        else
            echo "smtp_retryd (pid $retd) is running..."
        fi
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        mails_reload
        ;;
    *)
        Usage
        exit 1
esac

exit 0
