diff --git a/CHANGES b/CHANGES
index 8e9467f..4166168 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,10 @@ Security:
 	not given it logs to a file in . (cwd) only when it is not writable by
 	other users.
 
+Testing:
+	test.sh produces file results.txt with columns of test numbers, names,
+	and results.
+
 ####################### V 1.8.0.2:
 
 Security:
diff --git a/test.sh b/test.sh
index 55abd17..759e42b 100755
--- a/test.sh
+++ b/test.sh
@@ -92,7 +92,7 @@ debug=$DEBUG
 
 [ "$DEFS" ] && echo "BASH_VERSION=\"$BASH_VERSION\"" >&2
 
-[ "$DEFS" ] && echo "ECHO_E=\"$ECHO_E\"" >&2
+[ "$DEFS" ] && echo "ECHO=\"$ECHO\"" >&2
 
 UNAME=`uname`
 [ "$DEFS" ] && echo "UNAME=\"$UNAME\"" >&2
@@ -744,6 +744,8 @@ mkdir -p "$TD"
 
 echo "Using temp directory $TD"
 
+RESULTS="$TD/results.txt" 	# file for list of results
+
 case "$TESTS" in
 *%consistency%*)
 # test if addresses are sorted alphabetically:
@@ -796,16 +798,40 @@ listFAIL=
 listCANT=
 namesFAIL=
 
+ok () {
+    numOK=$((numOK+1))
+    listOK="$listOK $N"
+    do_result OK
+}
+
+cant () {
+    numCANT=$((numCANT+1))
+    listCANT="$listCANT $N"
+    do_result CANT
+}
+
+failed () {
+    numFAIL=$((numFAIL+1))
+    listFAIL="$listFAIL $N"
+    do_result FAILED
+}
+
+do_result () {
+    #echo "RESULTS=\"$RESULTS\"" >&2; exit
+    echo "$N $NAME $1" >>$RESULTS
+}
+
 #==============================================================================
 # test if selected socat features work ("FUNCTIONS")
 
 testecho () {
     local N="$1"
-    local title="$2"
-    local arg1="$3";	[ -z "$arg1" ] && arg1="-"
-    local arg2="$4";	[ -z "$arg2" ] && arg2="echo"
-    local opts="$5"
-    local T="$6";	[ -z "$T" ] && T=0 	# fractional seconds
+    local NAME="$2"
+    local title="$3"
+    local arg1="$4";	[ -z "$arg1" ] && arg1="-"
+    local arg2="$5";	[ -z "$arg2" ] && arg2="echo"
+    local opts="$6"
+    local T="$7";	[ -z "$T" ] && T=0 	# fractional seconds
     local tf="$td/test$N.stdout"
     local te="$td/test$N.stderr"
     local tdiff="$td/test$N.diff"
@@ -825,22 +851,19 @@ testecho () {
 	$PRINTF "$FAILED: $TRACE $SOCAT:\n"
 	echo "$TRACE $SOCAT $opts $arg1 $arg2" >&2
 	cat "$te" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
+	failed
     elif echo "$da" |diff - "$tf" >"$tdiff" 2>&1; then
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$SOCAT $opts $arg1 $arg2" >&2; fi
 	if [ -n "$debug" ]; then cat $te >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     else
 	$PRINTF "$FAILED:\n"
 	echo "$TRACE $SOCAT $opts $arg1 $arg2" >&2
 	cat "$te" >&2
 	echo diff: >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
+	failed
     fi
     fi # NUMCOND
 }
@@ -849,11 +872,12 @@ testecho () {
 # flush of od buffers
 testod () {
     local num="$1"
-    local title="$2"
-    local arg1="$3";	[ -z "$arg1" ] && arg1="-"
-    local arg2="$4";	[ -z "$arg2" ] && arg2="echo"
-    local opts="$5"
-    local T="$6";	[ -z "$T" ] && T=0 	# fractional seconds
+    local NAME="$2"
+    local title="$3"
+    local arg1="$4";	[ -z "$arg1" ] && arg1="-"
+    local arg2="$5";	[ -z "$arg2" ] && arg2="echo"
+    local opts="$6"
+    local T="$7";	[ -z "$T" ] && T=0 	# fractional seconds
     local tf="$td/test$N.stdout"
     local te="$td/test$N.stderr"
     local tr="$td/test$N.ref"
@@ -868,21 +892,18 @@ testod () {
 	$PRINTF "$FAILED: $TRACE $SOCAT:\n"
 	echo "$TRACE $SOCAT $opts $arg1 $arg2"
 	cat "$te"
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $num"
+	failed
 #    elif echo "$daout" |diff - "$tf" >"$tdiff" 2>&1; then
     elif diff "$tr" "$tf" >"$tdiff" 2>&1; then
 	$PRINTF "$OK\n"
 	if [ -n "$debug" ]; then cat $te; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     else
 	$PRINTF "$FAILED: diff:\n"
 	echo "$TRACE $SOCAT $opts $arg1 $arg2"
 	cat "$te"
 	cat "$tdiff"
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $num"
+	failed
     fi
     fi # NUMCOND
 }
@@ -1937,7 +1958,7 @@ NAME=UNISTDIO
 case "$TESTS " in
 *%$N%*|*%functions%*|*%stdio%*|*%$NAME%*)
 TEST="$NAME: unidirectional throughput from stdin to stdout"
-testecho "$N" "$TEST" "stdin" "stdout" "$opts -u"
+testecho "$N" "$NAME" "$TEST" "stdin" "stdout" "$opts -u"
 esac
 N=$((N+1))
 
@@ -1948,7 +1969,7 @@ NAME=UNPIPESTDIO
 case "$TESTS" in
 *%$N%*|*%functions%*|*%stdio%*|*%$NAME%*)
 TEST="$NAME: stdio with simple echo via internal pipe"
-testecho "$N" "$TEST" "stdio" "pipe" "$opts"
+testecho "$N" "$NAME" "$TEST" "stdio" "pipe" "$opts"
 esac
 N=$((N+1))
 
@@ -1957,7 +1978,7 @@ NAME=UNPIPESHORT
 case "$TESTS" in
 *%$N%*|*%functions%*|*%stdio%*|*%$NAME%*)
 TEST="$NAME: short form of stdio ('-') with simple echo via internal pipe"
-testecho "$N" "$TEST" "-" "pipe" "$opts"
+testecho "$N" "$NAME" "$TEST" "-" "pipe" "$opts"
 esac
 N=$((N+1))
 
@@ -1966,7 +1987,7 @@ NAME=DUALSTDIO
 case "$TESTS" in
 *%$N%*|*%functions%*|*%stdio%*|*%$NAME%*)
 TEST="$NAME: splitted form of stdio ('stdin!!stdout') with simple echo via internal pipe"
-testecho "$N" "$TEST" "stdin!!stdout" "pipe" "$opts"
+testecho "$N" "$NAME" "$TEST" "stdin!!stdout" "pipe" "$opts"
 esac
 N=$((N+1))
 
@@ -1975,7 +1996,7 @@ NAME=DUALSHORTSTDIO
 case "$TESTS" in
 *%$N%*|*%functions%*|*%stdio%*|*%$NAME%*)
 TEST="$NAME: short splitted form of stdio ('-!!-') with simple echo via internal pipe"
-testecho "$N" "$TEST" "-!!-" "pipe" "$opts"
+testecho "$N" "$NAME" "$TEST" "-!!-" "pipe" "$opts"
 esac
 N=$((N+1))
 
@@ -1984,7 +2005,7 @@ NAME=DUALFDS
 case "$TESTS" in
 *%$N%*|*%functions%*|*%fd%*|*%$NAME%*)
 TEST="$NAME: file descriptors with simple echo via internal pipe"
-testecho "$N" "$TEST" "0!!1" "pipe" "$opts"
+testecho "$N" "$NAME" "$TEST" "0!!1" "pipe" "$opts"
 esac
 N=$((N+1))
 
@@ -1996,7 +2017,7 @@ TEST="$NAME: simple echo via named pipe"
 # with MacOS, this test hangs if nonblock is not used. Is an OS bug.
 tp="$td/pipe$N"
 # note: the nonblock is required by MacOS 10.1(?), otherwise it hangs (OS bug?)
-testecho "$N" "$TEST" "" "pipe:$tp,nonblock" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "pipe:$tp,nonblock" "$opts"
 esac
 N=$((N+1))
 
@@ -2006,7 +2027,7 @@ case "$TESTS" in
 *%$N%*|*%functions%*|*%pipe%*|*%$NAME%*)
 TEST="$NAME: simple echo via named pipe, specified twice"
 tp="$td/pipe$N"
-testecho "$N" "$TEST" "" "pipe:$tp,nonblock!!pipe:$tp" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "pipe:$tp,nonblock!!pipe:$tp" "$opts"
 esac
 N=$((N+1))
 
@@ -2016,7 +2037,7 @@ case "$TESTS" in
 *%$N%*|*%functions%*|*%engine%*|*%file%*|*%ignoreeof%*|*%$NAME%*)
 TEST="$NAME: simple echo via file"
 tf="$td/file$N"
-testecho "$N" "$TEST" "" "$tf,ignoreeof!!$tf" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "$tf,ignoreeof!!$tf" "$opts"
 esac
 N=$((N+1))
 
@@ -2025,7 +2046,7 @@ NAME=EXECSOCKETPAIR
 case "$TESTS" in
 *%$N%*|*%functions%*|*%exec%*|*%socketpair%*|*%$NAME%*)
 TEST="$NAME: simple echo via exec of cat with socketpair"
-testecho "$N" "$TEST" "" "EXEC:$CAT" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "EXEC:$CAT" "$opts"
 esac
 N=$((N+1))
 
@@ -2033,7 +2054,7 @@ NAME=SYSTEMSOCKETPAIR
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%socketpair%*|*%$NAME%*)
 TEST="$NAME: simple echo via system() of cat with socketpair"
-testecho "$N" "$TEST" "" "SYSTEM:$CAT" "$opts" "$val_t"
+testecho "$N" "$NAME" "$TEST" "" "SYSTEM:$CAT" "$opts" "$val_t"
 esac
 N=$((N+1))
 
@@ -2042,7 +2063,7 @@ NAME=EXECPIPES
 case "$TESTS" in
 *%$N%*|*%functions%*|*%exec%*|*%pipe%*|*%$NAME%*)
 TEST="$NAME: simple echo via exec of cat with pipes"
-testecho "$N" "$TEST" "" "EXEC:$CAT,pipes" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "EXEC:$CAT,pipes" "$opts"
 esac
 N=$((N+1))
 
@@ -2050,7 +2071,7 @@ NAME=SYSTEMPIPES
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
 TEST="$NAME: simple echo via system() of cat with pipes"
-testecho "$N" "$TEST" "" "SYSTEM:$CAT,pipes" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "SYSTEM:$CAT,pipes" "$opts"
 esac
 N=$((N+1))
 
@@ -2062,10 +2083,9 @@ TEST="$NAME: simple echo via exec of cat with pseudo terminal"
 if ! eval $NUMCOND; then :;
 elif ! testfeats pty >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-testecho "$N" "$TEST" "" "EXEC:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "EXEC:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts"
 fi
 esac
 N=$((N+1))
@@ -2077,10 +2097,9 @@ TEST="$NAME: simple echo via system() of cat with pseudo terminal"
 if ! eval $NUMCOND; then :;
 elif ! testfeats pty >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-testecho "$N" "$TEST" "" "SYSTEM:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "SYSTEM:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts"
 fi
 esac
 N=$((N+1))
@@ -2090,7 +2109,7 @@ NAME=SYSTEMPIPESFDS
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
 TEST="$NAME: simple echo via system() of cat with pipes, non stdio"
-testecho "$N" "$TEST" "" "SYSTEM:$CAT>&9 <&8,pipes,fdin=8,fdout=9" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "SYSTEM:$CAT>&9 <&8,pipes,fdin=8,fdout=9" "$opts"
 esac
 N=$((N+1))
 
@@ -2099,7 +2118,7 @@ NAME=DUALSYSTEMFDS
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%socketpair%*|*%$NAME%*)
 TEST="$NAME: echo via dual system() of cat"
-testecho "$N" "$TEST" "SYSTEM:$CAT>&6,fdout=6!!system:$CAT<&7,fdin=7" "" "$opts" "$val_t"
+testecho "$N" "$NAME" "$TEST" "SYSTEM:$CAT>&6,fdout=6!!system:$CAT<&7,fdin=7" "" "$opts" "$val_t"
 esac
 N=$((N+1))
 
@@ -2112,7 +2131,7 @@ NAME=EXECSOCKETPAIRFLUSH
 case "$TESTS" in
 *%$N%*|*%functions%*|*%exec%*|*%socketpair%*|*%$NAME%*)
 TEST="$NAME: call to od via exec with socketpair"
-testod "$N" "$TEST" "" "EXEC:$OD_C" "$opts"
+testod "$N" "$NAME" "$TEST" "" "EXEC:$OD_C" "$opts"
 esac
 N=$((N+1))
 
@@ -2120,7 +2139,7 @@ NAME=SYSTEMSOCKETPAIRFLUSH
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%socketpair%*|*%$NAME%*)
 TEST="$NAME: call to od via system() with socketpair"
-testod "$N" "$TEST" "" "SYSTEM:$OD_C" "$opts" $val_t
+testod "$N" "$NAME" "$TEST" "" "SYSTEM:$OD_C" "$opts" $val_t
 esac
 N=$((N+1))
 
@@ -2129,7 +2148,7 @@ NAME=EXECPIPESFLUSH
 case "$TESTS" in
 *%$N%*|*%functions%*|*%exec%*|*%pipes%*|*%$NAME%*)
 TEST="$NAME: call to od via EXEC with pipes"
-testod "$N" "$TEST" "" "EXEC:$OD_C,pipes" "$opts"
+testod "$N" "$NAME" "$TEST" "" "EXEC:$OD_C,pipes" "$opts"
 esac
 N=$((N+1))
 
@@ -2137,7 +2156,7 @@ NAME=SYSTEMPIPESFLUSH
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
 TEST="$NAME: call to od via system() with pipes"
-testod "$N" "$TEST" "" "SYSTEM:$OD_C,pipes" "$opts" "$val_t"
+testod "$N" "$NAME" "$TEST" "" "SYSTEM:$OD_C,pipes" "$opts" "$val_t"
 esac
 N=$((N+1))
 
@@ -2149,10 +2168,9 @@ N=$((N+1))
 #TEST="$NAME: call to od via exec with pseudo terminal"
 #if ! testfeats pty >/dev/null; then
 #    $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-#    numCANT=$((numCANT+1))
-#    listCANT="$listCANT $N"
+#    cant
 #else
-#testod "$N" "$TEST" "" "exec:$OD_C,pty,$PTYOPTS" "$opts"
+#testod "$N" "$NAME" "$TEST" "" "exec:$OD_C,pty,$PTYOPTS" "$opts"
 #fi
 #esac
 #N=$((N+1))
@@ -2165,10 +2183,9 @@ N=$((N+1))
 #TEST="$NAME: call to od via system() with pseudo terminal"
 #if ! testfeats pty >/dev/null; then
 #    $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-#    numCANT=$((numCANT+1))
-#    listCANT="$listCANT $N"
+#    cant
 #else
-#testod "$N" "$TEST" "" "system:$OD_C,pty,$PTYOPTS" "$opts"
+#testod "$N" "$NAME" "$TEST" "" "system:$OD_C,pty,$PTYOPTS" "$opts"
 #fi
 #esac
 #N=$((N+1))
@@ -2178,7 +2195,7 @@ NAME=SYSTEMPIPESFDSFLUSH
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
 TEST="$NAME: call to od via system() with pipes, non stdio"
-testod "$N" "$TEST" "" "SYSTEM:$OD_C>&9 <&8,pipes,fdin=8,fdout=9" "$opts" "$val_t"
+testod "$N" "$NAME" "$TEST" "" "SYSTEM:$OD_C>&9 <&8,pipes,fdin=8,fdout=9" "$opts" "$val_t"
 esac
 N=$((N+1))
 
@@ -2186,7 +2203,7 @@ NAME=DUALSYSTEMFDSFLUSH
 case "$TESTS" in
 *%$N%*|*%functions%*|*%system%*|*%pipes%*|*%$NAME%*)
 TEST="$NAME: call to od via dual system()"
-testod "$N" "$TEST" "SYSTEM:$OD_C>&6,fdout=6!!SYSTEM:$CAT<&7,fdin=7" "pipe" "$opts" "$val_t"
+testod "$N" "$NAME" "$TEST" "SYSTEM:$OD_C>&6,fdout=6!!SYSTEM:$CAT<&7,fdin=7" "pipe" "$opts" "$val_t"
 esac
 N=$((N+1))
 
@@ -2198,18 +2215,15 @@ TEST="$NAME: simple echo via self receiving raw IPv4 protocol"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats rawip) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}RAWIP not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "IP4:127.0.0.1:$IPPROTO" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "IP4:127.0.0.1:$IPPROTO" "$opts"
 fi
 esac
 N=$((N+1))
@@ -2221,18 +2235,15 @@ TEST="$NAME: simple echo via self receiving raw IP protocol, v4 by target"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats rawip) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}RAWIP not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "IP:127.0.0.1:$IPPROTO" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "IP:127.0.0.1:$IPPROTO" "$opts"
 fi ;; # NUMCOND, feats
 esac
 N=$((N+1))
@@ -2244,18 +2255,15 @@ TEST="$NAME: simple echo via self receiving raw IPv6 protocol"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats rawip) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}RAWIP not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "IP6:[::1]:$IPPROTO" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "IP6:[::1]:$IPPROTO" "$opts"
 fi ;; # NUMCOND, feats
 esac
 N=$((N+1))
@@ -2267,18 +2275,15 @@ TEST="$NAME: simple echo via self receiving raw IP protocol, v6 by target"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats rawip) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}RAWIP not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "IP:[::1]:$IPPROTO" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "IP:[::1]:$IPPROTO" "$opts"
 fi
 esac
 N=$((N+1))
@@ -2297,12 +2302,11 @@ TEST="$NAME: echo via self connection of TCP IPv4 socket"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}only on Linux$NORMAL\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     newport tcp4 	# provide free port number in $PORT
     #ts="127.0.0.1:$tsl"
-    testecho "$N" "$TEST" "" "TCP:$SECONDADDR:$PORT,sp=$PORT,bind=$SECONDADDR,reuseaddr" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "TCP:$SECONDADDR:$PORT,sp=$PORT,bind=$SECONDADDR,reuseaddr" "$opts"
 fi
 esac
 N=$((N+1))
@@ -2315,11 +2319,10 @@ case "$TESTS" in
 TEST="$NAME: echo via self connection of UDP IPv4 socket"
 if [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}only on Linux$NORMAL\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     newport udp4 	# provide free port number in $PORT
-    testecho "$N" "$TEST" "" "UDP:$SECONDADDR:$PORT,sp=$PORT,bind=$SECONDADDR" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "UDP:$SECONDADDR:$PORT,sp=$PORT,bind=$SECONDADDR" "$opts"
 fi
 esac
 fi # NUMCOND
@@ -2333,16 +2336,14 @@ TEST="$NAME: echo via self connection of UDP IPv6 socket"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats udp ip6 >/dev/null || ! runsudp6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     tf="$td/file$N"
     newport udp6 	# provide free port number in $PORT
-    testecho "$N" "$TEST" "" "UDP6:[::1]:$PORT,sp=$PORT,bind=[::1]" "$opts"
+    testecho "$N" "$NAME" "$TEST" "" "UDP6:[::1]:$PORT,sp=$PORT,bind=[::1]" "$opts"
 fi
 esac
 N=$((N+1))
@@ -2356,7 +2357,7 @@ TEST="$NAME: echo via two unidirectional UDP IPv4 sockets"
 tf="$td/file$N"
 newport udp4; PORT1=$PORT 	# get free port
 newport udp4; PORT2=$PORT 	# get free port
-testecho "$N" "$TEST" "" "UDP:127.0.0.1:$PORT2,sp=$PORT1!!UDP:127.0.0.1:$PORT1,sp=$PORT2" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "UDP:127.0.0.1:$PORT2,sp=$PORT1!!UDP:127.0.0.1:$PORT1,sp=$PORT2" "$opts"
 esac
 fi # NUMCOND
 N=$((N+1))
@@ -2392,8 +2393,7 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    echo "rc=$rc2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
@@ -2401,13 +2401,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $bg 2>/dev/null
 esac
@@ -2426,8 +2424,7 @@ elif ! cond=$(checkconds "" "" "" \
 			 "so-reuseaddr" \
 			 "tcp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2448,9 +2445,7 @@ if [ $? -ne 0 ]; then
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	$PRINTF "$FAILED\n"
 	echo "$CMD0 &"
@@ -2459,17 +2454,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	cat "${te}1" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
 else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
 fi
 kill $pid1 2>/dev/null
 wait
@@ -2486,20 +2478,16 @@ TEST="$NAME: echo via connection to TCP V6 socket"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats IP6 TCP LISTEN STDIO PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs - TCP6-LISTEN PIPE STDIN STDOUT TCP6-CONNECT); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions so-reuseaddr ) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2520,8 +2508,7 @@ if [ $? -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     echo "$CMD1 &"
@@ -2530,16 +2517,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}2" >&2
     echo diff:
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null
 fi
@@ -2556,20 +2541,16 @@ TEST="$NAME: echo via connection to TCP socket, v4 by target"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO PIPE IP4 TCP LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs TCP TCP-LISTEN STDIN STDOUT PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions pf) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2590,9 +2571,7 @@ if [ $? -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
@@ -2600,17 +2579,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null
 fi
@@ -2626,20 +2602,16 @@ TEST="$NAME: echo via connection to TCP socket, v6 by target"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO PIPE IP6 TCP LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs TCP TCP-LISTEN STDIN STDOUT PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions pf) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2660,9 +2632,7 @@ if [ $? -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
@@ -2670,17 +2640,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null
 fi
@@ -2698,16 +2665,13 @@ TEST="$NAME: option ipv6-v6only=0 listens on IPv4"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions ipv6-v6only); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2727,18 +2691,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 fi
@@ -2755,16 +2716,13 @@ TEST="$NAME: option ipv6-v6only=1 does not listen on IPv4"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions ipv6-v6only); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2782,17 +2740,14 @@ echo "$da" |$CMD2 >>"$tf" 2>>"${te}2"
 if [ $? -eq 0 ]; then
    $PRINTF "$FAILED:\n"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED:\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid; wait
 wait
