#! /bin/sh

### BEGIN INIT INFO
# Provides:          g15daemon
# Required-Start:    $syslog $local_fs
# Required-Stop:     $syslog $local_fs
# Should-Start:      $remote_fs
# Should-Stop:       $remote_fs
# X-Start-Before:    xdm kdm gdm ldm sdm
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: load deamon for Logitech G15 keyboard lcd display
# Description:       load deamon for Logitech G15 keyboard lcd display
### END INIT INFO


PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/g15daemon
NAME=g15daemon
DESC=g15daemon

[ -x "$DAEMON" ] || exit 0

# Include g15daemon defaults if available
if [ -f /etc/default/g15daemon ] ; then
	. /etc/default/g15daemon
fi

if [ "$SWITCH_KEY" = "MR" ]; then
	DAEMON_OPTS="-s $DAEMON_OPTS"
fi

set -e

if [ "$G15DEBUG" = "on" ]; then

log() {
    logger -p daemon.debug -t g15 -- "$*"
}
else

log() {
    true
}

fi




wait_for_file() {
        local file=$1
        local timeout=$2
        [ "$timeout" ] || timeout=120

        local count=$(($timeout * 10))
        while [ $count != 0 ]; do
                [ -e "$file" ] && return 0
                sleep 0.1
                count=$(($count - 1))
        done
	return 1
}

load_uinput() {
    if [ ! -e /dev/input/uinput ] ; then
        modprobe -q uinput || true
	wait_for_file /dev/input/uinput 3  ||  return 1
    fi
}

wait_usr_mount() {
    if [ ! -e "$DAEMON" ] ; then
        wait_for_file "$DAEMON" 7  ||  return 1
    fi
}

is_running() {
	start-stop-daemon --stop --test --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON 
}

do_start() {
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON -- $DAEMON_OPTS
}

do_stop() {
        $DAEMON -k
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                --oknodo --retry 5 --exec $DAEMON
}


case "$1" in
  start)
	echo -n "Starting $DESC: "
	load_uinput || echo -n ".../dev/input/uinput not found ..."
	do_start
	echo "$NAME."
	;;
  stop)
	echo -n "Stopping $DESC: "
	do_stop
	echo "$NAME."
	;;
  #reload)
	#
	#	If the daemon can reload its config files on the fly
	#	for example by sending it SIGHUP, do it here.
	#
	#	If the daemon responds to changes in its config file
	#	directly anyway, make this a do-nothing entry.
	#
	# echo "Reloading $DESC configuration files."
	# start-stop-daemon --stop --signal 1 --quiet --pidfile \
	#	/var/run/$NAME.pid --exec $DAEMON
  	#;;
  force-reload)
	#
	#	If the "reload" option is implemented, move the "force-reload"
	#	option to the "reload" entry above. If not, "force-reload" is
	#	just the same as "restart" except that it does nothing if the
	#   daemon isn't already running.
	# check wether $DAEMON is running. If so, restart
	is_running  &&  $0 restart  ||  exit 0
        ;;
  restart)
    echo -n "Restarting $DESC: "
	do_stop
	# the device is slow to shut-down
	sleep 1
	do_start
	echo "$NAME."
	;;
  udev)
	log "calling g15 udev; action: $ACTION, product $PRODUCT"
	if [ "x$ACTION" = "xadd" ] ; then
	    load_uinput || true
	    wait_usr_mount || true
	    # it seems udev will not release a device if userspace is still
	    # connected
	    is_running && ( do_stop; sleep 1 )
	    do_start
	elif [ "x$ACTION" = "xremove" ] ; then
	    do_stop
	else
	    echo "unknow udev action '$ACTION'"
	    exit 1

	fi
	;;
  shared-udev)
        # some devices share usb also for audio, which causes some spourios
        # udev messages.
        log "calling g15 shared-dev; action: $ACTION, product $PRODUCT"
        if [ "x$ACTION" = "xadd" ] ; then
            load_uinput || true
            wait_usr_mount || true
            do_start
        elif [ "x$ACTION" = "xremove" ] ; then
            do_stop
        else
            echo "unknow udev action '$ACTION'"
            exit 1

        fi
        ;;

  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|force-reload|udev}" >&2
	exit 1
	;;
esac

exit 0
