1######################################################################## 2# # 3# This software is part of the ast package # 4# Copyright (c) 1982-2007 AT&T Knowledge Ventures # 5# and is licensed under the # 6# Common Public License, Version 1.0 # 7# by AT&T Knowledge Ventures # 8# # 9# A copy of the License is available at # 10# http://www.opensource.org/licenses/cpl1.0.txt # 11# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12# # 13# Information and Software Systems Research # 14# AT&T Research # 15# Florham Park NJ # 16# # 17# David Korn <dgk@research.att.com> # 18# # 19######################################################################## 20# test the behavior of co-processes 21function err_exit 22{ 23 print -u2 -n "\t" 24 print -u2 -r ${Command}[$1]: "${@:2}" 25 let Errors+=1 26} 27alias err_exit='err_exit $LINENO' 28 29Command=${0##*/} 30integer Errors=0 31 32if [[ -d /cygdrive ]] 33then err_exit cygwin detected - coprocess tests disabled - enable at the risk of wedging your system 34 exit $((Errors)) 35fi 36 37function ping # id 38{ 39 integer x=0 40 while ((x < 5)) 41 do read -r 42 print -r "$1 $REPLY" 43 done 44} 45 46cat |& 47print -p "hello" 48read -p line 49[[ $line == hello ]] || err_exit 'coprocessing fails' 50exec 5>&p 6<&p 51print -u5 'hello again' || err_exit 'write on u5 fails' 52read -u6 line 53[[ $line == 'hello again' ]] || err_exit 'coprocess after moving fds fails' 54exec 5<&- 6<&- 55 56ping three |& 57exec 3>&p 58ping four |& 59exec 4>&p 60ping pipe |& 61 62integer count 63for i in three four pipe four pipe four three pipe pipe three pipe 64do case $i in 65 three) to=-u3;; 66 four) to=-u4;; 67 pipe) to=-p;; 68 esac 69 count=count+1 70 print $to $i $count 71done 72 73while ((count > 0)) 74do count=count-1 75 read -p 76# print -r - "$REPLY" 77 set -- $REPLY 78 if [[ $1 != $2 ]] 79 then err_exit "$1 does not match 2" 80 fi 81 case $1 in 82 three);; 83 four) ;; 84 pipe) ;; 85 *) err_exit "unknown message +|$REPLY|+" 86 esac 87done 88 89file=/tmp/regress$$ 90trap "rm -f $file" EXIT 91cat > $file <<\! 92/bin/cat |& 93! 94chmod +x $file 95$file 2> /dev/null || err_exit "parent coprocess prevents script coprocess" 96exec 5<&p 6>&p 97exec 5<&- 6>&- 98${SHELL-ksh} |& 99print -p $'print hello | cat\nprint Done' 100read -t 5 -p 101read -t 5 -p 102if [[ $REPLY != Done ]] 103then err_exit "${SHELL-ksh} coprocess not working" 104fi 105exec 5<&p 6>&p 106exec 5<&- 6>&- 107count=0 108{ 109echo line1 | grep 'line2' 110echo line2 | grep 'line1' 111} |& 112SECONDS=0 113while 114 read -p -t 10 line 115do 116 ((count = count + 1)) 117 echo "Line $count: $line" 118done 119if (( SECONDS > 8 )) 120then err_exit 'read -p hanging' 121fi 122( sleep 3 |& sleep 1 && kill $!; sleep 1; sleep 3 |& sleep 1 && kill $! ) || 123 err_exit "coprocess cleanup not working correctly" 124unset line 125( 126 integer n=0 127 while read line 128 do echo $line |& 129 if cat <&p 130 then ((n++)) 131 wait $! 132 fi 133 done > /dev/null 2>&1 <<- ! 134 line1 135 line2 136 line3 137 line4 138 line5 139 line6 140 line7 141 ! 142 (( n==7 )) && print ok 143) | read -t 10 line 144if [[ $line != ok ]] 145then err_exit 'coprocess timing bug' 146fi 147( 148 /bin/cat |& 149 exec 6>&p 150 print -u6 ok 151 exec 6>&- 152 sleep 1 153 kill $! 2> /dev/null 154) && err_exit 'coprocess with subshell would hang' 155for sig in IOT ABRT 156do if ( trap - $sig ) 2> /dev/null 157 then if [[ $( 158 cat |& 159 pid=$! 160 trap "print TRAP" $sig 161 ( 162 sleep 2 163 kill -$sig $$ 164 sleep 2 165 kill -$sig $$ 166 kill $pid 167 ) 2> /dev/null & 168 read -p 169 ) != $'TRAP\nTRAP' ]] 170 then err_exit 'traps when reading from coprocess not working' 171 fi 172 break 173 fi 174done 175 176trap 'sleep_pid=; kill $pid; err_exit "coprocess 1 hung"' TERM 177{ sleep 5; kill $$; } & 178sleep_pid=$! 179builtin cat 180cat |& 181pid=$! 182exec 5<&p 6>&p 183print -u6 hi; read -u5 184[[ $REPLY == hi ]] || err_exit 'REPLY is $REPLY not hi' 185exec 6>&- 186wait $pid 187trap - TERM 188[[ $sleep_pid ]] && kill $sleep_pid 189 190trap 'sleep_pid=; kill $pid; err_exit "coprocess 2 hung"' TERM 191{ sleep 5; kill $$; } & 192sleep_pid=$! 193cat |& 194pid=$! 195print foo >&p 2> /dev/null || err_exit 'first write of foo to coprocess failed' 196print foo >&p 2> /dev/null || err_exit 'second write of foo to coprocess failed' 197kill $pid 198wait $pid 2> /dev/null 199trap - TERM 200[[ $sleep_pid ]] && kill $sleep_pid 201 202trap 'sleep_pid=; kill $pid; err_exit "coprocess 3 hung"' TERM 203{ sleep 5; kill $$; } & 204sleep_pid=$! 205cat |& 206pid=$! 207print -p foo 208print -p bar 209read <&p || err_exit 'first read from coprocess failed' 210[[ $REPLY == foo ]] || err_exit "first REPLY is $REPLY not foo" 211read <&p || err_exit 'second read from coprocess failed' 212[[ $REPLY == bar ]] || err_exit "second REPLY is $REPLY not bar" 213kill $pid 214wait $pid 2> /dev/null 215trap - TERM 216[[ $sleep_pid ]] && kill $sleep_pid 217 218exit $((Errors)) 219