multiplex.sh revision 218767
118334Speter#	$OpenBSD: multiplex.sh,v 1.12 2009/05/05 07:51:36 dtucker Exp $
290075Sobrien#	Placed in the Public Domain.
390075Sobrien
418334SpeterCTL=/tmp/openssh.regress.ctl-sock.$$
590075Sobrien
618334Spetertid="connection multiplexing"
790075Sobrien
890075Sobrienif config_defined DISABLE_FD_PASSING ; then
990075Sobrien	echo "skipped (not supported on this platform)"
1090075Sobrien	exit 0
1118334Speterfi
1290075Sobrien
1390075SobrienDATA=/bin/ls${EXEEXT}
1490075SobrienCOPY=$OBJ/ls.copy
1590075SobrienLOG=$TEST_SSH_LOGFILE
1618334Speter
1718334Speterstart_sshd
1890075Sobrien
1990075Sobrientrace "start master, fork to background"
2090075Sobrien${SSH} -Nn2 -MS$CTL -F $OBJ/ssh_config -oSendEnv="_XXX_TEST" somehost &
2118334SpeterMASTER_PID=$!
2218334Speter
2318334Speter# Wait for master to start and authenticate
2418334Spetersleep 5
2518334Speter
2618334Speterverbose "test $tid: envpass"
2718334Spetertrace "env passing over multiplexed connection"
2818334Speter_XXX_TEST=blah ${SSH} -F $OBJ/ssh_config -oSendEnv="_XXX_TEST" -S$CTL otherhost sh << 'EOF'
2918334Speter	test X"$_XXX_TEST" = X"blah"
3018334SpeterEOF
3118334Speterif [ $? -ne 0 ]; then
3218334Speter	fail "environment not found"
3318334Speterfi
3418334Speter
3518334Speterverbose "test $tid: transfer"
3618334Speterrm -f ${COPY}
3718334Spetertrace "ssh transfer over multiplexed connection and check result"
3850397Sobrien${SSH} -F $OBJ/ssh_config -S$CTL otherhost cat ${DATA} > ${COPY}
3950397Sobrientest -f ${COPY}			|| fail "ssh -Sctl: failed copy ${DATA}" 
4050397Sobriencmp ${DATA} ${COPY}		|| fail "ssh -Sctl: corrupted copy of ${DATA}"
4150397Sobrien
4250397Sobrienrm -f ${COPY}
4350397Sobrientrace "ssh transfer over multiplexed connection and check result"
4450397Sobrien${SSH} -F $OBJ/ssh_config -S $CTL otherhost cat ${DATA} > ${COPY}
4550397Sobrientest -f ${COPY}			|| fail "ssh -S ctl: failed copy ${DATA}" 
4650397Sobriencmp ${DATA} ${COPY}		|| fail "ssh -S ctl: corrupted copy of ${DATA}"
4790075Sobrien
4850397Sobrienrm -f ${COPY}
4918334Spetertrace "sftp transfer over multiplexed connection and check result"
5018334Speterecho "get ${DATA} ${COPY}" | \
5118334Speter	${SFTP} -S ${SSH} -F $OBJ/ssh_config -oControlPath=$CTL otherhost >$LOG 2>&1
5218334Spetertest -f ${COPY}			|| fail "sftp: failed copy ${DATA}" 
5318334Spetercmp ${DATA} ${COPY}		|| fail "sftp: corrupted copy of ${DATA}"
5418334Speter
5518334Speterrm -f ${COPY}
5618334Spetertrace "scp transfer over multiplexed connection and check result"
5718334Speter${SCP} -S ${SSH} -F $OBJ/ssh_config -oControlPath=$CTL otherhost:${DATA} ${COPY} >$LOG 2>&1
5818334Spetertest -f ${COPY}			|| fail "scp: failed copy ${DATA}" 
5918334Spetercmp ${DATA} ${COPY}		|| fail "scp: corrupted copy of ${DATA}"
6018334Speter
6150397Sobrienrm -f ${COPY}
6250397Sobrien
6350397Sobrienfor s in 0 1 4 5 44; do
6418334Speter	trace "exit status $s over multiplexed connection"
6518334Speter	verbose "test $tid: status $s"
6618334Speter	${SSH} -F $OBJ/ssh_config -S $CTL otherhost exit $s
6718334Speter	r=$?
6818334Speter	if [ $r -ne $s ]; then
6918334Speter		fail "exit code mismatch for protocol $p: $r != $s"
7018334Speter	fi
7118334Speter
7218334Speter	# same with early close of stdout/err
7318334Speter	trace "exit status $s with early close over multiplexed connection"
7418334Speter	${SSH} -F $OBJ/ssh_config -S $CTL -n otherhost \
7518334Speter                exec sh -c \'"sleep 2; exec > /dev/null 2>&1; sleep 3; exit $s"\'
7618334Speter	r=$?
7718334Speter	if [ $r -ne $s ]; then
7818334Speter		fail "exit code (with sleep) mismatch for protocol $p: $r != $s"
7950397Sobrien	fi
8050397Sobriendone
8118334Speter
8218334Spetertrace "test check command"
8318334Speter${SSH} -F $OBJ/ssh_config -S $CTL -Ocheck otherhost || fail "check command failed" 
8418334Speter
8590075Sobrientrace "test exit command"
8690075Sobrien${SSH} -F $OBJ/ssh_config -S $CTL -Oexit otherhost || fail "send exit command failed" 
8790075Sobrien
8890075Sobrien# Wait for master to exit
8990075Sobriensleep 2
9090075Sobrien
9190075Sobrienkill -0 $MASTER_PID >/dev/null 2>&1 && fail "exit command failed" 
9290075Sobrien