#
# $Id$
#

set kill /bin/kill
set sleep /bin/sleep
set kinit $KINIT
set kdestroy $KDESTROY

set hostname [exec hostname]

# Hack around Solaris 9 kernel race condition that causes last output
# from a pty to get dropped.
if { $PRIOCNTL_HACK } {
    catch {exec priocntl -s -c FX -m 30 -p 30 -i pid [getpid]}
    rename spawn oldspawn
    proc spawn { args } {
	upvar 1 spawn_id spawn_id
	set newargs {}
	set inflags 1
	set eatnext 0
	foreach arg $args {
	    if { $arg == "-ignore" \
		     || $arg == "-open" \
		     || $arg == "-leaveopen" } {
		lappend newargs $arg
		set eatnext 1
		continue
	    }
	    if [string match "-*" $arg] {
		lappend newargs $arg
		continue
	    }
	    if { $eatnext } {
		set eatnext 0
		lappend newargs $arg
		continue
	    }
	    if { $inflags } {
		set inflags 0
		set newargs [concat $newargs {priocntl -e -c FX -p 0}]
	    }
	    lappend newargs $arg
	}
	set pid [eval oldspawn $newargs]
	return $pid
    }
}

if { [string length $VALGRIND] } {
    rename spawn valgrind_aux_spawn
    proc spawn { args } {
	global VALGRIND
	upvar 1 spawn_id spawn_id
	set newargs {}
	set inflags 1
	set eatnext 0
	foreach arg $args {
	    if { $arg == "-ignore" \
		     || $arg == "-open" \
		     || $arg == "-leaveopen" } {
		lappend newargs $arg
		set eatnext 1
		continue
	    }
	    if [string match "-*" $arg] {
		lappend newargs $arg
		continue
	    }
	    if { $eatnext } {
		set eatnext 0
		lappend newargs $arg
		continue
	    }
	    if { $inflags } {
		set inflags 0
		# Only run valgrind for local programs, not
		# system ones.
#&&![string match "/bin/sh" $arg] sh is used to start kadmind!
		if [string match "/" [string index $arg 0]]&&![string match "/bin/ls" $arg]&&![regexp {/kshd$} $arg] {
		    set newargs [concat $newargs $VALGRIND]
		} elseif [string match "." [string index $arg 0]] {
		    set newargs [concat $newargs $VALGRIND]
		}
	    }
	    lappend newargs $arg
	}
	set pid [eval valgrind_aux_spawn $newargs]
	return $pid
    }
}

# this will initialize the database and keytab
load_lib "helpers.exp"

proc rpc_test_version {} {
	global CLIENT
	global SERVER

	clone_output "$CLIENT version <unknown>"
	clone_output "$SERVER version <unknown>"
}

proc rpc_test_load {} {
	#
}

# rpc_test_exit -- clean up and exit
proc rpc_test_exit {} {
	global server_id
	global server_pid
	global server_started
	global kill

        if { [info exists server_started] && $server_started == 0 } { 
	    return 
	}

 	if {[catch {
		expect {
			-i $server_id
			eof { 
				fail "server exited!"
				verbose $expect_out(buffer) 1
			}
			timeout { pass "server survived" }
		}
	} tmp]} {
		fail "server exited! (expect failed)"
	}
}

#
# rpc_test_start -- start the rpc_test server running
#
proc rpc_test_start { } {
 	global SERVER PROT
	global server_id
	global server_pid
	global server_started
	global env

	if [info exists server_pid] { rpc_test_exit }

	set env(KRB5_KTNAME) FILE:$env(RPC_TEST_SRVTAB)

 	verbose "% $SERVER" 1
	set server_pid [spawn $SERVER $PROT]
	set server_id $spawn_id
        set server_started 1

	unset env(KRB5_KTNAME)

	set timeout 30

	expect {
		"running" { }
	        "Cannot register service" {
		        send_error "Server cannot register with portmap/rpcbind!!\n"
		        note "+++"
		        note "+++ These tests require the ability to register with portmap/rpcbind"
		        note "+++ Either the server is not running or it does not"
		        note "+++  allow registration using a loopback connection"
		        note "+++"
		        verbose $expect_out(buffer) 1
		        set server_started 0
		        unsupported "Server registration"
		        return
	        }
		eof { 
			send_error "server exited!"
			verbose $expect_out(buffer) 1
		}
		timeout { 
			send_error "server didn't start in $timeout seconds"
			verbose $expect_out(buffer) 1
		}
	}

}

set MULTIPASS {
    {tcp PROT=-t dummy=[rpc_test_start]}
    {udp PROT=-u dummy=[rpc_test_start]}
}
