#! /bin/sh
# chkconfig: 345 91 35
# description: This package enables Linux to talk to Macintosh
#              computers via the AppleTalk networking protocol and 
#              provides printer, file sharing, and AppleTalk routing 
#              services.   
#
# AppleTalk daemons. Make sure not to start atalkd in the background:
# its data structures must have time to stablize before running the
# other processes.

ATALK_BIN=/usr/local/bin
ATALK_CONF_DIR=/usr/local/etc/netatalk
ATALK_SBIN=/usr/local/sbin

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

# Source networking configuration.
. /etc/sysconfig/network

# Quickly probe for appletalk and warn if we can't find it
/sbin/modprobe appletalk || echo "[could not load appletalk module]"

# Check for IP Encapsulation support
#/sbin/modprobe ipddp || echo "[could not load IP encapsulation]"

if [ ! -x ${ATALK_SBIN}/atalkd ]; then
     echo "[${ATALK_SBIN}/atalkd not found.  Did it compile?]";
     exit 0;
fi

if [ ! -f ${ATALK_CONF_DIR}/netatalk.conf ]; then
     echo "[${ATALK_CONF_DIR}/netatalk.conf not found]";
     exit 0;
fi

# read in netatalk configuration
. ${ATALK_CONF_DIR}/netatalk.conf

# Check that networking is up.
if [ ${NETWORKING} = "no" ]; then
     echo "[Network isn't started]"; 
     exit 0;
fi

# initialize return values
RETVAL=1
RETVAL_ATALKD=0
RETVAL_PAPD=0
RETVAL_CNID_METAD=0
RETVAL_AFPD=0

# startup code for everything
atalk_startup() {
    if [ x"${ATALKD_RUN}" != x"no" ]; then 
	echo -n "  Starting atalkd:"
	daemon ${ATALK_SBIN}/atalkd
	RETVAL_ATALKD=$?
	echo

	if [ -x ${ATALK_BIN}/nbprgstr ]; then	
	    action "  Registering ${ATALK_NAME}:Workstation${ATALK_ZONE}:" ${ATALK_BIN}/nbprgstr -p 4 \"${ATALK_NAME}:Workstation${ATALK_ZONE}\"
	    action "  Registering ${ATALK_NAME}:netatalk${ATALK_ZONE}:" ${ATALK_BIN}/nbprgstr -p 4 \"${ATALK_NAME}:netatalk${ATALK_ZONE}\"
	fi	

	if [ x"${PAPD_RUN}" = x"yes"  -a -x ${ATALK_SBIN}/papd ]; then
	    echo -n "  Starting papd:"
	    daemon ${ATALK_SBIN}/papd
	    RETVAL_PAPD=$?
	    echo
	fi

	# check for timelord in bin directory
	if [ x"${TIMELORD_RUN}" = x"yes"  -a -x ${ATALK_BIN}/timelord ]; then
	    echo -n "  Starting timelord"
	    daemon ${ATALK_BIN}/timelord
	    echo
	fi

	# check for timelord in sbin directory
	if [ x"${TIMELORD_RUN}" = x"yes"  -a -x ${ATALK_SBIN}/timelord ]; then
	    echo -n "  Starting timelord"
	    daemon ${ATALK_SBIN}/timelord
	    echo
	fi

	# check for a2boot in bin directory
	if [ x"${A2BOOT_RUN}" = x"yes"  -a -x ${ATALK_BIN}/a2boot ]; then
	    echo -n "  Starting a2boot"
	    daemon ${ATALK_BIN}/a2boot
	    echo
	fi

	# check for a2boot in sbin directory
	if [ x"${A2BOOT_RUN}" = x"yes"  -a -x ${ATALK_SBIN}/a2boot ]; then
	    echo -n "  Starting a2boot"
	    daemon ${ATALK_SBIN}/a2boot
	    echo
	fi

    fi

    if [ x"${CNID_METAD_RUN}" = x"yes" -a -x ${ATALK_SBIN}/cnid_metad ] ; then
	    echo -n "  Starting cnid_metad:"
	    daemon ${ATALK_SBIN}/cnid_metad
	    RETVAL_CNID_METAD=$?
	    echo
    fi

    if [ x"${AFPD_RUN}" = x"yes" -a -x ${ATALK_SBIN}/afpd ] ; then
	    echo -n "  Starting afpd:"
	    daemon ${ATALK_SBIN}/afpd ${AFPD_UAMLIST} -g ${AFPD_GUEST} \
               -c ${AFPD_MAX_CLIENTS} -n \"${ATALK_NAME}${ATALK_ZONE}\"
	    RETVAL_AFPD=$?
	    echo
    fi

    if [ $RETVAL_ATALKD -eq 0 -a $RETVAL_PAPD -eq 0 -a $RETVAL_CNID_METAD -eq 0 -a $RETVAL_AFPD -eq 0 ]; then
        RETVAL=0
	touch /var/lock/subsys/atalk || RETVAL=1
    fi
}

