#! /bin/sh
#
# This is an init script for openembedded
# Copy it to /etc/init.d/rsyslog and type
# > update-rc.d rsyslog defaults 5
#

PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=rsyslog
RSYSLOGD=rsyslogd
RSYSLOGD_BIN=/usr/sbin/rsyslogd
RSYSLOGD_OPTIONS=""
RSYSLOGD_PIDFILE=/var/run/rsyslogd.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$RSYSLOGD_BIN" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
#
# Function that starts the daemon/service
#
do_start()
{
        DAEMON=$1
        DAEMON_ARGS=$2
        PIDFILE=$3
        # Return
        #   0 if daemon has been started
        #   1 if daemon could not be started
        #   if daemon had already been started, start-stop-daemon will return 1
        #   so add -o/--oknodo(if nothing is done, exit 0)
        start-stop-daemon -S --quiet --pidfile $PIDFILE --exec $DAEMON \
                             --oknodo -- $DAEMON_ARGS || return 1
}
#
# Function that stops the daemon/service
#
do_stop()
{
        NAME=$1
        PIDFILE=$2
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        # QUIT/TERM/INT should work here, but they don't ????? 
        start-stop-daemon -K --quiet --signal KILL --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        rm -f $PIDFILE
        return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        NAME=$1
        PIDFILE=$2
        start-stop-daemon -K --signal HUP --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

do_status() {
        NAME=$1
        PIDFILE=$2
        # -t: test only but not stop
        start-stop-daemon -K -t --quiet --pidfile $PIDFILE --name $NAME
        # exit with status 0 if process is found
        if [ "$?" = "0" ]; then
                return 0
        else
                return 1
        fi
}

case "$1" in
  start)
        echo -n "starting $RSYSLOGD ... "
        do_start "$RSYSLOGD_BIN" "$RSYSLOGD_OPTIONS" "$RSYSLOGD_PIDFILE"
        case "$?" in
                0) echo "done" ;;
                1) echo "failed" ;;
        esac
        ;;
  stop)
        echo -n "stopping $RSYSLOGD ... "
        do_stop "$RSYSLOGD" "$RSYSLOGD_PIDFILE"
        case "$?" in
                0|1) echo "done" ;;
                2) echo "failed" ;;
        esac
        ;;
  reload|force-reload)
        echo -n "reloading $RSYSLOGD ... "
        do_reload "$RSYSLOGD" "$RSYSLOGD_PIDFILE"
        echo "done"
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  status)
        echo -n "status $RSYSLOGD ... "
        do_status "$RSYSLOGD" "$RSYSLOGD_PIDFILE"
        if [ "$?" = "0" ]; then
                echo "running"
                exit 0        
        else
                echo "stopped"
                exit 1        
        fi
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
        exit 3
        ;;
esac
exit 0
