aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/qemu-iotests/2331
-rw-r--r--tests/qemu-iotests/common.nbd94
2 files changed, 42 insertions, 53 deletions
diff --git a/tests/qemu-iotests/233 b/tests/qemu-iotests/233
index 057cad2044..a5c17c3963 100755
--- a/tests/qemu-iotests/233
+++ b/tests/qemu-iotests/233
@@ -49,7 +49,6 @@ _supported_proto file
# If porting to non-Linux, consider using socat instead of ss in common.nbd
_require_command QEMU_NBD
-nbd_server_set_tcp_port
tls_x509_init
echo
diff --git a/tests/qemu-iotests/common.nbd b/tests/qemu-iotests/common.nbd
index 25fc9ffaa4..24b01b60aa 100644
--- a/tests/qemu-iotests/common.nbd
+++ b/tests/qemu-iotests/common.nbd
@@ -22,6 +22,11 @@
nbd_unix_socket="${TEST_DIR}/qemu-nbd.sock"
nbd_tcp_addr="127.0.0.1"
nbd_pid_file="${TEST_DIR}/qemu-nbd.pid"
+nbd_stderr_fifo="${TEST_DIR}/qemu-nbd.fifo"
+
+# If bash version is >= 4.1, this will be overwritten by a dynamically
+# assigned file descriptor value.
+nbd_fifo_fd=10
nbd_server_stop()
{
@@ -33,77 +38,62 @@ nbd_server_stop()
kill "$NBD_PID"
fi
fi
- rm -f "$nbd_unix_socket"
-}
-
-nbd_server_wait_for_unix_socket()
-{
- pid=$1
-
- for ((i = 0; i < 300; i++))
- do
- if [ -r "$nbd_unix_socket" ]; then
- return
- fi
- kill -s 0 $pid 2>/dev/null
- if test $? != 0
- then
- echo "qemu-nbd unexpectedly quit"
- exit 1
- fi
- sleep 0.1
- done
- echo "Failed in check of unix socket created by qemu-nbd"
- exit 1
+ rm -f "$nbd_unix_socket" "$nbd_stderr_fifo"
}
nbd_server_start_unix_socket()
{
nbd_server_stop
- $QEMU_NBD -v -t -k "$nbd_unix_socket" "$@" &
- nbd_server_wait_for_unix_socket $!
+ $QEMU_NBD -v -t -k "$nbd_unix_socket" --fork "$@"
}
-nbd_server_set_tcp_port()
+nbd_server_start_tcp_socket()
{
- (ss --help) >/dev/null 2>&1 || _notrun "ss utility not found, skipping test"
+ nbd_server_stop
+ mkfifo "$nbd_stderr_fifo"
for ((port = 10809; port <= 10909; port++))
do
- if ! ss -tln | grep -sqE ":$port\b"; then
+ # Redirect stderr to FIFO, so we can later decide whether we
+ # want to read it or to redirect it to our stderr, depending
+ # on whether the command fails or not
+ $QEMU_NBD -v -t -b $nbd_tcp_addr -p $port --fork "$@" \
+ 2> "$nbd_stderr_fifo" &
+
+ # Taken from common.qemu
+ if [[ "${BASH_VERSINFO[0]}" -ge "5" ||
+ ("${BASH_VERSINFO[0]}" -ge "4" && "${BASH_VERSINFO[1]}" -ge "1") ]]
+ then
+ exec {nbd_fifo_fd}<"$nbd_stderr_fifo"
+ else
+ let _nbd_fifo_fd++
+ eval "exec ${_nbd_fifo_fd}<'$nbd_stderr_fifo'"
+ fi
+ wait $!
+
+ if test $? == 0
+ then
+ # Success, redirect qemu-nbd's stderr to our stderr
nbd_tcp_port=$port
+ (cat <&$nbd_fifo_fd >&2) &
+ eval "exec $nbd_fifo_fd>&-"
return
fi
- done
- echo "Cannot find free TCP port for nbd in range 10809-10909"
- exit 1
-}
-
-nbd_server_wait_for_tcp_socket()
-{
- pid=$1
+ # Failure, read the output
+ output=$(cat <&$nbd_fifo_fd)
+ eval "exec $nbd_fifo_fd>&-"
- for ((i = 0; i < 300; i++))
- do
- if ss -tln | grep -sqE ":$nbd_tcp_port\b"; then
- return
- fi
- kill -s 0 $pid 2>/dev/null
- if test $? != 0
+ if ! echo "$output" | grep -q "Address already in use"
then
- echo "qemu-nbd unexpectedly quit"
+ # Unknown error, print it
+ echo "$output" >&2
+ rm -f "$nbd_stderr_fifo"
exit 1
fi
- sleep 0.1
done
- echo "Failed in check of TCP socket created by qemu-nbd"
- exit 1
-}
-nbd_server_start_tcp_socket()
-{
- nbd_server_stop
- $QEMU_NBD -v -t -b $nbd_tcp_addr -p $nbd_tcp_port "$@" &
- nbd_server_wait_for_tcp_socket $!
+ echo "Cannot find free TCP port for nbd in range 10809-10909"
+ rm -f "$nbd_stderr_fifo"
+ exit 1
}