#!/bin/bash
#
# test-lib.sh -- library of functions for nfs-utils tests
#
# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#

# make sure $srcdir is set and sanity check it
srcdir=${srcdir-.}
if [ ! -d ${srcdir} ]; then
	echo "***ERROR***: bad installation -- \$srcdir=${srcdir}"
	exit 1
fi

export PATH=$PATH:${srcdir}:${srcdir}/nsm_client

# Some tests require root privileges. Check for them and skip the test (exit 77)
# if the caller doesn't have them.
check_root() {
	if [ $EUID -ne 0 ]; then
		echo "*** Skipping this test as it requires root privs ***"
		exit 77
	fi
}

# is lockd registered as a service?
lockd_registered() {
	rpcinfo -p | grep -q nlockmgr
	return $?
}

# start up statd
start_statd() {
	rpcinfo -u 127.0.0.1 status 1 &> /dev/null
	if [ $? -eq 0 ]; then
		echo "***ERROR***: statd is already running and should "
		echo "             be down when starting this test"
		return 1
	fi
	$srcdir/../utils/statd/statd --no-notify
}

# shut down statd
kill_statd() {
	kill `cat /var/run/rpc.statd.pid`
}
