test.sh: many corrections, esp.for AIX, SunOS

This commit is contained in:
Gerhard Rieger 2022-01-06 17:13:27 +01:00
parent e1a2e37480
commit c3081fbba9
2 changed files with 117 additions and 83 deletions

View file

@ -21,6 +21,12 @@ Porting:
EPROTOTYPE on most other OSes). EPROTOTYPE on most other OSes).
Streams: Must not push ldterm when it is already active (hangs). Streams: Must not push ldterm when it is already active (hangs).
Testing:
test.sh: many corrections for AIX's older shell utilities, e.g.sleep(1)
does not allow fractions of seconds, grep does not understand '\<';
OpenIndiana/SunOS netstat format;
many more functional and cosmetic code corrections.
####################### V 1.7.4.2: ####################### V 1.7.4.2:
Corrections: Corrections:

194
test.sh
View file

@ -64,8 +64,8 @@ MISCDELAY=1
if ! [ -x "$SOCAT" ] && ! type $SOCAT >/dev/null 2>&1; then if ! [ -x "$SOCAT" ] && ! type $SOCAT >/dev/null 2>&1; then
echo "$SOCAT does not exist" >&2; exit 1; echo "$SOCAT does not exist" >&2; exit 1;
fi fi
if [ -z "$PROCAN" ]; then if test -x ./procan; then PROCAN="./procan"; elif ! type procan >/dev/null 2>&1; then PROCAN=${SOCAT%/*}/procan; fi; fi if [ -z "$PROCAN" ]; then if test -x ./procan; then PROCAN="./procan"; elif type procan >/dev/null 2>&1; then PROCAN=procan; elif test -x ${SOCAT%/*}/procan; then PROCAN=${SOCAT%/*}/procan; else PROCAN=false; fi; fi
if [ -z "$FILAN" ]; then if test -x ./filan; then FILAN="./filan"; elif ! type filan >/dev/null 2>&1; then FILAN=${SOCAT%/*}/filan; fi; fi if [ -z "$FILAN" ]; then if test -x ./filan; then FILAN="./filan"; elif ! type filan >/dev/null 2>&1; then FILAN=filan; elif test -x ${SOCAT%/*}/filan; then FILAN=${SOCAT%/*}/filan; else FILAN=false; fi; fi
opts="$opt_t $OPTS" opts="$opt_t $OPTS"
export SOCAT_OPTS="$opts" export SOCAT_OPTS="$opts"
#debug="1" #debug="1"
@ -255,12 +255,17 @@ SunOS)
;; ;;
esac esac
# some OSes need special options
case "$UNAME" in case "$UNAME" in
#HP-UX) #HP-UX)
# # on HP-UX, the default options (below) hang some tests (former 14, 15) # # on HP-UX, the default options (below) hang some tests (former 14, 15)
# PTYOPTS= # PTYOPTS=
# PTYOPTS2= # PTYOPTS2=
# ;; # ;;
SunOS)
PTYOPTS="echo=0,opost=0,perm=600"
PTYOPTS2="cfmakeraw"
;;
*) *)
PTYOPTS="echo=0,opost=0" PTYOPTS="echo=0,opost=0"
#PTYOPTS2="raw,echo=0" #PTYOPTS2="raw,echo=0"
@ -324,9 +329,9 @@ esac
# need user (owner) of filesystem entry # need user (owner) of filesystem entry
case "$UNAME" in case "$UNAME" in
Linux) fileuser() { stat -L --print "%U\n" "$tsock" 2>/dev/null; } ;; Linux) fileuser() { stat -L --print "%U\n" "$1" 2>/dev/null; } ;;
FreeBSD) fileuser() { ls -l test.sh |awk '{print($3);}'; } ;; FreeBSD) fileuser() { ls -l "$1" |awk '{print($3);}'; } ;;
*) fileuser() { ls -l test.sh |awk '{print($3);}'; } ;; *) fileuser() { ls -l "$1" |awk '{print($3);}'; } ;;
esac esac
if2addr4() { if2addr4() {
@ -1998,7 +2003,7 @@ runsip6 () {
[ -n "$HAVENOT_IP6" ] && return $HAVENOT_IP6 [ -n "$HAVENOT_IP6" ] && return $HAVENOT_IP6
local l local l
case "$UNAME" in case "$UNAME" in
AIX) l=$($IFCONFIG lo0 |grep 'inet6 ::1/0') ;; AIX) l=$($IFCONFIG lo0 |grep 'inet6 ::1[/%]') ;;
HP-UX) l=$($IFCONFIG lo0 |grep ' inet6 ') ;; HP-UX) l=$($IFCONFIG lo0 |grep ' inet6 ') ;;
Linux) if [ "$IP" ]; then Linux) if [ "$IP" ]; then
l=$($IP address |egrep 'inet6 ::1/128') l=$($IP address |egrep 'inet6 ::1/128')
@ -2029,42 +2034,42 @@ runsip6 () {
# check if TCP on IPv4 is available on host # check if TCP on IPv4 is available on host
runstcp4 () { runstcp4 () {
runsip4 >/dev/null || { echo TCP4; return 1; } runsip4 >/dev/null || { echo TCP4; return 1; }
$SOCAT -h |grep '\<tcp4-' >/dev/null || return 1 $SOCAT -h |grep ' tcp4-' >/dev/null || return 1
return 0; return 0;
} }
# check if TCP on IPv6 is available on host # check if TCP on IPv6 is available on host
runstcp6 () { runstcp6 () {
runsip6 >/dev/null || { echo TCP6; return 1; } runsip6 >/dev/null || { echo TCP6; return 1; }
$SOCAT -h |grep '\<tcp6-' >/dev/null || return 1 $SOCAT -h |grep ' tcp6-' >/dev/null || return 1
return 0; return 0;
} }
# check if UDP on IPv4 is available on host # check if UDP on IPv4 is available on host
runsudp4 () { runsudp4 () {
runsip4 >/dev/null || { echo UDP4; return 1; } runsip4 >/dev/null || { echo UDP4; return 1; }
$SOCAT -h |grep '\<udp4-' >/dev/null || return 1 $SOCAT -h |grep ' udp4-' >/dev/null || return 1
return 0; return 0;
} }
# check if UDP on IPv6 is available on host # check if UDP on IPv6 is available on host
runsudp6 () { runsudp6 () {
runsip6 >/dev/null || { echo UDP6; return 1; } runsip6 >/dev/null || { echo UDP6; return 1; }
$SOCAT -h |grep '\<udp6-' >/dev/null || return 1 $SOCAT -h |grep ' udp6-' >/dev/null || return 1
return 0; return 0;
} }
# check if SCTP on IPv4 is available on host # check if SCTP on IPv4 is available on host
runssctp4 () { runssctp4 () {
runsip4 >/dev/null || { echo SCTP4; return 1; } runsip4 >/dev/null || { echo SCTP4; return 1; }
$SOCAT -h |grep '\<sctp4-' >/dev/null || return 1 $SOCAT -h |grep ' sctp4-' >/dev/null || return 1
return 0; return 0;
} }
# check if SCTP on IPv6 is available on host # check if SCTP on IPv6 is available on host
runssctp6 () { runssctp6 () {
runsip6 >/dev/null || { echo SCTP6; return 1; } runsip6 >/dev/null || { echo SCTP6; return 1; }
$SOCAT -h |grep '\<sctp6-' >/dev/null || return 1 $SOCAT -h |grep ' sctp6-' >/dev/null || return 1
return 0; return 0;
} }
@ -2211,7 +2216,7 @@ waittcp4port () {
*) l=$(netstat -an |grep '^tcp4.* .*[0-9*]\.'$port' .* \*\.\* .* LISTEN') ;; *) l=$(netstat -an |grep '^tcp4.* .*[0-9*]\.'$port' .* \*\.\* .* LISTEN') ;;
esac ;; esac ;;
AIX) l=$(netstat -an |grep '^tcp[^6] 0 0 .*[*0-9]\.'$port' .* LISTEN$') ;; AIX) l=$(netstat -an |grep '^tcp[^6] 0 0 .*[*0-9]\.'$port' .* LISTEN$') ;;
SunOS) l=$(netstat -an -f inet -P tcp |grep '.*[1-9*]\.'$port' .*\* 0 .* LISTEN') ;; SunOS) l=$(netstat -an -f inet -P tcp |grep '.*[1-9*]\.'$port' .*\* .* 0 .* LISTEN') ;;
HP-UX) l=$(netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' .* LISTEN$') ;; HP-UX) l=$(netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' .* LISTEN$') ;;
OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') ;; OSF1) l=$(/usr/sbin/netstat -an |grep '^tcp 0 0 .*[0-9*]\.'$port' [ ]*\*\.\* [ ]*LISTEN') ;;
CYGWIN*) l=$(netstat -an -p TCP |grep '^ TCP [0-9.]*:'$port' .* LISTENING') ;; CYGWIN*) l=$(netstat -an -p TCP |grep '^ TCP [0-9.]*:'$port' .* LISTENING') ;;
@ -4075,7 +4080,7 @@ tf="$td/test$N.stdout"
te="$td/test$N.stderr" te="$td/test$N.stderr"
tdiff="$td/test$N.diff" tdiff="$td/test$N.diff"
da="test$N $(date) $RANDOM" da="test$N $(date) $RANDOM"
CMD1="$TRACE $SOCAT $opts pty,link=$tt pipe" CMD1="$TRACE $SOCAT $opts PTY,$PTYOPTS,link=$tt PIPE"
CMD2="$TRACE $SOCAT $opts - $tt,$PTYOPTS2" CMD2="$TRACE $SOCAT $opts - $tt,$PTYOPTS2"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
$CMD1 2>"${te}1" & $CMD1 2>"${te}1" &
@ -4083,9 +4088,9 @@ pid=$! # background process id
waitfile "$tt" waitfile "$tt"
# this hangs on HP-UX, so we use a timeout # this hangs on HP-UX, so we use a timeout
(echo "$da"; sleep 1) |$CMD2 >$tf 2>"${te}2" & (echo "$da"; sleep 1) |$CMD2 >$tf 2>"${te}2" &
rc2=$! pid2=$!
#sleep 5 && kill $rc2 2>/dev/null & #sleep 5 && kill $rc2 2>/dev/null &
wait $rc2 wait $pid2
if ! echo "$da" |diff - "$tf" >"$tdiff"; then if ! echo "$da" |diff - "$tf" >"$tdiff"; then
$PRINTF "$FAILED: $TRACE $SOCAT:\n" $PRINTF "$FAILED: $TRACE $SOCAT:\n"
echo "$CMD1 &" echo "$CMD1 &"
@ -4311,7 +4316,7 @@ pid=$! # background process id
waittcp4port $PORT waittcp4port $PORT
#echo "$da" |$CMD >$tf 2>"${te}2" #echo "$da" |$CMD >$tf 2>"${te}2"
#note: with about OpenSSL 1.1 s_server lost the half close feature, thus: #note: with about OpenSSL 1.1 s_server lost the half close feature, thus:
(echo "$da"; sleep 0.1) |$CMD >$tf 2>"${te}2" (echo "$da"; psleep 0.1) |$CMD >$tf 2>"${te}2"
if ! echo "$da" |diff - "$tf" >"$tdiff"; then if ! echo "$da" |diff - "$tf" >"$tdiff"; then
$PRINTF "$FAILED: $TRACE $SOCAT:\n" $PRINTF "$FAILED: $TRACE $SOCAT:\n"
echo "$CMD2 &" echo "$CMD2 &"
@ -5341,7 +5346,8 @@ elif ! testfeats pty >/dev/null; then
numCANT=$((numCANT+1)) numCANT=$((numCANT+1))
listCANT="$listCANT $N" listCANT="$listCANT $N"
else else
testecho "$N" "$TEST" "exec:cat,pty,raw!!-" "" "$opts" # T value needed (only) by AIX
testecho "$N" "$TEST" "exec:cat,pty,raw!!-" "" "$opts" 0.1
fi ;; # NUMCOND, feats fi ;; # NUMCOND, feats
esac esac
N=$((N+1)) N=$((N+1))
@ -5381,7 +5387,8 @@ touch "$tpo"
# during development of this test, the following command line succeeded: # during development of this test, the following command line succeeded:
# (sleep 1; $ECHO "user\n\c"; sleep 1; $ECHO "password\c"; sleep 1; $ECHO "\n\c"; sleep 1; $ECHO "test 1\n\c"; sleep 1; $ECHO "\003\c"; sleep 1; $ECHO "test 2\n\c"; sleep 1; $ECHO "exit\n\c"; sleep 1) |$TRACE $SOCAT -d -d -d -d -lf/tmp/$USER/debug1 -v -x - exec:'./readline.sh ./readline-test.sh',pty,ctty,setsid,raw,echo=0,isig # (sleep 1; $ECHO "user\n\c"; sleep 1; $ECHO "password\c"; sleep 1; $ECHO "\n\c"; sleep 1; $ECHO "test 1\n\c"; sleep 1; $ECHO "\003\c"; sleep 1; $ECHO "test 2\n\c"; sleep 1; $ECHO "exit\n\c"; sleep 1) |$TRACE $SOCAT -d -d -d -d -lf/tmp/$USER/debug1 -v -x - exec:'./readline.sh ./readline-test.sh',pty,ctty,setsid,raw,echo=0,isig
# #
PATH=${SOCAT%socat}:$PATH eval "$CMD 2>$te &" # the following cat, in case of socat failure, reads the pipe to prevent below writer from hanging
PATH=${SOCAT%socat}:$PATH eval "$CMD 2>$te || cat $tpi >/dev/null &"
pid=$! # background process id pid=$! # background process id
usleep $MICROS usleep $MICROS
@ -7079,6 +7086,7 @@ pids=$!
waitfile "$ts1" waitfile "$ts1"
echo "$da1" |eval "$CLI" >"${tf}1" 2>"${te}1" echo "$da1" |eval "$CLI" >"${tf}1" 2>"${te}1"
rc=$? rc=$?
kill $pids 2>/dev/null
wait wait
if [ $rc -ne 0 ]; then if [ $rc -ne 0 ]; then
kill "$pids" 2>/dev/null kill "$pids" 2>/dev/null
@ -7115,8 +7123,8 @@ case "$TESTS" in
TEST="$NAME: simple echo via exec of cat with pipes,stderr" 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. # this test is known to fail when logging is enabled with OPTS/opts env var.
SAVE_opts="$opts" SAVE_opts="$opts"
opts="$(echo "$opts" |sed 's/-d//g')" opts="$(echo "$opts" |sed 's/-dd*//g')"
testecho "$N" "$TEST" "" "exec:$CAT,pipes,stderr" "$opts" testecho "$N" "$TEST" "" "EXEC:$CAT,pipes,stderr" "$opts"
opts="$SAVE_opts" opts="$SAVE_opts"
esac esac
N=$((N+1)) N=$((N+1))
@ -8649,10 +8657,17 @@ if ! eval $NUMCOND; then :;
else else
tf="$td/test$N.stout" tf="$td/test$N.stout"
te="$td/test$N.stderr" te="$td/test$N.stderr"
CMD="$TRACE $SOCAT $opts /dev/null pty,end-close" CMD="$TRACE $SOCAT $opts -d -d /dev/null pty,end-close"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
$CMD 2>"${te}" # AIX reports the pty writeable for select() only when its slave side has been
rc=$? # opened, therefore we run this process in background and check its NOTICE
# output for the PTY name
{ $CMD 2>"${te}"; echo $? >"$td/test$N.rc0"; } &
waitfile "${te}"
psleep 0.1
PTY=$(grep "N PTY is " $te |sed 's/.*N PTY is //')
[ -e "$PTY" ] && cat $PTY >/dev/null
rc=$(cat "$td/test$N.rc0")
if [ "$rc" = 0 ]; then if [ "$rc" = 0 ]; then
$PRINTF "$OK\n" $PRINTF "$OK\n"
numOK=$((numOK+1)) numOK=$((numOK+1))
@ -8691,9 +8706,9 @@ printf "test $F_n $TEST... " $N
$CMD0 >/dev/null 2>"${te}0" & $CMD0 >/dev/null 2>"${te}0" &
pid0=$! pid0=$!
waitudp4port $PORT 1 waitudp4port $PORT 1
{ echo "$da"; sleep 0.1; } |$CMD1 >"${tf}1" 2>"${te}1" { echo "$da"; psleep 0.1; } |$CMD1 >"${tf}1" 2>"${te}1"
rc1=$? rc1=$?
{ echo "xyz"; sleep 0.1; } |$CMD1 >"${tf}2" 2>"${te}2" { echo "xyz"; psleep 0.1; } |$CMD1 >"${tf}2" 2>"${te}2"
rc2=$? rc2=$?
kill $pid0 2>/dev/null; wait kill $pid0 2>/dev/null; wait
if [ $rc1 != 0 -o $rc2 != 0 ]; then if [ $rc1 != 0 -o $rc2 != 0 ]; then
@ -9723,7 +9738,7 @@ N=$((N+1))
# process under some circumstances. # process under some circumstances.
NAME=EXECPTYKILL NAME=EXECPTYKILL
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%exec%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%exec%*|*%pty%*|*%$NAME%*)
TEST="$NAME: exec:...,pty explicitely kills sub process" TEST="$NAME: exec:...,pty explicitely kills sub process"
# we want to check if the exec'd sub process is killed in time # we want to check if the exec'd sub process is killed in time
# for this we have a shell script that generates a file after two seconds; # for this we have a shell script that generates a file after two seconds;
@ -9847,7 +9862,12 @@ case "$TESTS" in
TEST="$NAME: more than FOPEN_MAX FDs in use" TEST="$NAME: more than FOPEN_MAX FDs in use"
# this test opens a number of FDs before socat is invoked. socat will have to # this test opens a number of FDs before socat is invoked. socat will have to
# allocate higher FD numbers and thus hang if it cannot handle them. # allocate higher FD numbers and thus hang if it cannot handle them.
if ! eval $NUMCOND; then :; else 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"
else
REDIR= REDIR=
#set -vx #set -vx
FOPEN_MAX=$($PROCAN -c 2>/dev/null |grep '^#define[ ][ ]*FOPEN_MAX' |awk '{print($3);}') FOPEN_MAX=$($PROCAN -c 2>/dev/null |grep '^#define[ ][ ]*FOPEN_MAX' |awk '{print($3);}')
@ -10617,7 +10637,8 @@ case "X$IPPORT" in
tsa="$tra" tsa="$tra"
esac esac
#CMD0="$TRACE $SOCAT $opts -u $KEYW-RECVFROM:$tra,reuseaddr,$SCM_RECV SYSTEM:\"export -p\"" #CMD0="$TRACE $SOCAT $opts -u $KEYW-RECVFROM:$tra,reuseaddr,$SCM_RECV SYSTEM:\"export -p\""
CMD0="$TRACE $SOCAT $opts -u -lpsocat $KEYW-RECVFROM:$tra,reuseaddr,$SCM_RECV SYSTEM:\"echo \\\$SOCAT_$SCM_ENVNAME\"" # without that ultra escaped quote the test failed for IPv6 when there was file ./1
CMD0="$TRACE $SOCAT $opts -u -lpsocat $KEYW-RECVFROM:$tra,reuseaddr,$SCM_RECV SYSTEM:\"echo \\\\\\\"\\\$SOCAT_$SCM_ENVNAME\\\\\\\"\""
CMD1="$TRACE $SOCAT $opts -u - $KEYW-SENDTO:$tsa,$SCM_ENABLE" CMD1="$TRACE $SOCAT $opts -u - $KEYW-SENDTO:$tsa,$SCM_ENABLE"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
# is this option supported? # is this option supported?
@ -10641,6 +10662,7 @@ kill "$pid0" 2>/dev/null; wait
# do not show more messages than requested # do not show more messages than requested
if [ "$SCM_VALUE" = "timestamp" ]; then if [ "$SCM_VALUE" = "timestamp" ]; then
SCM_VALUE="$(date '+%a %b %e %H:%M:.. %Y'), ...... usecs" SCM_VALUE="$(date '+%a %b %e %H:%M:.. %Y'), ...... usecs"
#echo "\"$SCM_VALUE\"" >&2 # debugging
fi fi
if [ "$rc1" -ne 0 ]; then if [ "$rc1" -ne 0 ]; then
$PRINTF "$NO_RESULT: $SOCAT:\n" $PRINTF "$NO_RESULT: $SOCAT:\n"
@ -10652,9 +10674,9 @@ if [ "$rc1" -ne 0 ]; then
listCANT="$listCANT $N" listCANT="$listCANT $N"
#elif ! egrep "^export SOCAT_$SCM_ENVNAME=[\"']?$SCM_VALUE[\"']?\$" ${tf} >/dev/null; then #elif ! egrep "^export SOCAT_$SCM_ENVNAME=[\"']?$SCM_VALUE[\"']?\$" ${tf} >/dev/null; then
#elif ! eval echo "$TRACE $SOCAT_\$SCM_VALUE" |diff - "${tf}" >/dev/null; then #elif ! eval echo "$TRACE $SOCAT_\$SCM_VALUE" |diff - "${tf}" >/dev/null; then
elif ! expr "$(cat "$tf")" : "$(eval echo "\$SCM_VALUE")\$" >/dev/null; then elif ! expr "$(cat "$tf")" : "$SCM_VALUE\$" >/dev/null; then
$PRINTF "$FAILED\n" $PRINTF "$FAILED\n"
echo "logged value \"$(cat "$tf")\" instead of \"$(eval echo "\$SCM_VALUE")\"" echo "logged value \"$(cat "$tf")\" instead of $SCM_VALUE"
echo "$CMD0 &" echo "$CMD0 &"
echo "$CMD1" echo "$CMD1"
cat "${te}0" cat "${te}0"
@ -11517,7 +11539,8 @@ N=$((N+1))
if type openssl >/dev/null 2>&1; then if type openssl >/dev/null 2>&1; then
OPENSSL_METHOD=$(openssl s_client -help 2>&1 |egrep -o -e '-tls1(_[012])?' |sort |tail -n 1) OPENSSL_METHOD=$(openssl s_client -help 2>&1 |egrep -e '-tls1_[012]' |sed -e 's/.*\(-tls1_[012]\).*/\1/' |sort |tail -n 1)
#OPENSSL_METHOD=$(openssl s_client -help 2>&1 |egrep -o -e '-tls1(_[012])?' |sort |tail -n 1)
[ -z "$OPENSSL_METHOD" ] && OPENSSL_METHOD="-tls1" # just so [ -z "$OPENSSL_METHOD" ] && OPENSSL_METHOD="-tls1" # just so
fi fi
@ -12140,7 +12163,7 @@ UDP6 UDP [::1] PORT shut-null
# problem reported by Johan Thillemann # problem reported by Johan Thillemann
NAME=READLINE_OVFL NAME=READLINE_OVFL
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%security%*|*%readline%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%security%*|*%readline%*|*%pty%*|*%$NAME%*)
TEST="$NAME: test for buffer overflow in readline prompt handling" TEST="$NAME: test for buffer overflow in readline prompt handling"
# address 1 is the readline where write data was handled erroneous # address 1 is the readline where write data was handled erroneous
# address 2 provides data to trigger the buffer overflow # address 2 provides data to trigger the buffer overflow
@ -12199,8 +12222,12 @@ tdiff="$td/test$N.diff"
da="test$N $(date) $RANDOM" da="test$N $(date) $RANDOM"
RLIMIT_NOFILE="$(ulimit -n)" RLIMIT_NOFILE="$(ulimit -n)"
if ! [[ "$RLIMIT_NOFILE" =~ ^[0-9][0-9]*$ ]]; then if ! [[ "$RLIMIT_NOFILE" =~ ^[0-9][0-9]*$ ]]; then
$PRINTF "${YELLOW}cannot determine ulimit -n" $PRINTF "${YELLOW}cannot determine ulimit -n${NORMAL}"
else else
if [ $RLIMIT_NOFILE -gt 1024 ]; then
ulimit -n 1024 # 65536 takes too long
RLIMIT_NOFILE="$(ulimit -n)"
fi
CMD0="$TRACE $SOCAT $opts TCP-LISTEN:$PORT,$REUSEADDR,range=$LOCALHOST:255.255.255.255 PIPE" CMD0="$TRACE $SOCAT $opts TCP-LISTEN:$PORT,$REUSEADDR,range=$LOCALHOST:255.255.255.255 PIPE"
CMD1="$TRACE $SOCAT $opts -t 0 /dev/null TCP:$SECONDADDR:$PORT,bind=$SECONDADDR" CMD1="$TRACE $SOCAT $opts -t 0 /dev/null TCP:$SECONDADDR:$PORT,bind=$SECONDADDR"
CMD2="$TRACE $SOCAT $opts - TCP:$LOCALHOST:$PORT,bind=$LOCALHOST" CMD2="$TRACE $SOCAT $opts - TCP:$LOCALHOST:$PORT,bind=$LOCALHOST"
@ -12572,7 +12599,7 @@ if [ "$fileopt" = "." ]; then fileopt=; fi
if [ "$addropts" = "." ]; then addropts=; fi if [ "$addropts" = "." ]; then addropts=; fi
NAME=${ADDR_}_UMASK NAME=${ADDR_}_UMASK
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%proto%*|*%socket%*|*%$proto%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%proto%*|*%socket%*|*%$proto%*|*%umask%*|*%$NAME%*)
TEST="$NAME: $ADDR applies option umask" TEST="$NAME: $ADDR applies option umask"
# start a socat process with passive/listening file system entry. Check the # start a socat process with passive/listening file system entry. Check the
# permissions of the FS entry, then terminate the process. # permissions of the FS entry, then terminate the process.
@ -12634,18 +12661,17 @@ pipe . . file -u FILE:/dev/null
# tests: option perm with "passive" NAMED group addresses # tests: option perm with "passive" NAMED group addresses
while read addr fileopt addropts proto diropt; do while read addr fileopt addropts feat waitfor diropt; do
if [ -z "$addr" ] || [[ "$addr" == \#* ]]; then continue; fi if [ -z "$addr" ] || [[ "$addr" == \#* ]]; then continue; fi
# test if passive (listening...) filesystem based addresses implement option perm # test if passive (listening...) filesystem based addresses implement option perm
ADDR=$(toupper $addr) ADDR=$(toupper $addr)
ADDR_=${ADDR/-/_} ADDR_=${ADDR/-/_}
PROTO=$(toupper $proto)
if [ "$diropt" = "." ]; then diropt=; fi if [ "$diropt" = "." ]; then diropt=; fi
if [ "$fileopt" = "." ]; then fileopt=; fi if [ "$fileopt" = "." ]; then fileopt=; fi
if [ "$addropts" = "." ]; then addropts=; fi if [ "$addropts" = "." ]; then addropts=; fi
NAME=${ADDR_}_PERM NAME=${ADDR_}_PERM
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%proto%*|*%socket%*|*%$proto%*|*%ignoreeof%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%socket%*|*%$feat%*|*%ignoreeof%*|*%perm%*|*%$NAME%*)
TEST="$NAME: $ADDR applies option perm" TEST="$NAME: $ADDR applies option perm"
# start a socat process with passive/listening file system entry. Check the # start a socat process with passive/listening file system entry. Check the
# permissions of the FS entry, then terminate the process. # permissions of the FS entry, then terminate the process.
@ -12663,7 +12689,7 @@ fi
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
$CMD0 >/dev/null 2>"$te0" & $CMD0 >/dev/null 2>"$te0" &
pid0=$! pid0=$!
wait${proto} $tsock 1 2>"$tlog" wait${waitfor} $tsock 1 2>"$tlog"
ERRNOENT=; if ! [ -e "$tsock" ]; then ERRNOENT=1; fi ERRNOENT=; if ! [ -e "$tsock" ]; then ERRNOENT=1; fi
perms=$(fileperms "$tsock") perms=$(fileperms "$tsock")
kill $pid0 2>>"$tlog" kill $pid0 2>>"$tlog"
@ -12693,31 +12719,30 @@ PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
# #
done <<<" done <<<"
# address fileopt addropts waitfor direction # address fileopt addropts feat waitfor direction
create . . file -U create . . file file -U
open . creat file . open . creat file file .
gopen . creat file . gopen . creat file file .
unix-listen . . unixport . unix-listen . . unix unixport .
unix-recvfrom . . unixport . unix-recvfrom . . unix unixport .
unix-recv . . unixport -u unix-recv . . unix unixport -u
pipe . . file -u pipe . . pipe file -u
pty link . file . pty link . pty file .
" "
# tests: option user with "passive" NAMED group addresses # tests: option user with "passive" NAMED group addresses
while read addr fileopt addropts proto diropt; do while read addr fileopt addropts feat waitfor diropt; do
if [ -z "$addr" ] || [[ "$addr" == \#* ]]; then continue; fi if [ -z "$addr" ] || [[ "$addr" == \#* ]]; then continue; fi
# test if passive (listening...) filesystem based addresses implement option user # test if passive (listening...) filesystem based addresses implement option user
ADDR=$(toupper $addr) ADDR=$(toupper $addr)
ADDR_=${ADDR/-/_} ADDR_=${ADDR/-/_}
PROTO=$(toupper $proto)
if [ "$diropt" = "." ]; then diropt=; fi if [ "$diropt" = "." ]; then diropt=; fi
if [ "$fileopt" = "." ]; then fileopt=; fi if [ "$fileopt" = "." ]; then fileopt=; fi
if [ "$addropts" = "." ]; then addropts=; fi if [ "$addropts" = "." ]; then addropts=; fi
NAME=${ADDR_}_USER NAME=${ADDR_}_USER
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%proto%*|*%socket%*|*%$proto%*|*%root%*|*%ignoreeof%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%socket%*|*%$feat%*|*%root%*|*%ignoreeof%*|*%$NAME%*)
TEST="$NAME: $ADDR applies option user" TEST="$NAME: $ADDR applies option user"
# start a socat process with passive/listening file system entry with user option. # start a socat process with passive/listening file system entry with user option.
# Check the owner of the FS entry, then terminate the process. # Check the owner of the FS entry, then terminate the process.
@ -12740,7 +12765,7 @@ fi
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
$CMD0 >/dev/null 2>"$te0" & $CMD0 >/dev/null 2>"$te0" &
pid0=$! pid0=$!
wait${proto} $tsock 1 2>"$tlog" wait${waitfor} $tsock 1 2>"$tlog"
ERRNOENT=; if ! [ -e "$tsock" ]; then ERRNOENT=1; fi ERRNOENT=; if ! [ -e "$tsock" ]; then ERRNOENT=1; fi
user=$(fileuser "$tsock") user=$(fileuser "$tsock")
kill $pid0 2>>"$tlog" kill $pid0 2>>"$tlog"
@ -12770,34 +12795,33 @@ PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
# #
done <<<" done <<<"
# address fileopt addropts waitfor direction # address fileopt addropts feat waitfor direction
create . . file -U create . . file file -U
open . creat file . open . creat file file .
gopen . creat file . gopen . creat file file .
unix-listen . . unixport . unix-listen . . unix unixport .
unix-recvfrom . . unixport . unix-recvfrom . . unix unixport .
unix-recv . . unixport -u unix-recv . . unix unixport -u
pipe . . file -u pipe . . pipe file -u
pty link . file . pty link . pty file .
" "
# tests: is "passive" filesystem entry removed at the end? (without fork) # tests: is "passive" filesystem entry removed at the end? (without fork)
while read addr fileopt addropts proto diropt crit ADDR2; do while read addr fileopt addropts feat waitfor diropt crit ADDR2; do
if [ -z "$addr" ] || [[ "$addr" == \#* ]]; then continue; fi if [ -z "$addr" ] || [[ "$addr" == \#* ]]; then continue; fi
# some passive (listening...) filesystem based addresses did not remove the file # some passive (listening...) filesystem based addresses did not remove the file
# system entry at the end # system entry at the end
ADDR=$(toupper $addr) ADDR=$(toupper $addr)
ADDR_=${ADDR/-/_} ADDR_=${ADDR/-/_}
PROTO=$(toupper $proto)
if [ "$diropt" = "." ]; then diropt=; fi if [ "$diropt" = "." ]; then diropt=; fi
if [ "$fileopt" = "." ]; then fileopt=; fi if [ "$fileopt" = "." ]; then fileopt=; fi
if [ "$addropts" = "." ]; then addropts=; fi if [ "$addropts" = "." ]; then addropts=; fi
# $ADDR removes the file system entry when the process is terminated # $ADDR removes the file system entry when the process is terminated
NAME=${ADDR_}_REMOVE NAME=${ADDR_}_REMOVE
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%unix%*|*%socket%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%feat%*|*%socket%*|*%$NAME%*)
TEST="$NAME: $ADDR removes socket entry when terminated during accept" TEST="$NAME: $ADDR removes socket entry when terminated while waiting for connection"
# start a socat process with listening unix domain socket etc. Terminate the # start a socat process with listening unix domain socket etc. Terminate the
# process and check if the file system socket entry still exists. # process and check if the file system socket entry still exists.
# Test succeeds when entry does not exist. # Test succeeds when entry does not exist.
@ -12813,7 +12837,7 @@ fi
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
$CMD0 >/dev/null 2>"$te0" & $CMD0 >/dev/null 2>"$te0" &
pid0=$! pid0=$!
wait${proto} "$crit" $tsock 1 2>"$tlog" wait${waitfor} "$crit" $tsock 1 2>"$tlog"
kill $pid0 2>>"$tlog" kill $pid0 2>>"$tlog"
rc1=$? rc1=$?
wait >>"$tlog" wait >>"$tlog"
@ -12842,12 +12866,12 @@ PORT=$((PORT+1))
N=$((N+1)) N=$((N+1))
# #
done <<<" done <<<"
# address fileopt addropts waitfor direction crit ADDR2 # address fileopt addropts feat waitfor direction crit ADDR2
unix-listen . . unixport . -e FILE:/dev/null unix-listen . . unix unixport . -e FILE:/dev/null
unix-recvfrom . . unixport . -e FILE:/dev/null unix-recvfrom . . unix unixport . -e FILE:/dev/null
unix-recv . . unixport -u -e FILE:/dev/null unix-recv . . unix unixport -u -e FILE:/dev/null
pipe . . file -u -e FILE:/dev/null pipe . . pipe file -u -e FILE:/dev/null
pty link . file . -L PIPE pty link . pty file . -L PIPE
" "
@ -13074,11 +13098,13 @@ if [ $w0 -eq 0 ]; then
rc1=$? rc1=$?
kill $pid0 2>/dev/null; wait kill $pid0 2>/dev/null; wait
fi fi
if [ $w0 -eq 0 ] && echo "$da" |diff - "${tf}1"; then 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" $PRINTF "${YELLOW}WARN${NORMAL} (obsolete method succeeds)\n"
numOK=$((numOK+1)) numOK=$((numOK+1))
else else
$PRINTF "$OK (obsolete method fails)\n" $PRINTF "$OK (obsolete method fails)\n"
cat "$tdiff"
numOK=$((numOK+1)) numOK=$((numOK+1))
fi fi
if [ "$VERBOSE" ]; then if [ "$VERBOSE" ]; then
@ -13140,7 +13166,7 @@ fi
echo "$da" |$CMD1 >"${tf}1" 2>"${te}1" echo "$da" |$CMD1 >"${tf}1" 2>"${te}1"
rc1=$? rc1=$?
kill $pid0 2>/dev/null; wait kill $pid0 2>/dev/null; wait
if echo "$da" |diff - "${tf}1"; then if echo "$da" |diff - "${tf}1" >"$tdiff"; then
$PRINTF "$OK\n" $PRINTF "$OK\n"
numOK=$((numOK+1)) numOK=$((numOK+1))
if [ "$VERBOSE" ]; then if [ "$VERBOSE" ]; then
@ -13150,9 +13176,10 @@ if echo "$da" |diff - "${tf}1"; then
else else
$PRINTF "$FAILED\n" $PRINTF "$FAILED\n"
echo "$CMD0 &" echo "$CMD0 &"
echo "$CMD1"
cat "${te}0" cat "${te}0"
echo "$CMD1"
cat "${te}1" cat "${te}1"
cat "$tdiff"
numFAIL=$((numFAIL+1)) numFAIL=$((numFAIL+1))
listFAIL="$listFAIL $N" listFAIL="$listFAIL $N"
#esac #esac
@ -13676,7 +13703,7 @@ N=$((N+1))
# termios options of the first address were applied to the second address. # termios options of the first address were applied to the second address.
NAME=TERMIOS_PH_ALL NAME=TERMIOS_PH_ALL
case "$TESTS" in case "$TESTS" in
*%$N%*|*%functions%*|*%bugs%*|*%termios%*|*%$NAME%*) *%$N%*|*%functions%*|*%bugs%*|*%pty%*|*%termios%*|*%$NAME%*)
TEST="$NAME: are termios options applied to the correct address" TEST="$NAME: are termios options applied to the correct address"
# add a termios option to the first address, a tty, and have a second address # add a termios option to the first address, a tty, and have a second address
# with pipe. If no error occurs the termios option was not applied to the pipe, # with pipe. If no error occurs the termios option was not applied to the pipe,
@ -13925,7 +13952,8 @@ CMD="$TRACE $SOCAT $opts - $tf,o-direct,ignoreeof!!$tf"
echo "$da" |$CMD >"$to" 2>"$te" echo "$da" |$CMD >"$to" 2>"$te"
rc=$? rc=$?
if [ $rc -ne 0 ] && grep -q "Invalid argument" "$te" && [ $UNAME = Linux ]; then if [ $rc -ne 0 ] && grep -q "Invalid argument" "$te" && [ $UNAME = Linux ]; then
case $(stat -f $tf |grep -o "Type: [^[:space:]]*" |cut -c 7-) in case $(stat -f $tf |grep "Type: [^[:space:]]*" |sed -e 's/.*\(Type: [^[:space:]]*\).*/\1/' |cut -c 7-) in
#case $(stat -f $tf |grep -o "Type: [^[:space:]]*" |cut -c 7-) in
ext2/ext3|xfs|reiserfs) ext2/ext3|xfs|reiserfs)
$PRINTF "${FAILED}\n" $PRINTF "${FAILED}\n"
echo "$CMD" >&2 echo "$CMD" >&2
@ -14078,7 +14106,7 @@ tdiff="$td/test$N.diff"
da="test$N $(date) $RANDOM" da="test$N $(date) $RANDOM"
init_openssl_s_server init_openssl_s_server
CMD1="$TRACE openssl s_server $OPENSSL_S_SERVER_4 $OPENSSL_S_SERVER_DTLS -accept $PORT -quiet $OPENSSL_S_SERVER_NO_IGN_EOF -cert testsrv.pem" CMD1="$TRACE openssl s_server $OPENSSL_S_SERVER_4 $OPENSSL_S_SERVER_DTLS -accept $PORT -quiet $OPENSSL_S_SERVER_NO_IGN_EOF -cert testsrv.pem"
CMD="$TRACE $SOCAT $opts -T 1 - OPENSSL-DTLS-CLIENT:$LOCALHOST:$PORT,pf=ip4,verify=0,$SOCAT_EGD" CMD="$TRACE $SOCAT $opts -T 3 - OPENSSL-DTLS-CLIENT:$LOCALHOST:$PORT,pf=ip4,verify=0,$SOCAT_EGD"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
( sleep 2; echo "$da"; sleep 1 ) |$CMD1 2>"${te}1" & ( sleep 2; echo "$da"; sleep 1 ) |$CMD1 2>"${te}1" &
pid1=$! # background process id pid1=$! # background process id
@ -14146,7 +14174,7 @@ printf "test $F_n $TEST... " $N
$CMD1 >/dev/null 2>"${te}1" & $CMD1 >/dev/null 2>"${te}1" &
pid1=$! pid1=$!
waitudp4port $PORT 1 waitudp4port $PORT 1
( echo "$da"; sleep 0.1 ) |$CMD 2>"$te" |grep "$da" >"$tf" ( echo "$da"; psleep 0.1 ) |$CMD 2>"$te" |grep "$da" >"$tf"
rc=$? rc=$?
kill $pid1 2>/dev/null; wait kill $pid1 2>/dev/null; wait
if echo "$da" |diff - $tf >"$tdiff"; then if echo "$da" |diff - $tf >"$tdiff"; then
@ -14544,7 +14572,7 @@ pid0=$!
waitudp4port $PORT 1 waitudp4port $PORT 1
echo "$da" |$CMD1 >"${tf}1" 2>"${te}1" echo "$da" |$CMD1 >"${tf}1" 2>"${te}1"
rc1=$? rc1=$?
sleep 0.1 psleep 0.1
kill $pid0 2>/dev/null; wait kill $pid0 2>/dev/null; wait
if [ -f ${tf}0 ] && echo "$da" |diff - ${tf}0 >$tdiff; then if [ -f ${tf}0 ] && echo "$da" |diff - ${tf}0 >$tdiff; then
$PRINTF "$OK\n" $PRINTF "$OK\n"
@ -14868,7 +14896,7 @@ da="test$N $(date) $RANDOM"
CMD0="$TRACE $SOCAT $opts -u OPENSSL-DTLS-LISTEN:$PORT,cert=testsrv.pem,verify=0 CREAT:$to" CMD0="$TRACE $SOCAT $opts -u OPENSSL-DTLS-LISTEN:$PORT,cert=testsrv.pem,verify=0 CREAT:$to"
CMD1="$TRACE $SOCAT $opts -u OPEN:$ti OPENSSL-DTLS-CONNECT:$LOCALHOST:$PORT,cafile=testsrv.crt" CMD1="$TRACE $SOCAT $opts -u OPEN:$ti OPENSSL-DTLS-CONNECT:$LOCALHOST:$PORT,cafile=testsrv.crt"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
i=0; while [ $i -lt 100000 ]; do printf "%9u %9u %9u %9u %9u %9u %9u %9u %9u %9u\n" $i $i $i $i $i $i $i $i $i $i; let i+=100; done >$ti i=0; while [ $i -lt $((2*8192)) ]; do printf "%9u %9u %9u %9u %9u %9u %9u %9u %9u %9u\n" $i $i $i $i $i $i $i $i $i $i; let i+=100; done >$ti
$CMD0 >/dev/null 2>"${te}0" & $CMD0 >/dev/null 2>"${te}0" &
pid0=$! pid0=$!
waitudp4port $PORT 1 waitudp4port $PORT 1
@ -14942,7 +14970,7 @@ da="test$N $(date) $RANDOM"
CMD0="$TRACE $SOCAT $opts -U OPENSSL-DTLS-LISTEN:$PORT,cert=testsrv.pem,verify=0 OPEN:$ti" CMD0="$TRACE $SOCAT $opts -U OPENSSL-DTLS-LISTEN:$PORT,cert=testsrv.pem,verify=0 OPEN:$ti"
CMD1="$TRACE $SOCAT $opts -u OPENSSL-DTLS-CONNECT:$LOCALHOST:$PORT,cafile=testsrv.crt CREAT:$to" CMD1="$TRACE $SOCAT $opts -u OPENSSL-DTLS-CONNECT:$LOCALHOST:$PORT,cafile=testsrv.crt CREAT:$to"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
i=0; while [ $i -lt 100000 ]; do printf "%9u %9u %9u %9u %9u %9u %9u %9u %9u %9u\n" $i $i $i $i $i $i $i $i $i $i; let i+=100; done >$ti i=0; while [ $i -lt $((2*8192)) ]; do printf "%9u %9u %9u %9u %9u %9u %9u %9u %9u %9u\n" $i $i $i $i $i $i $i $i $i $i; let i+=100; done >$ti
$CMD0 >/dev/null 2>"${te}0" & $CMD0 >/dev/null 2>"${te}0" &
pid0=$! pid0=$!
waitudp4port $PORT 1 waitudp4port $PORT 1
@ -15016,7 +15044,7 @@ pid0=$!
waittcp4port $PORT 1 waittcp4port $PORT 1
$CMD1 >"${tf}1" 2>"${te}1" $CMD1 >"${tf}1" 2>"${te}1"
rc1=$? rc1=$?
sleep 0.5 psleep 0.5
kill $pid0 2>/dev/null; wait kill $pid0 2>/dev/null; wait
if [ $rc1 -ne 0 ]; then if [ $rc1 -ne 0 ]; then
$PRINTF "$CANT\n" $PRINTF "$CANT\n"