xref: /plan9/rc/bin/srvssh (revision ddb951e381e761084e6b3ea97b340f3f88e014f8)
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