# /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 () {
    if type usplash_write >/dev/null 2>&1; then
        usplash_write "STATUS $*" || true
    fi
    echo " * $@"
}

log_failure_msg () {
    if type usplash_write >/dev/null 2>&1; then
        usplash_write "STATUS $*" || true
    fi

    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 () {
    if type usplash_write >/dev/null 2>&1; then
        usplash_write "STATUS $*" || true
    fi
    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

        if type usplash_write >/dev/null 2>&1; then
	    usplash_write "TEXT $*" || true
        fi

	# 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 xenl >/dev/null 2>&1 && \
		$TPUT hpa 60 >/dev/null 2>&1; then
	    COLS=`$TPUT cols`
	    if [ -n "$COLS" ]; then
		 COL=`$EXPR $COLS - 7`
	    else
		 COL=73
	    fi
	    # We leave the cursor `hanging' about-to-wrap
	    # (see terminfo(5) xenl, which is approximately right).
	    # That way if the script prints anything then we will
	    # be on the next line and not overwrite part of the message.

	    # Previous versions of this code attempted to colour-code
	    # the asterisk but this can't be done reliably because
	    # in practice init scripts sometimes print messages even
	    # when they succeed and we won't be able to reliably know
	    # where the colourful asterisk ought to go.
	    
	    printf " * $*       "
	    # Enough trailing spaces for ` [fail]' to fit in; if the
	    # message is too long it wraps here rather than later,
	    # which is what we want.
	    $TPUT hpa `$EXPR $COLS - 1`
	    printf ' '
        else
	    echo " * $*"
	    COL=''
        fi
}

# int log_end_message (int exitstatus)
log_end_msg () {

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

    if type usplash_write >/dev/null 2>&1; then
        if [ $1 -eq 0 ]; then
            usplash_write "SUCCESS ok" || true
        else
            usplash_write "FAILURE failed" || true
        fi
    fi

    if [ "$COL" ]; then
        printf "\r"
	$TPUT hpa $COL
	if [ $1 -eq 0 ]; then
	    echo "[ ok ]"
	else
	    printf '['
	    $TPUT setaf 1  # red
	    printf fail
	    $TPUT op  # normal
	    echo ']'
        fi
    else
	if [ $1 -eq 0 ]; then
            echo "   ...done."
        else
            echo "   ...fail!"
        fi
    fi
    return $1
}
