mirror of
https://repo.or.cz/socat.git
synced 2024-12-22 23:42:34 +00:00
some raw IP and UNIX datagram modes failed on BSD systems; test.sh: more stable timing, corrections for BSD
This commit is contained in:
parent
67e59494c4
commit
f8496421f9
7 changed files with 97 additions and 41 deletions
4
CHANGES
4
CHANGES
|
@ -1,5 +1,7 @@
|
||||||
|
|
||||||
corrections:
|
corrections:
|
||||||
|
some raw IP and UNIX datagram modes failed on BSD systems
|
||||||
|
|
||||||
when UDP-LISTEN continued to listen after packet dropped by, e.g.,
|
when UDP-LISTEN continued to listen after packet dropped by, e.g.,
|
||||||
range option, the old listen socket would not be closed but a new one
|
range option, the old listen socket would not be closed but a new one
|
||||||
created. open sockets could accumulate.
|
created. open sockets could accumulate.
|
||||||
|
@ -24,7 +26,7 @@ corrections:
|
||||||
|
|
||||||
some minor corrections
|
some minor corrections
|
||||||
|
|
||||||
improved test.sh script
|
improved test.sh script: more stable timing, corrections for BSD
|
||||||
|
|
||||||
replaced the select() calls by poll() to cleanly fix the problems with
|
replaced the select() calls by poll() to cleanly fix the problems with
|
||||||
many file descriptors already open
|
many file descriptors already open
|
||||||
|
|
|
@ -97,7 +97,7 @@ doc/socat.1: doc/socat.yo
|
||||||
yodl2man -o $@ $+
|
yodl2man -o $@ $+
|
||||||
|
|
||||||
doc/socat.html: doc/socat.yo
|
doc/socat.html: doc/socat.yo
|
||||||
yodl2html -o $@ $+
|
cd doc; yodl2html -o socat.html socat.yo; cd ..
|
||||||
|
|
||||||
progs: $(PROGS)
|
progs: $(PROGS)
|
||||||
|
|
||||||
|
|
4
socat.c
4
socat.c
|
@ -905,10 +905,10 @@ int _socat(void) {
|
||||||
(fd2in->revents&(POLLIN|POLLHUP|POLLERR))) {
|
(fd2in->revents&(POLLIN|POLLHUP|POLLERR))) {
|
||||||
mayrd2 = true;
|
mayrd2 = true;
|
||||||
}
|
}
|
||||||
if (XIO_GETWRFD(sock1) >= 0 && (fd1out->revents&(POLLOUT|POLLERR))) {
|
if (XIO_GETWRFD(sock1) >= 0 && (fd1out->revents&(POLLOUT|POLLHUP|POLLERR))) {
|
||||||
maywr1 = true;
|
maywr1 = true;
|
||||||
}
|
}
|
||||||
if (XIO_GETWRFD(sock2) >= 0 && (fd2out->revents&(POLLOUT|POLLERR))) {
|
if (XIO_GETWRFD(sock2) >= 0 && (fd2out->revents&(POLLOUT|POLLHUP|POLLERR))) {
|
||||||
maywr2 = true;
|
maywr2 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
113
test.sh
113
test.sh
|
@ -11,6 +11,30 @@
|
||||||
|
|
||||||
#set -vx
|
#set -vx
|
||||||
|
|
||||||
|
val_t=0.1
|
||||||
|
while [ "$1" ]; do
|
||||||
|
case "X$1" in
|
||||||
|
X-t?*) val_t="${1#-t}" ;;
|
||||||
|
X-t) shift; val_t="$1" ;;
|
||||||
|
*) break;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
opt_t="-t $val_t"
|
||||||
|
|
||||||
|
#MICROS=100000
|
||||||
|
case "X$val_t" in
|
||||||
|
X*.???????*) S="${val_t%.*}"; uS="${val_t#*.}"; uS="${uS:0:6}" ;;
|
||||||
|
X*.*) S="${val_t%.*}"; uS="${val_t#*.}"; uS="${uS}000000"; uS="${uS:0:6}" ;;
|
||||||
|
X*) S="${val_t}"; uS="000000" ;;
|
||||||
|
esac
|
||||||
|
MICROS=${S}${uS}
|
||||||
|
MICROS=${MICROS##0000}; MICROS=${MICROS##00}; MICROS=${MICROS##0}
|
||||||
|
#
|
||||||
|
_MICROS=$((MICROS+999999)); SECONDs="${_MICROS%??????}"
|
||||||
|
[ -z "$SECONDs" ] && SECONDs=0
|
||||||
|
|
||||||
withroot=0 # perform privileged tests even if not run by root
|
withroot=0 # perform privileged tests even if not run by root
|
||||||
#PATH=$PATH:/opt/freeware/bin
|
#PATH=$PATH:/opt/freeware/bin
|
||||||
#PATH=$PATH:/usr/local/ssl/bin
|
#PATH=$PATH:/usr/local/ssl/bin
|
||||||
|
@ -20,7 +44,7 @@ MISCDELAY=1
|
||||||
[ -z "$SOCAT" ] && SOCAT="./socat"
|
[ -z "$SOCAT" ] && SOCAT="./socat"
|
||||||
[ -z "$PROCAN" ] && PROCAN="./procan"
|
[ -z "$PROCAN" ] && PROCAN="./procan"
|
||||||
[ -z "$FILAN" ] && FILAN="./filan"
|
[ -z "$FILAN" ] && FILAN="./filan"
|
||||||
opts="-t0.1 $OPTS"
|
opts="$opt_t $OPTS"
|
||||||
export SOCAT_OPTS="$opts"
|
export SOCAT_OPTS="$opts"
|
||||||
#debug="1"
|
#debug="1"
|
||||||
debug=
|
debug=
|
||||||
|
@ -31,18 +55,26 @@ MCINTERFACE=lo # !!! Linux only
|
||||||
#LOCALHOST=localhost
|
#LOCALHOST=localhost
|
||||||
LOCALHOST=127.0.0.1
|
LOCALHOST=127.0.0.1
|
||||||
LOCALHOST6=[::1]
|
LOCALHOST6=[::1]
|
||||||
PROTO=$((192+RANDOM/1024))
|
PROTO=$((144+RANDOM/2048))
|
||||||
PORT=12002
|
PORT=12002
|
||||||
SOURCEPORT=2002
|
SOURCEPORT=2002
|
||||||
CAT=cat
|
CAT=cat
|
||||||
OD_C="od -c"
|
OD_C="od -c"
|
||||||
|
# precision sleep; takes seconds with fractional part
|
||||||
|
psleep () {
|
||||||
|
local T="$1"
|
||||||
|
[ "$T" = 0 ] && T=0.000002
|
||||||
|
$SOCAT -T "$T" pipe pipe
|
||||||
|
}
|
||||||
# time in microseconds to wait in some situations
|
# time in microseconds to wait in some situations
|
||||||
MICROS=100000
|
|
||||||
if ! type usleep >/dev/null 2>&1; then
|
if ! type usleep >/dev/null 2>&1; then
|
||||||
usleep () {
|
usleep () {
|
||||||
local n="$1"
|
local n="$1"
|
||||||
# older bashes do not accept $1 here:
|
case "$n" in
|
||||||
sleep $(((n+999999)/1000000))
|
*???????) S="${n%??????}"; uS="${n:${#n}-6}" ;;
|
||||||
|
*) S=0; uS="00000$n"; uS="${uS:${#uS}-6}" ;;
|
||||||
|
esac
|
||||||
|
$SOCAT -T $S.$uS pipe pipe
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
#USLEEP=usleep
|
#USLEEP=usleep
|
||||||
|
@ -94,7 +126,7 @@ Linux)
|
||||||
BCADDR=127.255.255.255
|
BCADDR=127.255.255.255
|
||||||
BCIFADDR=$($IFCONFIG $BROADCASTIF |grep 'inet ' |awk '{print($2);}' |cut -d: -f2) ;;
|
BCIFADDR=$($IFCONFIG $BROADCASTIF |grep 'inet ' |awk '{print($2);}' |cut -d: -f2) ;;
|
||||||
FreeBSD|NetBSD|OpenBSD)
|
FreeBSD|NetBSD|OpenBSD)
|
||||||
MAINIF=$($IFCONFIG -a |grep '^[a-z]' |head -1 |cut -d: -f1)
|
MAINIF=$($IFCONFIG -a |grep '^[a-z]' |grep -v '^lo0: ' |head -1 |cut -d: -f1)
|
||||||
BROADCASTIF="$MAINIF"
|
BROADCASTIF="$MAINIF"
|
||||||
SECONDADDR=$($IFCONFIG $BROADCASTIF |grep 'inet ' |awk '{print($2);}')
|
SECONDADDR=$($IFCONFIG $BROADCASTIF |grep 'inet ' |awk '{print($2);}')
|
||||||
BCIFADDR="$SECONDADDR"
|
BCIFADDR="$SECONDADDR"
|
||||||
|
@ -105,8 +137,10 @@ HP-UX)
|
||||||
SECONDADDR=$($IFCONFIG $MAINIF |tail -n 1 |awk '{print($2);}')
|
SECONDADDR=$($IFCONFIG $MAINIF |tail -n 1 |awk '{print($2);}')
|
||||||
BCADDR=$($IFCONFIG $BROADCASTIF |grep 'broadcast ' |sed 's/.*broadcast/broadcast/' |awk '{print($2);}') ;;
|
BCADDR=$($IFCONFIG $BROADCASTIF |grep 'broadcast ' |sed 's/.*broadcast/broadcast/' |awk '{print($2);}') ;;
|
||||||
SunOS)
|
SunOS)
|
||||||
|
MAINIF=$($IFCONFIG -a |grep '^[a-z]' |grep -v '^lo0: ' |head -1 |cut -d: -f1)
|
||||||
|
BROADCASTIF="$MAINIF"
|
||||||
#BROADCASTIF=hme0
|
#BROADCASTIF=hme0
|
||||||
BROADCASTIF=eri0
|
#BROADCASTIF=eri0
|
||||||
SECONDADDR=$($IFCONFIG $BROADCASTIF |grep 'inet ' |awk '{print($2);}')
|
SECONDADDR=$($IFCONFIG $BROADCASTIF |grep 'inet ' |awk '{print($2);}')
|
||||||
BCIFADDR="$SECONDADDR"
|
BCIFADDR="$SECONDADDR"
|
||||||
BCADDR=$($IFCONFIG $BROADCASTIF |grep 'broadcast ' |sed 's/.*broadcast/broadcast/' |awk '{print($2);}') ;;
|
BCADDR=$($IFCONFIG $BROADCASTIF |grep 'broadcast ' |sed 's/.*broadcast/broadcast/' |awk '{print($2);}') ;;
|
||||||
|
@ -123,9 +157,12 @@ case "$UNAME" in
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if [ -z "$SECONDIP6ADDR" ]; then
|
if [ -z "$SECONDIP6ADDR" ]; then
|
||||||
case "$TESTS" in
|
# case "$TESTS" in
|
||||||
*%root2%*) $IFCONFIG eth0 ::2/128
|
# *%root2%*) $IFCONFIG eth0 ::2/128
|
||||||
esac
|
# esac
|
||||||
|
SECONDIP6ADDR="$LOCALHOST6"
|
||||||
|
else
|
||||||
|
SECONDIP6ADDR="[$SECONDIP6ADDR]"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TRUE=$(which true)
|
TRUE=$(which true)
|
||||||
|
@ -147,7 +184,7 @@ vt100|vt320|linux|xterm|cons25|dtterm|aixterm|sun-color)
|
||||||
RED="\0033[31m"
|
RED="\0033[31m"
|
||||||
GREEN="\0033[32m"
|
GREEN="\0033[32m"
|
||||||
YELLOW="\0033[33m"
|
YELLOW="\0033[33m"
|
||||||
if [ "$UNAME" = SunOS ]; then
|
if false && [ "$UNAME" = SunOS ]; then
|
||||||
NORMAL="\0033[30m"
|
NORMAL="\0033[30m"
|
||||||
else
|
else
|
||||||
NORMAL="\0033[39m"
|
NORMAL="\0033[39m"
|
||||||
|
@ -156,7 +193,7 @@ vt100|vt320|linux|xterm|cons25|dtterm|aixterm|sun-color)
|
||||||
RED="\033[31m"
|
RED="\033[31m"
|
||||||
GREEN="\033[32m"
|
GREEN="\033[32m"
|
||||||
YELLOW="\033[33m"
|
YELLOW="\033[33m"
|
||||||
if [ "$UNAME" = SunOS ]; then
|
if false && [ "$UNAME" = SunOS ]; then
|
||||||
NORMAL="\033[30m"
|
NORMAL="\033[30m"
|
||||||
else
|
else
|
||||||
NORMAL="\033[39m"
|
NORMAL="\033[39m"
|
||||||
|
@ -1436,7 +1473,7 @@ testecho () {
|
||||||
#$ECHO "testing $title (test $N)... \c"
|
#$ECHO "testing $title (test $N)... \c"
|
||||||
$PRINTF "test $F_n %s... " $N "$title"
|
$PRINTF "test $F_n %s... " $N "$title"
|
||||||
#echo "$da" |$cmd >"$tf" 2>"$te"
|
#echo "$da" |$cmd >"$tf" 2>"$te"
|
||||||
(echo "$da"; sleep $T) |($SOCAT $opts "$arg1" "$arg2" >"$tf" 2>"$te"; echo $? >"$td/test$N.rc") &
|
(psleep $T; echo "$da"; psleep $T) |($SOCAT $opts "$arg1" "$arg2" >"$tf" 2>"$te"; echo $? >"$td/test$N.rc") &
|
||||||
export rc1=$!
|
export rc1=$!
|
||||||
#sleep 5 && kill $rc1 2>/dev/null &
|
#sleep 5 && kill $rc1 2>/dev/null &
|
||||||
# rc2=$!
|
# rc2=$!
|
||||||
|
@ -1476,7 +1513,7 @@ testod () {
|
||||||
local dain="$(date) $RANDOM"
|
local dain="$(date) $RANDOM"
|
||||||
local daout="$(echo "$dain" |$OD_C)"
|
local daout="$(echo "$dain" |$OD_C)"
|
||||||
$PRINTF "test $F_n %s... " $num "$title"
|
$PRINTF "test $F_n %s... " $num "$title"
|
||||||
(echo "$dain"; sleep $T) |$SOCAT $opts "$arg1" "$arg2" >"$tf" 2>"$te"
|
(psleep $T; echo "$dain"; psleep $T) |$SOCAT $opts "$arg1" "$arg2" >"$tf" 2>"$te"
|
||||||
if [ "$?" != 0 ]; then
|
if [ "$?" != 0 ]; then
|
||||||
$PRINTF "$FAILED: $SOCAT:\n"
|
$PRINTF "$FAILED: $SOCAT:\n"
|
||||||
echo "$SOCAT $opts $arg1 $arg2"
|
echo "$SOCAT $opts $arg1 $arg2"
|
||||||
|
@ -1537,6 +1574,8 @@ ifprocess () {
|
||||||
FreeBSD) l="$(ps -faje |grep "^........ $(printf %5u $1)")" ;;
|
FreeBSD) l="$(ps -faje |grep "^........ $(printf %5u $1)")" ;;
|
||||||
HP-UX) l="$(ps -fade |grep "^........ $(printf %5u $1)")" ;;
|
HP-UX) l="$(ps -fade |grep "^........ $(printf %5u $1)")" ;;
|
||||||
Linux) l="$(ps -fade |grep "^........ $(printf %5u $1)")" ;;
|
Linux) l="$(ps -fade |grep "^........ $(printf %5u $1)")" ;;
|
||||||
|
NetBSD) l="$(ps -aj |grep "^........ $(printf %4u $1)")" ;;
|
||||||
|
OpenBSD) l="$(ps -kaj |grep "^........ $(printf %5u $1)")" ;;
|
||||||
SunOS) l="$(ps -fade |grep "^........ $(printf %5u $1)")" ;;
|
SunOS) l="$(ps -fade |grep "^........ $(printf %5u $1)")" ;;
|
||||||
*) l="$(ps -fade |grep "^[^ ][^ ]*[ ][ ]*$(printf %5u $1) ")" ;;
|
*) l="$(ps -fade |grep "^[^ ][^ ]*[ ][ ]*$(printf %5u $1) ")" ;;
|
||||||
esac
|
esac
|
||||||
|
@ -1557,6 +1596,8 @@ childprocess () {
|
||||||
FreeBSD) l="$(ps -faje |grep "^........ ..... $(printf %5u $1)")" ;;
|
FreeBSD) l="$(ps -faje |grep "^........ ..... $(printf %5u $1)")" ;;
|
||||||
HP-UX) l="$(ps -fade |grep "^........ ..... $(printf %5u $1)")" ;;
|
HP-UX) l="$(ps -fade |grep "^........ ..... $(printf %5u $1)")" ;;
|
||||||
Linux) l="$(ps -fade |grep "^........ ..... $(printf %5u $1)")" ;;
|
Linux) l="$(ps -fade |grep "^........ ..... $(printf %5u $1)")" ;;
|
||||||
|
NetBSD) l="$(ps -aj |grep "^........ ..... $(printf %4u $1)")" ;;
|
||||||
|
OpenBSD) l="$(ps -kaj |grep "^........ ..... $(printf %5u $1)")" ;;
|
||||||
SunOS) l="$(ps -fade |grep "^........ ..... $(printf %5u $1)")" ;;
|
SunOS) l="$(ps -fade |grep "^........ ..... $(printf %5u $1)")" ;;
|
||||||
*) l="$(ps -fade |grep "^[^ ][^ ]*[ ][ ]*[0-9][0-9]**[ ][ ]*$(printf %5u $1) ")" ;; esac
|
*) l="$(ps -fade |grep "^[^ ][^ ]*[ ][ ]*[0-9][0-9]**[ ][ ]*$(printf %5u $1) ")" ;; esac
|
||||||
if [ -z "$l" ]; then
|
if [ -z "$l" ]; then
|
||||||
|
@ -2009,7 +2050,7 @@ NAME=SYSTEMSOCKET
|
||||||
case "$TESTS" in
|
case "$TESTS" in
|
||||||
*%functions%*|*%system%*|*%$NAME%*)
|
*%functions%*|*%system%*|*%$NAME%*)
|
||||||
TEST="$NAME: simple echo via system() of cat with socketpair"
|
TEST="$NAME: simple echo via system() of cat with socketpair"
|
||||||
testecho "$N" "$TEST" "" "system:$CAT" "$opts"
|
testecho "$N" "$TEST" "" "system:$CAT" "$opts" "$val_t"
|
||||||
esac
|
esac
|
||||||
N=$((N+1))
|
N=$((N+1))
|
||||||
|
|
||||||
|
@ -2073,12 +2114,12 @@ NAME=DUALSYSTEMFDS
|
||||||
case "$TESTS" in
|
case "$TESTS" in
|
||||||
*%functions%*|*%system%*|*%$NAME%*)
|
*%functions%*|*%system%*|*%$NAME%*)
|
||||||
TEST="$NAME: echo via dual system() of cat"
|
TEST="$NAME: echo via dual system() of cat"
|
||||||
testecho "$N" "$TEST" "system:$CAT>&6,fdout=6!!system:$CAT<&7,fdin=7" "" "$opts"
|
testecho "$N" "$TEST" "system:$CAT>&6,fdout=6!!system:$CAT<&7,fdin=7" "" "$opts" "$val_t"
|
||||||
esac
|
esac
|
||||||
N=$((N+1))
|
N=$((N+1))
|
||||||
|
|
||||||
|
|
||||||
# test: send EOF to exec'ed sub process, let it finished its operation, and
|
# test: send EOF to exec'ed sub process, let it finish its operation, and
|
||||||
# check if the sub process returns its data before terminating.
|
# check if the sub process returns its data before terminating.
|
||||||
NAME=EXECSOCKETFLUSH
|
NAME=EXECSOCKETFLUSH
|
||||||
# idea: have socat exec'ing od; send data and EOF, and check if the od'ed data
|
# idea: have socat exec'ing od; send data and EOF, and check if the od'ed data
|
||||||
|
@ -2095,7 +2136,7 @@ NAME=SYSTEMSOCKETFLUSH
|
||||||
case "$TESTS" in
|
case "$TESTS" in
|
||||||
*%functions%*|*%system%*|*%$NAME%*)
|
*%functions%*|*%system%*|*%$NAME%*)
|
||||||
TEST="$NAME: call to od via system() with socketpair"
|
TEST="$NAME: call to od via system() with socketpair"
|
||||||
testod "$N" "$TEST" "" "system:$OD_C" "$opts"
|
testod "$N" "$TEST" "" "system:$OD_C" "$opts" $val_t
|
||||||
esac
|
esac
|
||||||
N=$((N+1))
|
N=$((N+1))
|
||||||
|
|
||||||
|
@ -3579,7 +3620,7 @@ 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"
|
||||||
CMD2="$SOCAT $opts OPENSSL-LISTEN:$PORT,pf=ip4,reuseaddr,$SOCAT_EGD,cert=testsrv.crt,key=testsrv.key,verify=0 exec:'$OD_C'"
|
CMD2="$SOCAT $opts OPENSSL-LISTEN:$PORT,pf=ip4,reuseaddr,$SOCAT_EGD,cert=testsrv.crt,key=testsrv.key,verify=0 exec:'$OD_C'"
|
||||||
CMD="$SOCAT $opts - openssl:$LOCALHOST:$PORT,verify=0,$SOCAT_EGD"
|
CMD="$SOCAT -T1 $OPTS - openssl:$LOCALHOST:$PORT,verify=0,$SOCAT_EGD"
|
||||||
printf "test $F_n $TEST... " $N
|
printf "test $F_n $TEST... " $N
|
||||||
eval "$CMD2 2>\"${te}1\" &"
|
eval "$CMD2 2>\"${te}1\" &"
|
||||||
pid=$! # background process id
|
pid=$! # background process id
|
||||||
|
@ -4412,6 +4453,7 @@ EOF
|
||||||
|
|
||||||
#0 if ! sed 's/.*\r//g' "$tpo" |diff -q "$tr" - >/dev/null 2>&1; then
|
#0 if ! sed 's/.*\r//g' "$tpo" |diff -q "$tr" - >/dev/null 2>&1; then
|
||||||
#0 if ! sed 's/.*'"$($ECHO '\r\c')"'/</g' "$tpo" |diff -q "$tr" - >/dev/null 2>&1; then
|
#0 if ! sed 's/.*'"$($ECHO '\r\c')"'/</g' "$tpo" |diff -q "$tr" - >/dev/null 2>&1; then
|
||||||
|
wait
|
||||||
if ! tr "$($ECHO '\r \c')" "% " <$tpo |sed 's/%$//g' |sed 's/.*%//g' |diff "$tr" - >"$tdiff" 2>&1; then
|
if ! tr "$($ECHO '\r \c')" "% " <$tpo |sed 's/%$//g' |sed 's/.*%//g' |diff "$tr" - >"$tdiff" 2>&1; then
|
||||||
$PRINTF "$FAILED: $SOCAT:\n"
|
$PRINTF "$FAILED: $SOCAT:\n"
|
||||||
echo "$CMD"
|
echo "$CMD"
|
||||||
|
@ -7110,15 +7152,15 @@ tdiff="$td/test$N.diff"
|
||||||
da1a="$(date) $RANDOM"
|
da1a="$(date) $RANDOM"
|
||||||
da1b="$(date) $RANDOM"
|
da1b="$(date) $RANDOM"
|
||||||
CMD1="$SOCAT $opts - UNIX-CONNECT:$ts"
|
CMD1="$SOCAT $opts - UNIX-CONNECT:$ts"
|
||||||
CMD="$SOCAT -t0.1 $opts EXEC:"$CAT",end-close UNIX-LISTEN:$ts,fork"
|
CMD="$SOCAT $opts EXEC:"$CAT",end-close UNIX-LISTEN:$ts,fork"
|
||||||
printf "test $F_n $TEST... " $N
|
printf "test $F_n $TEST... " $N
|
||||||
$CMD 2>"${te}2" &
|
$CMD 2>"${te}2" &
|
||||||
pid2=$!
|
pid2=$!
|
||||||
waitfile $ts 1
|
waitfile $ts 1
|
||||||
echo "$da1a" |$CMD1 2>>"${te}1a" >"$tf"
|
echo "$da1a" |$CMD1 2>>"${te}1a" >"$tf"
|
||||||
usleep 100000
|
usleep $MICROS
|
||||||
echo "$da1b" |$CMD1 2>>"${te}1b" >>"$tf"
|
echo "$da1b" |$CMD1 2>>"${te}1b" >>"$tf"
|
||||||
usleep 100000
|
#usleep $MICROS
|
||||||
kill "$pid2" 2>/dev/null
|
kill "$pid2" 2>/dev/null
|
||||||
wait
|
wait
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
|
@ -7285,6 +7327,7 @@ case "$TESTS" in
|
||||||
TEST="$NAME: UDP/IPv4 broadcast"
|
TEST="$NAME: UDP/IPv4 broadcast"
|
||||||
if [ -z "$BCADDR" ]; then
|
if [ -z "$BCADDR" ]; then
|
||||||
$PRINTF "test $F_n $TEST... ${YELLOW}dont know a broadcast address${NORMAL}\n" $N
|
$PRINTF "test $F_n $TEST... ${YELLOW}dont know a broadcast address${NORMAL}\n" $N
|
||||||
|
numCANT=$((numCANT+1))
|
||||||
else
|
else
|
||||||
tf="$td/test$N.stdout"
|
tf="$td/test$N.stdout"
|
||||||
te="$td/test$N.stderr"
|
te="$td/test$N.stderr"
|
||||||
|
@ -7921,9 +7964,9 @@ to="$td/test$N.out"
|
||||||
te="$td/test$N.err"
|
te="$td/test$N.err"
|
||||||
tdiff="$td/test$N.diff"
|
tdiff="$td/test$N.diff"
|
||||||
da="test$N $(date) $RANDOM"; da="$da$($ECHO '\r')"
|
da="test$N $(date) $RANDOM"; da="$da$($ECHO '\r')"
|
||||||
CMD="$SOCAT $opts system:\"echo A; sleep 2\",readbytes=2!!- -!!/dev/null"
|
CMD="$SOCAT $opts system:\"echo A; sleep $((2*SECONDs))\",readbytes=2!!- -!!/dev/null"
|
||||||
printf "test $F_n $TEST... " $N
|
printf "test $F_n $TEST... " $N
|
||||||
(sleep 1; echo) |eval "$CMD" >"$to" 2>"$te"
|
(usleep $((2*MICROS)); echo) |eval "$CMD" >"$to" 2>"$te"
|
||||||
if test -s "$to"; then
|
if test -s "$to"; then
|
||||||
$PRINTF "$FAILED: $SOCAT:\n"
|
$PRINTF "$FAILED: $SOCAT:\n"
|
||||||
echo "$CMD"
|
echo "$CMD"
|
||||||
|
@ -7944,7 +7987,7 @@ NAME=EXECPTYKILL
|
||||||
case "$TESTS" in
|
case "$TESTS" in
|
||||||
*%functions%*|*%bugs%*|*%exec%*|*%$NAME%*)
|
*%functions%*|*%bugs%*|*%exec%*|*%$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 kill 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;
|
||||||
# it should be killed after one second, so if the file was generated the test
|
# it should be killed after one second, so if the file was generated the test
|
||||||
# has failed
|
# has failed
|
||||||
|
@ -7955,18 +7998,18 @@ tda="$td/test$N.data"
|
||||||
tsh="$td/test$N.sh"
|
tsh="$td/test$N.sh"
|
||||||
tdiff="$td/test$N.diff"
|
tdiff="$td/test$N.diff"
|
||||||
cat >"$tsh" <<EOF
|
cat >"$tsh" <<EOF
|
||||||
sleep 1; echo; sleep 1; touch "$tda"; echo
|
sleep $SECONDs; echo; sleep $SECONDs; touch "$tda"; echo
|
||||||
EOF
|
EOF
|
||||||
chmod a+x "$tsh"
|
chmod a+x "$tsh"
|
||||||
CMD1="$SOCAT $opts -U UNIX-LISTEN:$ts,fork EXEC:$tsh,pty"
|
CMD1="$SOCAT $opts -t $SECONDs -U UNIX-LISTEN:$ts,fork EXEC:$tsh,pty"
|
||||||
CMD="$SOCAT $opts /dev/null UNIX-CONNECT:$ts"
|
CMD="$SOCAT $opts -t $SECONDs /dev/null UNIX-CONNECT:$ts"
|
||||||
printf "test $F_n $TEST... " $N
|
printf "test $F_n $TEST... " $N
|
||||||
$CMD1 2>"${te}2" &
|
$CMD1 2>"${te}2" &
|
||||||
pid1=$!
|
pid1=$!
|
||||||
sleep 1
|
sleep $SECONDs
|
||||||
waitfile $ts 1
|
waitfile $ts $SECONDs
|
||||||
$CMD 2>>"${te}1" >>"$tf"
|
$CMD 2>>"${te}1" >>"$tf"
|
||||||
usleep 2500000
|
sleep $((2*SECONDs))
|
||||||
kill "$pid1" 2>/dev/null
|
kill "$pid1" 2>/dev/null
|
||||||
wait
|
wait
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
|
@ -8073,7 +8116,7 @@ done
|
||||||
#echo "$REDIR"
|
#echo "$REDIR"
|
||||||
#testecho "$N" "$TEST" "" "pipe" "$opts -T 3" "" 1
|
#testecho "$N" "$TEST" "" "pipe" "$opts -T 3" "" 1
|
||||||
#set -vx
|
#set -vx
|
||||||
eval testecho "\"$N\"" "\"$TEST\"" "\"\"" "pipe" "\"$opts -T 1\"" 1 $REDIR
|
eval testecho "\"$N\"" "\"$TEST\"" "\"\"" "pipe" "\"$opts -T $((2*SECONDs))\"" 1 $REDIR
|
||||||
#set +vx
|
#set +vx
|
||||||
fi # could determine FOPEN_MAX
|
fi # could determine FOPEN_MAX
|
||||||
esac
|
esac
|
||||||
|
@ -8107,8 +8150,9 @@ rc2=$?
|
||||||
sleep 1
|
sleep 1
|
||||||
#read -p ">"
|
#read -p ">"
|
||||||
l="$(childprocess $pid1)"
|
l="$(childprocess $pid1)"
|
||||||
|
rcc=$?
|
||||||
kill $pid1 2>/dev/null; wait
|
kill $pid1 2>/dev/null; wait
|
||||||
if [ $rc2 -ne 0 ]; then
|
if [ $rc2 -ne 0 -o $rcc -ne 0 ]; then
|
||||||
$PRINTF "$NO_RESULT\n" # already handled in test UDP4STREAM
|
$PRINTF "$NO_RESULT\n" # already handled in test UDP4STREAM
|
||||||
numCANT=$((numCANT+1))
|
numCANT=$((numCANT+1))
|
||||||
elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
|
elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
|
||||||
|
@ -8157,8 +8201,9 @@ rc2=$?
|
||||||
sleep 1
|
sleep 1
|
||||||
#read -p ">"
|
#read -p ">"
|
||||||
l="$(childprocess $pid1)"
|
l="$(childprocess $pid1)"
|
||||||
|
rcc=$?
|
||||||
kill $pid1 2>/dev/null; wait
|
kill $pid1 2>/dev/null; wait
|
||||||
if [ $rc2 -ne 0 ]; then
|
if [ $rc2 -ne 0 -o $rcc -ne 0 ]; then
|
||||||
$PRINTF "$NO_RESULT\n" # already handled in test UDP4DGRAM
|
$PRINTF "$NO_RESULT\n" # already handled in test UDP4DGRAM
|
||||||
numCANT=$((numCANT+1))
|
numCANT=$((numCANT+1))
|
||||||
elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
|
elif ! echo "$da" |diff - "$tf" >"$tdiff"; then
|
||||||
|
|
3
xio-ip.c
3
xio-ip.c
|
@ -56,7 +56,8 @@ const struct optdesc opt_ip_router_alert={"ip-router-alert","routeralert",OPT_IP
|
||||||
#endif
|
#endif
|
||||||
/* following: Linux allows int but OpenBSD reqs char/byte */
|
/* following: Linux allows int but OpenBSD reqs char/byte */
|
||||||
const struct optdesc opt_ip_multicast_ttl={"ip-multicast-ttl","multicastttl",OPT_IP_MULTICAST_TTL,GROUP_SOCK_IP,PH_PASTSOCKET,TYPE_BYTE,OFUNC_SOCKOPT,SOL_IP,IP_MULTICAST_TTL};
|
const struct optdesc opt_ip_multicast_ttl={"ip-multicast-ttl","multicastttl",OPT_IP_MULTICAST_TTL,GROUP_SOCK_IP,PH_PASTSOCKET,TYPE_BYTE,OFUNC_SOCKOPT,SOL_IP,IP_MULTICAST_TTL};
|
||||||
const struct optdesc opt_ip_multicast_loop={"ip-multicast-loop","multicastloop",OPT_IP_MULTICAST_LOOP,GROUP_SOCK_IP,PH_PASTSOCKET,TYPE_INT,OFUNC_SOCKOPT,SOL_IP,IP_MULTICAST_LOOP};
|
/* following: Linux allows int but OpenBSD reqs char/byte */
|
||||||
|
const struct optdesc opt_ip_multicast_loop={"ip-multicast-loop","multicastloop",OPT_IP_MULTICAST_LOOP,GROUP_SOCK_IP,PH_PASTSOCKET,TYPE_BYTE,OFUNC_SOCKOPT,SOL_IP,IP_MULTICAST_LOOP};
|
||||||
const struct optdesc opt_ip_multicast_if ={"ip-multicast-if", "multicast-if", OPT_IP_MULTICAST_IF, GROUP_SOCK_IP,PH_PASTSOCKET,TYPE_IP4NAME,OFUNC_SOCKOPT,SOL_IP,IP_MULTICAST_IF};
|
const struct optdesc opt_ip_multicast_if ={"ip-multicast-if", "multicast-if", OPT_IP_MULTICAST_IF, GROUP_SOCK_IP,PH_PASTSOCKET,TYPE_IP4NAME,OFUNC_SOCKOPT,SOL_IP,IP_MULTICAST_IF};
|
||||||
#ifdef IP_PKTOPTIONS
|
#ifdef IP_PKTOPTIONS
|
||||||
const struct optdesc opt_ip_pktoptions = { "ip-pktoptions", "pktopts", OPT_IP_PKTOPTIONS, GROUP_SOCK_IP, PH_PASTSOCKET, TYPE_INT, OFUNC_SOCKOPT, SOL_IP, IP_PKTOPTIONS };
|
const struct optdesc opt_ip_pktoptions = { "ip-pktoptions", "pktopts", OPT_IP_PKTOPTIONS, GROUP_SOCK_IP, PH_PASTSOCKET, TYPE_INT, OFUNC_SOCKOPT, SOL_IP, IP_PKTOPTIONS };
|
||||||
|
|
|
@ -298,7 +298,9 @@ int xioopen_rawip_recv(int argc, const char *argv[], struct opt *opts,
|
||||||
}
|
}
|
||||||
|
|
||||||
xfd->stream.dtype = XIODATA_RECV_SKIPIP;
|
xfd->stream.dtype = XIODATA_RECV_SKIPIP;
|
||||||
result = _xioopen_dgram_recv(&xfd->stream, xioflags, &/*us.soa*/xfd->stream.para.socket.la.soa, uslen,
|
result =
|
||||||
|
_xioopen_dgram_recv(&xfd->stream, xioflags,
|
||||||
|
needbind?&xfd->stream.para.socket.la.soa:NULL, uslen,
|
||||||
opts, pf, socktype, ipproto, E_ERROR);
|
opts, pf, socktype, ipproto, E_ERROR);
|
||||||
_xio_openlate(&xfd->stream, opts);
|
_xio_openlate(&xfd->stream, opts);
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -78,6 +78,9 @@ xiosetunix(struct sockaddr_un *saun,
|
||||||
if (tight) {
|
if (tight) {
|
||||||
len = sizeof(struct sockaddr_un)-sizeof(saun->sun_path)+
|
len = sizeof(struct sockaddr_un)-sizeof(saun->sun_path)+
|
||||||
MIN(pathlen, sizeof(saun->sun_path));
|
MIN(pathlen, sizeof(saun->sun_path));
|
||||||
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
|
saun->sun_len = len;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
len = sizeof(struct sockaddr_un);
|
len = sizeof(struct sockaddr_un);
|
||||||
}
|
}
|
||||||
|
@ -91,6 +94,9 @@ xiosetunix(struct sockaddr_un *saun,
|
||||||
if (tight) {
|
if (tight) {
|
||||||
len = sizeof(struct sockaddr_un)-sizeof(saun->sun_path)+
|
len = sizeof(struct sockaddr_un)-sizeof(saun->sun_path)+
|
||||||
MIN(pathlen+1, sizeof(saun->sun_path));
|
MIN(pathlen+1, sizeof(saun->sun_path));
|
||||||
|
#if HAVE_STRUCT_SOCKADDR_SALEN
|
||||||
|
saun->sun_len = len;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
len = sizeof(struct sockaddr_un);
|
len = sizeof(struct sockaddr_un);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue