X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/tunneluser/blobdiff_plain/1dc744ac1faf61a0c8b8f2e427436316f28f660a..HEAD:/bin/outbound diff --git a/bin/outbound b/bin/outbound index 5ed160d..ac810aa 100755 --- a/bin/outbound +++ b/bin/outbound @@ -63,6 +63,9 @@ daemon () { ## 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 @@ -80,9 +83,18 @@ daemon () { ;; 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 @@ -90,13 +102,10 @@ daemon () { 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 }