#!/bin/sh
#
# chkconfig: 345 14 82
# description: SpinFS volume location database
# processname: vldb
#

EXECPATH="/usr/sbin/vldb"
[ -x ${EXECPATH} ] || exit 0

# Source function library.
. /etc/init.d/functions

# My function to find the pid of a program
my_pidofproc() {
        base=`basename $1`

        # Test syntax.
        if [ $# = 0 ] ; then
                echo "Usage: pidofproc {program}"
                return 1
        fi

        # First try "/var/run/*.pid" files
        if [ -f /var/run/${base}.pid ] ; then
                pid=`cat /var/run/${base}.pid | { read foo ; echo $foo ; }`
                if [ "$pid" != "" ] ; then
                        echo $pid
                        return 0
                fi
        fi

        # Next try "pidof"
        pid=`pidof -o $$ -o $PPID -o %PPID -x ${base}`
        if [ "$pid" != "" ] ; then
                echo $pid
                return 0
        fi
}

# My function to start a program.
my_daemon() {
        # Test syntax.
        gotbase=
        daemon_user=
        nicelevel=0
        while [ "$1" != "${1##-}" -o "$1" != "${1##+}" ]; do 
          case $1 in
            '')    echo '$0: Usage: daemon [+/-nicelevel] {program}'
                   return 1;;
            --check)
                   shift
                   base=$1
                   gotbase="yes"
                   shift
                   ;;
            --user)
                   shift
                   daemon_user=$1
                   shift
                   ;;
            -*|+*) nicelevel=$1
                   shift
                   ;;
             *)    nicelevel=0
                   ;;
          esac
        done

        # Save basename.
        [ -z $gotbase ] && base=`basename $1`

        # See if it's already running.
        pidlist=`my_pidofproc $1`

        pid=
        for apid in $pidlist ; do
           [ -d /proc/$apid ] && pid="$pid $apid"
        done

        if [ -n "$pid" ]; then
        	[ "$BOOTUP" = "verbose" ] && echo -n " $base"
		[ "$BOOTUP" != "verbose" ] && echo_success
		return 0
	fi

        # make sure it doesn't core dump anywhere; while this could mask
        # problems with the daemon, it also closes some security problems
#        ulimit -S -c 0 >/dev/null 2>&1

        # Echo daemon
        [ "$BOOTUP" = "verbose" ] && echo -n " $base"

        # And start it up.
        if [ -z "$daemon_user" ]; then 
           nice -n $nicelevel initlog $INITLOG_ARGS -c "$*" && success "$base startup" || failure "$base startup"
        else
           nice -n $nicelevel initlog $INITLOG_ARGS -c "su $daemon_user -c \"$*\"" && success "$base startup" || failure "$base startup"
        fi
}

getParentPid() {
    pidlist=`/sbin/pidof -x $1`
    retval=$?
    if [ $retval -eq 0 ]; then
        ps -o pid,ppid $pidlist | awk '/[0-9]/{X[P=$1]=$2}END{while(X[P]in X)P=X[P];print P}'
        retval=$?
    fi
    return $retval;
}

RETVAL=0

start() {
        USE_GDB=0
        while [ "$1" != "${1##-}" ]; do 
       	    case $1 in
	    -gdb)  USE_GDB=1
                   shift
	           ;;
	    *)     ;;
            esac
        done

	# handle RDB set up
	if [ -z "${RDB_DIR}" ]; then
	    RDBDIR="/var/spinmgmt/rdb";
	    export RDB_DIR="${RDBDIR}";
	fi

	if [ ! -d "${RDB_DIR}" ]; then
	    mkdir -p ${RDB_DIR}
            if [ $? -ne 0 ]; then
	        failure "$base startup -- can not make ${RDB_DIR}"
        	return -1;
	    fi
	fi

        if [ -z "${RDBSITELIST}" -a -z "${RDBSITEID}" ]; then
	    #default to using RDB_XXX mode
	    if [ -z "${RDBXXX}" ]; then
		RDBXXX="1";
	    fi
	    export RDB_XXX="${RDBXXX}"
	fi

	if [ $USE_GDB -eq 0 ]; then
	    echo -n $"Starting up VLDB daemon: "
            my_daemon ${EXECPATH} -background $*
	    RETVAL=$?
	    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/vldb
	    echo
        else
            echo  "under gdb...";
            rm -f /tmp/gdb.$$
            echo  "+++ NOTE: Ignoring the following signals: PWR, XCPU, 32 and PIPE"
            echo  "handle SIGPWR nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIGXCPU nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIG32 nostop noprint" >> /tmp/gdb.$$
            echo  "handle SIGPIPE nostop noprint" >> /tmp/gdb.$$
            shift
            echo  "+++ Please wait while symbols load and gdb performs emulation..."
            echo  "+++ The 'run' command is '"run -gdb $*"' or '"run -gdb -d $*"'"
            gdb --command=/tmp/gdb.$$ ${EXECPATH}
	    echo

        fi
}

stop() {
     PID=`getParentPid ${EXECPATH}`;
     RETVAL=$?;
     if [ $RETVAL -eq 0 -a -n "$PID" ]; then
	echo -n $"stopping VLDB daemon: "
        ${EXECPATH} stop 2>&1 > /dev/null
        RC=$?
	# Vldb sleeps for 4 seconds before completely exiting...
        sleep 6
        CHECKPID=`getParentPid "${EXECPATH}"`;
        [ $RC -eq 0 -a -z "$CHECKPID" ] &&
	    success "spinvldb (pid ${PID}) stop" || 
            killproc ${EXECPATH};
	    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/vldb
        echo;
    else
        echo "spinvldb is not running.";
    fi
}

dostatus() {
    PID=`getParentPid "${EXECPATH}"`;
    RETVAL=$?
    if [ $RETVAL -eq 0 -a -n "$PID" ]; then
	echo "spinvldb (pid ${PID}) is running...";
    else
	echo "spinvldb is not running.";
    fi
    return $RETVAL;
}

restart() {
	stop
	start $*
	RETVAL=$?
}

condrestart() {
	[ -e /var/lock/subsys/vldb ] && restart || :
}

cd /core

# See how we were called.
case "$1" in
  start)
	runlevel=`runlevel | cut -d ' ' -f 2`
	ntpdcmd=`find /etc/rc.d/rc$runlevel.d/ -name *ntp* 2> /dev/null`
	if [ -x $ntpdcmd ]; then
		$ntpdcmd status > /dev/null
		[ $? != 0 ] && $ntpdcmd start
	fi
        shift
	start $*
	;;
  stop)
        shift
	stop $*
	;;
  status)
        shift
	dostatus $*
	;;
  restart|reload)
        shift 
	restart $*
	;;
  condrestart)
        shift
	condrestart $*
	;;
  *)
	echo "Usage: spinvldb {start|stop|status|restart|reload|condrestart}"
	exit 1
esac

exit $RETVAL