@@ -2808,16 +2763,13 @@ TEST="$NAME: env SOCAT_DEFAULT_LISTEN_IP for IPv4 preference on listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runstcp6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions ipv6-v6only); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2837,18 +2789,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi
@@ -2862,12 +2811,10 @@ TEST="$NAME: env SOCAT_DEFAULT_LISTEN_IP for IPv6 preference on listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2888,8 +2835,7 @@ if [ $? -ne 0 ]; then
    cat "${te}1" >&2
    echo "$CMD2"
    cat "${te}2" >&2
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED (diff):\n"
    echo "SOCAT_DEFAULT_LISTEN_IP=6 $CMD1 &"
@@ -2898,16 +2844,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}2" >&2
    echo "// diff:" >&2
    cat "$tdiff" >&2
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null; wait
 fi
@@ -2921,16 +2865,13 @@ TEST="$NAME: option -4 for IPv4 preference on listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions ipv6-v6only); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -2950,18 +2891,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi
@@ -2975,12 +2913,10 @@ TEST="$NAME: option -6 for IPv6 preference on listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -3000,18 +2936,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 wait
@@ -3026,16 +2959,13 @@ TEST="$NAME: pf=4 overrides option -6 on listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions ipv6-v6only); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -3055,18 +2985,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi
@@ -3080,12 +3007,10 @@ TEST="$NAME: pf=6 overrides option -4 on listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -3105,18 +3030,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi ;; # NUMCOND, feats
@@ -3149,8 +3071,7 @@ if [ $rc2 -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    echo "$CMD1 &"
@@ -3158,13 +3079,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    echo "$CMD2"
    cat "${te}2"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3178,8 +3097,7 @@ TEST="$NAME: echo via connection to UDP V6 socket"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -3201,18 +3119,15 @@ if [ $rc2 -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # ! testfeats
 esac
@@ -3237,18 +3152,15 @@ if [ $? -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD"
     cat "$te"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 elif ! diff "$tf1" "$tf2" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi # NUMCOND
 esac
@@ -3278,8 +3190,7 @@ if [ ! -p "$tp" ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+    failed
 else
 #echo "$da" >"$tp"	# might hang forever
 echo "$da" >"$tp" & export pid=$!; (relsleep 1; kill $pid 2>/dev/null) &
@@ -3295,13 +3206,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	$PRINTF "$FAILED: diff:\n"
 	cat "$tdiff"
     fi
-    numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi
 wait
@@ -3336,8 +3245,7 @@ if [ $? -ne 0 ]; then
     cat "${te}s"
     echo "$CMD"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     kill "$pids" 2>/dev/null
     $PRINTF "$FAILED:\n"
@@ -3346,13 +3254,11 @@ elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     echo "$CMD"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi # !(rc -ne 0)
 wait
 fi # NUMCOND
@@ -3385,8 +3291,7 @@ if [ $? -ne 0 ]; then
     cat "${te}s"
     echo "$CMD"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     kill "$pids" 2>/dev/null
     $PRINTF "$FAILED:\n"
@@ -3395,13 +3300,11 @@ elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     echo "$CMD"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi # !(rc -ne 0)
 wait
 fi # NUMCOND
@@ -3435,8 +3338,7 @@ if [ $? -ne 0 ]; then
     cat "${te}s"
     echo "$CMD"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da1" |diff - "${tf}" >"$tdiff"; then
     $PRINTF "$FAILED:\n"
     echo "$SRV &"
@@ -3444,13 +3346,11 @@ elif ! echo "$da1" |diff - "${tf}" >"$tdiff"; then
     echo "$CMD"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi # !(rc -ne 0)
 kill "$pids" 2>/dev/null; wait
 fi ;; # NUMCOND
@@ -3480,13 +3380,11 @@ kill $bg 2>/dev/null; wait
 if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
-    listFAIL="$listFAIL $N"
-    numFAIL=$((numFAIL+1))
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3514,13 +3412,11 @@ kill $bg 2>/dev/null
 if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
-    listFAIL="$listFAIL $N"
-    numFAIL=$((numFAIL+1))
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 wait
 fi ;; # NUMCOND
@@ -3543,13 +3439,11 @@ if [ -s "$te" ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3563,8 +3457,7 @@ TEST="$NAME: generation of pty for other processes"
 if ! eval $NUMCOND; then :;
 elif ! testfeats pty >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tt="$td/pty$N"
 tf="$td/test$N.stdout"
@@ -3590,13 +3483,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi ;; # NUMCOND, feats
@@ -3625,13 +3516,11 @@ if ! [ $rc0 = 0 ] ||
     echo "$CMD"
     cat "$te"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3657,13 +3546,11 @@ if ! echo "$da" |$CMD >$tf 2>"$te" ||
     echo "$CMD"
     cat "$te"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3674,7 +3561,7 @@ NAME=RIGHTTOLEFT
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: unidirectional throughput from stdin to stdout, right to left"
-testecho "$N" "$TEST" "stdout" "stdin" "$opts -U"
+testecho "$N" "$NAME" "$TEST" "stdout" "stdin" "$opts -U"
 esac
 N=$((N+1))
 
@@ -3686,12 +3573,10 @@ case "$TESTS" in
 if ! eval $NUMCOND; then :
 elif ! F=$(testfeats STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 TEST="$NAME: child process default properties"
 tf="$td/test$N.stdout"
@@ -3711,14 +3596,12 @@ then
     $PRINTF "$FAILED:\n"
     echo "$CMD"
     cat "$te" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3747,12 +3630,10 @@ then
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3781,12 +3662,10 @@ then
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -3800,16 +3679,13 @@ TEST="$NAME: openssl connect"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! type openssl >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl executable not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -3835,13 +3711,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi ;; # NUMCOND, feats
@@ -3856,12 +3730,10 @@ TEST="$NAME: openssl listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -3883,13 +3755,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -3904,12 +3774,10 @@ TEST="$NAME: openssl listen"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -3931,13 +3799,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -3970,12 +3836,10 @@ TEST="$NAME: $TESTKEYW half close"
 if ! eval $NUMCOND; then :;
 elif [ "$FEAT" != ',' ] && ! testfeats "$FEAT" >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $FEAT not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runs$RUNS >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$RUNS not available on host${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -3998,8 +3862,7 @@ if ! echo "$da" |$OD_C |diff - "$tf" >"$tdiff"; then
     echo "$CMD"
     cat "${te}"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then
@@ -4007,8 +3870,7 @@ else
 	echo "  $CMD"
     fi
    if [ -n "$debug" ]; then cat "${te}2" "${te}"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 wait
 fi ;; # NUMCOND, feats
@@ -4038,12 +3900,10 @@ TEST="$NAME: OpenSSL server authentication (hostname)"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -4066,13 +3926,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD1"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4087,12 +3945,10 @@ TEST="$NAME: openssl client authentication"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -4115,13 +3971,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4136,16 +3990,13 @@ TEST="$NAME: OpenSSL+FIPS client and server authentication"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testoptions fips >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL/FIPS not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 OPENSSL_FIPS=1 gentestcert testsrvfips
 OPENSSL_FIPS=1 gentestcert testclifips
@@ -4168,13 +4019,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4190,16 +4039,13 @@ TEST="$NAME: OpenSSL compression"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testoptions openssl-compress >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL compression option not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     gentestcert testsrv
     printf "test $F_n $TEST... " $N
@@ -4231,13 +4077,11 @@ else
         cat "${te}1"
         cat "${te}2"
         cat "$tdiff"
-        numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+        failed
     else
         $PRINTF "$OK\n"
         if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-        numOK=$((numOK+1))
-	listOK="$listOK $N"
+        ok
     fi
 fi ;; # NUMCOND, feats
 esac
@@ -4251,12 +4095,10 @@ TEST="$NAME: socks4 connect over TCP/IPv4"
 if ! eval $NUMCOND; then :;
 elif ! testfeats socks4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SOCKS4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -4278,13 +4120,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4299,12 +4139,10 @@ TEST="$NAME: socks4 connect over TCP/IPv6"
 if ! eval $NUMCOND; then :;
 elif ! testfeats socks4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SOCKS4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -4327,16 +4165,14 @@ if ! echo "$da" |diff - "${tf}1" >"$tdiff"; then
     cat "${te}1" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4352,12 +4188,10 @@ TEST="$NAME: socks4a connect over TCP/IPv4"
 if ! eval $NUMCOND; then :;
 elif ! testfeats socks4a >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SOCKS4A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -4379,13 +4213,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4400,12 +4232,10 @@ TEST="$NAME: socks4a connect over TCP/IPv6"
 if ! eval $NUMCOND; then :;
 elif ! testfeats socks4a >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SOCKS4A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -4427,13 +4257,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4449,12 +4277,10 @@ TEST="$NAME: proxy connect over TCP/IPv4"
 if ! eval $NUMCOND; then :;
 elif ! testfeats proxy >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PROXY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.sh"
 tf="$td/test$N.stdout"
@@ -4477,13 +4303,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4498,12 +4322,10 @@ TEST="$NAME: proxy connect over TCP/IPv6"
 if ! eval $NUMCOND; then :;
 elif ! testfeats proxy >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PROXY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.sh"
 tf="$td/test$N.stdout"
@@ -4526,13 +4348,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4566,18 +4386,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -4588,7 +4405,7 @@ NAME=EXECCATNOFORK
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: simple echo via exec of cat with nofork"
-testecho "$N" "$TEST" "" "EXEC:$CAT,nofork" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "EXEC:$CAT,nofork" "$opts"
 esac
 N=$((N+1))
 
@@ -4597,7 +4414,7 @@ NAME=SYSTEMCATNOFORK
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: simple echo via system() of cat with nofork"
-testecho "$N" "$TEST" "" "SYSTEM:$CAT,nofork" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "SYSTEM:$CAT,nofork" "$opts"
 esac
 N=$((N+1))
 
@@ -4606,7 +4423,7 @@ NAME=NOFORKSETSID
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: simple echo via exec() of cat with nofork and setsid"
-testecho "$N" "$TEST" "" "SYSTEM:$CAT,nofork,setsid" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "SYSTEM:$CAT,nofork,setsid" "$opts"
 esac
 N=$((N+1))
 
@@ -4622,12 +4439,10 @@ N=$((N+1))
 #echo "$da" |$TRACE $SOCAT stdin!!stdout UDP:$ts >"$tf"
 #if [ $? -eq 0 ] && echo "$da" |diff "$tf" -; then
 #   $ECHO "... test $N succeeded"
-#   numOK=$((numOK+1))
-#   listOK="$listOK $N"
+#   ok
 #else
 #   $ECHO "*** test $N $FAILED"
-#    numFAIL=$((numFAIL+1))
-#    listFAIL="$listFAIL $N"
+#    failed
 #fi
 #fi ;; # NUMCOND
 #N=$((N+1))
@@ -4642,12 +4457,10 @@ N=$((N+1))
 #echo "$da" |$TRACE $SOCAT - FILE:$tf.tmp,ignoreeof >"$tf"
 #if [ $? -eq 0 ] && echo "$da" |diff "$tf" -; then
 #   $ECHO "... test $N succeeded"
-#   numOK=$((numOK+1))
-#   listOK="$listOK $N"
+#   ok
 #else
 #   $ECHO "*** test $N $FAILED"
-#   numFAIL=$((numFAIL+1))
-#    listFAIL="$listFAIL $N"
+#   failed
 #fi
 #fi ;; # NUMCOND
 
@@ -4678,13 +4491,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4724,13 +4535,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "$te" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 wait
 MICROS=$SAVEMICS
@@ -4746,8 +4555,7 @@ TEST="$NAME: proxy connect accepts status with multiple spaces"
 if ! eval $NUMCOND; then :;
 elif ! testfeats proxy >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PROXY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.sh"
 tf="$td/test$N.stdout"
@@ -4771,16 +4579,14 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1" >&2
     echo "diff:"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$debug" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$debug" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -4804,19 +4610,16 @@ CMD="$TRACE $SOCAT $opts -u /dev/null -,setlk"
 $CMD <"$ff"  2>"$te"
 if [ "$?" -eq 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     if [ "$UNAME" = "Linux" ]; then
 	$PRINTF "$FAILED\n"
 	echo "$CMD"
 	cat "$te"
-	numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+	failed
     else
 	$PRINTF "${YELLOW}failed (don't care)${NORMAL}\n"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
     fi
 fi
 fi ;; # NUMCOND
@@ -4828,7 +4631,7 @@ NAME=SINGLEEXECOUTSOCKETPAIR
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: inheritance of stdout to single exec with socketpair"
-testecho "$N" "$TEST" "-!!exec:cat" "" "$opts" 1
+testecho "$N" "$NAME" "$TEST" "-!!exec:cat" "" "$opts" 1
 esac
 N=$((N+1))
 
@@ -4836,7 +4639,7 @@ NAME=SINGLEEXECOUTPIPE
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: inheritance of stdout to single exec with pipe"
-testecho "$N" "$TEST" "-!!exec:cat,pipes" "" "$opts" 1
+testecho "$N" "$NAME" "$TEST" "-!!exec:cat,pipes" "" "$opts" 1
 esac
 N=$((N+1))
 
@@ -4847,10 +4650,9 @@ TEST="$NAME: inheritance of stdout to single exec with pty"
 if ! eval $NUMCOND; then :;
 elif ! testfeats pty >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-testecho "$N" "$TEST" "-!!exec:cat,pty,raw" "" "$opts" 1
+testecho "$N" "$NAME" "$TEST" "-!!exec:cat,pty,raw" "" "$opts" 1
 fi ;; # NUMCOND, feats
 esac
 N=$((N+1))
@@ -4859,7 +4661,7 @@ NAME=SINGLEEXECINSOCKETPAIR
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: inheritance of stdin to single exec with socketpair"
-testecho "$N" "$TEST" "exec:cat!!-" "" "$opts"
+testecho "$N" "$NAME" "$TEST" "exec:cat!!-" "" "$opts"
 esac
 N=$((N+1))
 
@@ -4867,7 +4669,7 @@ NAME=SINGLEEXECINPIPE
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: inheritance of stdin to single exec with pipe"
-testecho "$N" "$TEST" "exec:cat,pipes!!-" "" "$opts"
+testecho "$N" "$NAME" "$TEST" "exec:cat,pipes!!-" "" "$opts"
 esac
 N=$((N+1))
 
@@ -4878,10 +4680,9 @@ TEST="$NAME: inheritance of stdin to single exec with pty, with delay"
 if ! eval $NUMCOND; then :;
 elif ! testfeats pty >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-testecho "$N" "$TEST" "exec:cat,pty,raw!!-" "" "$opts" $MISCDELAY
+testecho "$N" "$NAME" "$TEST" "exec:cat,pty,raw!!-" "" "$opts" $MISCDELAY
 fi ;; # NUMCOND, feats
 esac
 N=$((N+1))
@@ -4893,11 +4694,10 @@ TEST="$NAME: inheritance of stdin to single exec with pty"
 if ! eval $NUMCOND; then :;
 elif ! testfeats pty >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PTY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # T value needed (only) by AIX
-testecho "$N" "$TEST" "exec:cat,pty,raw!!-" "" "$opts" 0.1
+testecho "$N" "$NAME" "$TEST" "exec:cat,pty,raw!!-" "" "$opts" 0.1
 fi ;; # NUMCOND, feats
 esac
 N=$((N+1))
@@ -4911,8 +4711,7 @@ TEST="$NAME: readline with password and sigint"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats readline pty); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 SAVETERM="$TERM"; TERM=	# 'cause console might print controls even in raw
 SAVEMICS=$MICROS
@@ -4925,9 +4724,9 @@ te="$td/test$N.stderr"
 tr="$td/test$N.ref"
 tdiff="$td/test$N.diff"
 da="test$N $(date) $RANDOM"; da="$da$($ECHO '\r')"
-# the feature that we really want to test is in the readline.sh script
+# The feature that we really want to test is in the readline.sh script
 READLINE_LOG=; if grep -e -lf ./readline.sh >/dev/null; then READLINE_LOG="-lf $td/test$N.rl-log"; fi
-CMD="$TRACE $SOCAT -lpwrapper $opts -t1 open:$tpi,nonblock!!open:$tpo exec:\"./readline.sh -nh $READLINE_LOG ./readline-test.sh\",pty,ctty,setsid,raw,echo=0,isig"
+CMD="$TRACE $SOCAT -lpwrapper $opts -t1 OPEN:$tpi,nonblock!!OPEN:$tpo EXEC:\"./readline.sh -nh $READLINE_LOG ./readline-test.sh\",pty,ctty,setsid,raw,echo=0,isig"
 #echo "$CMD" >"$ts"
 #chmod a+x "$ts"
 printf "test $F_n $TEST... " $N
@@ -4985,14 +4784,12 @@ if ! tr "$($ECHO '\r \c')" "% " <$tpo |sed 's/%$//g' |sed 's/.*%//g' |diff "$tr"
     cat "$te" 2>&1
     echo diff:  2>&1
     cat "$tdiff" 2>&1
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 wait
 MICROS=$SAVEMICS
@@ -5047,8 +4844,7 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}4" >&2
     echo diff: >&2
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
@@ -5059,8 +4855,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}3" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD4"; fi
     if [ "$DEBUG" ];   then cat "${te}4" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -5074,8 +4869,7 @@ TEST="$NAME: gender changer via SSL through HTTP proxy, oneshot"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats openssl proxy); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat" |tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -5135,13 +4929,11 @@ if ! (echo "$da"; sleep 2) |diff - "$tf" >"$tdiff"; then
     echo "$CMD4 &"
     cat "${te}4"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}1" "${te}2" "${te}3" "${te}4" "${te}5" "${te}6"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null
 wait
@@ -5166,8 +4958,7 @@ TEST="$NAME: gender changer via SSL through HTTP proxy, daemons"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats openssl proxy); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -5251,19 +5042,16 @@ if test -s "${tdiff}1" -o -s "${tdiff}2" -o -s "${tdiff}3"; then
     echo "$CMD6 &"
     cat "${te}6_3"
     cat "${tdiff}3"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
   else
     $PRINTF "$OK ${YELLOW}(partial failure)${NORMAL}\n"
     if [ -n "$debug" ]; then cat "${te}1" "${te}2" "${te}3" "${te}4" "${te}5" ${te}6*; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
   fi
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}1" "${te}2" "${te}3" "${te}4" "${te}5" ${te}6*; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null
 wait
@@ -5307,8 +5095,7 @@ testserversec () {
 	$PRINTF "$NO_RESULT (ph.1 server not working):\n"
 	echo "$TRACE $SOCAT $opts \"$arg1,$secopt0\" echo &"
 	cat "${te}1"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
 	wait; return
     fi
     # now use client
@@ -5322,8 +5109,7 @@ testserversec () {
 	cat "${te}1"
 	echo "$TRACE $SOCAT $opts - \"$arg2\""
 	cat "${te}2"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
 	wait; return
     elif echo "$da" |diff - "$tf" >"$tdiff1" 2>&1; then
 	:	# function without security is ok, go on
@@ -5334,16 +5120,14 @@ testserversec () {
 	echo "$TRACE $SOCAT $opts - $arg2"
 	cat "${te}2"
 	cat "$tdiff1"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
 	wait; return
     fi
 
     # then: with security
     if [ "$port" ] && ! wait${proto}${ipvers}port $port 0; then
 	$PRINTF "$NO_RESULT (ph.1 port remains in use)\n"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
 	wait; return
     fi
     wait
@@ -5365,8 +5149,7 @@ testserversec () {
 	wait
 	echo "$CMD3"
 	cat "${te}3"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
 	return
     fi
     # now use client
@@ -5392,8 +5175,7 @@ testserversec () {
 	    echo "$TRACE $SOCAT $opts - $arg2"
 	    cat "${te}4"
 	    cat "$tdiff2"
-	    numFAIL=$((numFAIL+1))
-	    listFAIL="$listFAIL $N"
+	    failed
     elif [ "X$expect" != 'X*' -a X$result != X$expect ]; then
 	case X$result in
 	X-1) $PRINTF "$NO_RESULT (ph.2 client error): $TRACE $SOCAT:\n"
@@ -5401,8 +5183,7 @@ testserversec () {
 	    cat "${te}3"
 	    echo "$TRACE $SOCAT $opts - $arg2"
 	    cat "${te}4"
-	    numCANT=$((numCANT+1))
-	    listCANT="$listCANT $N"
+	    cant
 	    ;;
 	X0) $PRINTF "$NO_RESULT (ph.2 diff failed): diff:\n"
 	    echo "$TRACE $SOCAT $opts $arg echo"
@@ -5410,8 +5191,7 @@ testserversec () {
 	    echo "$TRACE $SOCAT $opts - $arg2"
 	    cat "${te}4"
 	    cat "$tdiff2"
-	    numCANT=$((numCANT+1))
-	    listCANT="$listCANT $N"
+	    cant
 	    ;;
 	X1) $PRINTF "$FAILED: SECURITY BROKEN\n"
 	    echo "$TRACE $SOCAT $opts $arg echo"
@@ -5419,8 +5199,7 @@ testserversec () {
 	    echo "$TRACE $SOCAT $opts - $arg2"
 	    cat "${te}4"
 	    cat "$tdiff2"
-	    numFAIL=$((numFAIL+1))
-	    listFAIL="$listFAIL $N"
+	    failed
 	    ;;
 	X2) $PRINTF "$FAILED: diff:\n"
 	    echo "$TRACE $SOCAT $opts $arg echo"
@@ -5428,8 +5207,7 @@ testserversec () {
 	    echo "$TRACE $SOCAT $opts - $arg2"
 	    cat "${te}4"
 	    cat "$tdiff2"
-	    numFAIL=$((numFAIL+1))
-	    listFAIL="$listFAIL $N"
+	    failed
 	    ;;
 	esac
     else
@@ -5438,8 +5216,7 @@ testserversec () {
 	[ "$debug" ] && cat ${te}3
 	[ "$VERBOSE" ] && echo "  $TRACE $SOCAT $opts - $arg2"
 	[ "$debug" ] && cat ${te}4
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
     wait
 #set +vx
@@ -5454,8 +5231,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$SECONDADDR" ]; then
     # we need access to a second addresses
     $PRINTF "test $F_n $TEST... ${YELLOW}need a second IPv4 address${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp4 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "TCP4-L:$PORT,reuseaddr,fork,retry=1" "" "range=$SECONDADDR/32" "TCP4:127.0.0.1:$PORT" 4 tcp $PORT 0
@@ -5471,8 +5247,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$SECONDADDR" ]; then
     # we need access to a second addresses
     $PRINTF "test $F_n $TEST... ${YELLOW}need a second IPv4 address${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp4 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "TCP4-L:$PORT,reuseaddr,fork,retry=1" "" "range=$SECONDADDR:255.255.255.255" "TCP4:127.0.0.1:$PORT" 4 tcp $PORT 0
@@ -5522,8 +5297,7 @@ TEST="$NAME: security of TCP4-L with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip4 libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -5542,8 +5316,7 @@ TEST="$NAME: security of TCP4-L with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip4 libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -5563,8 +5336,7 @@ TEST="$NAME: security of TCP6-L with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "TCP6-L:$PORT,reuseaddr,fork,retry=1" "" "range=[::2]/128" "TCP6:[::1]:$PORT" 6 tcp $PORT 0
@@ -5579,8 +5351,7 @@ TEST="$NAME: security of TCP6-L with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "TCP6-L:$PORT,reuseaddr,fork,retry=1" "" "sp=$PORT" "TCP6:[::1]:$PORT" 6 tcp $PORT 0
@@ -5595,8 +5366,7 @@ TEST="$NAME: security of TCP6-L with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "TCP6-L:$PORT,reuseaddr,fork,retry=1" "" "lowport" "TCP6:[::1]:$PORT" 6 tcp $PORT 0
@@ -5611,8 +5381,7 @@ TEST="$NAME: security of TCP6-L with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6 libwrap && runstcp6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -5666,8 +5435,7 @@ TEST="$NAME: security of UDP4-L with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4 libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -5687,8 +5455,7 @@ TEST="$NAME: security of UDP6-L with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 #testserversec "$N" "$TEST" "$opts" "UDP6-L:$PORT,reuseaddr,fork" "" "range=[::2]/128" "UDP6:[::1]:$PORT" 6 udp $PORT 0
@@ -5704,8 +5471,7 @@ TEST="$NAME: security of UDP6-L with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "UDP6-L:$PORT,reuseaddr" "" "sp=$PORT" "UDP6:[::1]:$PORT" 6 udp $PORT 0
@@ -5720,8 +5486,7 @@ TEST="$NAME: security of UDP6-L with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "UDP6-L:$PORT,reuseaddr" "" "lowport" "UDP6:[::1]:$PORT" 6 udp $PORT 0
@@ -5736,8 +5501,7 @@ TEST="$NAME: security of UDP6-L with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6 libwrap && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -5756,8 +5520,7 @@ TEST="$NAME: security of SSL-L over TCP/IPv4 with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 newport tcp4 	# provide free port number in $PORT
@@ -5773,8 +5536,7 @@ TEST="$NAME: security of SSL-L with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 newport tcp4 	# provide free port number in $PORT
@@ -5790,8 +5552,7 @@ TEST="$NAME: security of SSL-L with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 newport tcp4 	# provide free port number in $PORT
@@ -5807,8 +5568,7 @@ TEST="$NAME: security of SSL-L with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 tcp libwrap openssl); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 ha="$td/hosts.allow"
@@ -5828,8 +5588,7 @@ TEST="$NAME: security of SSL-L with client certificate"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -5846,8 +5605,7 @@ TEST="$NAME: security of SSL with server certificate"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -5865,12 +5623,10 @@ TEST="$NAME: security of SSL-L over TCP/IPv6 with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert6 testsrv6
 newport tcp6 	# provide free port number in $PORT
@@ -5886,12 +5642,10 @@ TEST="$NAME: security of SSL-L over TCP/IPv6 with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert6 testsrv6
 newport tcp6 	# provide free port number in $PORT
@@ -5907,12 +5661,10 @@ TEST="$NAME: security of SSL-L over TCP/IPv6 with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert6 testsrv6
 newport tcp6 	# provide free port number in $PORT
@@ -5928,8 +5680,7 @@ TEST="$NAME: security of SSL-L over TCP/IPv6 with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 tcp libwrap openssl && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert6 testsrv6
 ha="$td/hosts.allow"
@@ -5953,12 +5704,10 @@ TEST="$NAME: security of client openssl-commonname option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -5979,12 +5728,10 @@ TEST="$NAME: security of server openssl-commonname option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -6002,16 +5749,13 @@ TEST="$NAME: OpenSSL restrictions by FIPS"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testoptions fips >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL/FIPS not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestcert testcli
@@ -6027,7 +5771,7 @@ NAME=UNIEXECEOF
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: give exec'd write-only process a chance to flush (-u)"
-testod "$N" "$TEST" "" EXEC:"$OD_C" "$opts -u"
+testod "$N" "$NAME" "$TEST" "" EXEC:"$OD_C" "$opts -u"
 esac
 N=$((N+1))
 
@@ -6036,7 +5780,7 @@ NAME=REVEXECEOF
 case "$TESTS" in
 *%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: give exec'd write-only process a chance to flush (-U)"
-testod "$N" "$TEST" EXEC:"$OD_C" "-" "$opts -U"
+testod "$N" "$NAME" "$TEST" EXEC:"$OD_C" "-" "$opts -U"
 esac
 N=$((N+1))
 
@@ -6051,13 +5795,11 @@ printf "test $F_n $TEST... " $N
 type=$($FILAN -f . 2>$te |tail -n 1 |awk '{print($2);}')
 if [ "$type" = "dir" ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi ;; # NUMCOND
 esac
@@ -6086,16 +5828,14 @@ if [ "$type" = "socket" ]; then
 	echo "$SOCAT $opts UNIX-LISTEN:\"$ts\" /dev/null </dev/null 2>\"$te1\""
 	echo "$FILAN -f "$ts" 2>$te2 |tail -n 1 |awk '{print(\$2);}'"
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$SOCAT $opts UNIX-LISTEN:\"$ts\" /dev/null </dev/null 2>\"$te1\"" >&2
     cat "$te1"
     echo "$FILAN -f "$ts" 2>$te2 |tail -n 1 |awk '{print(\$2);}'" >&2
     cat "$te2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 kill $spid 2>/dev/null
 wait
@@ -6144,8 +5884,7 @@ if echo "$da" |diff - "$tf"> "$tdiff"; then
 	echo "  $TRACE $SOCAT $opts -lpsocat1 PTY,$PTYTYPE,pty-wait-slave,link=\"$tp\" UNIX-LISTEN:\"$ts\"" >&2
 	echo "  $TRACE $SOCAT -lpsocat3 $opts - file:\"$tp\",$PTYOPTS2" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "${YELLOW}FAILED${NORMAL}\n"
     cat "$te1"
@@ -6153,8 +5892,7 @@ else
     cat "$te3"
     cat "$te4"
     cat "$tdiff"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 fi
 set +vx
 }
@@ -6167,12 +5905,10 @@ TEST="$NAME: test if master pty ($PTYTYPE) waits for slave connection"
 if ! eval $NUMCOND; then :; else
 if ! feat=$(testfeats pty); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions "$PTYTYPE" pty-wait-slave); then
     $PRINTF "test $F_n $TEST... ${YELLOW}option $(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
    testptywaitslave "$N" "$TEST" "$PTYTYPE" "$opts"
 fi
@@ -6188,12 +5924,10 @@ TEST="$NAME: test if master pty ($PTYTYPE) waits for slave connection"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats pty); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions "$PTYTYPE" pty-wait-slave); then
     $PRINTF "test $F_n $TEST... ${YELLOW}option $(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
    testptywaitslave "$N" "$TEST" "$PTYTYPE" "$opts"
 fi ;; # NUMCOND, feats
@@ -6209,12 +5943,10 @@ TEST="$NAME: test the connect-timeout option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions connect-timeout); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # We need a hanging connection attempt, guess an address for this
 case "$UNAME" in
@@ -6236,8 +5968,7 @@ if ! kill $pid1 2>"$tk1"; then
     $PRINTF "${YELLOW}does not hang${NORMAL}\n"
     echo "$CMD" >&2
     cat "$te1" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # Second, set connect-timeout and see if socat exits before kill
 CMD="$TRACE $SOCAT $opts - TCP:$HANGIP:1,connect-timeout=$(reltime 1)"
@@ -6248,15 +5979,13 @@ if kill $pid2 2>"$tk2"; then
     $PRINTF "$FAILED (\n"
     echo "$CMD" >&2
     cat "$te2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then
 	echo "$CMD" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi
 wait
@@ -6297,8 +6026,7 @@ if [ $rc2 -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED (diff)\n"
     echo "$CMD1 &"
@@ -6307,13 +6035,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}2" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi ;;
 esac
 fi # NUMCOND
@@ -6327,8 +6053,7 @@ TEST="$NAME: openssl listen with DSA certificate"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 SRVCERT=testsrvdsa
 gentestdsacert $SRVCERT
@@ -6351,13 +6076,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat ${te}1 ${te}2; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -6392,8 +6115,7 @@ TEST="$NAME: exit status when dying on SIG$signam"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats pty); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat" |tr a-z A-Z) not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 SIG="$(signum $signam)"
 te="$td/test$N.stderr"
@@ -6419,14 +6141,12 @@ sleep 1; kill -INT $(cat $tp)
 wait
 if [ "$stat" -eq $((128+$SIG)) ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 wait
 fi ;; # NUMCOND, feats
@@ -6443,8 +6163,7 @@ TEST="$NAME: restrict reading from file with bytes option"
 if ! eval $NUMCOND; then :;
 elif false; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tr="$td/test$N.ref"
 ti="$td/test$N.in"
@@ -6468,13 +6187,11 @@ if ! diff "$tr" "$to" >"$tdiff" 2>&1; then
     echo "$CMD"
     cat "$te"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -6488,20 +6205,16 @@ TEST="$NAME: UDP socket rebinds after first connection"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO IP4 UDP PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO UDP4-CONNECT UDP4-LISTEN PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions bind so-reuseaddr fork) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -6526,8 +6239,7 @@ if [ $? -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     kill "$pids" 2>/dev/null
     $PRINTF "$NO_RESULT (first conn failed); diff:\n"
@@ -6536,8 +6248,7 @@ elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     echo "$CMD1"
     cat "${te}1" >&2
     cat "$tdiff"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 relsleep 2		# UDP-LISTEN sleeps 1s
 echo "$da2" |eval "$CMD1" >"${tf}2" 2>"${te}2"
@@ -6548,8 +6259,7 @@ if [ $rc -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da2" |diff - "${tf}2" >"$tdiff"; then
     $PRINTF "$FAILED: diff\n"
     echo "$CMD0 &"
@@ -6558,16 +6268,14 @@ elif ! echo "$da2" |diff - "${tf}2" >"$tdiff"; then
     cat "${te}1" >&2
     echo "diff:"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi # !( $? -ne 0)
 fi # !(rc -ne 0)
 wait
@@ -6594,11 +6302,10 @@ TEST="$NAME: $PROTOV listen handles 2 concurrent connections"
 if ! eval $NUMCOND; then :;
 #elif ! feat=$(testfeats $PROTOV); then
 #    $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$PROTOV" |tr a-z A-Z) not available${NORMAL}\n" $N
-#    numCANT=$((numCANT+1))
+#    cant
 elif ! runs$protov >/dev/null; then
      $PRINTF "test $F_n $TEST... ${YELLOW}$PROTOV not available${NORMAL}\n" $N
-     numCANT=$((numCANT+1))
-     listCANT="$listCANT $N"
+     cant
 else
 ts="$td/test$N.sock"
 tref="$td/test$N.ref"
@@ -6650,8 +6357,7 @@ if ! diff -u "$tref" "$tf" >"$tdiff"; then
     echo "$CMD1"
     cat "${te}2" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -6660,8 +6366,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi # !(rc -ne 0)
 wait
 fi ;; # NUMCOND, feats
@@ -6703,18 +6408,15 @@ if [ $? -ne 0 ]; then
     echo "$SRV &"
     echo "$CLI"
     cat "${te}s" "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     kill "$pids" 2>/dev/null
     $PRINTF "$FAILED; diff:\n"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi # !(rc -ne 0)
 wait
 fi ;; # NUMCOND
@@ -6753,8 +6455,7 @@ if [ $rc -ne 0 ]; then
     cat "${te}s"
     echo "$CLI"
     cat "${te}1" "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     kill "$pids" 2>/dev/null
     $PRINTF "$FAILED:\n"
@@ -6763,12 +6464,10 @@ elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     echo "$CLI"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi # !(rc -ne 0)
 fi ;; # NUMCOND
 esac
@@ -6783,7 +6482,7 @@ TEST="$NAME: simple echo via exec of cat with pipes,stderr"
 # this test is known to fail when logging is enabled with OPTS/opts env var.
 SAVE_opts="$opts"
 opts="$(echo "$opts" |sed 's/-dd*//g')"
-testecho "$N" "$TEST" "" "EXEC:$CAT,pipes,stderr" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "EXEC:$CAT,pipes,stderr" "$opts"
 opts="$SAVE_opts"
 esac
 N=$((N+1))
@@ -6800,7 +6499,7 @@ case "$opts" in
 *-d*) opts="$opts -d" ;;
 *) opts="-d -d" ;;
 esac
-testecho "$N" "$TEST" "" "exec:$CAT,pipes,stderr" "$opts"
+testecho "$N" "$NAME" "$TEST" "" "exec:$CAT,pipes,stderr" "$opts"
 opts="$SAVE_opts"
 esac
 N=$((N+1))
@@ -6811,7 +6510,7 @@ NAME=SIMPLEPARSE
 case "$TESTS" in
 *%$N%*|*%functions%*|*%PARSE%*|*%$NAME%*)
 TEST="$NAME: invoke socat from socat"
-testecho "$N" "$TEST" "" exec:"$SOCAT - exec\:$CAT,pipes" "$opts" "$val_t"
+testecho "$N" "$NAME" "$TEST" "" exec:"$SOCAT - exec\:$CAT,pipes" "$opts" "$val_t"
 esac
 N=$((N+1))
 
@@ -6836,20 +6535,17 @@ if [ "$rc" -ne 0 ]; then
     $PRINTF "$FAILED:\n"
     echo "$TRACE $SOCAT" -u "exec:echo $da" -
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif [ -s "$tdiff" ]; then
     $PRINTF "$FAILED:\n"
     echo diff:
     cat "$tdiff"
     if [ -n "$debug" ]; then cat $te; fi
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat $te; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -6859,7 +6555,7 @@ NAME=NESTEDSOCATEXEC
 case "$TESTS" in
 *%parse%*|*%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: does lexical analysis work sensibly (exec)"
-testecho "$N" "$TEST" "" "exec:'$SOCAT - exec:$CAT,pipes'" "$opts" 1
+testecho "$N" "$NAME" "$TEST" "" "exec:'$SOCAT - exec:$CAT,pipes'" "$opts" 1
 esac
 N=$((N+1))
 
@@ -6867,7 +6563,7 @@ NAME=NESTEDSOCATSYSTEM
 case "$TESTS" in
 *%parse%*|*%$N%*|*%functions%*|*%$NAME%*)
 TEST="$NAME: does lexical analysis work sensibly (system)"
-testecho "$N" "$TEST" "" "system:\"$SOCAT - exec:$CAT,pipes\"" "$opts" 1
+testecho "$N" "$NAME" "$TEST" "" "system:\"$SOCAT - exec:$CAT,pipes\"" "$opts" 1
 esac
 N=$((N+1))
 
@@ -6879,12 +6575,10 @@ TEST="$NAME: TCP4 mapped into TCP6 address space"
 if ! eval $NUMCOND; then :;
 elif true; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature removed${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats tcp ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -6905,18 +6599,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null; wait
 fi ;; # NUMCOND, feats
@@ -6956,8 +6647,7 @@ if [ "$rc2" -ne 0 ]; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -6965,13 +6655,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi # NUMCOND
  ;;
@@ -6986,8 +6674,7 @@ TEST="$NAME: UDP/IPv6 datagram"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -7010,18 +6697,15 @@ if [ $? -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat ${te}1 ${te}2; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -7035,8 +6719,7 @@ TEST="$NAME: raw IPv4 datagram"
 if ! eval $NUMCOND; then :;
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -7062,18 +6745,15 @@ if [ $rc2 -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # root, NUMCOND
 esac
@@ -7088,12 +6768,10 @@ TEST="$NAME: raw IPv6 datagram by self addressing"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 rawip && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -7115,18 +6793,15 @@ if [ $? -ne 0 ]; then
 #   cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # root, NUMCOND
 esac
@@ -7160,8 +6835,7 @@ if [ $rc2 -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD1 &"
@@ -7170,16 +6844,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}2" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -7216,8 +6888,7 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -7225,13 +6896,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi # NUMCOND
  ;;
@@ -7246,8 +6915,7 @@ TEST="$NAME: UDP/IPv6 receive"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -7273,18 +6941,15 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -7298,8 +6963,7 @@ TEST="$NAME: raw IPv4 receive"
 if ! eval $NUMCOND; then :;
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -7325,18 +6989,15 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, root
 esac
@@ -7350,12 +7011,10 @@ TEST="$NAME: raw IPv6 receive"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 rawip && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -7380,18 +7039,15 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, root
 esac
@@ -7425,18 +7081,15 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi # NUMCOND
  ;;
@@ -7451,8 +7104,7 @@ TEST="$NAME: security of UDP4-RECVFROM with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "UDP4-RECVFROM:$PORT,reuseaddr" "" "sp=$PORT" "UDP4-SENDTO:127.0.0.1:$PORT" 4 udp $PORT 0
@@ -7467,8 +7119,7 @@ TEST="$NAME: security of UDP4-RECVFROM with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "UDP4-RECVFROM:$PORT,reuseaddr" "" "lowport" "UDP4-SENDTO:127.0.0.1:$PORT" 4 udp $PORT 0
@@ -7495,8 +7146,7 @@ TEST="$NAME: security of UDP4-RECVFROM with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 udp libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -7517,8 +7167,7 @@ TEST="$NAME: security of UDP4-RECV with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4; PORT1=$PORT
 newport udp4; PORT2=$PORT
@@ -7537,8 +7186,7 @@ TEST="$NAME: security of UDP4-RECV with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4; PORT1=$PORT
 newport udp4; PORT2=$PORT
@@ -7556,8 +7204,7 @@ TEST="$NAME: security of UDP4-RECV with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4; PORT1=$PORT
 newport udp4; PORT2=$PORT
@@ -7575,8 +7222,7 @@ TEST="$NAME: security of UDP4-RECV with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip4 libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4; PORT1=$PORT
 newport udp4; PORT2=$PORT
@@ -7599,8 +7245,7 @@ TEST="$NAME: security of UDP6-RECVFROM with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "UDP6-RECVFROM:$PORT,reuseaddr" "" "sp=$PORT" "UDP6-SENDTO:[::1]:$PORT" 6 udp $PORT 0
@@ -7615,8 +7260,7 @@ TEST="$NAME: security of UDP6-RECVFROM with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 testserversec "$N" "$TEST" "$opts" "UDP6-RECVFROM:$PORT,reuseaddr" "" "lowport" "UDP6-SENDTO:[::1]:$PORT" 6 udp $PORT 0
@@ -7631,8 +7275,7 @@ TEST="$NAME: security of UDP6-RECVFROM with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 #testserversec "$N" "$TEST" "$opts" "UDP6-RECVFROM:$PORT,reuseaddr,fork" "" "range=[::2]/128" "UDP6-SENDTO:[::1]:$PORT" 6 udp $PORT 0
@@ -7648,8 +7291,7 @@ TEST="$NAME: security of UDP6-RECVFROM with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6 libwrap && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -7669,8 +7311,7 @@ TEST="$NAME: security of UDP6-RECV with SOURCEPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6; PORT1=$PORT
 newport udp6; PORT2=$PORT
@@ -7689,8 +7330,7 @@ TEST="$NAME: security of UDP6-RECV with LOWPORT option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6; PORT1=$PORT
 newport udp6; PORT2=$PORT
@@ -7708,8 +7348,7 @@ TEST="$NAME: security of UDP6-RECV with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6; PORT1=$PORT
 newport udp6; PORT2=$PORT
@@ -7727,8 +7366,7 @@ TEST="$NAME: security of UDP6-RECV with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6 libwrap && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -7751,12 +7389,10 @@ TEST="$NAME: security of IP4-RECVFROM with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp4 	# provide free port number in $PORT
 #testserversec "$N" "$TEST" "$opts" "IP4-RECVFROM:$IPPROTO,reuseaddr,fork" "" "range=$SECONDADDR/32" "IP4-SENDTO:127.0.0.1:$IPPROTO" 4 ip $IPPROTO 0
@@ -7773,12 +7409,10 @@ TEST="$NAME: security of IP4-RECVFROM with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -7801,12 +7435,10 @@ TEST="$NAME: security of IP4-RECV with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 IPPROTO1=$IPPROTO; #IPPROTO=$((IPPROTO+1))
 IPPROTO2=$((IPPROTO+1))
@@ -7827,12 +7459,10 @@ TEST="$NAME: security of IP4-RECV with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 IPPROTO1=$IPPROTO; #IPPROTO=$((IPPROTO+1))
 IPPROTO2=$((IPPROTO+1))
@@ -7856,12 +7486,10 @@ TEST="$NAME: security of IP6-RECVFROM with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 rawip && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport udp6 	# provide free port number in $PORT
 #testserversec "$N" "$TEST" "$opts" "IP6-RECVFROM:$IPPROTO,reuseaddr,fork" "" "range=[::2]/128" "IP6-SENDTO:[::1]:$IPPROTO" 6 ip $IPPROTO 0
@@ -7878,12 +7506,10 @@ TEST="$NAME: security of IP6-RECVFROM with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 rawip libwrap && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ha="$td/hosts.allow"
 hd="$td/hosts.deny"
@@ -7905,12 +7531,10 @@ TEST="$NAME: security of IP6-RECV with RANGE option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 rawip) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}raw IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 IPPROTO1=$IPPROTO; #IPPROTO=$((IPPROTO+1))
 IPPROTO2=$((IPPROTO+1))
@@ -7929,12 +7553,10 @@ TEST="$NAME: security of IP6-RECV with TCPWRAP option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip6 rawip libwrap && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 IPPROTO1=$IPPROTO; #IPPROTO=$((IPPROTO+1))
 IPPROTO2=$((IPPROTO+1))
@@ -7962,8 +7584,7 @@ TEST="$NAME: option O_NOATIME on file"
 if ! eval $NUMCOND; then :;
 elif ! testoptions o-noatime >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}o-noatime not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.file"
 te="$td/test$N.stderr"
@@ -7983,8 +7604,7 @@ if [ $? -ne 0 ]; then # command failed
     $PRINTF "${FAILED}:\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
 # check which file has a later atime stamp
 if [ $(ls -ltu "${tf}1" "${tf}2" |head -1 |sed 's/.* //') != "${tf}2" ];
@@ -7992,13 +7612,11 @@ then
    $PRINTF "$FAILED: $TRACE $SOCAT:\n"
    echo "$CMD"
    cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi # wrong time stamps
 fi # command ok
 fi ;; # NUMCOND, feats
@@ -8016,8 +7634,7 @@ TEST="$NAME: option O_NOATIME on file descriptor"
 if ! eval $NUMCOND; then :;
 elif ! testoptions o-noatime >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}o-noatime not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.file"
 te="$td/test$N.stderr"
@@ -8039,8 +7656,7 @@ if [ $rc -ne 0 ]; then # command failed
     $PRINTF "${FAILED} (rc=$rc):\n"
     echo "$CMD"
     cat "$te" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
 # check which file has a later atime stamp
 if [ $(ls -ltu "${tf}1" "${tf}2" |head -1 |sed 's/.* //') != "${tf}2" ];
@@ -8048,14 +7664,12 @@ then
     $PRINTF "$FAILED (bad order):\n"
     echo "$CMD" >&2
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi # wrong time stamps
 fi # command ok
 fi ;; # NUMCOND, feats
@@ -8073,8 +7687,7 @@ TEST="$NAME: extended file system options using fs noatime option"
 if ! eval $NUMCOND; then :;
 elif ! testoptions fs-noatime >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}fs-noatime not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.socket"
 tf="$td/test$N.file"
@@ -8089,8 +7702,7 @@ CMD="$TRACE $SOCAT $opts -u /dev/null create:\"${tf}1\",fs-noatime"
 $CMD0 2>"${te}0"
 if [ $? -ne 0 ]; then
     $PRINTF "${YELLOW} cannot test${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # generate a file with noatime, len >= 1
 $CMD 2>"$te"
@@ -8098,8 +7710,7 @@ if [ $? -ne 0 ]; then # command failed
     $PRINTF "${YELLOW}impotent file system?${NORMAL}\n"
     echo "$CMD"
     cat "$te"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 sleep 1
 # generate a reference file
@@ -8114,13 +7725,11 @@ then
    $PRINTF "$FAILED: $TRACE $SOCAT:\n"
    echo "$CMD"
    cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi # not impotent
 fi # can test
@@ -8136,8 +7745,7 @@ TEST="$NAME: option cool-write"
 if ! eval $NUMCOND; then :;
 elif ! testoptions cool-write >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}option cool-write not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 #set -vx
 ti="$td/test$N.pipe"
