1d9306527SDavid du Colombier#!/bin/rc 2d9306527SDavid du Colombier 3d9306527SDavid du Colombier# Serve Unix u9fs over SSH 4d9306527SDavid du Colombier# 5d9306527SDavid du Colombier# Basically, try each of the following until you find one that works: 6d9306527SDavid du Colombier# 7d9306527SDavid du Colombier# srvssh unix 8d9306527SDavid du Colombier# srvssh -r unix 9d9306527SDavid du Colombier# srvssh -R unix 10d9306527SDavid du Colombier# srvssh -r -s unix 11d9306527SDavid du Colombier# srvssh -R -s unix 12d9306527SDavid du Colombier# 13d9306527SDavid du Colombier# and then never look back. Note that "srvssh unix" should always 14d9306527SDavid du Colombier# work. It's just that if you're talking with certain sshd's, you'll get 15d9306527SDavid du Colombier# hit by Nagle's algorithm and need to explore the other flags. 16d9306527SDavid du Colombier 17d9306527SDavid du Colombier# When using ssh to start u9fs, the only way to turn off 18d9306527SDavid du Colombier# Nagle's algorithm (which kills the performance of RPC-based 19d9306527SDavid du Colombier# protocols like 9P) is to allocate a pseudo-terminal. The 20d9306527SDavid du Colombier# command ssh -Rmp attempts to allocate a pseudo-terminal and 21d9306527SDavid du Colombier# then put it in a transparent mode. Especially when 22d9306527SDavid du Colombier# connected to older SSH daemons, the connection ends up not 23d9306527SDavid du Colombier# quite transparent. To get around this, we explicity set the tty 24d9306527SDavid du Colombier# mode on the command line as well. The hope is that -Rmp makes 25d9306527SDavid du Colombier# the connection transparent enough for the Tversion, and the stty 26d9306527SDavid du Colombier# command will do the rest. If -Rmp doesn't make the connection 27d9306527SDavid du Colombier# transparent enough for the Tversion (but the stty commands do 28d9306527SDavid du Colombier# make the connection fully transparent) then add "-s 5" to the srv 29d9306527SDavid du Colombier# command to tell it to wait 5 seconds before sending the Tversion. 30d9306527SDavid du Colombier# That should be enough time for the stty to take effect. 31d9306527SDavid du Colombier 32d9306527SDavid du Colombierrfork e 33d9306527SDavid du Colombier 34d9306527SDavid du Colombierfn usage { 35*ddb951e3SDavid du Colombier echo 'usage: srvssh [-R] [-r] [-s] [-u u9fspath] system [srvname [mtpt]]' >[1=2] 36d9306527SDavid du Colombier exit usage 37d9306527SDavid du Colombier} 38d9306527SDavid du Colombier 39d9306527SDavid du Colombierrawhack='' 40d9306527SDavid du Colombiersleephack=() 41d9306527SDavid du Colombieru9fspath=u9fs 42d9306527SDavid du Colombierrawflags='' 43d9306527SDavid du Colombier 44d9306527SDavid du Colombierwhile(~ $1 -*){ 45d9306527SDavid du Colombier switch($1){ 46d9306527SDavid du Colombier case -r 47d9306527SDavid du Colombier rawflags='-Rmp' 48d9306527SDavid du Colombier shift 49d9306527SDavid du Colombier case -R 50d9306527SDavid du Colombier rawflags='-Rmp' 51d9306527SDavid du Colombier rawhack=('stty raw -echo '';''') 52d9306527SDavid du Colombier shift 53d9306527SDavid du Colombier case -s 54d9306527SDavid du Colombier sleephack=(-s 5) 55d9306527SDavid du Colombier shift 56d9306527SDavid du Colombier case -u 57d9306527SDavid du Colombier shift 58d9306527SDavid du Colombier u9fspath=$1 59d9306527SDavid du Colombier shift 60d9306527SDavid du Colombier case -u* 61d9306527SDavid du Colombier u9fspath=`{echo $1 | sed s/-u//} 62d9306527SDavid du Colombier shift 63d9306527SDavid du Colombier case * 64d9306527SDavid du Colombier usage 65d9306527SDavid du Colombier } 66d9306527SDavid du Colombier} 67d9306527SDavid du Colombier 68d9306527SDavid du Colombierif(! ~ $#* 1 2 3) 69d9306527SDavid du Colombier usage 70d9306527SDavid du Colombier 71d9306527SDavid du Colombierswitch($#*){ 72d9306527SDavid du Colombiercase 1 73d9306527SDavid du Colombier srv=$1 74d9306527SDavid du Colombier mtpt=/n/$1 75d9306527SDavid du Colombiercase 2 76d9306527SDavid du Colombier srv=$2 77d9306527SDavid du Colombier mtpt=/n/$1 78d9306527SDavid du Colombiercase 3 79d9306527SDavid du Colombier srv=$2 80d9306527SDavid du Colombier mtpt=$3 81d9306527SDavid du Colombier} 82d9306527SDavid du Colombier 83d9306527SDavid du Colombierx=(srv $sleephack -e \ 84d9306527SDavid du Colombier 'ssh '$rawflags' '$1' '$rawhack' '$u9fspath' -na none -u ''$''USER -l ''$''HOME/u9fs.log' \ 85d9306527SDavid du Colombier $srv $mtpt) 86d9306527SDavid du Colombier$x 87d9306527SDavid du Colombier 88d9306527SDavid du Colombier# Sometimes /srv/whatever can be a closed pipe, in which case 89d9306527SDavid du Colombier# srv will have been killed for writing to it, without a chance to 90d9306527SDavid du Colombier# defend itself. Rerun it in this case. 91d9306527SDavid du Colombier 92d9306527SDavid du Colombierss=$status 93d9306527SDavid du Colombierif(~ $ss *'write on closed pipe'*){ 94d9306527SDavid du Colombier rm -f /srv/$srv 95d9306527SDavid du Colombier $x 96d9306527SDavid du Colombier ss=$status 97d9306527SDavid du Colombier} 98d9306527SDavid du Colombier 99d9306527SDavid du Colombierif(! ~ $ss '') 100d9306527SDavid du Colombier echo srvssh: $ss >[1=2] 101d9306527SDavid du Colombierexit $ss 102