From af7d44d7516d57adac3107d3139d6a234db782b4 Mon Sep 17 00:00:00 2001 From: Gerhard Rieger <gerhard@dest-unreach.org> Date: Tue, 28 Jan 2025 01:25:22 +0100 Subject: [PATCH] Fixed a few testing issues --- CHANGES | 2 + VERSION | 2 +- socat-broker.sh | 1 + socat-chain.sh | 1 + socat-mux.sh | 1 + test.sh | 267 +++++++++++++++++++++++++++++++++++++++--------- 6 files changed, 227 insertions(+), 47 deletions(-) diff --git a/CHANGES b/CHANGES index a3629c4..691e417 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,8 @@ Testing: test.sh produces file results.txt with columns of test numbers, names, and results. + Fixed a few testing issues + ####################### V 1.8.0.2: Security: diff --git a/VERSION b/VERSION index 2b16796..8a17980 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -"1.8.0.2" +"1.8.0.2+" diff --git a/socat-broker.sh b/socat-broker.sh index ccdea6f..b4b6dd2 100755 --- a/socat-broker.sh +++ b/socat-broker.sh @@ -37,6 +37,7 @@ while [ "$1" ]; do X-q) QUIET=1; OPTS="-d0" ;; X-d*|X-l?*) OPTS="$OPTS $1" ;; X-b|X-S|X-t|X-T|X-l) OPT=$1; shift; OPTS="$OPTS $OPT $1" ;; + X--experimental) ;; X-) break ;; X-*) echo "Unknown option \"$1\"" >&2 usage >&2 diff --git a/socat-chain.sh b/socat-chain.sh index fa8e93e..357aff0 100755 --- a/socat-chain.sh +++ b/socat-chain.sh @@ -77,6 +77,7 @@ while [ "$1" ]; do X-q) QUIET=1; OPTS="-d0" ;; X-d*|X-l?*) OPTS="$OPTS $1" ;; X-b|X-S|X-t|X-T|X-l) OPT=$1; shift; OPTS="$OPTS $OPT $1" ;; + X--experimental) ;; X-) break ;; X-*) echo "$0: Unknown option \"$1\"" >&2 usage >&2 diff --git a/socat-mux.sh b/socat-mux.sh index 084c0e6..8cea73e 100755 --- a/socat-mux.sh +++ b/socat-mux.sh @@ -43,6 +43,7 @@ while [ "$1" ]; do X-q) QUIET=1; OPTS="-d0" ;; X-d*|X-l?*) OPTS="$OPTS $1" ;; X-b|X-S|X-t|X-T|X-l) OPT=$1; shift; OPTS="$OPTS $OPT $1" ;; + X--experimental) ;; X-) break ;; X-*) echo "$0: Unknown option \"$1\"" >&2 usage >&2 diff --git a/test.sh b/test.sh index 759e42b..bd8ea14 100755 --- a/test.sh +++ b/test.sh @@ -48,6 +48,7 @@ usage() { $ECHO "\t-d \t\tShow log output of commands, even when they did not fail (not yet completed)" $ECHO "\t-D \t\tOutput some platform/system specific defines (variables)" $ECHO "\t--internet \tAllow tests that send packets to Internet" + $ECHO "\t--experimental \tApply --experimental option to Socat" $ECHO "\t--expect-fail N1,N2,... \tIgnore failure of these tests" $ECHO "\ttest-spec \Number of test or name of test" $ECHO "Contents of environment variable OPTS are passed to Socat invocations, e.'g:" @@ -78,8 +79,9 @@ while [ "$1" ]; do X-n) shift; NUMCOND="test \$N -eq $1" ;; X-N?*) NUMCOND="test \$N -gt ${1#-N}" ;; X-N) shift; NUMCOND="test \$N -ge $1" ;; - X-C) rm -f testcert*.conf testcert.dh testcli*.* testsrv*.* ;; + X-C) rm -f testcert*.conf testcert.dh testcli*.* testsrv*.* testalt.* ;; X--internet|X-internet) INTERNET=1 ;; # allow access to 3rd party Internet hosts + X--experimental) EXPERIMENTAL=1 ;; X--expect-fail|X-expect-fail) OPT_EXPECT_FAIL=1; shift; EXPECT_FAIL="$1" ;; X-*) echo "Unknown option \"$1\"" >&2 usage >&2 @@ -129,16 +131,23 @@ if [ -z "$PROCAN" ]; then if test -x ./procan; then PROCAN="./procan"; elif type if [ -z "$FILAN" ]; then if test -x ./filan; then FILAN="./filan"; elif ! type filan >/dev/null 2>&1; then FILAN=filan; elif test -x ${SOCAT%/*}/filan; then FILAN=${SOCAT%/*}/filan; else FILAN=false; fi; fi [ "$DEFS" ] && echo "FILAN=\"$FILAN\"" >&2 +if ! sleep 0.1 2>/dev/null; then + sleep () { + $SOCAT -T $0 PIPE PIPE + } +fi + if [ -z "$val_t" ]; then # Determine the time Socat needs for an empty run $SOCAT /dev/null /dev/null # populate caches - MILLIs=$(bash -c 'time socat /dev/null /dev/null' 2>&1 |grep ^real |sed 's/.*m\(.*\)s.*/\1/' |tr -d ,.) + MILLIs=$(bash -c 'time $SOCAT /dev/null /dev/null' 2>&1 |grep ^real |sed 's/.*m\(.*\)s.*/\1/' |tr -d ,.) while [ "${MILLIs:0:1}" = '0' ]; do MILLIs=${MILLIs##0}; done # strip leading '0' to avoid octal [ -z "$MILLIs" ] && MILLIs=1 [ "$DEFS" ] && echo "MILLIs=\"$MILLIs\" (1)" >&2 # On my idle development computer this value flaps from 0.001 to 0.004 # 0.001 lets many tests fail, so we triple the result + #MILLIs=$((10*MILLIs)) MILLIs=$((3*MILLIs)) [ "$DEFS" ] && echo "MILLIs=\"$MILLIs\" (2)" >&2 MICROS=${MILLIs}000 @@ -191,6 +200,7 @@ PATH=.:$PATH # for usleep,relsleep MISCDELAY=1 OPTS="$opt_t $OPTS" +[ "$EXPERIMENTAL" ] && OPTS="--experimental $OPTS" opts="$OPTS" [ "$DEFS" ] && echo "opts=\"$opts\"" >&2 @@ -356,12 +366,12 @@ IP.2 = ::1 EOF -# clean up from previous runs -rm -f testcli.{crt,key,pem} -rm -f testsrv.{crt,key,pem} -rm -f testcli6.{crt,key,pem} -rm -f testsrv6.{crt,key,pem} -rm -f testalt.{crt,key,pem} +# clean up from previous runs - no, only with -C +#rm -f testcli.{crt,key,pem} +#rm -f testsrv.{crt,key,pem} +#rm -f testcli6.{crt,key,pem} +#rm -f testsrv6.{crt,key,pem} +#rm -f testalt.{crt,key,pem} CAT="cat" OD_C="od -c" @@ -657,20 +667,12 @@ vt100|vt320|linux|xterm|cons25|dtterm|aixterm|sun-color|xterm-color|xterm-256col RED="\0033[31m" GREEN="\0033[32m" YELLOW="\0033[33m" -# if [ "$UNAME" = SunOS ]; then -# NORMAL="\0033[30m" -# else - NORMAL="\0033[39m" -# fi - else + NORMAL="\0033[39m" + else # "\101" RED="\033[31m" GREEN="\033[32m" YELLOW="\033[33m" -# if [ "$UNAME" = SunOS ]; then -# NORMAL="\033[30m" -# else - NORMAL="\033[39m" -# fi + NORMAL="\033[39m" fi OK="${GREEN}OK${NORMAL}" FAILED="${RED}FAILED${NORMAL}" @@ -787,6 +789,63 @@ fi /bin/rm "$TF-diff" esac +case "$TESTS" in +*%consistency%*) + # Test if help shows option types without inconsistency + $ECHO "testing if help shows option types correctly...\c" + TF="$TD/socat-hhh" + LINE="$($SOCAT -hhh |grep "^[[:space:]]*ip-add-source-membership\>")" + if [ -z "$LINE" ]; then + $ECHO $CANT + else + TYPE="$($ECHO "$LINE" |sed 's/^.*type=\([^[:space:]][^[:space:]]*\).*/\1/')" + if [ "$TYPE" != "IP-MREQ-SOURCE" ]; then + $ECHO "\n*** help does not show option types correctly" >&2 + exit 1 + else + echo " ok" + fi + fi +esac + +case "$TESTS" in +*%consistency%*) + # Test if help shows option phases without inconsistency + $ECHO "testing if help shows option phases correctly...\c" + TF="$TD/socat-hhh" + LINE="$($SOCAT -hhh |grep "^[[:space:]]*dash\>")" + if [ -z "$LINE" ]; then + $ECHO $CANT + else + PHASE="$($ECHO "$LINE" |sed 's/^.*phase=\([^[:space:]][^[:space:]]*\).*/\1/')" + if [ "$PHASE" != "PREEXEC" ]; then + $ECHO "\n*** help does not show option phases correctly" >&2 + exit 1 + else + echo " ok" + fi + fi +esac + +case "$TESTS" in +*%consistency%*) + # Test if help shows option groups without inconsistency + $ECHO "testing if help shows option groups correctly...\c" + TF="$TD/socat-hhh" + LINE="$($SOCAT -hhh |grep "^[[:space:]]*udplite-recv-cscov\>")" + if [ -z "$LINE" ]; then + $ECHO $CANT + else + GROUP="$($ECHO "$LINE" |sed 's/^.*groups=\([^[:space:]][^[:space:]]*\).*/\1/')" + if [ "$GROUP" != "UDPLITE" ]; then + $ECHO "\n*** help does not show option groups correctly" >&2 + exit 1 + else + echo " ok" + fi + fi +esac + #============================================================================== N=1 @@ -976,6 +1035,10 @@ testoptions () { # if not: prints ev.message to stderr, returns 1 childprocess () { local l + case "$1" in + [1-9]*) ;; + *) echo "childprocess \"$1\": not a number" >&2; exit 1 ;; + esac case "$UNAME" in AIX) l="$(ps -fade |grep "^........ ...... $(printf %6u $1)")" ;; FreeBSD) l="$(ps -faje |grep "^........ ..... $(printf %5u $1)")" ;; @@ -999,6 +1062,10 @@ childprocess () { childpids () { local recursive i if [ "X$1" = "X-r" ]; then recursive=1; shift; fi + case "$1" in + [1-9]*) ;; + *) echo "childpids \"$1\": not a number" >&2; exit 1 ;; + esac case "$UNAME" in AIX) l="$(ps -fade |grep "^........ ...... $(printf %6u $1)" |awk '{print($2);}')" ;; FreeBSD) l="$(ps -fl |grep "^[^ ][^ ]*[ ][ ]*[0-9][0-9]*[ ][ ]*$1[ ]" |awk '{print($2);}')" ;; @@ -1204,7 +1271,7 @@ runsunix () { routesip6 () { runsip6 >/dev/null || { echo route6; return 1; } - ping -c 1 -s 0 -6 2606:4700:4700::1111 >/dev/null 2>&1 || { echo route6; return 1; } + $PING6 -c 1 2606:4700:4700::1111 >/dev/null 2>&1 || { echo route6; return 1; } return 0; } @@ -1236,13 +1303,6 @@ checkconds() { [ "$i" ] && { echo "Only on (one of) $unames"; return 255; } fi - if [ "$root" = "root" ]; then - if [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then - echo "Must be root" - return 255 - fi - fi - if [ "$progs" ]; then for i in $progs; do if ! type >/dev/null 2>&1; then @@ -1283,11 +1343,20 @@ checkconds() { fi if [ "$inet" ]; then - if [ -z "$NTERNET" ]; then + if [ -z "$INTERNET" ]; then echo "Use test.sh option --internet" return 255 fi fi + + # Only at the end, so we get a better overview of missing features + if [ "$root" = "root" ]; then + if [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then + echo "Must be root" + return 255 + fi + fi + return 0 } @@ -1319,7 +1388,7 @@ waitip4proto () { # SunOS) l=$(netstat -an -f inet -P raw |grep '.*[1-9*]\.'$proto' [ ]*Idle') ;; # HP-UX) l=$(netstat -an |grep '^raw 0 0 .*[0-9*]\.'$proto' .* \*\.\* ') ;; # OSF1) l=$(/usr/sbin/netstat -an |grep '^raw 0 0 .*[0-9*]\.'$proto' [ ]*\*\.\*') ;; - *) #l=$(netstat -an |grep -i 'raw .*[0-9*][:.]'$proto' ') ;; + *) #l=$(netstat -an |grep -i 'raw .*[0-9*][:.]'$proto' ') ;; relsleep 5; return 0 ;; esac [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ @@ -1444,7 +1513,7 @@ waittcp4port () { OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') ;; CYGWIN*) l=$(netstat -an -p TCP |grep '^ TCP [0-9.]*:'$port' .* LISTENING') ;; DragonFly) l=$(netstat -ant |grep '^tcp4 .* .*[0-9*]\.'$port' [ ]* \*\.\* [ ]* LISTEN.*') ;; - *) l=$(netstat -an |grep -i 'tcp .*[0-9*][:.]'$port' .* listen') ;; + *) l=$(netstat -an |grep -i 'tcp .*[0-9*][:.]'$port' .* listen') ;; esac if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ \( \( $logic -eq 0 \) -a -z "$l" \) ]; then @@ -1525,7 +1594,7 @@ waitudp4port () { HP-UX) l=$(netstat -an |grep '^udp 0 0 .*[0-9*]\.'$port' .* \*\.\* ') ;; OSF1) l=$(/usr/sbin/netstat -an |grep '^udp 0 0 .*[0-9*]\.'$port' [ ]*\*\.\*') ;; DragonFly) l=$(netstat -an |grep '^udp4 .* .*[0-9*]\.'$port' [ ]* \*\.\* [ ]*') ;; - *) l=$(netstat -an |grep -i 'udp .*[0-9*][:.]'$port' ') ;; + *) l=$(netstat -an |grep -i 'udp .*[0-9*][:.]'$port' ') ;; esac if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ \( \( $logic -eq 0 \) -a -z "$l" \) ]; then @@ -1586,7 +1655,7 @@ waitsctp4port () { while [ $timeout -gt 0 ]; do case "$UNAME" in Linux) if [ "$SS" ]; then - l=$($SS -4 -n 2>/dev/null |grep "^sctp.*LISTEN .*:$port\>") + l=$($SS -4 -a -n 2>/dev/null |grep "^sctp.*LISTEN .*:$port\>") else l=$(netstat -n -a |grep '^sctp .*[0-9*]:'$port' .* LISTEN') fi ;; @@ -1601,7 +1670,7 @@ waitsctp4port () { # HP-UX) l=$(netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' .* LISTEN$') ;; # OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') ;; # CYGWIN*) l=$(netstat -an -p TCP |grep '^ TCP [0-9.]*:'$port' .* LISTENING') ;; - *) l=$(netstat -an |grep -i 'sctp .*[0-9*][:.]'$port' .* listen') ;; + *) l=$(netstat -an |grep -i 'sctp .*[0-9*][:.]'$port' .* listen') ;; esac if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ \( \( $logic -eq 0 \) -a -z "$l" \) ]; then @@ -1631,6 +1700,7 @@ waitudplite4port () { Linux) #if [ "$SS" ]; then #l=$($SS -4 -l -n -u |grep "^UNCONN .*:$port\>") #else + # On Ubuntu-20 only netstat shows udplite ports if ! netstat -nU >/dev/null 2>&1; then return 0 # speculative fi @@ -1665,6 +1735,51 @@ waitudplite4port () { return 1 } +# wait until an DCCP4 listen port is ready +waitdccp4port () { + local port="$1" + local logic="$2" # 0..wait until free; 1..wait until listening + local timeout="$3" + local l + local vx=+; case $- in *vx*) set +vx; vx=-; esac # no tracing here + [ "$logic" ] || logic=1 + [ "$timeout" ] || timeout=5 + while [ $timeout -gt 0 ]; do + case "$UNAME" in + Linux) + # On Ubuntu-20, only ss shows DCCP ports + if [ "$SS" ]; then + l=$($SS -4 -a -n 2>/dev/null |grep "^dccp.*LISTEN .*:$port\>") + else + l=$(netstat -n -a |grep '^dccp .*[0-9*]:'$port' .* LISTEN') + fi ;; +# FreeBSD) l=$(netstat -an |grep '^tcp4.* .*[0-9*]\.'$port' .* \*\.\* .* LISTEN') ;; +# NetBSD) l=$(netstat -an |grep '^tcp .* .*[0-9*]\.'$port' [ ]* \*\.\* [ ]* LISTEN.*') ;; +# Darwin) case "$(uname -r)" in +# [1-5]*) l=$(netstat -an |grep '^tcp.* .*[0-9*]\.'$port' .* \*\.\* .* LISTEN') ;; +# *) l=$(netstat -an |grep '^tcp4.* .*[0-9*]\.'$port' .* \*\.\* .* LISTEN') ;; +# esac ;; +# AIX) l=$(netstat -an |grep '^tcp[^6] 0 0 .*[*0-9]\.'$port' .* LISTEN$') ;; + SunOS) l=$(netstat -an -f inet -P dccp |grep '.*[1-9*]\.'$port' .*\* 0 .* LISTEN') ;; +# HP-UX) l=$(netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' .* LISTEN$') ;; +# OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') ;; +# CYGWIN*) l=$(netstat -an -p TCP |grep '^ TCP [0-9.]*:'$port' .* LISTENING') ;; + *) l=$(netstat -an |grep -i 'dccp .*[0-9*][:.]'$port' .* listen') ;; + esac + if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ + \( \( $logic -eq 0 \) -a -z "$l" \) ]; then + set ${vx}vx + return 0 + fi + sleep $val_t + timeout=$((timeout-1)) + done + + $ECHO "!port $port timed out! \c" >&2 + set ${vx}vx + return 1 +} + # check if a TCP6 port is in use # exits with 0 when it is not used checktcp6port () { @@ -1696,7 +1811,7 @@ waittcp6port () { SunOS) l=$(netstat -an -f inet6 -P tcp |grep '.*[1-9*]\.'$port' .*\* [ ]* 0 .* LISTEN') ;; #OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp6 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') /*?*/;; DragonFly) l=$(netstat -ant |grep '^tcp6 .* .*[0-9*]\.'$port' [ ]* \*\.\* [ ]* LISTEN.*') ;; - *) l=$(netstat -an |grep -i 'tcp6 .*:'$port' .* listen') ;; + *) l=$(netstat -an |grep -i 'tcp6 .*:'$port' .* listen') ;; esac if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ \( \( $logic -eq 0 \) -a -z "$l" \) ]; then @@ -1746,7 +1861,7 @@ waitudp6port () { #HP-UX) l=$(netstat -an |grep '^udp 0 0 .*[0-9*]\.'$port' ') ;; #OSF1) l=$(/usr/sbin/netstat -an |grep '^udp6 0 0 .*[0-9*]\.'$port' [ ]*\*\.\*') ;; DragonFly) l=$(netstat -ant |grep '^udp6 .* .*[0-9*]\.'$port' [ ]* \*\.\* [ ]*') ;; - *) l=$(netstat -an |grep -i 'udp .*[0-9*][:.]'$port' ') ;; + *) l=$(netstat -an |grep -i 'udp .*[0-9*][:.]'$port' ') ;; esac if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ \( \( $logic -eq 0 \) -a -z "$l" \) ]; then @@ -1781,9 +1896,9 @@ waitsctp6port () { while [ $timeout -gt 0 ]; do case "$UNAME" in Linux) if [ "$SS" ]; then - l=$($SS -6 -n 2>/dev/null |grep "^LISTEN .*:$port\>") + l=$($SS -6 -a -n 2>/dev/null |grep "^sctp .*LISTEN .*:$port\>") else - l=$(netstat -an |grep '^sctp[6 ] .* [0-9a-f:]*:'$port' .* LISTEN') + l=$(netstat -an |grep '^sctp[6 ] .* \*:'$port' .* LISTEN') fi ;; # FreeBSD) l=$(netstat -an |grep -i 'tcp[46][6 ] .*[0-9*][:.]'$port' .* listen') ;; # NetBSD) l=$(netstat -an |grep '^tcp6 .*[0-9*]\.'$port' [ ]* \*\.\*') ;; @@ -1791,7 +1906,7 @@ waitsctp6port () { # AIX) l=$(netstat -an |grep '^tcp[6 ] 0 0 .*[*0-9]\.'$port' .* LISTEN$') ;; SunOS) l=$(netstat -an -f inet6 -P sctp |grep '.*[1-9*]\.'$port' .*\* [ ]* 0 .* LISTEN') ;; # #OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp6 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') /*?*/;; - *) l=$(netstat -an |grep -i 'stcp6 .*:'$port' .* listen') ;; + *) l=$(netstat -an |grep -i 'stcp6 .*:'$port' .* listen') ;; esac if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ \( \( $logic -eq 0 \) -a -z "$l" \) ]; then @@ -1852,6 +1967,45 @@ waitudplite6port () { return 1 } +# wait until a dccp6 listen port is ready +# not all (Linux) variants show this in netstat +waitdccp6port () { + local port="$1" + local logic="$2" # 0..wait until free; 1..wait until listening + local timeout="$3" + local l + local vx=+; case $- in *vx*) set +vx; vx=-; esac # no tracing here + [ "$logic" ] || logic=1 + [ "$timeout" ] || timeout=5 + while [ $timeout -gt 0 ]; do + case "$UNAME" in + Linux) if [ "$SS" ]; then + l=$($SS -6 -a -n 2>/dev/null |grep "^dccp .*LISTEN .*:$port\>") + else + l=$(netstat -an |grep '^dccp[6 ] .* [0-9a-f:]*:'$port' .* LISTEN') + fi ;; +# FreeBSD) l=$(netstat -an |grep -i 'tcp[46][6 ] .*[0-9*][:.]'$port' .* listen') ;; +# NetBSD) l=$(netstat -an |grep '^tcp6 .*[0-9*]\.'$port' [ ]* \*\.\*') ;; +# OpenBSD) l=$(netstat -an |grep -i 'tcp6 .*[0-9*][:.]'$port' .* listen') ;; +# AIX) l=$(netstat -an |grep '^tcp[6 ] 0 0 .*[*0-9]\.'$port' .* LISTEN$') ;; + SunOS) l=$(netstat -an -f inet6 -P dccp |grep '.*[1-9*]\.'$port' .*\* [ ]* 0 .* LISTEN') ;; +# #OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp6 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') /*?*/;; + *) l=$(netstat -an |grep -i 'stcp6 .*:'$port' .* listen') ;; + esac + if [ \( \( $logic -ne 0 \) -a -n "$l" \) -o \ + \( \( $logic -eq 0 \) -a -z "$l" \) ]; then + set ${vx}vx + return 0 + fi + sleep $val_t + timeout=$((timeout-1)) + done + + $ECHO "!port $port timed out! \c" >&2 + set ${vx}vx + return 1 +} + # we need this misleading function name for canonical reasons waitunixport () { waitfile "$1" "$2" "$3" @@ -1895,6 +2049,15 @@ case "$UNAME" in *) SOCK_SEQPACKET=5 ;; esac + +if [ "$INTERNET" ]; then + # No "-s 24" on Solaris + if ! ping -c 1 "server-4.dest-unreach.net" >/dev/null 2>&1; then + echo "$0: Option --internet but no connectivity or DNS" >&2 + #exit 1 + fi +fi + # generate a test certificate and key gentestcert () { local name="$1" @@ -5004,7 +5167,7 @@ waittcp4port $PORT3 1 50 || $PRINTF "$FAILED: port $PORT3\n" >&2 </dev/null # now we start the external daemon eval "$CMD5 2>\"${te}5\" &" pid5=$! -waittcp4port $PORT5 1 50 || $PRINTF "$FAILED: port $5PORT\n" >&2 </dev/null +waittcp4port $PORT5 1 50 || $PRINTF "$FAILED: port $PORT5\n" >&2 </dev/null # and this is the outside client: echo "$da1" |$CMD6 >${tf}_1 2>"${te}6_1" & pid6_1=$! @@ -5014,7 +5177,7 @@ echo "$da3" |$CMD6 >${tf}_3 2>"${te}6_3" & pid6_3=$! wait $pid6_1 $pid6_2 $pid6_3 kill $pid1 $pid2 $pid3 $pid4 $pid5 $(childpids $pid5) 2>/dev/null -# (On BSDs a child of pid5 loves to hang) +# (On BSDs a child of pid5 likes to hang) # (echo "$da1"; relsleep 2) |diff - "${tf}_1" >"${tdiff}1" (echo "$da2"; relsleep 2) |diff - "${tf}_2" >"${tdiff}2" @@ -12027,7 +12190,7 @@ if [ "$ERRNOENT" ]; then cat "$tlog" >&2 failed elif [ "$user" != "$SUBSTUSER" ]; then - $PRINTF "${FAILD}(user \"$user\", expected \"$SUBSTUSER\")\n" + $PRINTF "${FAILED}(user \"$user\", expected \"$SUBSTUSER\")\n" echo "$CMD0 &" cat "$te0" >&2 failed @@ -12812,7 +12975,20 @@ TEST="$NAME: is option ipv6-join-group used" # Terminate immediately, do not transfer data. # If socat exits with 0 the test succeeds. # Up to 1.7.3.1 it failed with "1 option(s) could not be used" -if ! eval $NUMCOND; then :; else +if ! eval $NUMCOND; then :; +elif ! cond=$(checkconds \ + "" \ + "" \ + "" \ + "IP6 UDP GOPEN" \ + "UDP6-RECV GOPEN" \ + "ipv6-join-group" \ + "udp6" ); then + $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N + numCANT=$((numCANT+1)) + listCANT="$listCANT $N" + namesCANT="$namesCANT $NAME" +else tf="$td/test$N.stdout" te="$td/test$N.stderr" tdiff="$td/test$N.diff" @@ -16935,9 +17111,8 @@ te="$td/test$N.stderr" tdiff="$td/test$N.diff" da="test$N $(date) $RANDOM" #CMD0="$TRACE $SOCAT $opts PIPE SYSTEM:\"$SOCAT\ -dddd\ -lf ${te}1\ PIPE\ PIPE\",setsid,sigint" -# -T is required on (only?) OpenBSD-4 -CMD0="$TRACE $SOCAT $opts -T 2 SOCKETPAIR SYSTEM:\"$SOCAT\ -dddd\ -lf\ ${te}1\ PIPE\ PIPE\",setsid,sigint" -#CMD0="$TRACE $SOCAT $opts -T 2 SOCKETPAIR SYSTEM:\"$SOCAT\ -dddd\ -T\ 1\ -lf ${te}1\ PIPE\ PIPE\",setsid,sigint" +# Without -T process remains on OpenBSD-4, AIX, ? +CMD0="$TRACE $SOCAT $opts -T 2 SOCKETPAIR SYSTEM:\"$SOCAT\ -dddd\ -T\ 1\ -lf ${te}1\ PIPE\ PIPE\",setsid,sigint" printf "test $F_n $TEST... " $N eval $CMD0 >/dev/null 2>"${te}0" & pid0=$! @@ -18733,7 +18908,7 @@ elif ! cond=$(checkconds \ "" \ "IP6 TCP LISTEN FILE" \ "TCP-LISTEN TCP6-CONNECT FILE" \ - "" \ + "ai-addrconfig" \ "tcp6" ); then $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N cant