@@ -8159,13 +7767,11 @@ if [ $rc -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD &"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8187,8 +7793,7 @@ TEST="$NAME: option cool-write on bidirectional stdio"
 if ! eval $NUMCOND; then :;
 elif ! testoptions cool-write >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}option cool-write not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 #set -vx
 ti="$td/test$N.pipe"
@@ -8212,13 +7817,11 @@ if [ $rc -ne 0 ]; then
     cat "${te}1"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8265,8 +7868,7 @@ if [ $rc2a -ne 0 -o $rc2b -ne 0 ]; then
     cat "${te}2a" >&2
     echo "$CMD2"
     cat "${te}2b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! $ECHO "$da2a\n$da2b" |diff - "${tf}0" >"$tdiff"; then
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD0 &"
@@ -8278,8 +7880,7 @@ elif ! $ECHO "$da2a\n$da2b" |diff - "${tf}0" >"$tdiff"; then
     echo "$CMD2"
     cat "${te}2b" >&2
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -8290,8 +7891,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}2a" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -8326,19 +7926,16 @@ if [ $? -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1a" "${te}1b" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! $ECHO "$da1a\n$da1b" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
    cat "${te}1a" "${te}1b" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1a" "${te}1b" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -8372,14 +7969,12 @@ PTY=$(grep "N PTY is " $te |sed 's/.*N PTY is //')
 rc=$(cat "$td/test$N.rc0")
 if [ "$rc" = 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -8423,8 +8018,7 @@ if [ $rc1 != 0 -o $rc2 != 0 ]; then
     cat "${te}1" >&2
     echo "$CMD1"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - "${tf}" >"$tdiff"; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -8433,8 +8027,7 @@ elif echo "$da" |diff - "${tf}" >"$tdiff"; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD0 &"
@@ -8445,8 +8038,7 @@ else
     cat "${te}2" >&2
     echo "// diff:" >&2
     cat "${tdiff}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -8463,8 +8055,7 @@ TEST="$NAME: UDP6-LISTEN with bind"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats udp ip6) || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}UDP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8486,18 +8077,15 @@ if [ $rc2 -ne 0 ]; then
    echo "$CMD1 &"
    echo "$CMD2"
    cat "${te}1" "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8513,8 +8101,7 @@ TEST="$NAME: use of multiple tcpwrapper enabling options"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip4 libwrap) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8538,18 +8125,15 @@ if [ $rc2 -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8565,8 +8149,7 @@ TEST="$NAME: specification of TCP6 address in hosts.allow"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats tcp ip6 libwrap && runsip6); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8592,18 +8175,15 @@ if [ $rc2 -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8617,8 +8197,7 @@ TEST="$NAME: UDP/IPv4 broadcast"
 if ! eval $NUMCOND; then :;
 elif [ -z "$BCADDR" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}dont know a broadcast address${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8645,13 +8224,11 @@ if [ "$rc2" -ne 0 ]; then
     echo "$CMD2"
     cat "${te}1"
     cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$tut" ]; then
@@ -8659,8 +8236,7 @@ else
 	echo "$CMD2"
     fi
     if [ -n "$debug" ]; then cat $te; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8677,12 +8253,10 @@ TEST="$NAME: raw IPv4 broadcast"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}raw IP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ -z "$BCADDR" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}dont know a broadcast address${NORMAL}\n" $N
 else
