diff --git a/CHANGES b/CHANGES index cf9a110..a03f5cc 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,10 @@ Corrections: filan -s displayed "(stream)" instead of "tcp" with addresses (regression). + Fixed a bug that made ignoreeof fail in 1.8.0.0 and 1.8.0.1; + corrected test IGNOREEOF. + Thanks to Rusty Bird for the precise problem report. + Building: Disabling certain features during configure could break build process. diff --git a/socat.c b/socat.c index cf1685d..6ffbd21 100644 --- a/socat.c +++ b/socat.c @@ -1013,7 +1013,7 @@ int _socat(void) { /* for ignoreeof */ if (polling) { if (!wasaction) { - if (socat_opts.total_timeout.tv_usec <= 1000000) { + if (socat_opts.total_timeout.tv_usec < 1000000) { if (total_timeout.tv_usec < socat_opts.pollintv.tv_usec) { total_timeout.tv_usec += 1000000; total_timeout.tv_sec -= 1; diff --git a/test.sh b/test.sh index bd8ea14..1357f1d 100755 --- a/test.sh +++ b/test.sh @@ -3521,67 +3521,110 @@ esac N=$((N+1)) +# Test the ignoreeof option in forward (left to right) direction NAME=IGNOREEOF case "$TESTS" in *%$N%*|*%functions%*|*%engine%*|*%ignoreeof%*|*%$NAME%*) TEST="$NAME: ignoreeof on file" -if ! eval $NUMCOND; then :; else +# Let Socat read from an empty file, this would terminate immediately due to +# EOF. Wait for more than one second, then append data to the file; when Socat +# transfers this data the test succeeded. +if ! eval $NUMCOND; then :; +elif ! cond=$(checkconds \ + "" \ + "" \ + "" \ + "STDIO FILE" \ + "STDOUT FILE" \ + "ignoreeof" \ + "" ); then + $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N + numCANT=$((numCANT+1)) + listCANT="$listCANT $N" +else ti="$td/test$N.file" tf="$td/test$N.stdout" te="$td/test$N.stderr" tdiff="$td/test$N.diff" da="test$N $(date) $RANDOM" -CMD="$TRACE $SOCAT $opts -u file:\"$ti\",ignoreeof -" +# Note: the bug in 1.8.0.0 and 1.8.0.1 let Socat terminate in unidirectional +# mode after 1s, in bidirectional mode with traffic in reverse direction +# (var wasaction) immediately +CMD="$TRACE $SOCAT $opts -u FILE:\"$ti\",ignoreeof -" printf "test $F_n $TEST... " $N touch "$ti" $CMD >"$tf" 2>"$te" & bg=$! -sleep 0.1 +# Up to 1.8.0.1 this sleep was 0.1 and thus the test said OK despite the bug +sleep 1.1 echo "$da" >>"$ti" sleep 1 kill $bg 2>/dev/null; wait if ! echo "$da" |diff - "$tf" >"$tdiff"; then - $PRINTF "$FAILED: diff:\n" - cat "$tdiff" + $PRINTF "$FAILED (diff)\n" + echo "$CMD" + cat "$te" >&2 + echo "// diff:" >&2 + cat "$tdiff" >&2 failed else - $PRINTF "$OK\n" - if [ -n "$debug" ]; then cat $te; fi - ok + $PRINTF "$OK\n" + if [ -n "$VERBOSE" ]; then echo "$CMD"; fi + if [ -n "$DEBUG" ]; then cat "$te" >&2; fi + ok fi fi ;; # NUMCOND esac N=$((N+1)) +# Test the ignoreeof option in reverse (right to left) direction NAME=IGNOREEOF_REV case "$TESTS" in *%$N%*|*%functions%*|*%engine%*|*%ignoreeof%*|*%$NAME%*) TEST="$NAME: ignoreeof on file right-to-left" -if ! eval $NUMCOND; then :; else +if ! eval $NUMCOND; then :; +elif ! cond=$(checkconds \ + "" \ + "" \ + "" \ + "STDIO FILE" \ + "STDOUT FILE" \ + "ignoreeof" \ + "" ); then + $PRINTF "test $F_n $TEST... ${YELLOW}$cond${NORMAL}\n" $N + numCANT=$((numCANT+1)) + listCANT="$listCANT $N" +else +# Let Socat read from an empty file, this would terminate immediately due to +# EOF. Wait for more than one second, then append data to the file; when Socat +# transfers this data the test succeeded. ti="$td/test$N.file" tf="$td/test$N.stdout" te="$td/test$N.stderr" tdiff="$td/test$N.diff" da="test$N $(date) $RANDOM" -CMD="$SOCAT $opts -U - file:\"$ti\",ignoreeof" +CMD="$SOCAT $opts -U - FILE:\"$ti\",ignoreeof" printf "test $F_n $TEST... " $N touch "$ti" $CMD >"$tf" 2>"$te" & bg=$! -relsleep 1 +sleep 1.1 echo "$da" >>"$ti" sleep 1 -kill $bg 2>/dev/null +kill $bg 2>/dev/null; wait if ! echo "$da" |diff - "$tf" >"$tdiff"; then - $PRINTF "$FAILED: diff:\n" - cat "$tdiff" + $PRINTF "$FAILED (diff)\n" + echo "$CMD" + cat "$te" >&2 + echo "// diff:" >&2 + cat "$tdiff" >&2 failed else - $PRINTF "$OK\n" - if [ -n "$debug" ]; then cat $te; fi - ok + $PRINTF "$OK\n" + if [ -n "$VERBOSE" ]; then echo "$CMD"; fi + if [ -n "$DEBUG" ]; then cat "$te" >&2; fi + ok fi -wait fi ;; # NUMCOND esac N=$((N+1)) @@ -3601,12 +3644,13 @@ $CMD >"$tf" 2>"$te" if [ -s "$te" ]; then $PRINTF "$FAILED: $TRACE $SOCAT:\n" echo "$CMD" - cat "$te" + cat "$te" >&2 failed else - $PRINTF "$OK\n" - if [ -n "$debug" ]; then cat $te; fi - ok + $PRINTF "$OK\n" + if [ -n "$VERBOSE" ]; then echo "$CMD"; fi + if [ -n "$DEBUG" ]; then cat "$te" >&2; fi + ok fi fi ;; # NUMCOND esac