#
# Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#

setup() {
    # Verify directory context variables are set
    if [ "${TESTJAVA}" = "" ] ; then
        echo "TESTJAVA not set. Test cannot execute.  Failed."
        exit 1
    fi

    if [ "${TESTCLASSES}" = "" ] ; then
        TESTCLASSES="."
    fi

    if [ "${TESTSRC}" = "" ] ; then
        TESTSRC="."
    fi

    OS=`uname -s`
    case ${OS} in
    Windows_* | CYGWIN*)
        PS=";"
        FS="\\"
        ;;
    *)
        PS=":"
        FS="/"
        ;;
    esac
}

verify_os() {
    OS=`uname -s`
    case ${OS} in
    Windows_95 | Windows_98 | Windows_ME | CYGWIN* )
        echo "Test bypassed: jvmstat feature not supported on ${OS}"
        exit 0
        ;;
    Windows_*)
        # verify that the tmp directory supports persistent ACLs, which
        # are required for jvmstat to enable its shared memory feature.
        # NOTE: FAT type files systems do not support ACLs, but NTFS files
        # systems do.
        #
        echo "temp directory is in: `windir -t`"
        TMPDRIVE=`windir -t | cut -d: -f1`
        if [ "${TMPDRIVE}" = "" ] ; then
            echo "Could not get temp directory drive letter"
            exit 1
        fi

        echo "temp file system characteristics:"
        sysinf drives -a | grep "^${TMPDRIVE}"
        sysinf drives -a | grep "^${TMPDRIVE}" | grep PERSISTENT_ACLS > /dev/null
        case $? in
        0)
            ;;
        1)
            echo "Test bypassed: jvmstat feature disabled because the temp"
            echo "directory doesn't support persistent ACLs"
            exit 0
            ;;
        2)
            echo "Could not get temp directory file system features"
            exit 1
            ;;
        *)
            echo "Unexpected return code from grep - $?"
            exit 1
            ;;
        esac
        ;;
    esac
}

# function to kill the process with the given process id
kill_proc() {
    kill_pid=$1

    if [ "${kill_pid}" = "" ]
    then
        echo "kill_proc(): null pid: ignored"
        return
    fi

    if [ ${kill_pid} -le 0 ]
    then
        echo "kill_proc(): invalid pid: ${kill_pid}: ignored"
        return
    fi

    OS=`uname -s`
    case $OS in
    Windows_*)
        case ${SHELL_VERSION} in
        [1234567].* | 8.[12345].*)
            # when starting processes in the background, mks creates an
            # intervening between the parent process and the background
            # process. The pid acquired for background process as acquired
            # by the $! shell variable is actually the pid of the invervening
            # shell and not that of the background process. Sending a specific
            # signal to the intervening shell will only effects the intervening 
            # shell and not the background process, thus leaving the background
            # process running. The following code assumes that the pid passed
            # into this function as ${kill_pid}, was acquired by $!. Therefore,
            # in order to kill the background process, we must first find the
            # children of ${kill_pid} (should be only one child) and kill them.
        
            ps -o pid,ppid | grep "${kill_pid}$"
            children=`mks_children ${kill_pid}`
            echo "killing children of ${kill_pid}: ${children}"
            for child in ${children} ; do
                kill_proc_common ${child}
            done
            ;;
        *)
            # in mks 8.6 and later, the pid returned in $! is now the pid
            # of the background process and not that of the intervening shell.
            kill_proc_common ${kill_pid}
            ;;
        esac
        ;;
    *)
        kill_proc_common ${kill_pid}
        ;;
    esac
}

mks_children() {
    ppid=$1
    ps -o pid,ppid | grep "${ppid}$" | awk '
BEGIN	{ pids="" }
	{ pids = pids $1 " " }
END	{ print pids }'
}

kill_proc_common() {
   kpid=$1

    # verify that the process exists and we can signal it
    kill -0 ${kpid} 2>/dev/null
    if [ $? -ne 0 ]
    then
        echo "Could not signal >${kpid}<"
        echo "user id = `id`"
        echo "process information :"
        ps -l -p ${kpid}
        return
    fi

    kill -TERM ${kpid}		# hit it easy first
    if [ $? -eq 0 ]
    then
        sleep 2
        kill -0 ${kpid} 2>/dev/null
        # check if it's still hanging around
        if [ $? -eq 0 ]
        then
            # it's still lingering, now it it hard
            kill -KILL ${kpid} 2>/dev/null
            if [ $? -ne 0 ]
            then
                echo "Could not kill ${kpid}!"
            fi
        fi
    else
        echo "Error sending term signal to ${kpid}!"
    fi
}