@@ -8715,8 +8289,7 @@ if [ "$rc2" -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" | sed 's/XXXX/YYYY/'|diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD1 &"
@@ -8725,16 +8298,14 @@ elif ! echo "$da" | sed 's/XXXX/YYYY/'|diff - "$tf" >"$tdiff"; then
     cat "${te}2" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD2"; fi
 	if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8764,16 +8335,13 @@ TEST="$NAME: UDP/IPv4 multicast, send only"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 udp) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs UDP4-RECV UDP4-SENDTO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions ip-add-membership bind) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8798,8 +8366,7 @@ if [ "$rc2" -ne 0 ]; then
    cat "${te}1" >&2
    echo "$CMD2"
    cat "${te}2" >&2
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    echo "$CMD1 &"
@@ -8807,16 +8374,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    echo "$CMD2"
    cat "${te}2" >&2
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8829,12 +8394,10 @@ TEST="$NAME: IPv4 multicast"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8861,18 +8424,15 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8889,24 +8449,19 @@ TEST="$NAME: UDP/IPv6 multicast"
 if ! eval $NUMCOND; then :;
 elif ! f=$(testfeats ip6 udp); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $f not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs - STDIO UDP6-RECV UDP6-SENDTO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions ipv6-join-group) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv6 does not work on $HOSTNAME${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! echo |$SOCAT -u -t 0.1 - UDP6-SENDTO:[ff02::1]:12002 >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv6 multicasting does not work${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -8932,14 +8487,11 @@ if [ "$rc2" -ne 0 ]; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 #    if ! [ "$UNAME" = Linux ] || ! [[ $(uname -r) =~ ^2\.* ]] || ! [[ ^3\.* ]] || ! [[ ^4\.[0-4]\.* ]]; then
 #   $PRINTF "${YELLOW}works only on Linux up to about 4.4${NORMAL}\n" $N
-#   numCANT=$((numCANT+1))
-#   listCANT="$listCANT $N"
+#   cant
 #    else
    $PRINTF "$FAILED\n"
    echo "$CMD1 &"
@@ -8947,8 +8499,7 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    echo "$CMD2"
    cat "${te}2"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-   listFAIL="$listFAIL $N"
+   failed
 #    fi
 else
     $PRINTF "$OK\n"
@@ -8956,8 +8507,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -8994,8 +8544,7 @@ if [ "$rc2" -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD1 &"
@@ -9004,16 +8553,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}2" >&2
     echo diff: >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -9026,12 +8573,10 @@ TEST="$NAME: IPv4 multicast, with reply"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 rawip) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -9057,13 +8602,11 @@ if [ "$rc2" -ne 0 ]; then
     echo "$CMD2"
     cat "${te}1"
     cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$tut" ]; then
@@ -9071,8 +8614,7 @@ else
 	echo "$CMD2"
     fi
     if [ -n "$debug" ]; then cat $te; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -9090,12 +8632,10 @@ TEST="$NAME: reading data sent through tun interface"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 tun) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -9120,21 +8660,18 @@ if [ $? -ne 0 ]; then
     echo "$CMD &"
     echo "$CMD1"
     cat "${te}" "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD &"
     echo "$CMD1"
     cat "$tdiff"
     cat "${te}" "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}" "${te}1"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -9152,12 +8689,10 @@ TEST="$NAME: pass data through tun interface using INTERFACE"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats ip4 tun interface) || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -9184,8 +8719,7 @@ if [ "$rc1" -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD0 &"
@@ -9194,16 +8728,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1" >&2
     echo "// diff:"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -9217,8 +8749,7 @@ TEST="$NAME: abstract UNIX stream socket, listen and connect"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats abstract-unixsocket); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.socket"
 tf="$td/test$N.stdout"
@@ -9243,8 +8774,7 @@ if [ $? -ne 0 ]; then
     cat "${te}s"
     echo "$CMD"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     kill "$pids" 2>/dev/null
     $PRINTF "$FAILED:\n"
@@ -9253,13 +8783,11 @@ elif ! echo "$da1" |diff - "${tf}1" >"$tdiff"; then
     echo "$CMD"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi # !(rc -ne 0)
 wait
 fi ;; # NUMCOND, feats
@@ -9274,8 +8802,7 @@ TEST="$NAME: abstract UNIX datagram"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats abstract-unixsocket); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -9300,8 +8827,7 @@ if [ $rc2 -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD1 &"
@@ -9309,16 +8835,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD2"
     cat "${te}2" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -9332,8 +8856,7 @@ TEST="$NAME: abstract UNIX datagram receive"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats abstract-unixsocket); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.socket"
 tf="$td/test$N.stdout"
@@ -9359,8 +8882,7 @@ if [ "$rc2" -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD1 &"
@@ -9368,16 +8890,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD2"
     cat "${te}2" >&2
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -9396,8 +8916,7 @@ TEST="$NAME: abstract bind"
 if ! eval $NUMCOND; then :; 
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -9413,21 +8932,18 @@ if [ $rc1 -ne 0 ]; then
     echo "$CMD1"
     echo "rc=$rc1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff -q - $tf; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD1" >&2
     cat "${te}1" >&2
     echo "$da" |diff - "$tf" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -9454,8 +8970,7 @@ TEST="$NAME: socat handles data buffered by openssl"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats openssl) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.out"
 te="$td/test$N.err"
@@ -9480,13 +8995,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD2"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 wait
 fi # NUMCOND, featsesac
@@ -9510,8 +9023,7 @@ TEST="$NAME: trigger EOF after that many bytes, even when socket idle"
 if ! eval $NUMCOND; then :;
 elif false; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tr="$td/test$N.ref"
 ti="$td/test$N.in"
@@ -9525,13 +9037,11 @@ printf "test $F_n $TEST... " $N
 if test -s "$to"; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -9575,18 +9085,15 @@ if [ $? -ne 0 ]; then
     echo "$CMD1 &"
     echo "$CMD2"
     cat "${te}1" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif [ -f "$tda" ]; then
     $PRINTF "$FAILED\n"
     cat "${te}1" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -9626,18 +9133,15 @@ if [ $? -ne 0 ]; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid1 2>/dev/null
 wait
@@ -9671,15 +9175,13 @@ TEST="$NAME: more than FOPEN_MAX FDs in use"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 REDIR=
 #set -vx
 if [ -z "$FOPEN_MAX" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}could not determine FOPEN_MAX${NORMAL}\n" "$N"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     if [ $FOPEN_MAX -lt 270 ]; then
 	OPEN_FILES=$FOPEN_MAX	# more than the highest FOPEN_MAX
@@ -9692,9 +9194,9 @@ i=3; while [ "$i" -lt "$OPEN_FILES" ]; do
     i=$((i+1))
 done
 #echo "$REDIR"
-#testecho "$N" "$TEST" "" "pipe" "$opts -T 3" "" 1 
+#testecho "$N" "$NAME" "$TEST" "" "pipe" "$opts -T 3" "" 1 
 #set -vx
-eval testecho "\"$N\"" "\"$TEST\"" "\"\"" "pipe" "\"$opts -T $((2*SECONDs))\"" 1 $REDIR
+eval testecho "\"$N\"" "\"$NAME\"" "\"$TEST\"" "\"\"" "pipe" "\"$opts -T $((2*SECONDs))\"" 1 $REDIR
 #set +vx
 fi # could determine FOPEN_MAX
 fi ;; # NUMCOND
@@ -9733,24 +9235,20 @@ l="$(childprocess $pid1)"
 kill $pid1 2>/dev/null; wait
 if [ $rc2 -ne 0 ]; then
     $PRINTF "$NO_RESULT (client failed)\n"	# already handled in test UDP4STREAM
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$NO_RESULT (diff failed)\n"	# already handled in test UDP4STREAM
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif $(isdefunct "$l"); then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD1 &"
     echo "$CMD2"
     cat "${te}1" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -9793,16 +9291,14 @@ if [ $rc2 -ne 0 ]; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$NO_RESULT\n"	# already handled in test UDP4DGRAM
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif $(isdefunct "$l"); then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD1 &"
@@ -9810,16 +9306,14 @@ elif $(isdefunct "$l"); then
     echo "$CMD2"
     cat "${te}2" >&2
     cat "${te}1" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -9839,8 +9333,7 @@ TEST="$NAME: raw IPv4 receive with bind"
 if ! eval $NUMCOND; then :;
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -9866,18 +9359,15 @@ if [ "$rc2" -ne 0 ]; then
    echo "$CMD2"
    cat "${te}1"
    cat "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, root
 esac
@@ -9916,8 +9406,7 @@ rc2b=$?
 kill $pid1 2>/dev/null; wait
 if [ $rc2b -ne 0 ]; then
     $PRINTF "$NO_RESULT\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! echo "$da2b" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD1 &" >&2