case "$1" in
'start')
	echo -n 'Starting AppleTalk services: '
	if [ x"${ATALK_BGROUND}" = x"yes" ]; then 
	    echo -n "(backgrounded)"
	    atalk_startup >& /dev/null &
	else
	    echo
	    atalk_startup
	fi
	echo 
	;;
'stop')
	echo 'Shutting down AppleTalk services: '
	if [ x"${ATALKD_RUN}" != x"no" ]; then
	    if [ x"${PAPD_RUN}" = x"yes" -a -x ${ATALK_SBIN}/papd ]; then
		echo -n "  Stopping papd:"
		killproc papd
		RETVAL_PAPD=$?
		echo
	    fi

            # checking for timelord in bin directory
	    if [ x"${TIMELORD_RUN}" = x"yes" -a -x ${ATALK_BIN}/timelord ]; then
		echo -n "  Stopping timelord:"
		killproc timelord
		echo
	    fi

            # checking for timelord in sbin directory
	    if [ x"${TIMELORD_RUN}" = x"yes" -a -x ${ATALK_SBIN}/timelord ]; then
		echo -n "  Stopping timelord:"
		killproc timelord
		echo
	    fi

            # checking for a2boot in bin directory
	    if [ x"${A2BOOT_RUN}" = x"yes" -a -x ${ATALK_BIN}/a2boot ]; then
		echo -n "  Stopping a2boot:"
		killproc a2boot
		echo
	    fi

            # checking for a2boot in sbin directory
	    if [ x"${A2BOOT_RUN}" = x"yes" -a -x ${ATALK_SBIN}/a2boot ]; then
		echo -n "  Stopping a2boot:"
		killproc a2boot
		echo
	    fi

	    action "  Unregistering ${ATALK_NAME}:Workstation${ATALK_ZONE}:" ${ATALK_BIN}/nbpunrgstr \"${ATALK_NAME}:Workstation${ATALK_ZONE}\"
	    action "  Unregistering ${ATALK_NAME}:netatalk${ATALK_ZONE}:" ${ATALK_BIN}/nbpunrgstr \"${ATALK_NAME}:netatalk${ATALK_ZONE}\"

	    # kill atalkd last, since without it the plumbing goes away.
	    if [ -x ${ATALK_SBIN}/atalkd ]; then
		echo -n "  Stopping atalk:"
		killproc atalkd
		RETVAL_ATALKD=$?
		echo
	    fi
	fi

	# kill this separately as we also do AFP/tcp
	if [ x"${AFPD_RUN}" = x"yes" -a -x ${ATALK_SBIN}/afpd ]; then
	    echo -n "  Stopping afpd:"
	    killproc afpd
	    RETVAL_AFPD=$?
	    echo
	fi

	if [ x"${CNID_METAD_RUN}" = x"yes" -a -x ${ATALK_SBIN}/cnid_metad ]; then
	    echo -n "  Stopping cnid_metad:"
	    killproc cnid_metad
	    RETVAL_CNID_METAD=$?
	    echo
	fi

	if [ $RETVAL_ATALKD -eq 0 -a $RETVAL_PAPD -eq 0 -a $RETVAL_AFPD -eq 0 ] ; then
	    RETVAL=0
	    rm -f /var/lock/subsys/atalk || RETVAL=1
	fi
	echo ""
	;;
  'restart'|'reload')
	$0 stop
	$0 start
	RETVAL=$?
	;;
  'status')
	status atalkd
	RETVAL=$?
	;;
  *)
	echo "Usage: atalk {start|stop|restart|status}"
	exit 1
esac

exit $RETVAL
