#! /bin/sh

# chkconfig: 2345 40 80
# description: rcDCC is a startup script for DCC  https://www.rhyolite.com/dcc/
# processname: dccd
# processname: dccm
# processname: dccifd

### BEGIN INIT INFO
# Provides:	    dccd dccm dccifd
# Required-Start:   $network $named $syslog $time
# Should-Start:	    ypbind sendmail
# Required-Stop:
# Should-Stop:
# Default-Start:    2 3 4 5
# Default-Stop:	    0 1 6
# Short-Description: DCC daemons providing mail filtering
# Description:       Start dccm, dccifd, and/or dccd to support DCC mail
#	filtering via sendmail, postfix, or SpamAssassin
### END INIT INFO



# start or stop dccd, dccifd, and dccm for Solaris, System V, IRIX,
#   Redhat Linux, or FreeBSD

# dccm must be started before sendmail and stopped after sendmail to avoid
#   complaints from sendmail
# dccd must be should before the first mail message arrives
# Thus on some Solaris systems, this script can be installed as
#   rc0.d/K37DCC  rc1.d/K37DCC  rc2.d/S88DCC  rcS.d/K37DCC
# On some Linux systems it can be installed as rc.d/init.d/DCC and linked
#   to rc.d/rc0.d/K31DCC rc.d/rc1.d/K31DCC rc.d/rc2.d/S80DCC rc.d/rc3.d/S80DCC
#   rc.d/rc4.d/S80DCC rc.d/rc5.d/S80DCC and rc.d/rc6.d/K31DCC
# On other Linux systems such as SUSE, link this script to /etc/init.d/DCC and
#   run `insserv DCC`
# On FreeBSD 5.* and 6.* systems, link this file to
#	/usr/local/etc/rc.d/rcDCC.sh
# PROVIDE: dcc
# REQUIRE: NETWORKING
# BEFORE: mail
# KEYWORD: shutdown


# Copyright (c) 2017 by Rhyolite Software, LLC
#
# This agreement is not applicable to any entity which sells anti-spam
# solutions to others or provides an anti-spam solution as part of a
# security solution sold to other entities, or to a private network
# which employs the DCC or uses data provided by operation of the DCC
# but does not provide corresponding data to other users.
#
# Permission to use, copy, modify, and distribute this software without
# changes for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear in all
# copies and any distributed versions or copies are either unchanged
# or not called anything similar to "DCC" or "Distributed Checksum
# Clearinghouse".
#
# Parties not eligible to receive a license under this agreement can
# obtain a commercial license to use DCC by contacting Rhyolite Software
# at sales@rhyolite.com.
#
# A commercial license would be for Distributed Checksum and Reputation
# Clearinghouse software.  That software includes additional features.  This
# free license for Distributed ChecksumClearinghouse Software does not in any
# way grant permision to use Distributed Checksum and Reputation Clearinghouse
# software
#
# THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC
# BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
#	Rhyolite Software DCC 1.3.159-1.42 $Revision$
#	Generated automatically from rcDCC.in by configure.


DCC_HOMEDIR=/var/dcc
DCC_LIBEXEC=/usr/pkg/libexec	    # in case dcc_conf has disappeared
. $DCC_HOMEDIR/dcc_conf
if test -z "$DCC_RUNDIR" -a -n "$DCCM_RUNDIR"; then
    # deal with old dcc_conf files
    DCC_RUNDIR="$DCCM_RUNDIR"
fi

USAGE="`basename $0`: [-x] [-m dccd|dccifd|dccm|grey] start|stop"

DEBUG=
DAEMON=
while getopts "xm:" c; do
    case $c in
	x) set -x; DEBUG=-x;;
	m) if test "$OPTARG" = dccd -o "$OPTARG" = dccifd		\
			-o "$OPTARG" = dccm -o "$OPTARG" = grey; then
		DAEMON=$OPTARG
	    else
		echo "unrecognized daemon $OPTARG" 1>&2
		DAEMON=
	    fi
	    ;;
	*) echo "$USAGE" 1>&2;;
    esac