@@ -9925,13 +9414,11 @@ elif ! echo "$da2b" |diff - "$tf" >"$tdiff"; then
     echo "$CMD2" >&2
     cat "${te}2b" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}1" "${te}2" "${te}3"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -9958,20 +9445,17 @@ echo "$da" |diff - "$tf" >"$tdiff"
 if [ "$rc" -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif [ -s "$tdiff" ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo diff:
     cat "$tdiff"
     if [ -n "$debug" ]; then cat $te; fi
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat $te; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10013,24 +9497,20 @@ fi
 kill $pid1 2>/dev/null; wait
 if [ $rc1 -ne 0 ]; then
     $PRINTF "$NO_RESULT\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $nsocks -eq 0 ]; then
     $PRINTF "$NO_RESULT\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $nsocks -ne 1 ]; then
     $PRINTF "$FAILED ($nsocks listening sockets)\n"
     echo "$CMD0 &"
     echo "$CMD1"
     cat "${te}0" "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10061,19 +9541,16 @@ if [ $rc0 != 0 ]; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - "$tf" >/dev/null; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     echo "$CMD1"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi ;; # NUMCOND
 esac
@@ -10099,18 +9576,15 @@ if [ $? -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat $te; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10139,13 +9613,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED: diff:\n"
     cat "$tdiff"
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat $te; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10170,20 +9642,16 @@ if ! eval $NUMCOND; then :;
 #elif [[ "$PF" == "#*" ]]; then :
 elif [ "$ROOT" = root -a $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats ${KEYW%[46]} IP${KEYW##*[A-Z]}); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$KEYW not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runs${proto} >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$KEYW not available on host${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testoptions $SCM_RECV >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}option $SCM_RECV not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -10239,8 +9707,7 @@ if [ "$rc1" -ne 0 ]; then
     echo "$CMD1"
     grep " $LEVELS " "${te}0"
     grep " $LEVELS " "${te}1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! grep "ancillary message: $SCM_TYPE: $SCM_NAME=" ${te}0 >/dev/null; then
     $PRINTF "$FAILED\n"
     echo "variable $SCM_TYPE: $SCM_NAME not set"
@@ -10248,8 +9715,7 @@ elif ! grep "ancillary message: $SCM_TYPE: $SCM_NAME=" ${te}0 >/dev/null; then
     echo "$CMD1"
     grep " $LEVELS " "${te}0"
     grep " $LEVELS " "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! grep "ancillary message: $SCM_TYPE: $SCM_NAME=$SCM_VALUE\$" ${te}0 >/dev/null; then
     $PRINTF "$FAILED\n"
     badval="$(grep "ancillary message: $SCM_TYPE: $SCM_NAME" ${te}0 |sed 's/.*=//g')"
@@ -10258,21 +9724,18 @@ elif ! grep "ancillary message: $SCM_TYPE: $SCM_NAME=$SCM_VALUE\$" ${te}0 >/dev/
     echo "$CMD1"
     grep " $LEVELS " "${te}0"
     grep " $LEVELS " "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then grep " $LEVELS " "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "echo XYZ |$CMD1"; fi
     if [ "$DEBUG" ];   then grep " $LEVELS " "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 else # option is not supported
     $PRINTF "${YELLOW}$SCM_RECV not available${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 fi # option is not supported
 fi # NUMCOND, root, feats
  ;;
@@ -10331,12 +9794,10 @@ TEST="$NAME: $KEYW-LISTEN sets environment variables with socket addresses"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats $FEAT); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat" |tr a-z A-Z) not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runs${protov} >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -10374,8 +9835,7 @@ if [ $rc1 != 0 ]; then
     cat "${te}0"
     echo "$CMD1"
     cat "${te}1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ "$(grep SOCAT_SOCKADDR "${tf}" |sed -e 's/^[^=]*=//' |sed -e "s/[\"']//g")" = "$TEST_SOCKADDR" -a \
     "$(grep SOCAT_PEERADDR "${tf}" |sed -e 's/^[^=]*=//' -e "s/[\"']//g")" = "$TEST_PEERADDR" -a \
     \( "$PORTMETHOD" = ',' -o "$(grep SOCAT_SOCKPORT "${tf}" |sed -e 's/^[^=]*=//' |sed -e 's/"//g')" = "$TEST_SOCKPORT" \) -a \
@@ -10388,8 +9848,7 @@ elif [ "$(grep SOCAT_SOCKADDR "${tf}" |sed -e 's/^[^=]*=//' |sed -e "s/[\"']//g"
 	echo "$CMD1"
 	cat "${te}1"
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -10398,8 +9857,7 @@ else
     cat "${te}1"
     echo -e "SOCAT_SOCKADDR=$TEST_SOCKADDR\nSOCAT_PEERADDR=$TEST_PEERADDR\nSOCAT_SOCKPORT=$TEST_SOCKPORT\nSOCAT_PEERPORT=$TEST_PEERPORT" |
     diff - "${tf}"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND, feats
  ;;
@@ -10438,12 +9896,10 @@ TEST="$NAME: $KEYW ancillary message sets env SOCAT_$SCM_ENVNAME"
 if ! eval $NUMCOND; then :;
 elif [ "$ROOT" = root -a $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ "$PF" = "IP6" ] && ( ! feat=$(testfeats ip6) || ! runsip6 ) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -10495,8 +9951,7 @@ if [ "$rc1" -ne 0 ]; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 #elif ! $GREP_E "^export SOCAT_$SCM_ENVNAME=[\"']?$SCM_VALUE[\"']?\$" ${tf} >/dev/null; then
 #elif ! eval echo "$TRACE $SOCAT_\$SCM_VALUE" |diff - "${tf}" >/dev/null; then
 elif ! expr "$(cat "$tf")" : "$SCM_VALUE\$" >/dev/null; then
@@ -10506,21 +9961,18 @@ elif ! expr "$(cat "$tf")" : "$SCM_VALUE\$" >/dev/null; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "{ echo XYZ; sleep 0.1; } |$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 else # option is not supported
     $PRINTF "${YELLOW}$SCM_RECV not available${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 fi # option is not supported
 fi ;; # NUMCOND, feats
 esac
@@ -10588,8 +10040,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10597,13 +10048,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi # NUMCOND
  ;;
@@ -10619,8 +10068,7 @@ TEST="$NAME: socket connect with TCP/IPv6"
 if ! eval $NUMCOND; then :;
 elif ! testfeats tcp ip6 >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # start a TCP6-LISTEN process that echoes data, and send test data using
 # SOCKET-CONNECT, selecting TCP/IPv6. The sent data should be returned.
@@ -10649,8 +10097,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10658,13 +10105,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10699,8 +10144,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10708,13 +10152,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10755,8 +10197,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10764,13 +10205,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10809,8 +10248,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10818,13 +10256,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10864,8 +10300,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10873,13 +10308,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10921,8 +10354,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10930,13 +10362,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -10977,8 +10407,7 @@ if [ "$rc1" -ne 0 ]; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
@@ -10986,13 +10415,11 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    cat "${te}0"
    echo "$CMD1"
    cat "${te}1"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat $te; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND
 esac
@@ -11006,8 +10433,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$SECONDADDR" ]; then
     # we need access to more loopback addresses
     $PRINTF "test $F_n $TEST... ${YELLOW}need a second IPv4 address${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp4; ts1p=$(printf "%04x" $PORT);
 testserversec "$N" "$TEST" "$opts" "SOCKET-LISTEN:2:6:x${ts1p}x00000000x0000000000000000,$REUSEADDR,fork,retry=1" "" "range=x0000x7f000000:x0000xffffffff" "SOCKET-CONNECT:2:6:x${ts1p}x${SECONDADDRHEX}x0000000000000000" 4 tcp $PORT 0
@@ -11031,8 +10457,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$TIOCEXCL" ]; then
     # we use the numeric value of TIOCEXL which is system dependent
     $PRINTF "test $F_n $TEST... ${YELLOW}no value of TIOCEXCL${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tp="$td/test$N.pty"
 tf="$td/test$N.stdout"
@@ -11057,21 +10482,18 @@ if ! echo "$da" |diff - "$tf" >/dev/null; then
     echo "$CMD0 &"
     echo "$CMD1"
     echo "$da" |diff - "$tf"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc2 -eq 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
     echo "$CMD1"
     echo "$CMD2"
     cat "${te}0" "${te}1" "${te}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND, TIOCEXCL
 ;;
@@ -11096,8 +10518,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$TCP_MAXSEG" ]; then
     # we use the numeric value of TCP_MAXSEG which might be system dependent
     $PRINTF "test $F_n $TEST... ${YELLOW}value of TCPMAXSEG not known${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -11124,29 +10545,25 @@ if ! echo "$da" |diff - "${tf}1" >"$tdiff"; then
     echo "$CMD1"
     cat ${te}1
     cat "$tdiff"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc1 -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
     cat ${te}0
     echo "$CMD1"
     cat ${te}1
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif [ $rc2 -eq 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
     cat ${te}0
     echo "$CMD2"
     cat ${te}2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -11175,8 +10592,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$SO_REUSEADDR" ]; then
     # we use the numeric value of SO_REUSEADDR which might be system dependent
     $PRINTF "test $F_n $TEST... ${YELLOW}value of SO_REUSEADDR not known${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -11207,8 +10623,7 @@ if ! echo "$da" |diff - "${tf}1" >"${tdiff}1"; then
     echo "$CMD1"
     cat ${te}1
     cat "${tdiff}1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc3 -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
@@ -11219,8 +10634,7 @@ elif [ $rc3 -ne 0 ]; then
     cat ${te}2
     echo "$CMD3"
     cat ${te}3
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "${tf}3" >"${tdiff}3"; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
@@ -11232,13 +10646,11 @@ elif ! echo "$da" |diff - "${tf}3" >"${tdiff}3"; then
     echo "$CMD3"
     cat ${te}3
     cat "${tdiff}3"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2" "${te}3"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND, SO_REUSEADDR
  ;;
@@ -11253,15 +10665,12 @@ TEST="$NAME: echo via connection to SCTP V4 socket"
 if ! eval $NUMCOND; then :;
 elif ! testfeats sctp ip4 >/dev/null || ! runsip4 >/dev/null || ! runssctp4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SCTP4 not available${NORMAL}\n" $N
-    listCANT="$listCANT $N"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ "$UNAME" = Linux ] && ! grep ^sctp /proc/modules >/dev/null; then
     # RHEL5 based systems became unusable when an sctp socket was created but
     # module sctp not loaded
     $PRINTF "test $F_n $TEST...${YELLOW}load sctp module!${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -11283,18 +10692,15 @@ if [ $? -ne 0 ]; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid1 2>/dev/null
 wait
@@ -11310,12 +10716,10 @@ TEST="$NAME: echo via connection to SCTP V6 socket"
 if ! eval $NUMCOND; then :;
 elif ! testfeats sctp ip6 >/dev/null || ! runsip6 >/dev/null || ! runssctp6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SCTP6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ "$UNAME" = Linux ] && ! grep ^sctp /proc/modules >/dev/null; then
     $PRINTF "test $F_n $TEST...${YELLOW}load sctp module!${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -11337,18 +10741,15 @@ if [ $? -ne 0 ]; then
    cat "${te}1"
    echo "$CMD2"
    cat "${te}2"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
    $PRINTF "$FAILED: diff:\n"
    cat "$tdiff"
-   numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+   failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 fi # NUMCOND, feats
@@ -11381,21 +10782,17 @@ TEST="$NAME: OpenSSL connections survive renogotiation"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! type openssl >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl executable not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! [[ $(echo $OPENSSL_VERSION |awk '{print($2);}') =~ [01].* ]]; then
     # openssl s_client apparently provides renegotiation only up to version 1.2
     $PRINTF "test $F_n $TEST... ${YELLOW}not with OpenSSL $OPENSSL_VERSION${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -11420,16 +10817,14 @@ if echo "$da" |diff - ${tf}1 >"$tdiff"; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif grep -i "Connection refused" "${te}1" >/dev/null; then
     $PRINTF "$CANT (conn failed)\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD0 &"
@@ -11438,8 +10833,7 @@ else
     cat "${te}1" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11461,21 +10855,17 @@ TEST="$NAME: OpenSSL connections do not block after renogotiation"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! type openssl >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl executable not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! [[ $(echo $OPENSSL_VERSION |awk '{print($2);}') =~ [01].* ]]; then
     # openssl s_client apparently provides renegotiation only up to version 1.2
     $PRINTF "test $F_n $TEST... ${YELLOW}not with OpenSSL $OPENSSL_VERSION${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -11500,16 +10890,14 @@ if echo "$da" |diff - ${tf}1 >"$tdiff"; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif grep -i "Connection refused" "${te}1" >/dev/null; then
     $PRINTF "$CANT (conn failed)\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$FAILED (diff)\n"
     echo "$CMD0 &"
@@ -11518,8 +10906,7 @@ else
     cat "${te}1" >&2
     echo "// diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11550,14 +10937,12 @@ $CMD0 </dev/null 1>&0 2>"${te}0"
 rc0=$?
 if [ $rc0 -lt 128 ] || [ $rc0 -eq 255 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11585,14 +10970,12 @@ $CMD0 </dev/null 1>&0 2>"${te}0"
 rc0=$?
 if [ $rc0 -lt 128 ] || [ $rc0 -eq 255 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11621,14 +11004,12 @@ $CMD0 </dev/null 1>&0 2>"${te}0"
 rc0=$?
 if [ $rc0 -lt 128 ] || [ $rc0 -eq 255 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11668,16 +11049,14 @@ if [ $rc1 -ne 0 ]; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif grep -q ' W ' "${te}1"; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif  ! echo "$da" |diff - ${tf}1 >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -11685,12 +11064,10 @@ elif  ! echo "$da" |diff - ${tf}1 >"$tdiff"; then
     cat "${te}0"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -11716,14 +11093,12 @@ $CMD0 >/dev/null 2>"${te}0"
 rc0=$?
 if [ $rc0 -ne 0 -a -f "$tf" ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11748,14 +11123,12 @@ $CMD0 >/dev/null 2>"${te}0"
 rc0=$?
 if [ $rc0 -ne 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11795,26 +11168,21 @@ if [ $rc1 -ne 0 ]; then
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
 elif [ ! -e "$tw" ]; then 
 	$PRINTF "$NO_RESULT (no wc -c output)\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
-	namesCANT="$namesCANT $NAME"
+	cant
 elif [ "$bytes" -eq $(cat "$tw") ]; then
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
 else
 	$PRINTF "$FAILED (incomplete)\n"
 	echo "transferred only $(cat $tw) of $bytes bytes" >&2
@@ -11822,9 +11190,7 @@ else
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
 fi
 fi # NUMCOND
  ;;
@@ -11839,12 +11205,10 @@ TEST="$NAME: OpenSSL server with cipher aNULL "
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -11865,13 +11229,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     #cat "${te}1"
     #cat "${te}2"
     #cat "$tdiff"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -11898,12 +11260,10 @@ TEST="$NAME: max-children option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats "$FEAT" >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$FEAT not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runs$RUNS >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(toupper $RUNS) not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 case "X$IPPORT" in
     "XPORT")
@@ -11935,8 +11295,7 @@ relsleep 2
 kill $pid1 $pid2 $pid0 2>/dev/null; wait
 if echo -e "$da 1\n$da 2" |diff - $tf >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -11946,8 +11305,7 @@ else
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -11986,12 +11344,10 @@ TEST="$NAME: max-children option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats "$FEAT" >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$FEAT not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runs$RUNS >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(toupper $RUNS) not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 case "X$IPPORT" in
     "XPORT")
@@ -12025,8 +11381,7 @@ cpids="$(childpids $pid0)"
 kill $pid1 $pid2 $pid0 $cpids 2>/dev/null; wait
 if echo -e "$da 1" |diff - $tf >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -12036,8 +11391,7 @@ else
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -12067,8 +11421,7 @@ TEST="$NAME: test for buffer overflow in readline prompt handling"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testfeats readline pty); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -12086,14 +11439,12 @@ if [ $rc -ne 0 ]; then
     $PRINTF "${YELLOW}framework failed${NORMAL}\n"
 elif [ $rc0 -eq 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     grep -v ^rc= "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -12155,8 +11506,7 @@ if [ $rc2 -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif [ -f "$tdiff" -a ! -s "$tdiff" ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -12165,8 +11515,7 @@ elif [ -f "$tdiff" -a ! -s "$tdiff" ]; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -12175,8 +11524,7 @@ else
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # ulimit -n
 fi # NUMCOND
@@ -12216,19 +11564,16 @@ rc1=$?
 if [ $rc1 -lt 128 ]; then
     if [ "$EF" ]; then
 	$PRINTF "$OK\n"
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     else
 	$PRINTF "$UNKNOWN $RED(install ElectricFEnce!)$NORMAL\n"
-	numCANT=$((num+1))
-	listCANT="$listCANT $N"
+	cant
     fi
 else
     $PRINTF "$FAILED\n"
     echo "$CMD1"
     cat "${te}"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -12269,26 +11614,21 @@ if [ -z "$KEEPALIVE" ]; then
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 elif [ "$KEEPALIVE" = "1" ]; then
     $PRINTF "$OK\n";
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED (KEEPALIVE=$KEEPALIVE)\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -12308,8 +11648,7 @@ TEST="$NAME: test OPENSSL-CONNECT with bind option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf0="$td/test$N.0.stdout"
@@ -12334,8 +11673,7 @@ if [ "$rc1" -ne 0 ]; then
     echo "$CMD1"
     cat "$te0"
     cat "$te1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - $tf1 >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -12343,12 +11681,10 @@ elif ! echo "$da" |diff - $tf1 >"$tdiff"; then
     cat "${te}0"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -12366,8 +11702,7 @@ if ! eval $NUMCOND; then :;
 elif [ -z "$SECONDADDR" ]; then
     # we need access to a second address
     $PRINTF "test $F_n $TEST... ${YELLOW}need a second IPv4 address${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -12387,24 +11722,20 @@ sleep 1
 kill $pid0 2>/dev/null; wait
 if [ $rc1 != 0 ]; then
     $PRINTF "${YELLOW}invocation failed${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! [ -f "$tf" ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "${YELLOW}diff failed${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 
 fi ;; # $SECONDADDR, NUMCOND
@@ -12430,8 +11761,7 @@ FEAT=$(echo "$ssldist" |tr a-z A-Z)
 if ! eval $NUMCOND; then :;
 elif ! testfeats $FEAT >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$FEAT not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -12470,8 +11800,7 @@ if [ $rc1 != 0 ]; then
     cat "${te}0"
     echo "$CMD1"
     cat "${te}1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif effval="$(grep SOCAT_${SSLDIST}_${MODULE}_${FIELD} "${tf}" |sed -e 's/^[^=]*=//' |sed -e "s/[\"']//g")";
     [ "$effval" = "$VALUE" ]; then
     $PRINTF "$OK\n"
@@ -12481,8 +11810,7 @@ elif effval="$(grep SOCAT_${SSLDIST}_${MODULE}_${FIELD} "${tf}" |sed -e 's/^[^=]
 	echo "$CMD1"
 	cat "${te}1"
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "expected \"$VALUE\", got \"$effval\"" >&2
@@ -12490,8 +11818,7 @@ else
     cat "${te}0"
     echo "$CMD1"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND, feats
  ;;
@@ -12553,18 +11880,15 @@ if [ "$ERRNOENT" ]; then
     echo "$CMD0 &"
     cat "$te0"
     cat "$tlog"
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 elif [ "$perms" != "600" ]; then
     $PRINTF "${RED}perms \"$perms\", expected \"600\" ${NORMAL}\n"
     echo "$CMD0 &"
     cat "$te0"
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    let numOK=numOK+1
-    listOK="$listOK $N"
+    ok
 fi
                                set +xv
 fi # NUMCOND
@@ -12629,18 +11953,15 @@ if [ "$ERRNOENT" ]; then
     echo "$CMD0 &"
     cat "$te0"
     cat "$tlog"
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 elif [ "$perms" != "511" ]; then
     $PRINTF "${RED}perms \"$perms\", expected \"511\" ${NORMAL}\n"
     echo "$CMD0 &"
     cat "$te0"
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    let numOK=numOK+1
-    listOK="$listOK $N"
+    ok
 fi
                                       set +vx
 fi # NUMCOND
@@ -12680,8 +12001,7 @@ TEST="$NAME: $ADDR applies option user"
 if ! eval $NUMCOND; then :;
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tlog="$td/test$N.log"
 te0="$td/test$N.0.stderr"
@@ -12705,20 +12025,17 @@ if [ "$ERRNOENT" ]; then
     echo "$CMD0 &"
     cat "$te0" >&2
     cat "$tlog" >&2
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 elif [ "$user" != "$SUBSTUSER" ]; then
     $PRINTF "${FAILD}(user \"$user\", expected \"$SUBSTUSER\")\n"
     echo "$CMD0 &"
     cat "$te0" >&2
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
 fi
                                       set +vx
 fi # NUMCOND
@@ -12778,19 +12095,16 @@ if [ $rc1 != 0 ]; then
     echo "$CMD0 &"
     cat "$te0"
     cat "$tlog"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! [ $crit $tsock ]; then
     $PRINTF "$OK\n"
-    let numOK=numOK+1
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "$te0"
     cat "$tlog"
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -12847,19 +12161,16 @@ if [ $rc1 != 0 ]; then
     echo "$CMD0 &"
     cat "$te0"
     cat "$tlog"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! [ $crit $tsock ]; then
     $PRINTF "$OK\n"
-    let numOK=numOK+1
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "$te0"
     cat "$tlog"
-    let numFAIL=numFAIL+1
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -12887,8 +12198,7 @@ TEST="$NAME: SYSTEM address does not shutdown its parents addresses"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -12912,8 +12222,7 @@ if [ $rc1 -ne 0 ]; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "${tf}1" >"$tdiff" 2>&1; then
     $PRINTF "$FAILED\n"
     echo "diff:"
@@ -12922,12 +12231,10 @@ elif ! echo "$da" |diff - "${tf}1" >"$tdiff" 2>&1; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -12959,19 +12266,16 @@ if [ ! -f "$t0rc" ]; then
     echo "no return code of CMD0 stored" >&2
     echo "$CMD0 &"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo 1 |diff - "$t0rc" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "CMD0 exited with $(cat $t0rc), expected 1"
     echo "$CMD0 &"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -12999,12 +12303,10 @@ TEST="$NAME: test OpenSSL method $method"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! socat -hhh |grep -q "^[[:space:]]*openssl-method[[:space:]]"; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option openssl-method not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -13017,8 +12319,7 @@ CMD1="$SOCAT $opts - OPENSSL-CONNECT:$LOCALHOST:$PORT,opensslmethod=$method,veri
 printf "test $F_n $TEST... " $N
 if [ "$method" = DTLS1 -a "$(echo -e "$OPENSSL_VERSION\n1.0.2" |sort |tail -n 1)" = "$OPENSSL_VERSION_GOOD" ]; then
     $PRINTF "${YELLOW}might hang, skipping${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 $CMD0 >/dev/null 2>"${te}0" &
 pid0=$!
@@ -13031,13 +12332,11 @@ fi
 echo "$da" |diff - "${tf}1" >"$tdiff" 2>/dev/null
 if [ $w0 -eq 0 ] && [ -f "${tf}1" ] && ! [ -s "$tdiff" ]; then
     $PRINTF "${YELLOW}WARN${NORMAL} (obsolete method succeeds)\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$OK (obsolete method fails)\n"
     cat "$tdiff"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
     if [ "$VERBOSE" ]; then
 	echo "  $CMD0"
@@ -13067,12 +12366,10 @@ TEST="$NAME: test OpenSSL method $method"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! socat -hhh |grep -q "^[[:space:]]*openssl-method[[:space:]]"; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option openssl-method not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -13089,8 +12386,7 @@ CMD1="$SOCAT $opts - OPENSSL-CONNECT:$LOCALHOST:$PORT,openssl-method=$method,ver
 printf "test $F_n $TEST... " $N
 if [ "$method" = DTLS1 -a "$(echo -e "$OPENSSL_VERSION\n1.0.2" |sort |tail -n 1)" = "$OPENSSL_VERSION_GOOD" ]; then
     $PRINTF "${YELLOW}might hang, skipping${NORMAL}\n"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 $CMD0 >/dev/null 2>"${te}0" &
 pid0=$!
@@ -13104,8 +12400,7 @@ rc1=$?
 kill $pid0 2>/dev/null; wait
 if echo "$da" |diff - "${tf}1" >"$tdiff"; then 
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
     if [ "$VERBOSE" ]; then
 	echo "  $CMD0"
 	echo "  echo \"$da\" |$CMD1"
@@ -13117,8 +12412,7 @@ else
     echo "$CMD1"
     cat "${te}1"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
     #esac
 fi
 fi # !DTLS1 hang
@@ -13140,17 +12434,14 @@ TEST="$NAME: security of OpenSSL server with openssl-min-proto-version"
 if ! eval $NUMCOND; then :;
 elif ! testaddrs openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions openssl-min-proto-version); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! [ "$OPENSSL_LATEST_PROTO_VERSION" -a "$OPENSSL_BEFORELAST_PROTO_VERSION" -a \
          "$OPENSSL_LATEST_PROTO_VERSION" != "$OPENSSL_BEFORELAST_PROTO_VERSION" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}cannot determine two available SSL/TLS versions${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     gentestcert testsrv
     newport tcp4
@@ -13178,15 +12469,13 @@ $CMD >/dev/null 2>"${te}"
 rc=$?
 if [ $rc -eq 1 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}"
     echo "command did not terminate with error!"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13215,12 +12504,10 @@ if [ $rc0 -eq 0 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -13249,12 +12536,10 @@ if [ $rc0 -eq 0 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -13276,8 +12561,7 @@ TEST="$NAME: test the so-reuseaddr option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testoptions so-reuseaddr); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp4; tp="$PORT"
 tf="$td/test$N.stdout"
@@ -13305,8 +12589,7 @@ if ! echo "$da" |diff - "$tf"; then
     $PRINTF "${YELLOW}phase 1 failed${NORMAL}\n"
     echo "$CMD0 &"
     echo "$CMD1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc3 -ne 0 ]; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
@@ -13314,8 +12597,7 @@ elif [ $rc3 -ne 0 ]; then
     echo "$CMD2 &"
     echo "$CMD3"
     cat "${te}2" "${te}3"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "${tf}3"; then
     $PRINTF "$FAILED: $TRACE $SOCAT:\n"
     echo "$CMD0 &"
@@ -13323,13 +12605,11 @@ elif ! echo "$da" |diff - "${tf}3"; then
     echo "$CMD2 &"
     echo "$CMD3"
     echo "$da" |diff - "${tf}3"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2" "${te}3"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND, SO_REUSEADDR
  ;;
@@ -13350,8 +12630,7 @@ TEST="$NAME: test the so-reuseport option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testoptions so-reuseport); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp4; tp="$PORT"
 tf="$td/test$N.stdout"
@@ -13382,8 +12661,7 @@ if ! echo "$da2" |diff - "${tf}2"; then
     cat "${te}1"
     echo "$CMD2"
     cat "${te}2"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc3 -ne 0 ]; then
     $PRINTF "$FAILED:\n"
     echo "$CMD0 &"
@@ -13394,8 +12672,7 @@ elif [ $rc3 -ne 0 ]; then
     cat "${te}2"
     echo "$CMD3"
     cat "${te}3"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da2" |diff - "${tf}2"; then
     $PRINTF "$FAILED:\n"
     echo "$CMD0 &"
@@ -13407,8 +12684,7 @@ elif ! echo "$da2" |diff - "${tf}2"; then
     echo "$CMD3"
     cat "${te}3"
     echo "$da2" |diff - "${tf}2"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da3" |diff - "${tf}3"; then
     $PRINTF "$FAILED:\n"
     echo "$CMD0 &"
@@ -13420,13 +12696,11 @@ elif ! echo "$da3" |diff - "${tf}3"; then
     echo "$CMD3"
     cat "${te}3"
     echo "$da3" |diff - "${tf}3"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2" "${te}3"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND, SO_REUSEPORT
  ;;
@@ -13452,15 +12726,13 @@ eval "$CMD0" >"${tf}0" 2>"${te}0"
 rc1=$?
 if echo "$da" |diff - "${tf}0" >"$tdiff"; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13480,12 +12752,10 @@ TEST="$NAME: test OpenSSL ECDHE"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! openssl ciphers |grep -q '\<ECDHE\>'; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl: cipher ECDHE not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -13512,12 +12782,10 @@ if [ $rc1 -ne 0 ]; then
     echo "client and stderr:" >&2
     echo "$CMD1"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - "${tf}1" >"$tdiff"; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "server and stderr:" >&2
@@ -13526,8 +12794,7 @@ else
     echo "client and stderr:" >&2
     echo "$CMD0 &"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13557,14 +12824,12 @@ $CMD0 >/dev/null 2>"${te}0"
 rc0=$?
 if [ $rc0 -eq 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13593,19 +12858,16 @@ if [ $rc0 -ne 0 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - ${tf}0 >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13625,13 +12887,11 @@ $CMD0 >/dev/null 2>"${te}0"
 rc0=$?
 if [ "$rc0" = "1" ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi ;; # NUMCOND
 esac
@@ -13662,16 +12922,14 @@ $CMD1  2>"${te}1"
 rc0=$?
 if [ $rc0 -eq 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
     echo "$CMD1"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13698,14 +12956,12 @@ printf "test $F_n $TEST... " $N
 $CMD0 >/dev/null 2>"${te}0"
 if ! grep -q "ai_socktype not supported" ${te}0; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13736,16 +12992,14 @@ rc1=$?
 kill $pid0 2>/dev/null; wait
 if [ $(grep "socket 2 (fd .*) is at EOF" ${te}0 |wc -l) -eq 1 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13781,19 +13035,16 @@ if [ $rc0 -eq 0 ]; then
     $PRINTF "$FAILED (rc=$rc0)\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif [ $rc0 -eq 1 ]; then
     if grep -q "buffer size option (-b) to big" "${te}0"; then
 	$PRINTF "$OK\n"
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     else
 	$PRINTF "$FAILED (rc=$rc0)\n"
 	echo "$CMD0"
 	cat "${te}0"
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
+	failed
     fi
 fi
 fi # NUMCOND
@@ -13820,14 +13071,12 @@ if grep -q -i -e "syntax error" -e "unexpected end" "${te}0"; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0" >&2; fi
     if [ "$debug" ]; then cat ${te} >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13849,8 +13098,7 @@ TEST="$NAME: Service name resolution works with SCTP"
 if ! eval $NUMCOND; then :;
 elif ! runssctp4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}SCTP4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -13860,18 +13108,15 @@ printf "test $F_n $TEST... " $N
 $CMD0 >/dev/null 2>"${te}0"
 if [ $? -eq 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif grep -q "Connection refused" ${te}0; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -13889,8 +13134,7 @@ TEST="$NAME: echo via file with o-direct"
 if ! eval $NUMCOND; then :;
 elif ! testoptions o-direct >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}o-direct not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.file"
 to="$td/test$N.stdout"
@@ -13908,29 +13152,24 @@ if [ $rc -ne 0 ] && grep -q "Invalid argument" "$te" && [ $UNAME = Linux ]; then
 	    $PRINTF "${FAILED}\n"
 	    echo "$CMD" >&2
 	    cat "$te" >&2
-	    numFAIL=$((numFAIL+1))
-	    listFAIL="$listFAIL $N" ;;
+	    failed ;;
 	*) $PRINTF "${YELLOW}inable file system${NORMAL}\n"
-	    numCANT=$((numCANT+1))
-	    listCANT="$listCANT $N" ;;
+	    cant ;;
     esac
 elif [ $rc -ne 0 ]; then
     $PRINTF "${FAILED}:\n"
     echo "$CMD" >&2
     cat "$te" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$to" >$tdiff; then
     $PRINTF "${FAILED}\n"
     echo "$CMD" >&2
     cat "$te" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi # command ok
 fi ;; # NUMCOND, feats
 esac
@@ -13964,8 +13203,7 @@ rc1=$?
 kill $pid0 2>/dev/null; wait
 if test -S $uns && ! test -S $unc; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -13973,8 +13211,7 @@ else
     ls -ld $uns $unc
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14008,8 +13245,7 @@ rc1=$?
 kill $pid0 2>/dev/null; wait
 if test -S $uns && ! test -S $unc; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -14017,8 +13253,7 @@ else
     ls -ld $uns $unc
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14036,20 +13271,16 @@ TEST="$NAME: OpenSSL DTLS client"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testfeats ip4 udp openssl); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs openssl-dtls-client); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! type openssl >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl executable not found${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -14074,13 +13305,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD"
     cat "$te"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "$te"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -14096,25 +13325,20 @@ TEST="$NAME: OpenSSL DTLS server"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testfeats ip4 udp openssl) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs openssl-dtls-server); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! type openssl >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl executable not found${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [[ $(openssl version |awk '{print($2);}') =~ 0.9.8[a-ce] ]]; then
     # also on NetBSD-4 with openssl-0.9.8e
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl s_client might hang${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -14134,8 +13358,7 @@ rc=$?
 kill $pid1 2>/dev/null; wait
 if echo "$da" |diff - $tf >"$tdiff"; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD1 &"
@@ -14143,8 +13366,7 @@ else
     echo "$CMD"
     cat "$te"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14159,12 +13381,10 @@ TEST="$NAME: OpenSSL server authentication with SubjectAltName (hostname)"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestaltcert testalt
 tf="$td/test$N.stdout"
@@ -14186,13 +13406,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD1" >&2
     cat "${te}1" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -14207,12 +13425,10 @@ TEST="$NAME: OpenSSL server authentication with SubjectAltName (IPv4 address)"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 openssl >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestaltcert testalt
 tf="$td/test$N.stdout"
@@ -14234,13 +13450,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD1" >&2
     cat "${te}1" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -14255,12 +13469,10 @@ TEST="$NAME: OpenSSL server authentication with SubjectAltName (IPv6 address)"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip6 openssl >/dev/null || ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestaltcert testalt
 tf="$td/test$N.stdout"
@@ -14282,13 +13494,11 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     echo "$CMD1" >&2
     cat "${te}1" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -14308,8 +13518,7 @@ TEST="$NAME: raw dump of transferred data"
 if ! eval $NUMCOND; then :;
 elif [ $($SOCAT -h |grep -e ' -[rR] ' |wc -l) -lt 2 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Options -r, -R not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -14339,12 +13548,10 @@ if ! echo "$da1" |diff - $tr1 >$tdiff1 || ! echo "$da2" |diff - $tr2 >$tdiff2; t
     cat $tdiff1 >&2
     echo "Right-to-left:" >&2
     cat $tdiff2 >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -14364,16 +13571,13 @@ SNISERVER=badssl.com
 if ! eval $NUMCOND; then :;
 elif ! testaddrs openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions openssl-snihost); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ -z "$INTERNET" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}use test.sh option --internet${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -14385,14 +13589,12 @@ $CMD0 >/dev/null 2>"${te}0"
 rc0=$?
 if [ $rc0 -eq 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0" >&2
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14413,16 +13615,13 @@ SNISERVER=badssl.com
 if ! eval $NUMCOND; then :;
 elif ! testaddrs openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions openssl-no-sni); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ -z "$INTERNET" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}use test.sh option --internet${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -14434,14 +13633,12 @@ $CMD0 >/dev/null 2>"${te}0"
 rc0=$?
 if [ $rc0 -ne 0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0" >&2
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14457,12 +13654,10 @@ TEST="$NAME: test the accept-timeout option"
 if ! eval $NUMCOND; then :;
 elif ! feat=$(testaddrs tcp); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testoptions accept-timeout); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(echo "$feat"| tr 'a-z' 'A-Z') not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # Just start a process with accept-timeout 1s and check if it still runs 2s later
 # but before this, we test if the process waits at all
@@ -14482,8 +13677,7 @@ if ! kill $pid1 2>"$tk1"; then
     echo $CMD1 >&2
     cat "$te1" >&2
     cat "$tk1" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # Second, set accept-timeout and see if socat exits before kill
 CMD2="$TRACE $SOCAT $opts TCP-LISTEN:$PORT,reuseaddr,accept-timeout=$(reltime 1) PIPE"
@@ -14495,12 +13689,10 @@ if kill $pid2 2>"$tk2"; then
     echo "$CMD2" >&2
     cat "$te2" >&2
     cat "$tk2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi
 wait
@@ -14520,8 +13712,7 @@ TEST="$NAME: test UDP-DATAGRAM ignoring peerport"
 if ! eval $NUMCOND; then :
 elif [ $(echo $E "$SOCAT_VERSION\n1.7.3.4" |sort -n |tail -n 1) = 1.7.3.4 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only with Socat 1.7.4.0 or higher${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -14542,8 +13733,7 @@ sleep 0.1
 kill $pid0 2>/dev/null; wait
 if [ -f ${tf}0 ] && echo "$da" |diff - ${tf}0 >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
@@ -14551,8 +13741,7 @@ else
     echo "$CMD1" >&2
     cat "${te}1" >&2
     cat "${tdiff}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14568,16 +13757,13 @@ TEST="$NAME: proxy-authorization-file option"
 if ! eval $NUMCOND; then :;
 elif ! testfeats proxy >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}PROXY not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats listen tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testoptions proxy-authorization-file >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option proxy-authorization-file not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ta="$td/test$N.auth"
 tf="$td/test$N.stdout"
@@ -14603,8 +13789,7 @@ if [ $rc1 -ne 0 ]; then
     echo "$CMD1" >&2
     cat "${te}1" >&2
     cat "${tf}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! grep -q '^Proxy-authorization: Basic dXNlcjpzM2NyM3QK$' ${tf}0; then
     $PRINTF "$FAILED:\n"
     echo "$CMD0 &" >&2
@@ -14613,13 +13798,11 @@ elif ! grep -q '^Proxy-authorization: Basic dXNlcjpzM2NyM3QK$' ${tf}0; then
     cat "${te}1" >&2
     cat "${tf}0" >&2
     echo "Authorization string not in client request" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
    $PRINTF "$OK\n"
    if [ -n "$debug" ]; then cat "${te}1" "${te}2"; fi
-   numOK=$((numOK+1))
-   listOK="$listOK $N"
+   ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -14638,8 +13821,7 @@ TEST="$NAME: test communication via VSOCK loopback socket"
 if ! eval $NUMCOND; then :;
 elif ! fea=$(testfeats VSOCK); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$fea not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -14657,36 +13839,30 @@ rc1=$?
 kill $pid0 2>/dev/null; wait
 if [ $rc1 -ne 0 ] &&  [ "$UNAME" != Linux ]; then
     $PRINTF "${YELLOW}works only on Linux?${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc1 -ne 0 ] && [ "$UNAME" = Linux ] && ! [[ $UNAME_R =~ ^[6-9]\.* ]] && ! [[ $UNAME_R =~ ^5\.[6-]\.* ]] && ! [[ $UNAME_R =~ ^5\.[1-9][0-9].* ]]; then
     $PRINTF "${YELLOW}works only on Linux from 5.6${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif grep -q "No such device" "${te}1"; then
     $PRINTF "${YELLOW}Loopback does not work${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $rc1 -ne 0 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - ${tf}1 >${tdiff}$N; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14708,16 +13884,13 @@ TEST="$NAME: OpenSSL stream from client to server"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testfeats ip4 tcp openssl); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs openssl-listen openssl-connect); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 ti="$td/test$N.datain"
@@ -14743,12 +13916,10 @@ if [ $rc1 -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif diff $ti $to >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
@@ -14758,8 +13929,7 @@ else
     echo "diff:" >&2
     head -n 2 $tdiff >&2
     echo ... >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14780,16 +13950,13 @@ TEST="$NAME: OpenSSL stream from server to client"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testfeats ip4 tcp openssl); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs openssl-listen openssl-connect); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 ti="$td/test$N.datain"
@@ -14815,12 +13982,10 @@ if [ $rc1 -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif diff $ti $to >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
@@ -14830,8 +13995,7 @@ else
     echo "diff:" >&2
     head -n 2 $tdiff >&2
     echo ... >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14851,21 +14015,17 @@ TEST="$NAME: OpenSSL DTLS transfer from client to server"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testfeats ip4 udp openssl); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs openssl-dtls-listen openssl-dtls-connect); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [[ $(openssl version |awk '{print($2);}') =~ 0.9.8[a-ce] ]]; then
     # also on NetBSD-4 with openssl-0.9.8e
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl s_client might hang${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 ti="$td/test$N.datain"
@@ -14891,12 +14051,10 @@ if [ $rc1 -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif diff $ti $to >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
@@ -14906,8 +14064,7 @@ else
     echo "diff:" >&2
     head -n 2 $tdiff >&2
     echo ... >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -14927,21 +14084,17 @@ TEST="$NAME: OpenSSL DTLS transfer from server to client"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testfeats ip4 udp openssl); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs openssl-dtls-listen openssl-dtls-connect); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [[ $(openssl version |awk '{print($2);}') =~ 0.9.8[a-ce] ]]; then
     # also on NetBSD-4 with openssl-0.9.8e
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl s_client might hang${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 ti="$td/test$N.datain"
@@ -14967,12 +14120,10 @@ if [ $rc1 -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif diff $ti $to >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
@@ -14982,8 +14133,7 @@ else
     echo "diff:" >&2
     head -n 2 $tdiff >&2
     echo ... >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15002,16 +14152,13 @@ TEST="$NAME: test diverse of socket,openssl params"
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! type openssl >/dev/null 2>&1; then
     $PRINTF "test $F_n $TEST... ${YELLOW}openssl executable not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 tf="$td/test$N.stdout"
@@ -15032,19 +14179,17 @@ sleep 0.5
 kill $pid0 2>/dev/null; wait
 if [ $rc1 -ne 0 ]; then
     $PRINTF "$CANT\n"
-    numCANT=$((numCANT+1))
+    cant
 elif [ ! -e $trc0 ]; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15063,12 +14208,10 @@ TEST="$NAME: Test if OpenSSL server may be crashed by client cert with IPv6 addr
 if ! eval $NUMCOND; then :;
 elif ! testfeats openssl >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}OPENSSL not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! testfeats tcp ip4 >/dev/null || ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}TCP/IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 gentestcert testsrv
 gentestaltcert testalt
@@ -15088,16 +14231,14 @@ rc1=$?
 kill $pid0 2>/dev/null; wait
 if [ $rc1 -eq 0 ] && echo "$da" |diff - "${tf}0" >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15128,14 +14269,12 @@ if [ $rc -ne 0 ]; then
     if [ "$VERBOSE" ]; then
 	echo "$CMD &" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD &" >&2
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15154,8 +14293,7 @@ TEST="$NAME: Is the fs related user option on ABSTRACT socket applied to FD"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -15171,14 +14309,12 @@ if [ $rc -eq 0 ]; then
     if [ "$VERBOSE" ]; then
 	echo "$CMD" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD" >&2
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15208,21 +14344,18 @@ if [ ! -f "$ts" ]; then
 	echo "$CMD" >&2
 	cat "${te}" >&2
     fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ ! -s "$ts" ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then
 	echo "$CMD" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD &" >&2
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15295,8 +14428,7 @@ if [ $rc1 != 1 ]; then
     fi
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif nerr=$(grep ' E ' "${te}1" |wc -l); test "$nerr" -ne 1; then
     $PRINTF "$FAILED ($nerr error message(s) instead of 1)\n"
     if [ "$pid0" ]; then
@@ -15305,16 +14437,14 @@ elif nerr=$(grep ' E ' "${te}1" |wc -l); test "$nerr" -ne 1; then
     fi
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then
 	if [ "$pid0" ]; then echo "$CMD0 &" >&2; fi
 	echo "$CMD1" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 set +vx
 fi # NUMCOND
@@ -15390,24 +14520,21 @@ if [ $rc1 -ne 0 ]; then
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - "${tf}1" >$tdiff; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then
 	echo "$CMD0 &" >&2
 	echo "$CMD1" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &" >&2
     cat "${te}0" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15437,14 +14564,12 @@ if [ $rc0 -eq 0 ]; then
     if [ "$VERBOSE" ]; then
 	echo "$CMD0" >&2
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0" >&2
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15482,20 +14607,17 @@ if  [[ $LOWPORT =~ [0-9][0-9]* ]] && [ "$LOWPORT" -ge 640 -a "$LOWPORT" -le 1023
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif $SOCAT -V |grep -q "undef WITH_SYCLS"; then
     $PRINTF "$CANT (no SYCLS)\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15520,14 +14642,12 @@ printf "test $F_n $TEST... " $N
 $CMD0 </dev/null >/dev/null 2>"${te}0"
 if grep -q "missing numerical value" "${te}0"; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15553,14 +14673,12 @@ if grep -q "trailing garbage" "${te}0"; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0" >&2; fi
     if [ "$debug" ]; then cat ${te} >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15590,16 +14708,14 @@ if [ "$target" = "$tf" ]; then
 	echo "ln -s \"$tf\" \"$tl\""
 	echo "$FILAN -f "$tl" 2>$te |tail -n 1 |sed 's/.*LINKTARGET=\([^ ]*\)/\1/'"
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "touch \"$tf\"" >&2
     echo "ln -s \"$tf\" \"$tl\"" >&2
     echo "$FILAN -f "$tl" 2>$te |tail -n 1 |sed 's/.*LINKTARGET=\([^ ]*\)/\1/'" >&2
     cat "$te"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 kill $spid 2>/dev/null
 wait
@@ -15653,8 +14769,7 @@ for addr in exec system; do
 		cat "${te}0"
 		echo "{ echo -n \"${da:0:20}\"; relsleep 1; echo \"${da:20}\"; } |$CMD1"
 		cat "${te}1"
-		numFAIL=$((numFAIL+1))
-		listFAIL="$listFAIL $N"
+		failed
 	    elif ! echo "$da" |diff - "${tf}1" >"$tdiff"; then
 		$PRINTF "$FAILED (diff)\n"
 		echo "$CMD0 &" >&2
@@ -15663,16 +14778,14 @@ for addr in exec system; do
 		cat "${te}1" >&2
 		echo "diff:" >&2
 		cat $tdiff >&2
-		numFAIL=$((numFAIL+1))
-		listFAIL="$listFAIL $N"
+		failed
 	    else
 		$PRINTF "$OK\n"
 		if [ "$VERBOSE" ]; then
 		    echo "$CMD0 &" >&2
 		    echo "{ echo -n \"${da:0:20}\"; relsleep 1; echo \"${da:20}\"; } |$CMD1" >&2
 		fi
-		numOK=$((numOK+1))
-		listOK="$listOK $N"
+		ok
 	    fi
 	    MICROS=$SAVEMICS
 	fi # NUMCOND
@@ -15693,12 +14806,10 @@ TEST="$NAME: Dalan syntax error does not raise SIGSEGV"
 if ! eval $NUMCOND; then :
 elif ! a=$(testfeats GOPEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs - GOPEN SOCKET-LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -15712,21 +14823,18 @@ if [ $rc1 -eq 1 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif [ $rc1 -eq 139 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     # soemthing unexpected happened
     $PRINTF "$CANT\n"
     echo "$CMD"
     cat "${te}" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 fi
 fi # NUMCOND
  ;;
@@ -15746,20 +14854,16 @@ TEST="$NAME: filan -s displays TCP etc"
 if ! eval $NUMCOND; then :
 elif ! a=$(testfeats STDIO IP4 TCP LISTEN EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs STDIO TCP4 TCP4-LISTEN EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions so-reuseaddr nofork ) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -15781,8 +14885,7 @@ if [ $rc1 -eq 0 -a "$result" = tcp ]; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     if [ $rc1 -ne 0 ]; then
@@ -15794,8 +14897,7 @@ else
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15819,20 +14921,16 @@ TEST="$NAME: Restoring of terminal settings"
 if ! eval $NUMCOND; then :
 elif ! $(type stty >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}stty not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testfeats STDIO SYSTEM PTY GOPEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! a=$(testaddrs - STDIO SYSTEM GOPEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions cfmakeraw pty setsid ctty stderr) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 te="$td/test$N.stderr"
 tx0="$td/test$N.stty0"
@@ -15847,16 +14945,14 @@ if diff $tx0 $tx1 >$tdiff 2>&1; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD &"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}" >&2
     cat "${te}.outer" >&2
     cat $tdiff >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15876,12 +14972,10 @@ TEST="$NAME: Socat does not leak FDs to EXEC'd program"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testaddrs STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions stderr) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -15895,15 +14989,13 @@ if [ "$(cat  "${tf}" |grep -v ' door ' |wc -l)" -eq 3 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD" >&2
     cat "${te}" >&2
     cat "${tf}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15923,12 +15015,10 @@ TEST="$NAME: Socat does not leak sniffing FDs"
 if ! eval $NUMCOND; then :;
 elif ! a=$(testaddrs STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions stderr) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -15942,15 +15032,13 @@ if [ "$(cat  "${tf}" |grep -v ' door ' |wc -l)" -eq 3 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD" >&2
     cat "${te}" >&2
     cat "${tf}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -15976,20 +15064,16 @@ TEST="$NAME: ${KEYW}-RECVFROM with fork option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats $FEAT STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs - STDIO SYSTEM $PROTO-RECVFROM $PROTO-SENDTO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions fork ) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runs$RUNS >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}$(toupper $RUNS) not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 case "X$IPPORT" in
     "XPORT")
@@ -16029,8 +15113,7 @@ if $ECHO "$da 2\n$da 1" |diff -u - $tf >$tdiff; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -16041,9 +15124,7 @@ else
     cat "${te}2" >&2
     echo "diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16066,16 +15147,13 @@ TEST="$NAME: Option -S can turn off logging of SIGTERM"
 if ! eval $NUMCOND; then :;
 elif ! $SOCAT -h | grep -e " -S\>" >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option -S not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16092,16 +15170,13 @@ if ! grep "exiting on signal" ${te}0 >/dev/null; then
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$DEBUG" ];   then echo "kill -TERM <pid>" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
     echo "kill -TERM <pid>" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16119,16 +15194,13 @@ TEST="$NAME: Option -S can turn on logging of signal 31"
 if ! eval $NUMCOND; then :;
 elif ! $SOCAT -h | grep -e " -S\>" >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option -S not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16145,16 +15217,13 @@ if grep "exiting on signal" ${te}0 >/dev/null; then
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$DEBUG" ];   then echo "kill -31 <pid>" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
     echo "kill -31 <pid>" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16170,24 +15239,19 @@ TEST="$NAME: PROXY-CONNECT with option http-version"
 if ! eval $NUMCOND; then :;
 elif ! $(type proxyecho.sh >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}proxyecho.sh not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats IP4 TCP LISTEN EXEC STDIO PROXY); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs TCP4-LISTEN EXEC STDIO PROXY-CONNECT); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions so-reuseaddr crlf pf proxyport http-version) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.sh"
 tf="$td/test$N.stdout"
@@ -16209,16 +15273,14 @@ if ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}1" >&2
     echo "diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$debug" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$debug" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 kill $pid 2>/dev/null
 wait
@@ -16236,20 +15298,16 @@ TEST="$NAME: test the so-rcvtimeo option with DTLS"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO OPENSSL); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO DTLS); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions verify so-rcvtimeo) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 # We need a hanging connection attempt, guess an address for this
 HANGIP=0.0.0.1
@@ -16267,8 +15325,7 @@ if ! kill -0 $pid1 2>"$tk1"; then
     $PRINTF "${YELLOW}does not hang${NORMAL}\n"
     if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
     wait
 else
     # DTLS restarts read() a few times
@@ -16283,16 +15340,14 @@ if kill $pid2 2>"$tk2"; then
     echo "$CMD2" >&2
     cat "$te2" >&2
     cat "$tk2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
     while kill $pid2 2>/dev/null; do :; done
     wait
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD2 &"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi
 wait
@@ -16314,20 +15369,16 @@ TEST="$NAME: sniff file names with variables"
 if ! eval $NUMCOND; then :;
 elif ! A=$(testfeats IP4 TCP LISTEN PIPE STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs - TCP4 TCP4-LISTEN PIPE STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions so-reuseaddr fork) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16354,9 +15405,7 @@ if [ $rc1a != 0 -o $rc1b != 0 ]; then
     cat "${te}1a" >&2
     echo "$CMD1"
     cat "${te}1b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif test $(ls -l $td/test$N.*.log |wc -l) -eq 4 &&
 	test $(ls $td/test$N.*.log |head -n 1 |wc -c) -ge 56; then
     # Are the names correct?
@@ -16369,8 +15418,7 @@ elif test $(ls -l $td/test$N.*.log |wc -l) -eq 4 &&
     if [ "$DEBUG" ];   then cat "${te}1a" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif test -f $td/test$N.\$PROGNAME-\$TIMESTAMP.\$MICROS-\$SERVER0_PEERADDR-\$\$.in.log; then
     $PRINTF "$FAILED (vars not resolved)\n"
     echo "$CMD0 &"
@@ -16379,9 +15427,7 @@ elif test -f $td/test$N.\$PROGNAME-\$TIMESTAMP.\$MICROS-\$SERVER0_PEERADDR-\$\$.
     cat "${te}1a" >&2
     echo "$CMD1"
     cat "${te}1b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 else
     $PRINTF "$FAILED (unknown)\n"
     echo "$CMD0 &"
@@ -16390,9 +15436,7 @@ else
     cat "${te}1a" >&2
     echo "$CMD1"
     cat "${te}1b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16410,20 +15454,16 @@ TEST="$NAME: Socat option --statistics"
 if ! eval $NUMCOND; then :;
 elif ! $(type  >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}tee not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats STATS STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions pty cfmakeraw) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16438,21 +15478,17 @@ if [ $rc0 -ne 0 ]; then
     $PRINTF "$CANT\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(grep STATISTICS "${te}0" |wc -l) -eq 2 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16469,24 +15505,19 @@ TEST="$NAME: statistics on SIGUSR1"
 if ! eval $NUMCOND; then :;
 elif ! $(type tee >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}tee not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! $(type pkill >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}pkill not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats STATS STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions pty cfmakeraw) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16507,15 +15538,12 @@ if [ "$(grep STATISTICS "${te}0" |wc -l)" -eq 2 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16534,16 +15562,13 @@ TEST="$NAME: test the children-shutup option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats UNIX LISTEN EXEC FILE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs UNIX-LISTEN TCP4 FILE UNIX-CONNECT); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions fork children-shutup) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 newport tcp4
 ts="$td/test$N.sock"
@@ -16567,17 +15592,14 @@ if grep -q " W connect" ${te}0; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16597,28 +15619,22 @@ TEST="$NAME: INTERFACE ignores outgoing packets"
 if ! eval $NUMCOND; then :;
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! $(type ping >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}ping not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! feat=$(testfeats TUN STDIO INTERFACE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs - TUN STDIO INTERFACE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions iff-up tun-type tun-name ) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16651,8 +15667,7 @@ if [ $? -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif test -s "${tf}1"; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -16661,8 +15676,7 @@ elif test -s "${tf}1"; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -16671,8 +15685,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi ;; # NUMCOND, feats
 esac
@@ -16692,20 +15705,16 @@ TEST="$NAME: test if option reuseaddr's default is 1"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO PIPE IP4 TCP LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO PIPE TCP4 TCP4-LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions accept-timeout) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16732,8 +15741,7 @@ if [ $rc0b -eq 0 ]; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD0b"; fi
     if [ "$DEBUG" ];   then cat "${te}0b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0a &"
@@ -16742,9 +15750,7 @@ else
     cat "${te}1" >&2
     echo "$CMD0b"
     cat "${te}0b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16763,20 +15769,16 @@ TEST="$NAME: test if option reuseaddr's default is 1 with SSL-L"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats PIPE IP6 TCP OPENSSL LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs PIPE OPENSSL-CONNECT OPENSSL-LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions verify cert key) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv6 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16807,8 +15809,7 @@ if [ $rc0b -eq 0 ]; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD0b"; fi
     if [ "$DEBUG" ];   then cat "${te}0b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0a &"
@@ -16817,9 +15818,7 @@ else
     cat "${te}1" >&2
     echo "$CMD0b"
     cat "${te}0b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16838,20 +15837,16 @@ TEST="$NAME: test option reuseaddr without value"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO PIPE IP4 TCP LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO PIPE TCP4-CONNECT TCP4-LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions so-reuseaddr accept-timeout) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16878,8 +15873,7 @@ if [ $rc0b -eq 1 ] && grep -q -e "Address already in use" -e "Address in use" "$
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD0b"; fi
     if [ "$DEBUG" ];   then cat "${te}0b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 #elif grep -q "accept: \(Connection\|Operation\) timed out" "${te}0b"; then
 elif grep -q "accept: .* timed out" "${te}0b"; then
     # FreeBSD, Solaris do not seem to need SO_REUSEADDR with TCP at all
@@ -16890,8 +15884,7 @@ elif grep -q "accept: .* timed out" "${te}0b"; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD0b"; fi
     if [ "$DEBUG" ];   then cat "${te}0b" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0a &"
@@ -16900,9 +15893,7 @@ else
     cat "${te}1" >&2
     echo "$CMD0b"
     cat "${te}0b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -16925,28 +15916,22 @@ TEST="$NAME: try all available TCP4 addresses"
 if ! eval $NUMCOND; then :;
 elif ! $(type nslookup >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}nslookup not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 #elif ! $(type nslookup >/dev/null 2>&1) && ! $(type host >/dev/null 2>&1); then
 #    $PRINTF "test $F_n $TEST... ${YELLOW}nslookup and host not available${NORMAL}\n" $N
-#    numCANT=$((numCANT+1))
-#    listCANT="$listCANT $N"
+#    cant
 elif ! F=$(testfeats IP4 TCP GOPEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs TCP4-CONNECT GOPEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ -z "$INTERNET" ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}use test.sh option --internet${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -16980,15 +15965,12 @@ if [ $(grep " N opening connection to .*AF=2 " ${te} |wc -l) -eq 2 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17009,32 +15991,25 @@ TEST="$NAME: for TCP try all available IPv4 and IPv6 addresses"
 if ! eval $NUMCOND; then :;
 #elif ! $(type nslookup >/dev/null 2>&1) && ! $(type host >/dev/null 2>&1); then
 #    $PRINTF "test $F_n $TEST... ${YELLOW}nslookup and host not available${NORMAL}\n" $N
-#    numCANT=$((numCANT+1))
-#    listCANT="$listCANT $N"
+#    cant
 elif ! F=$(testfeats IP4 IP6 TCP); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs TCP-CONNECT GOPEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions ai-addrconfig) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip6 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv6 not available or not routable${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ -z "$INTERNET" ]; then	# only needs Internet DNS
     $PRINTF "test $F_n $TEST... ${YELLOW}use test.sh option --internet${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17082,15 +16057,12 @@ if [ $(grep " N opening connection to .*AF=[0-9]" ${te} |wc -l) -eq 2 ]; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD"; fi
     if [ "$DEBUG" ];   then cat "${te}" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD"
     cat "${te}" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17110,32 +16082,25 @@ TEST="$NAME: option netns (net namespace $ns)"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! $(type ip >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}ip program not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats IP4 TCP LISTEN NAMESPACES); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO TCP-LISTEN TCP EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions netns) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17167,9 +16132,7 @@ if [ $rc1 -ne 0 ]; then
     echo "$CMD1"
     cat "${te}1" >&2
     echo "ip netns del $ns"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif echo "$da" |od -c |diff - ${tf}1 >"$tdiff"; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then
@@ -17183,8 +16146,7 @@ elif echo "$da" |od -c |diff - ${tf}1 >"$tdiff"; then
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "ip netns del $ns"; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED (bad output)\n"
     echo "$CMD0 &"
@@ -17193,9 +16155,7 @@ else
     cat "${te}1" >&2
     diff:
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17217,32 +16177,25 @@ TEST="$NAME: option netns with EXEC (net namespace $ns)"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ $(id -u) -ne 0 -a "$withroot" -eq 0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Must be root${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! $(type ip >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}ip program not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats IP4 ABSTRACT_UNIXSOCKET UDP LISTEN NAMESPACES STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs ABSTRACT-RECV ABSTRACT-SENDTO CREATE EXEC UDP4-RECV STDIO UDP4); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $a not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions netns) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17275,9 +16228,7 @@ if [ $rc1 -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif echo "$da" |diff - ${tf}0 >"$tdiff" 2>/dev/null; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -17286,8 +16237,7 @@ elif echo "$da" |diff - ${tf}0 >"$tdiff" 2>/dev/null; then
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED (bad output)\n"
     echo "$CMD0 &"
@@ -17298,9 +16248,7 @@ else
     cat "${te}2" >&2
     echo diff:
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17321,11 +16269,9 @@ if ! cond=$(checkconds \
 		  "" \
 		  "" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
-    testecho "$N" "$TEST" "STDIO" "SOCKETPAIR" "$opts"
+    testecho "$N" "$NAME" "$TEST" "STDIO" "SOCKETPAIR" "$opts"
 fi
 esac
 N=$((N+1))
@@ -17343,11 +16289,9 @@ if ! cond=$(checkconds \
 		  "" \
 		  "" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
-    testecho "$N" "$TEST" "STDIO" "SOCKETPAIR,socktype=2" "$opts"
+    testecho "$N" "$NAME" "$TEST" "STDIO" "SOCKETPAIR,socktype=2" "$opts"
 fi
 esac
 N=$((N+1))
@@ -17365,11 +16309,9 @@ if ! cond=$(checkconds \
 		  "" \
 		  "" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
-    testecho "$N" "$TEST" "STDIO" "SOCKETPAIR,socktype=$SOCK_SEQPACKET" "$opts"
+    testecho "$N" "$NAME" "$TEST" "STDIO" "SOCKETPAIR,socktype=$SOCK_SEQPACKET" "$opts"
 fi
 esac
 N=$((N+1))
@@ -17387,20 +16329,16 @@ TEST="$NAME: Internal socketpair keeps packet boundaries"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO IP4 UDP SOCKETPAIR); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs - STDIO UDP4-DATAGRAM SOCKETPAIR); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions bind socktype ) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17425,8 +16363,7 @@ if [ "$rc2" -ne 0 ]; then
     cat "${te}1" >&2
     echo "$CMD2"
     cat "${te}2" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     $PRINTF "$FAILED\n"
     echo "$CMD1 &"
@@ -17435,16 +16372,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
     cat "${te}2" >&2
     echo diff:
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2 &"; fi
     if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -17464,20 +16399,16 @@ TEST="$NAME: ACCEPT-FD address"
 if ! eval $NUMCOND; then :;
 elif ! $(type systemd-socket-activate >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}systemd-socket-activate not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats IP4 TCP LISTEN); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs ACCEPT-FD PIPE STDIO TCP4); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17499,8 +16430,7 @@ if echo "$da" |diff "${tf}1" - >$tdiff; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -17508,9 +16438,7 @@ else
     echo "$CMD1"
     cat "${te}1" >&2
     cat $tdiff >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17531,20 +16459,16 @@ TEST="$NAME: POSIX-MQ (Linux) with prio"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats POSIXMQ STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs POSIXMQ-SEND POSIXMQ-READ STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions mq-prio unlink-early unlink-close) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17571,9 +16495,7 @@ if [ $rc0a -ne 0 -o $rc0b -ne 0 ]; then
     cat "${te}0b" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif $ECHO "$da 1\n$da 0" |diff - ${tf}1 >${tdiff}1; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0a"; fi
