#!/bin/sh
# startup script for Canon Printer Daemon for CUPS (ccpd)
#
# LSB init header to allow systemd/update-rc.d to detect runlevels
### BEGIN INIT INFO
# Provides:          ccpd
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Canon Printer Daemon for CUPS
# Description:       Manages ccpd for Canon CAPT printers
### END INIT INFO

if [ `ps awx | grep cupsd | grep -v grep | wc -l` -eq 0 ]; then
	while [ `ps awx | grep cupsd | grep -v grep | wc -l` -eq 0 ]
	do
		sleep 3
	done
	sleep 5
fi

if [ -f /etc/rc.d/init.d/functions ]; then
	if [ -f /etc/slackware-version ]; then
		SYS_F="SL"
	else
		. /etc/rc.d/init.d/functions 
		SYS_F="RH"
	fi
elif [ -x /sbin/startproc ]; then
	SYS_F="Su"
elif [ -x /sbin/start-stop-daemon ]; then
	SYS_F="De"
fi

DAEMON=/usr/sbin/ccpd
REAL_DAEMON=/usr/sbin/ccpd.real
LOCKFILE=/var/lock/subsys/ccpd

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

stop_process_by_name ()
{
	proc_name="$1"
	if ! command -v pidof >/dev/null 2>&1; then
		return 0
	fi
	pids=$(pidof "$proc_name" 2>/dev/null || true)
	if [ -z "$pids" ]; then
		return 0
	fi
	kill -TERM $pids 2>/dev/null || true
	sleep 1
	pids=$(pidof "$proc_name" 2>/dev/null || true)
	if [ -n "$pids" ]; then
		kill -KILL $pids 2>/dev/null || true
	fi
}

stop_processes_by_path_fragment ()
{
	path_fragment="$1"
	if [ -z "$path_fragment" ]; then
		return 0
	fi
	pids=$(ps -eo pid=,args= 2>/dev/null | awk -v pat="$path_fragment" 'index($0, pat) {print $1}' | tr '\n' ' ')
	if [ -z "$pids" ]; then
		return 0
	fi
	kill -TERM $pids 2>/dev/null || true
	sleep 1
	pids=$(ps -eo pid=,args= 2>/dev/null | awk -v pat="$path_fragment" 'index($0, pat) {print $1}' | tr '\n' ' ')
	if [ -n "$pids" ]; then
		kill -KILL $pids 2>/dev/null || true
	fi
}

ccpd_start ()
{
	echo -n "Starting ${DAEMON}: "

	if [ "$SYS_F" = "RH" ]; then	
		daemon ${DAEMON}
		[ "$?" = "0" ] && touch ${LOCKFILE}
		echo "."
	elif [ "$SYS_F" = "Su" ]; then
		startproc ${DAEMON}
		echo "."
	elif [ "$SYS_F" = "De" ]; then
		start-stop-daemon --start --quiet --oknodo --exec ${DAEMON}
		echo "."
	else
		`${DAEMON}`
	fi
}

ccpd_stop ()
{
	echo -n "Shutting down ${DAEMON}: "

	if [ "$SYS_F" = "De" ]; then
		start-stop-daemon --stop --quiet --oknodo --signal 15 --exec ${DAEMON}
		start-stop-daemon --stop --quiet --oknodo --signal 15 --exec ${REAL_DAEMON}
		stop_process_by_name ccpd.real
		stop_processes_by_path_fragment /usr/bin/captmon
		echo "."
	elif [ "$SYS_F" = "SL" ]; then
		kill -KILL `pidof ${DAEMON}`
		kill -KILL `pidof ${REAL_DAEMON}` 2>/dev/null
		stop_process_by_name ccpd.real
		stop_processes_by_path_fragment /usr/bin/captmon
		[ "$?" = "0" ] && rm -f ${LOCKFILE}
		echo 
	else
		killproc ${DAEMON}
		killproc ${REAL_DAEMON}
		stop_process_by_name ccpd.real
		stop_processes_by_path_fragment /usr/bin/captmon
		[ "$?" = "0" ] && rm -f ${LOCKFILE}
		echo	
	fi
}


case $1 in

	start)
		ccpd_start
		;;
		
	stop)
		ccpd_stop
		;;
	
	status)
		echo "${DAEMON}:" `pidof ${DAEMON}`
		;;
	
	restart)
		ccpd_stop
		ccpd_start
		;;
	
	*)
		echo "Usage: ccpd {start|stop|status}"
		exit 1
		;;
esac
exit 0
