#!/bin/sh

# collection of often used functions

NET_F_USE_SLEEP=false

[ ! -z ${BASH_VERSINFO} ] && [ ${BASH_VERSINFO} -ge 5 ] &&  NET_F_USE_SLEEP=true

LOGGER="/bin/logger -t init.d"

if [ "$START_MEMLOG" = "true" ] ; then
    # mostly the rc.conf is already sourced
    # if not well bad luck. Yet a prefer this
    # more paranoid version
    export LD_PRELOAD=/lib/libmemlog.so
fi

ABCMaskLen () {
	case "$NETMASK" in
		0.0.0.0)			return 0 ;;
		128.0.0.0)			return 1 ;;
		192.0.0.0)			return 2 ;;
		224.0.0.0)			return 3 ;;
		240.0.0.0)			return 4 ;;
		248.0.0.0)			return 5 ;;
		252.0.0.0)			return 6 ;;
		254.0.0.0)			return 7 ;;
		255.0.0.0)			return 8 ;;
		255.128.0.0)		return 9 ;;
		255.192.0.0)		return 10 ;;
		255.224.0.0)		return 11 ;;
		255.240.0.0)		return 12 ;;
		255.248.0.0)		return 13 ;;
		255.252.0.0)		return 14 ;;
		255.254.0.0)		return 15 ;;
		255.255.0.0)		return 16 ;;
		255.255.128.0)		return 17 ;;
		255.255.192.0)		return 18 ;;
		255.255.224.0)		return 19 ;;
		255.255.240.0)		return 20 ;;
		255.255.248.0)		return 21 ;;
		255.255.252.0)		return 22 ;;
		255.255.254.0)		return 23 ;;
		255.255.255.0)		return 24 ;;
		255.255.255.128)	return 25 ;;
		255.255.255.192)	return 26 ;;
		255.255.255.224)	return 27 ;;
		255.255.255.240)	return 28 ;;
		255.255.255.248)	return 29 ;;
		255.255.255.252)	return 30 ;;
		255.255.255.254)	return 31 ;;
		255.255.255.255)	return 32 ;;
	esac

	return 0;
}

WaitForStopService () {
	local i;

	for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
		# Check if stopped
		/bin/kill -0 $1 > /dev/null 2>&1
		if [ $? = 0 ] ; then
			# 0.1 sec
			if [ "$NET_F_USE_SLEEP" == "true" ]; then /bin/sleep 0.1 ; else /bin/usleep 100000 ; fi
		else
			$LOGGER $SERVICE: stopped
#			echo "$0: stopped"
			return 0
		fi
#		echo "wait $i"
	done

	$LOGGER $SERVICE: PID:$1 stop failed
	echo "$0: PID:$1 stop failed"

	return 1
}

ServiceCheckRunning1 () {
	local PID;

	if [ -r "$PIDFILE" ] ; then
		PID=$(/bin/cat $PIDFILE)

		# Check if running
		/bin/kill -0 $PID > /dev/null 2>&1
		if [ $? = 0 ] ; then
			$LOGGER $SERVICE: already running
			echo "$0 is already running."
			return 1
		fi

		$LOGGER ServiceCheckRunning1: $SERVICE: state undefined
		/bin/rm -f "$PIDFILE"
		if [ -n "$PROCESS_NAME" ] ; then
			/bin/killall $PROCESS_NAME
		fi
		echo "$0 is in an undefined state. PID file exists but no corresponding process. Killing alls apps and removing PID file."
		return 0
	fi

	return 0
}

ServiceCheckRunning2 () {
	local PID;
	local i;

	for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
		if [ -r "$PIDFILE" ] ; then
			PID=$(/bin/cat $PIDFILE)

			# Check if running
			/bin/kill -0 $PID > /dev/null 2>&1
			if [ $? = 0 ] ; then
				$LOGGER $SERVICE: started
				return 0
			fi

			$LOGGER $SERVICE: start failed
			echo "$0 start failed"
			return 1
		fi
		#0.05 sec
		if [ "$NET_F_USE_SLEEP" == "true" ]; then /bin/sleep 0.05 ; else /bin/usleep 50000 ; fi
	done

	$LOGGER $SERVICE: start failed
	echo "$0 start failed"

	return 1
}

ServiceStop () {
	local PID;

	if [ -r "$PIDFILE" ] ; then
		PID=$(/bin/cat $PIDFILE)

		# Check if still running
		/bin/kill -0 $PID > /dev/null 2>&1
		if [ $? != 0 ] ; then
			$LOGGER ServiceStop: $SERVICE: state undefined
			/bin/rm -f "$PIDFILE"
			if [ -n "$PROCESS_NAME" ] ; then
				/bin/killall $PROCESS_NAME
			fi
			echo "$0 is in an undefined state. PID file exists but no corresponding process. Killing alls apps and removing PID file."
			return 0
		fi

		/bin/kill $PID > /dev/null 2>&1

		/bin/rm -f "$PIDFILE"
	else
		echo "$0 is not running (no PID file)"
		return 1
	fi

	return 0
}

ServiceStopWaitable () {
	local PID;

	if [ -r "$PIDFILE" ] ; then
		PID=$(/bin/cat $PIDFILE)

		# Check if still running
		/bin/kill -0 $PID > /dev/null 2>&1
		if [ $? != 0 ] ; then
			$LOGGER ServiceStopWaitable: $SERVICE: state undefined
			/bin/rm -f "$PIDFILE"
			if [ -n "$PROCESS_NAME" ] ; then
				/bin/killall $PROCESS_NAME
			fi
			echo "$0 is in an undefined state. PID file exists but no corresponding process. Killing alls apps and removing PID file."
			return 0
		fi

		/bin/kill $PID > /dev/null 2>&1

		WaitForStopService $PID

		if [ "$?" -eq "1" ] ; then
			echo "Send kill signal to $0"
			/bin/kill -9 $PID > /dev/null 2>&1
		fi
		
		/bin/rm -f "$PIDFILE"
	else
		echo "$0 is not running (no PID file)"
		return 1
	fi

	return 0
}
ServiceSendSIGHUP () {
	local PID;

	if [ -r "$PIDFILE" ] ; then
		PID=$(/bin/cat $PIDFILE)

		# Check if still running
		/bin/kill -0 $PID > /dev/null 2>&1
		if [ $? != 0 ] ; then
			$LOGGER ServiceSendSIGHUP: $SERVICE: undefined state
			/bin/rm -f "$PIDFILE"
			if [ -n "$PROCESS_NAME" ] ; then
				/bin/killall $PROCESS_NAME
			fi
			echo "$0 is in an undefined state. PID file exists but no corresponding process. Killing alls apps and removing PID file."
			return 0
		fi

		/bin/kill -1 $PID > /dev/null 2>&1

		/bin/rm -f "$PIDFILE"
	else
		echo "$0 is not running (no PID file)"
		return 1
	fi

	return 0
}

ServiceStatus () {
	local PID;

	if [ -r "$PIDFILE" ] ; then
		PID=$(/bin/cat $PIDFILE)

		# Check if still running
		/bin/kill -0 $PID > /dev/null 2>&1
		if [ $? != 0 ] ; then
			$LOGGER ServiceStatus: $SERVICE: undefined state
			/bin/rm -f "$PIDFILE"
			if [ -n "$PROCESS_NAME" ] ; then
				/bin/killall $PROCESS_NAME
			fi
			echo "$0 is in an undefined state. PID file exists but no corresponding process. Killing alls apps and removing PID file."
			return 1
		fi

		echo "$0 is up and running"
	else
		echo "$0 is not running (no PID file)"
		return 1
	fi

	return 0
}