@@ -17582,8 +16504,7 @@ elif $ECHO "$da 1\n$da 0" |diff - ${tf}1 >${tdiff}1; then
     if [ "$DEBUG" ];   then cat "${te}0b" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0a"
@@ -17594,9 +16515,7 @@ else
     cat "${te}1" >&2
     echo "difference:" >&2
     cat ${tdiff}1 >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17615,20 +16534,16 @@ TEST="$NAME: POSIX-MQ (Linux) RECV with fork"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats POSIXMQ STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs POSIXMQ-SEND POSIXMQ-RECEIVE STDIO); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions fork unlink-early unlink-close) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17656,9 +16571,7 @@ if [ $rc1a -ne 0 -o $rc1b -ne 0 ]; then
     cat "${te}1a" >&2
     echo "$CMD1b"
     cat "${te}1b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif $ECHO "$da 0\n$da 1" |diff - ${tf}0 >${tdiff}0; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
@@ -17667,8 +16580,7 @@ elif $ECHO "$da 0\n$da 1" |diff - ${tf}0 >${tdiff}0; then
     if [ "$DEBUG" ];   then cat "${te}1a" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1b"; fi
     if [ "$DEBUG" ];   then cat "${te}1b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
@@ -17679,9 +16591,7 @@ else
     cat "${te}1b" >&2
     echo "difference:" >&2
     cat ${tdiff}0 >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17702,20 +16612,16 @@ TEST="$NAME: POSIX-MQ (Linux) RECV with fork,max-children"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats POSIXMQ STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs POSIXMQ-SEND POSIXMQ-RECEIVE STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions fork max-children unlink-early unlink-close) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17746,9 +16652,7 @@ if [ $rc1a -ne 0 -o $rc1b -ne 0 ]; then
     cat "${te}1a" >&2
     echo "$CMD1b"
     cat "${te}1b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif $ECHO "$da 1\n$da 2\n$da 3" |diff - ${tf}0 >${tdiff}0; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
