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