done
shift `expr $OPTIND - 1 || true`


MODULE=
if test `uname` = Linux; then
    # Convince the Redhat shutdown mechanism to invoke us at shutdown
    # by including this string:
    # . /etc/rc.d/init.d/functions

    # Some Linux systems need a module name in /var/lock/subsys that matches
    # the name to which this script is linked to /etc/rc.d/rc?.d for the
    # shutdown or Kxx script.
    MODULE=`basename $0 | sed -n -e 's/^[SK][0-9][0-9]\(.*\)/\1/p'`
    # If /usr/pkg/libexec/updatedcc runs /usr/pkg/libexec/rcDCC,
    #	then the running name of this program will not be the
    #	needed module name
    if test -z "$MODULE" -a -d /etc/rc.d; then
	for NM in `find /etc/rc.d -follow -name 'K[0-9][0-9]*dcc*'	\
				-o -name 'K[0-9][0-9]*DCC*'`; do
	  # The random string ddb7d6d95cbf42fd4fdb is extremely unlikely to
	  # appear in any file other than this file.
	  if grep ddb7d6d95cbf42fd4fdb $NM >/dev/null 2>&1; then
	      MODULE=`basename $NM | sed -e 's/^K[0-9][0-9]//'`
	      break
	  fi
	done
    fi
fi


case "$1" in
start|faststart|restart|reload)
	if test -z "$DAEMON" -o "$DAEMON" = dccd; then
	    $DCC_LIBEXEC/start-dccd $DEBUG
	fi
	if test -z "$DAEMON" -o "$DAEMON" = grey; then
	    $DCC_LIBEXEC/start-grey $DEBUG
	fi
	if test -z "$DAEMON" -o "$DAEMON" = dccm; then
	    $DCC_LIBEXEC/start-dccm $DEBUG
	fi
	if test -z "$DAEMON" -o "$DAEMON" = dccifd; then
	    $DCC_LIBEXEC/start-dccifd $DEBUG
	fi
	if test -n "$MODULE" -a -d /var/lock/subsys; then
	    touch /var/lock/subsys/$MODULE
	fi
	;;

stop)
	# stop dccm and dccifd
	PIDS=
	if test -z "$DAEMON" -o "$DAEMON" = dccm; then
	    PIDS="$PIDS `cat $DCC_RUNDIR/dccm.pid 2>/dev/null`"
	    PIDS="$PIDS `cat $DCC_HOMEDIR/dccm.pid 2>/dev/null`"
	fi
	if test -z "$DAEMON" -o "$DAEMON" = dccifd 2>/dev/null; then
	    PIDS="$PIDS `cat $DCC_RUNDIR/dccifd.pid 2>/dev/null`"
	    PIDS="$PIDS `cat $DCC_HOMEDIR/dccifd.pid 2>/dev/null`"
	fi
	if expr "$PIDS" : '.*[0-9]' >/dev/null; then
	    # signal the process group because on Linux systems signaling the
	    # main process for a threaded application does not work.
	      kill -15 $PIDS
	fi
	# Tell dccd about operating system shutdown, including deleting
	# dcc_db.hash, which will be rebuilt by dbclean when dccd is restarted.
	if test -z "$DAEMON" -o "$DAEMON" = dccd; then
	    $DCC_LIBEXEC/stop-dccd -S $DEBUG
	fi
	if test -z "$DAEMON" -o "$DAEMON" = grey; then
	    $DCC_LIBEXEC/stop-dccd -G -S $DEBUG
	fi
	if test -n "$MODULE" -a -f /var/lock/subsys/$MODULE; then
	    rm /var/lock/subsys/$MODULE
	fi
	;;

*)
	echo "$USAGE" 1>&2
	exit 1
	;;

esac
exit 0