@@ -17757,8 +16661,7 @@ elif $ECHO "$da 1\n$da 2\n$da 3" |diff - ${tf}0 >${tdiff}0; then
     if [ "$DEBUG" ];   then cat "${te}1a" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1b"; fi
     if [ "$DEBUG" ];   then cat "${te}1b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
@@ -17769,9 +16672,7 @@ else
     cat "${te}1b" >&2
     echo "difference:" >&2
     cat ${tdiff}0 >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17794,24 +16695,19 @@ TEST="$NAME: POSIX-MQ (Linux) SEND with fork,max-children"
 if ! eval $NUMCOND; then :;
 elif [ "$UNAME" != Linux ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Only on Linux${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats POSIXMQ STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs POSIXMQ-SEND POSIXMQ-READ STDIO SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions fork max-children mq-prio unlink-early unlink-close) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 #elif ! runsposixmq >/dev/null; then
 #    $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available${NORMAL}\n" $N
-#    numCANT=$((numCANT+1))
-#    listCANT="$listCANT $N"
+#    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17841,8 +16737,7 @@ if $ECHO "$da 1\n$da 2\n$da 3" |diff - ${tf}0 >${tdiff}0; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0"
@@ -17851,9 +16746,7 @@ else
     cat "${te}1" >&2
     echo "difference:" >&2
     cat ${tdiff}0 >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17872,16 +16765,13 @@ TEST="$NAME: sigint option with SHELL"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO SHELL PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SHELL PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions setsid sigint) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -17902,15 +16792,12 @@ if grep -q " W waitpid..: child .* exited with status 130" "${te}0" ||
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -17927,14 +16814,12 @@ TEST="$NAME: simple echo via SHELL of cat with socketpair"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO SHELL); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SHELL); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "SHELL:$CAT" "$opts" "$val_t"
+    testecho "$N" "$NAME" "$TEST" "" "SHELL:$CAT" "$opts" "$val_t"
 fi
 esac
 N=$((N+1))
@@ -17948,14 +16833,12 @@ TEST="$NAME: simple echo via SHELL of cat with pipes"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO SHELL SOCKETPAIR); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SHELL PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "SHELL:$CAT,pipes" "$opts" "$val_t"
+    testecho "$N" "$NAME" "$TEST" "" "SHELL:$CAT,pipes" "$opts" "$val_t"
 fi
 esac
 N=$((N+1))
@@ -17969,19 +16852,16 @@ TEST="$NAME: simple echo via SHELL of cat with pty"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO SHELL PTY); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SHELL PTY); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ "$SHELL" = /bin/ksh ]; then
     # on NetBSD-9.3 this test kills test.sh script...
     $PRINTF "test $F_n $TEST... ${YELLOW}/bin/ksh might kill test.sh${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testecho "$N" "$TEST" "" "SHELL:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts" "$val_t"
+    testecho "$N" "$NAME" "$TEST" "" "SHELL:$CAT,pty,$PTYOPTS,$PTYOPTS2" "$opts" "$val_t"
 fi
 esac
 N=$((N+1))
@@ -17995,14 +16875,12 @@ TEST="$NAME: call  od -c  via SHELL using socketpair"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO SHELL); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SHELL); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testod "$N" "$TEST" "" "SHELL:$OD_C" "$opts" "$val_t"
+    testod "$N" "$NAME" "$TEST" "" "SHELL:$OD_C" "$opts" "$val_t"
 fi
 esac
 N=$((N+1))
@@ -18016,14 +16894,12 @@ TEST="$NAME: call  od -c  via SHELL using pipes"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO SHELL SOCKETPAIR); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SHELL PIPE); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
-    testod "$N" "$TEST" "" "SHELL:$OD_C,pipes" "$opts" "$val_t"
+    testod "$N" "$NAME" "$TEST" "" "SHELL:$OD_C,pipes" "$opts" "$val_t"
 fi
 esac
 N=$((N+1))
@@ -18043,20 +16919,16 @@ elif [ "$UNAME" = "NetBSD" ]; then
     # On NetBSD-4.0 and NetBSD-9.3 this test hangs (signal has no effect)
     # (other versions not tried)
     $PRINTF "test $F_n $TEST... ${YELLOW}might hang on $UNAME${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats SYCLS STDIO SYSTEM SOCKETPAIR); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO SYSTEM SOCKETPAIR); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions setsid sigint) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -18078,15 +16950,12 @@ if grep -q " W waitpid..: child .* exited with status 130" "${te}0"; then
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "${YELLOW}FAILED (shell does not propagate SIGINT?${NORMAL}\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 fi
 fi # NUMCOND
  ;;
@@ -18106,20 +16975,16 @@ TEST="$NAME: test the res-nsaddr option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO IP4 UDP TCP); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO TCP4 UDP-RECVFROM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions res-nsaddr) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! runsip4 >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}IPv4 not available on host${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -18142,26 +17007,21 @@ if grep "$da" "${tf}0" >/dev/null; then
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 elif pgrep -u root nscd >/dev/null 2>&1; then
     $PRINTF "${YELLOW}FAILED (due to nscd?)${NORMAL}\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCAnT="$namesCANT $NAME"
+    cant
 else
     $PRINTF "$FAILED (query not received)\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
     echo "$CMD1"
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -18190,16 +17050,13 @@ TEST="$NAME: restore of pwd after CREAT with chdir option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats CREAT SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs - CREAT SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions chdir) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -18224,31 +17081,24 @@ else
 	$PRINTF "$FAILED\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif [ "$tpwd" != "$td" ]; then
 	$PRINTF "$FAILED (chdir failed)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! echo "$pwd2" |diff "$td/$tc" - >$tdiff; then
 	$PRINTF "$FAILED (bad pwd2)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -18268,16 +17118,13 @@ TEST="$NAME: restore of pwd after SYSTEM with chdir option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats SHELL SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs SHELL SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions chdir) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -18303,31 +17150,24 @@ else
 	$PRINTF "$FAILED (rc=$rc0)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif [ "$tpwd" != "$td" ]; then
 	$PRINTF "$FAILED (chdir failed)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! echo "$pwd2" |diff "$td/$tc" - >$tdiff; then
 	$PRINTF "$FAILED (bad pwd)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -18348,16 +17188,13 @@ TEST="$NAME: test restore after CREAT with umask option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats CREAT SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs CREAT SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions umask) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -18387,30 +17224,23 @@ else
 	$PRINTF "$FAILED\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif [ $((tumask + tperms - 0666)) -ne 0 ]; then
 	$PRINTF "$FAILED (umask failed)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! [ "$oumask" -eq $(cat "$tc") ]; then
 	$PRINTF "$FAILED (bad umask)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
 	cat "$tdebug" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -18430,16 +17260,13 @@ TEST="$NAME: test restore after SHELL with umask option"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats SHELL SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs SHELL SYSTEM); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions umask) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -18469,30 +17296,23 @@ else
 	$PRINTF "$FAILED\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif [ $((tumask + tperms - 0666)) -ne 0 ]; then
 	$PRINTF "$FAILED (umask failed)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! [ "$oumask" -eq $(cat "$tc") ]; then
 	$PRINTF "$FAILED (bad umask)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
 	cat "$tdebug" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -18522,12 +17342,10 @@ TEST="$NAME: Option unix-bind-tempname"
 if ! eval $NUMCOND; then :;
 elif [[ $CLI_ =~ ABSTRACT-* ]] && ! feat=$(testfeats abstract-unixsocket); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$feat not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions unix-bind-tempname) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 ts="$td/test$N.sock"
 tf="$td/test$N.stdout"
