Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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