# /lib/lsb/init-functions for Debian -*- shell-script -*-
#
#Copyright (c) 2002-03 Chris Lawrence
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions
#are met:
#1. Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
#2. Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
#3. Neither the name of the author nor the names of other contributors
#   may be used to endorse or promote products derived from this software
#   without specific prior written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
#FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
#DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
#OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
#HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
#LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
#OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#SUCH DAMAGE.

start_daemon () {
    local force nice pidfile exec
    set -- `POSIXLY_CORRECT=1 getopt "fn:p:" $*`
    force=0
    nice=0
    pidfile=/dev/null

    for i in $*; do
        case $i in
            -f)  force=1; shift;;
            -n)  nice=$2; shift 2;;
            -p)  pidfile=$2; shift 2;;
            --)  shift; break;;
        esac
    done

    exec=$1; shift

    if [ $force = 1 ]; then
        /sbin/start-stop-daemon --start --nicelevel $nice --quiet --startas $exec --pidfile /dev/null --oknodo -- $*
    elif [ $pidfile ]; then
        /sbin/start-stop-daemon --start --nicelevel $nice --quiet --exec $exec --oknodo --pidfile "$pidfile" -- $*
    else
        /sbin/start-stop-daemon --start --nicelevel $nice --quiet --exec $exec --oknodo -- $*
    fi
}

pidofproc () {
    local pidfile line i pids= status
    set -- `POSIXLY_CORRECT=1 getopt "p:" $*`
    pidfile=

    for i in $*; do
        case $i in
            -p)  pidfile=$2; shift 2;;
            --)  shift; break;;
        esac
    done

    if [ -z "$pidfile" ]; then
        pidfile=/var/run/$(basename "$1").pid
    fi

    if [ -f "$pidfile" ]; then
        read -d "" line < "$pidfile"
        for i in $line; do
            if [ -z "$(echo $p | sed 's/[0-9]//g')" -a -d "/proc/$i" ]; then 
                pids="$i $pids"
            fi
        done
        if [ -n "$pids" ]; then
            echo "$pids"
            return 0
        else
            return 2 # program is dead and /var/run pid file exists
        fi
    elif [ -x /bin/pidof ]; then
        /bin/pidof -o %PPID $1
        status="$?"
        [ "$status" = 1 ] && return 3 # program is not running
        return 0
    else
        return 4 # program or service is unknown
    fi
}

# start-stop-daemon uses the same algorithm as "pidofproc" above.
killproc () {
    local pidfile sig status
    set -- `POSIXLY_CORRECT=1 getopt "p:" $*`
    pidfile=

    for i in $*; do
        case $i in
            -p)  pidfile=$2; shift 2;;
            --)  shift; break;;
        esac
    done

    if [ ! $pidfile ]; then
        pidfile=/var/run/$(basename "$1").pid
    fi

    if [ $2 ]; then
        sig=$(echo $2 | sed -e 's/^-\(.*\)/\1/')
        sig=$(echo $sig | sed -e 's/^SIG\(.*\)/\1/')
        /sbin/start-stop-daemon --stop --pidfile "$pidfile" --signal $sig --quiet
        status="$?"
        [ "$status" = 1 ] && return 3 # program is not running
        return 0
    else
        /sbin/start-stop-daemon --stop --pidfile "$pidfile" --retry 5 --quiet --oknodo
    fi
}

log_success_msg () {
    echo " * $@"
}

log_failure_msg () {
    TPUT=/usr/bin/tput
    if [ -x $TPUT ] && $TPUT hpa 60 >/dev/null 2>&1; then
        RED=`$TPUT setaf 1`
        NORMAL=`$TPUT op`
        echo " $RED*$NORMAL $@"
    else
        echo " * $@"
    fi
}

log_warning_msg () {
    TPUT=/usr/bin/tput
    if [ -x $TPUT ] && $TPUT hpa 60 >/dev/null 2>&1; then
        YELLOW=`$TPUT setaf 3`
        NORMAL=`$TPUT op`
        echo " $YELLOW*$NORMAL $@"
    else
        echo " * $@"
    fi
}

#
# NON-LSB HELPER FUNCTIONS
#
# int get_lsb_header_val (char *scriptpathname, char *key)
get_lsb_header_val () {
        if [ ! -f "$1" ] || [ -z "$2" ]; then
                return 1
        fi
        LSB_S="### BEGIN INIT INFO"
        LSB_E="### END INIT INFO"
        sed -n "/$LSB_S/,/$LSB_E/ s/# $2: \(.*\)/\1/p" $1
}

# int log_begin_message (char *message)
log_begin_msg () {
        if [ -z "$1" ]; then
                return 1
        fi
        echo " * $@"
}

# int log_end_message (int exitstatus)
log_end_msg () {

    # If no arguments were passed, return
    [ -z "$1" ] && return 1

    # Only do the fancy stuff if we have an appropriate terminal
    # and if /usr is already mounted
    TPUT=/usr/bin/tput
    EXPR=/usr/bin/expr
    if [ -x $TPUT ] && [ -x $EXPR ] && $TPUT hpa 60 >/dev/null 2>&1; then
        COLS=`$TPUT cols`
        if [ -n "$COLS" ]; then
            COL=`$EXPR $COLS - 7`
        else
            COL=73
        fi
        UP=`$TPUT cuu1`
        END=`$TPUT hpa $COL`
        START=`$TPUT hpa 0`
        RED=`$TPUT setaf 1`
        NORMAL=`$TPUT op`
        if [ $1 -eq 0 ]; then
            echo "$UP$END[ ok ]"
        else
            echo -e "$UP$START $RED*$NORMAL$END[${RED}fail${NORMAL}]"
        fi
    else
	if [ $1 -eq 0 ]; then
            echo "   ...done."
        else
            echo "   ...fail!"
        fi
    fi
    return $1
}