@@ -18573,8 +17391,7 @@ if [ $rc2b -ne 0 ]; then
     cat "${te}2a" >&2
     echo "$CMD2"
     cat "${te}2b" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da a" |diff - ${tf}2a >${tdiff}2a; then
     $PRINTF "$FAILED (phase a)\n"
     echo "$CMD0 &"
@@ -18585,8 +17402,7 @@ elif ! echo "$da a" |diff - ${tf}2a >${tdiff}2a; then
     cat "${te}2a" >&2
     echo "diff a:" >&2
     cat ${tdiff}2a >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! echo "$da b" |diff - ${tf}2b >${tdiff}2b; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -18599,8 +17415,7 @@ elif ! echo "$da b" |diff - ${tf}2b >${tdiff}2b; then
     cat "${te}2b" >&2
     echo "diff b:" >&2
     cat ${tdiff}2b >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -18611,8 +17426,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}2a" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD2"; fi
     if [ "$DEBUG" ];   then cat "${te}2b" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -18669,8 +17483,7 @@ if [ -e $ts3 ]; then
     cat "${te}0b" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif ! grep -q " E " ${te}1; then
     $PRINTF "$FAILED\n"
     echo "Socat did not fail"
@@ -18680,8 +17493,7 @@ elif ! grep -q " E " ${te}1; then
     cat "${te}0b" >&2
     echo "$CMD1" >&2
     cat "${te}1" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0a"; fi
@@ -18690,8 +17502,7 @@ else
     if [ "$DEBUG" ];   then cat "${te}0b" >&2; fi
     if [ "$VERBOSE" ]; then echo "$CMD1"; fi
     if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -18710,20 +17521,16 @@ TEST="$NAME: f-setpipe-sz on STDIN"
 if ! eval $NUMCOND; then :;
 elif ! $(type true >/dev/null 2>&1); then
     $PRINTF "test $F_n $TEST... ${YELLOW}true not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! F=$(testfeats STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions f-setpipe-sz nofork) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -18742,24 +17549,19 @@ if [ "$rc0" -ne 0 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif ! diff <(echo $PIPESZ2) <(echo $PIPESZ2b) >$tdiff; then
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0" >&2
     echo "diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -18776,16 +17578,13 @@ TEST="$NAME: f-setpipe-sz on EXEC with pipes"
 if ! eval $NUMCOND; then :;
 elif ! F=$(testfeats STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Feature $F not configured in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! A=$(testaddrs STDIO EXEC); then
     $PRINTF "test $F_n $TEST... ${YELLOW}Address $A not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif ! o=$(testoptions pipes f-setpipe-sz) >/dev/null; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option $o not available in $SOCAT${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -18802,24 +17601,19 @@ if [ "$rc0" -ne 0 ]; then
     $PRINTF "$FAILED\n"
     echo "$CMD0"
     cat "${te}0" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 elif ! diff <(echo $PIPESZ2) <(echo $PIPESZ2b) >$tdiff; then
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
     cat "${te}0" >&2
     echo "diff:" >&2
     cat "$tdiff" >&2
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
-    namesFAIL="$namesFAIL $NAME"
+    failed
 else
     $PRINTF "$OK\n"
     if [ "$VERBOSE" ]; then echo "$CMD0"; fi
     if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 fi
 fi # NUMCOND
  ;;
@@ -18838,8 +17632,7 @@ elif ! cond=$(checkconds "" "" "" \
 			 "so-reuseaddr" \
 			 "dccp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -18860,9 +17653,7 @@ if [ $? -ne 0 ]; then
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
 elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	$PRINTF "$FAILED\n"
 	echo "$CMD0 &"
@@ -18871,17 +17662,14 @@ elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	cat "${te}1" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
 else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
 fi
 kill $pid1 2>/dev/null
 wait
@@ -18904,9 +17692,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "udplite4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -18929,8 +17715,7 @@ else
 	cat "${te}1" >&2
 	echo "$CMD2"
 	cat "${te}2" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
+	failed
     elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	$PRINTF "$FAILED (diff)\n"
 	echo "$CMD1 &" >&2
@@ -18939,17 +17724,14 @@ else
 	cat "${te}2" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD2"; fi
 	if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi ;; # NUMCOND
 esac
@@ -18971,9 +17753,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "udplite4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -18996,8 +17776,7 @@ else
 	cat "${te}1" >&2
 	echo "$CMD2"
 	cat "${te}2" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
+	failed
     elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	$PRINTF "$FAILED (diff)\n"
 	echo "$CMD1 &" >&2
@@ -19006,17 +17785,14 @@ else
 	cat "${te}2" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD2"; fi
 	if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi ;; # NUMCOND
 esac
@@ -19038,9 +17814,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "udplite4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19063,8 +17837,7 @@ else
 	cat "${te}1" >&2
 	echo "$CMD2"
 	cat "${te}2" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
+	failed
     elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
 	$PRINTF "$FAILED (diff)\n"
 	echo "$CMD1 &" >&2
@@ -19073,17 +17846,14 @@ else
 	cat "${te}2" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD1 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD2"; fi
 	if [ "$DEBUG" ];   then cat "${te}2" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi ;; # NUMCOND
 esac
@@ -19117,9 +17887,7 @@ elif ! cond=$(checkconds \
 		  "$REUSEADDR bind" \
 		  "$protov" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
 tf="$td/test$N.stdout"
 te="$td/test$N.stderr"
@@ -19157,8 +17925,7 @@ if [ $rc1 != 0 ]; then
     cat "${te}0"
     echo "$CMD1"
     cat "${te}1"
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 elif [ "$(grep SOCAT_SOCKADDR "${tf}" |sed -e 's/^[^=]*=//' |sed -e "s/[\"']//g")" = "$TEST_SOCKADDR" -a \
     "$(grep SOCAT_PEERADDR "${tf}" |sed -e 's/^[^=]*=//' -e "s/[\"']//g")" = "$TEST_PEERADDR" -a \
     \( "$PORTMETHOD" = ',' -o "$(grep SOCAT_SOCKPORT "${tf}" |sed -e 's/^[^=]*=//' |sed -e 's/"//g')" = "$TEST_SOCKPORT" \) -a \
@@ -19171,8 +17938,7 @@ elif [ "$(grep SOCAT_SOCKADDR "${tf}" |sed -e 's/^[^=]*=//' |sed -e "s/[\"']//g"
 	echo "$CMD1"
 	cat "${te}1"
     fi
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -19181,8 +17947,7 @@ else
     cat "${te}1"
     echo -e "SOCAT_SOCKADDR=$TEST_SOCKADDR\nSOCAT_PEERADDR=$TEST_PEERADDR\nSOCAT_SOCKPORT=$TEST_SOCKPORT\nSOCAT_PEERPORT=$TEST_PEERPORT" |
     diff - "${tf}"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND, feats
  ;;
@@ -19222,9 +17987,7 @@ elif ! cond=$(checkconds \
 		  "$REUSEADDR o-trunc o-creat o-append fork max-children $SHUT" \
 		  "$RUNS" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
 case "X$IPPORT" in
     "XPORT")
@@ -19258,8 +18021,7 @@ cpids="$(childpids $pid0)"
 kill $pid1 $pid2 $cpids $pid0 2>/dev/null; wait
 if echo -e "$da 1" |diff - $tf >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     echo "$CMD0 &"
@@ -19269,8 +18031,7 @@ else
     cat "${te}1"
     cat "${te}2"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 fi # NUMCOND
  ;;
@@ -19298,8 +18059,7 @@ elif ! cond=$(checkconds \
 		  "" \
 		  "" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19312,24 +18072,19 @@ else
 	$PRINTF "$FAILED\n"
 	echo "$CMD0"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! tty |diff - <(cat ${tf}0 |grep "controlling terminal" |grep -v -e '"/dev/tty"' -e none |head -n 1 |sed -e 's/controlling terminal by .*:[[:space:]]*//' -e 's/"//g') >$tdiff; then
 	$PRINTF "$FAILED\n"
 	echo "$CMD0"
 	cat "${te}0" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19354,9 +18109,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "tcp4 unix" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     ts="$td/test$N.sock"
     tf="$td/test$N.stdout"
@@ -19379,9 +18132,7 @@ else
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! echo "$da" |diff - "${tf}1" >$tdiff; then
 	$PRINTF "$FAILED (diff)\n"
 	echo "$CMD0 &"
@@ -19390,17 +18141,14 @@ else
 	cat "${te}1" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19425,14 +18173,10 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "tcp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 elif [[ $BASH_VERSION =~ ^[1-3]\. ]]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}requires bash 4 or higher${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     gentestcert testsrv
     tp="$td/test$N.pty"
@@ -19457,9 +18201,7 @@ else
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! echo "$da" |diff - "${tf}1" >$tdiff; then
 	$PRINTF "$FAILED (diff)\n"
 	echo "$CMD0 &"
@@ -19468,17 +18210,14 @@ else
 	cat "${te}1" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19506,9 +18245,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "tcp4 unix" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19546,9 +18283,7 @@ else
 	cat "${te}2a" >&2
 	echo "{ relsleep 20; echo \"\$da_b\"; relsleep 10; } |$CMD2"
 	cat "${te}2b" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! $ECHO "$da_a\n$da_b" |diff - "${tf}2a" >${tdiff}_a; then
 	$PRINTF "$FAILED (diff a)\n"
 	echo "$CMD0 &"
@@ -19561,9 +18296,7 @@ else
 	cat "${te}2b" >&2
 	echo "// diff a:" >&2
 	cat "${tdiff}_a" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! $ECHO "$da_a\n$da_b" |diff - "${tf}2b" >${tdiff}_b; then
 	$PRINTF "$FAILED (diff b)\n"
 	echo "$CMD0 &"
@@ -19576,9 +18309,7 @@ else
 	cat "${te}2b" >&2
 	echo "// diff b:" >&2
 	cat "${tdiff}_b" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -19589,8 +18320,7 @@ else
 	if [ "$DEBUG" ];   then cat "${te}2a" >&2; fi
 	if [ "$VERBOSE" ]; then echo "{ relsleep 20; echo \"\$da_b\"; relsleep 10; } |$CMD2"; fi
 	if [ "$DEBUG" ];   then cat "${te}2b" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19617,9 +18347,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "udp4 tcp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19648,9 +18376,7 @@ else
 	cat "${te}1a" >&2
 	echo "{ relsleep 20; echo \"\$da_b\"; relsleep 10; } |$CMD1"
 	cat "${te}1b" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! $ECHO "$da_a\n$da_b" |diff - "${tf}1a" >${tdiff}_a; then
 	$PRINTF "$FAILED (diff a)\n"
 	echo "$CMD0 &"
@@ -19661,9 +18387,7 @@ else
 	cat "${te}1b" >&2
 	echo "// diff a:" >&2
 	cat "${tdiff}_a" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! $ECHO "$da_a\n$da_b" |diff - "${tf}1b" >${tdiff}_b; then
 	$PRINTF "$FAILED (diff b)\n"
 	echo "$CMD0 &"
@@ -19674,9 +18398,7 @@ else
 	cat "${te}1b" >&2
 	echo "// diff b:" >&2
 	cat "${tdiff}_b" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -19685,8 +18407,7 @@ else
 	if [ "$DEBUG" ];   then cat "${te}1a" >&2; fi
 	if [ "$VERBOSE" ]; then echo "{ relsleep 20; echo \"\$da_b\"; relsleep 10.; } |$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1b" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19716,9 +18437,7 @@ elif ! cond=$(checkconds \
 		  "fork" \
 		  "udp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19740,35 +18459,28 @@ else
 	cat "${te}0" >&2
 	echo "echo \$da\" |$CMD1"
 	cat "${te}1" >&2
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
-	namesCANT="$namesCANT $NAME"
+	cant
     elif [ $(grep -c " E open(" "${te}0") -eq 0 ]; then
 	$PRINTF "$CANT (no error)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
 	echo "echo \$da\" |$CMD1"
 	cat "${te}1" >&2
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
-	namesCANT="$namesCANT $NAME"
+	cant
     elif [ $(grep -c " E open(" "${te}0") -ge 2 ]; then
 	$PRINTF "$FAILED (this bug)\n"
 	echo "$CMD0 &"
 	head -n 2 "${te}0" >&2
 	echo "echo \$da\" |$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19796,9 +18508,7 @@ elif ! cond=$(checkconds \
 		  "fork" \
 		  "udp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19823,9 +18533,7 @@ else
 	cat "${te}1a" >&2
 	echo "echo \$da b\" |$CMD1"
 	cat "${te}1b" >&2
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
-	namesCANT="$namesCANT $NAME"
+	cant
     elif [ $(grep -c " I socketpair(" "${te}0") -ne 2 ]; then
 	$PRINTF "$CANT (not 2 socketpair())\n"
 	echo "$CMD0 &"
@@ -19834,9 +18542,7 @@ else
 	cat "${te}1a" >&2
 	echo "echo \$da b\" |$CMD1"
 	cat "${te}1b" >&2
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
-	namesCANT="$namesCANT $NAME"
+	cant
     elif ! diff <(grep " I socketpair(" "${te}0" |head -n 1 |sed 's/.*\( I socketpair.*\)/\1/') <(grep " I socketpair(" "${te}0" |tail -n 1 |sed 's/.*\( I socketpair.*\)/\1/') >/dev/null 2>&1; then
 	$PRINTF "$FAILED (this bug)\n"
 	echo "$CMD0 &"
@@ -19845,9 +18551,7 @@ else
 	cat "${te}1a" >&2
 	echo "echo \$da b\" |$CMD1"
 	cat "${te}1b" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
@@ -19856,8 +18560,7 @@ else
 	if [ "$DEBUG" ];   then cat "${te}1a" >&2; fi
 	if [ "$VERBOSE" ]; then echo "echo \$da b\" |$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1b" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19886,9 +18589,7 @@ elif ! cond=$(checkconds \
 		  "pf" \
 		  "ip4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -19902,15 +18603,12 @@ else
 	$PRINTF "$FAILED (rc0=$rc0)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -19955,9 +18653,7 @@ TEST="$NAME: TCP-L with -0 accepts IPv4"
 if ! eval $NUMCOND; then :
 elif [ -z "$opt0" -a $SOCAT_VERSION != 1.8.0.0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option -0 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 elif ! cond=$(checkconds \
 		  "" \
 		  "" \
@@ -19967,9 +18663,7 @@ elif ! cond=$(checkconds \
 		  "" \
 		  "tcp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     opt0=
     if SOCAT_MAIN_WAIT= $SOCAT -h |grep -e '[[:space:]]-0[[:space:]]' >/dev/null; then
@@ -19997,21 +18691,17 @@ else
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1)) ;;
+	ok ;;
       Linux)
 	$PRINTF "$FAILED (rc1=$rc1)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME" ;;
+	failed ;;
       *)
 	  $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-	  numCANT=$((numCANT+1))
-	  listCANT="$listCANT $N"
-	  namesCANT="$namesCANT $NAME" ;;
+	  cant ;;
       esac
     else
 	$PRINTF "$OK\n"
@@ -20019,7 +18709,7 @@ else
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -20036,9 +18726,7 @@ TEST="$NAME: TCP-L with -0 accepts IPv6"
 if ! eval $NUMCOND; then :
 elif [ -z "$opt0" -a $SOCAT_VERSION != 1.8.0.0 ]; then
     $PRINTF "test $F_n $TEST... ${YELLOW}Option -0 not available${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 elif ! cond=$(checkconds \
 		  "" \
 		  "" \
@@ -20048,9 +18736,7 @@ elif ! cond=$(checkconds \
 		  "" \
 		  "tcp6" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -20072,16 +18758,14 @@ else
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -20125,9 +18809,7 @@ elif ! cond=$(checkconds \
 		  "${option%%=*}" \
 		  "$(tolower $PROTO)4 $(tolower $PROTO)6" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -20142,9 +18824,7 @@ else
     printf "test $F_n $TEST... " $N
     if [ -z "$ACCEPT_TIMEOUT" ] && [ -z "$BIN_TIMEOUT" ]; then
 	$PRINTF "$CANT (would block)\n"
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
-	namesCANT="$namesCANT $NAME"
+	cant
     else
       if [ "$BIN_TIMEOUT" ]; then
 	$BIN_TIMEOUT 0.1 $CMD0 >/dev/null 2>"${te}0"
@@ -20157,15 +18837,12 @@ else
 	$PRINTF "$FAILED (rc0=$rc0)\n"
 	echo "$CMD0 &"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
     fi 	# not would block
 fi # NUMCOND
@@ -20225,9 +18902,7 @@ elif ! cond=$(checkconds \
 		  "bind" \
 		  "$protov" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -20246,15 +18921,12 @@ else
 	$PRINTF "$FAILED (rc0=$rc0)\n"
 	echo "$CMD0"
 	cat "${te}0" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -20295,9 +18967,7 @@ elif ! cond=$(checkconds \
 		  "bind" \
 		  "$protov" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -20323,15 +18993,12 @@ else
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -20368,9 +19035,7 @@ elif ! cond=$(checkconds \
 		  "" \
 		  "" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.file"
     te="$td/test$N.stderr"
@@ -20386,9 +19051,7 @@ else
 #	$PRINTF "$CANT (rc0=$rc0)\n"
 #	echo "$CMD0"
 #	cat "${te}0" >&2
-#	numCANT=$((numCANT+1))
-#	listCANT="$listCANT $N"
-#	namesCANT="$namesCANT $NAME"
+#	cant
 #    elif ! echo "$da" |diff - "$tf" >$tdiff; then
     if ! echo "$da" |diff - "$tf" >$tdiff; then
 	$PRINTF "$FAILED (diff)\n"
@@ -20396,17 +19059,14 @@ else
 	cat "${te}0" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
 fi # NUMCOND
  ;;
@@ -20463,17 +19123,14 @@ if [ $rc1 -ne 0 ]; then
     echo "$CMD1"
     cat "${te}0"
     cat "${te}1"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 elif echo "$da" |diff - "$tf" >$tdiff; then
     $PRINTF "$OK\n"
-    numOK=$((numOK+1))
-    listOK="$listOK $N"
+    ok
 else
     $PRINTF "$FAILED\n"
     cat "$tdiff"
-    numFAIL=$((numFAIL+1))
-    listFAIL="$listFAIL $N"
+    failed
 fi
 if ! ls -l $f |diff "$td/test$N.$F.ls-l" -; then
     $PRINTF "${RED}this test changed properties of $f!${NORMAL}\n"
@@ -20494,8 +19151,11 @@ set -- $listOK;   while [ "$1" ]; do echo "$1"; shift; done >"$td/success.lst"
 ln -sf "$td/success.lst" .
 set -- $listFAIL; while [ "$1" ]; do echo "$1"; shift; done >"$td/failed.lst"
 ln -sf "$td/failed.lst" .
-sort -n <(cat "$td/success.lst" |while read x; do echo "$x OK"; done) <(cat "$td/cannot.lst" |while read x; do echo "$x CANT"; done) <(cat "$td/failed.lst" |while read x; do echo "$x FAILED"; done) >"$td/result.txt"
-ln -sf "$td/result.txt" .
+#sort -n <(cat "$td/success.lst" |while read x; do echo "$x OK"; done) <(cat "$td/cannot.lst" |while read x; do echo "$x CANT"; done) <(cat "$td/failed.lst" |while read x; do echo "$x FAILED"; done) >"$td/result.txt"
+#ln -sf "$td/result.txt" .
+
+ln -sf "$td/results.txt" .
+
 if [ "$numCANT" -gt 0 ]; then
     echo "CANT: $listCANT"
 fi
@@ -20508,8 +19168,6 @@ if [ -z "$OPT_EXPECT_FAIL" ]; then
     exit 	# with rc from above statement
 fi
 
-#set -vx
-
 if [ "$OPT_EXPECT_FAIL" ]; then
     diff  <(set -- $(echo "$EXPECT_FAIL" |tr ',' ' '); while [ "$1" ]; do echo "$1"; shift; done) "$td/failed.lst" >"$td/failed.diff"
     ln -sf "$td/failed.diff" .
@@ -20565,9 +19223,7 @@ elif ! cond=$(checkconds \
 		  "so-reuseaddr" \
 		  "tcp4" ); then
     $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N
-    numCANT=$((numCANT+1))
-    listCANT="$listCANT $N"
-    namesCANT="$namesCANT $NAME"
+    cant
 else
     tf="$td/test$N.stdout"
     te="$td/test$N.stderr"
@@ -20590,9 +19246,7 @@ else
 	cat "${te}0" >&2
 	echo "$CMD1"
 	cat "${te}1" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif ! echo "$da" |diff - "${tf}1" >$tdiff; then
 	$PRINTF "$FAILED (diff)\n"
 	echo "$CMD0 &"
@@ -20601,9 +19255,7 @@ else
 	cat "${te}1" >&2
 	echo "// diff:" >&2
 	cat "$tdiff" >&2
-	numFAIL=$((numFAIL+1))
-	listFAIL="$listFAIL $N"
-	namesFAIL="$namesFAIL $NAME"
+	failed
     elif [ ??? ]; then
 	# The test could not run meaningfully
 	$PRINTF "$CANT\n"
@@ -20611,17 +19263,16 @@ else
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numCANT=$((numCANT+1))
-	listCANT="$listCANT $N"
+	cant
     else
 	$PRINTF "$OK\n"
 	if [ "$VERBOSE" ]; then echo "$CMD0 &"; fi
 	if [ "$DEBUG" ];   then cat "${te}0" >&2; fi
 	if [ "$VERBOSE" ]; then echo "$CMD1"; fi
 	if [ "$DEBUG" ];   then cat "${te}1" >&2; fi
-	numOK=$((numOK+1))
-	listOK="$listOK $N"
+	ok
     fi
+    result
 fi # NUMCOND
  ;;
 esac