## Initial delay.
delay=0
+ ## Not waiting on a pipe yet.
+ kidcat=nil
+
## Keep the connection up for as long as we can.
while [ -f "$host.pid" ]; do
;;
esac
+ ## Prepare a pipe so that we can wait for SSH to finish. This is a
+ ## rotten hack.
+ case $kidcat in
+ nil) ;;
+ *) kill $kidcat >/dev/null 2>&1 || :; kidcat=nil ;;
+ esac
+ rm -f "$host.pipe"; mkfifo -m600 "$host.pipe"
+ cat $host.pipe >/dev/null& kidcat=$!
+
## Start a new connection.
writefile "$host.state" starting
- if ! runssh -MNnf "$host" >/dev/null; then continue; fi
+ if ! runssh -MNnf "$host" >"$host.pipe"; then continue; fi
if ! runssh -Ocheck "$host" >/dev/null 2>&1; then
echo "connection to $host apparently stillborn"
continue
writefile "$host.state" connected
delay=0
- ## Wait until it gets torn down. The chicanery with a pipe is because
- ## the ssh process will continue until either it gets disconnected from
- ## the server or stdin closes -- so we have to arrange that stdin doesn't
- ## close. Thanks to Richard Kettlewell for the suggestion.
- rm -f "$host.pipe"; mkfifo -m400 "$host.pipe"
- runssh -N "$host" >/dev/null <"$host.pipe" || :
+ ## Wait until it gets torn down.
+ wait $kidcat >/dev/null 2>&1 || :
rm -f "$host.pipe"
+ clobber
writefile "$host.state" disconnected
done
}