ssvnc_cmd 5.42 KB
Newer Older
runge's avatar
runge committed
1 2 3 4
#!/bin/sh
#
# Copyright (c) 2006 by Karl J. Runge <runge@karlrunge.com>
#
runge's avatar
runge committed
5
# ssvnc_cmd:
runge's avatar
runge committed
6
#
runge's avatar
runge committed
7
#    A wrapper that calls ss_vncviewer to use the enhanced TightVNC viewer. 
runge's avatar
runge committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#
# The enhanced TightVNC viewer features are:
#
#	- SSL support for connections using the co-bundled stunnel program.
#	- rfbNewFBSize VNC support (screen resizing)
#	- cursor alphablending with x11vnc at 32bpp
#	- xgrabserver support for fullscreen mode (for old window mgrs)
#
#
# Your platform (e.g. Linux.i686) is autodetected and enhanced
# vncviewer and stunnel binaries for it are used (see the ./bin directory).
#
# See the build.unix script if your platform is not in this package.
# You can also set the env. var. UNAME=os.arch to any "os.arch" you want
# to override the autodetetion.
#
# Usage:
#
runge's avatar
runge committed
26
#     ssvnc_cmd [ss_vncviewer-args] hostname:N [tightvncviewer-args]
runge's avatar
runge committed
27 28 29
#
# "hostname:N" is the host and VNC display to connect to, e.g. snoopy:0
#
runge's avatar
runge committed
30
# See the script util/ss_vncviewer for details about its arguments:
runge's avatar
runge committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
#
#	-verify pemfile
#	-mycert pemfile
#	-proxy  phost:pport
#	-alpha
#	-grab
#
#
# If the *very first* argument is "-cotvnc" then it is assumed you are on
# Darwin and want to run the Chicken of the VNC viewer via our wrapper.
#
#
# See the TightVNC viewer documentation for on its cmdline arguments.
#
# For convenience, here is the current (7/2006) TightVNC viewer -help output:
#
#       TightVNC viewer version 1.3dev5
#       
#       Usage: vncviewer [<OPTIONS>] [<HOST>][:<DISPLAY#>]
#              vncviewer [<OPTIONS>] [<HOST>][::<PORT#>]
#              vncviewer [<OPTIONS>] -listen [<DISPLAY#>]
#              vncviewer -help
#       
#       <OPTIONS> are standard Xt options, or:
#               -via <GATEWAY>
#               -shared (set by default)
#               -noshared
#               -viewonly
#               -fullscreen
#               -noraiseonbeep
#               -passwd <PASSWD-FILENAME> (standard VNC authentication)
#               -user <USERNAME> (Unix login authentication)
#               -encodings <ENCODING-LIST> (e.g. "tight copyrect")
#               -bgr233
#               -owncmap
#               -truecolour
#               -depth <DEPTH>
#               -compresslevel <COMPRESS-VALUE> (0..9: 0-fast, 9-best)
#               -quality <JPEG-QUALITY-VALUE> (0..9: 0-low, 9-high)
#               -nojpeg
#               -nocursorshape
#               -x11cursor
#               -autopass
#       
#       Option names may be abbreviated, e.g. -bgr instead of -bgr233.
#       See the manual page for more information.
#  

if [ "X$1" = "X-h" -o "X$1" = "X-help" -o "X$1" = "X--help" ]; then
	head -76 "$0" | grep -v bin/sh
	exit
fi

# Include /usr/bin... to be sure to get regular utilities:
#
PATH=$PATH:/usr/bin:/bin
export PATH

runge's avatar
runge committed
89
# Set this for ss_vncviewer to pick up:
runge's avatar
runge committed
90 91 92 93 94
#
if [ "X$1" = "X-cotvnc" ]; then
	shift
	DARWIN_COTVNC=1
	export DARWIN_COTVNC
runge's avatar
runge committed
95 96 97 98 99 100
elif [ "X$DARWIN_COTVNC" = "X" -a "X$DISPLAY" = "X" ]; then
	uname=`uname`
	if [ "X$uname" = "XDarwin" ]; then
		DARWIN_COTVNC=1
		export DARWIN_COTVNC
	fi
runge's avatar
runge committed
101
fi
runge's avatar
runge committed
102 103

use_ours=0
runge's avatar
runge committed
104 105 106
if [ "X$VNCVIEWERCMD" = "X" ]; then
	VNCVIEWERCMD="vncviewer"
	export VNCVIEWERCMD
runge's avatar
runge committed
107
	if [ "X$DARWIN_COTVNC" != "X" ]; then
runge's avatar
runge committed
108 109 110 111 112 113 114 115 116 117 118 119
		use_ours=1
	fi
fi

# work out os.arch platform string and check for binaries:
#
name=$UNAME
if [ "X$name" = "X" ]; then
	name=`uname -sm | sed -e 's/ /./g'`
fi

f="$0"
runge's avatar
runge committed
120
for t in 1 2 3 4 5 6
runge's avatar
runge committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134
do
	if [ -L "$f" ]; then
		f0="$f"
		f=`ls -l "$f" | sed -e 's/^.* -> //'`
		if echo "$f" | grep '^/' > /dev/null; then
			:
		else
			f="`dirname "$f0"`/$f"
		fi
	else
		break
	fi
done
dir=`dirname "$f"`
runge's avatar
runge committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
PATH="$dir:$PATH"

nearby=0
if [ -x "$dir/vncviewer" -a -x "$dir/stunnel" ]; then
	nearby=1
fi
if [ ! -d "$dir/$name" -a $nearby = 0 ]; then
	echo
	echo "Cannot find platform dir for your OS `uname -sm`:"
	echo
	echo "    $dir/$name" 
	echo
	PATH=$PATH:/usr/sbin:/usr/local/sbin:/dist/sbin

	quit=0
	if type vncviewer >/dev/null 2>/dev/null; then
		:
	else
		echo "vncviewer not found in PATH." 
		quit=1
	fi
	if type stunnel >/dev/null 2>/dev/null; then
		:
	else
		echo "stunnel not found in PATH."
		quit=1
	fi
	echo
	if [ "X$quit" = "X1" ]; then
		echo "You can set the \$UNAME env. var. to override the OS setting."
		echo "Or, if available, run the ./build.unix script to build it."
		echo "Or install external \"vncviewer\" and \"stunnel\" packages."
		exit 1
	fi
	echo "Using externel \"vncviewer\" and \"stunnel\" found in PATH."
runge's avatar
runge committed
170

runge's avatar
runge committed
171 172 173 174 175 176 177 178 179 180 181 182 183
	if [ "X$DARWIN_COTVNC" = "X" -a "X$VNCVIEWERCMD" = "Xvncviewer" ]; then
		hstr=`"$VNCVIEWERCMD" -h 2>&1 | head -5`
		if echo "$hstr" | grep '^TightVNC.*version 1\.[23]' > /dev/null; then
			# we need to avoid raw encoding
			use_ours=1
		fi
	fi
else
	STUNNEL_EXTRA_OPTS=${STUNNEL_EXTRA_OPTS:-"maxconn = 1"}
	export STUNNEL_EXTRA_OPTS
	SSVNC_VIEWER_INTERNAL=1
	export SSVNC_VIEWER_INTERNAL
	use_ours=1
runge's avatar
runge committed
184 185 186 187 188 189 190 191 192 193 194 195 196
fi

# Put our os.arch and other utils dirs at head of PATH to be sure to
# pick them up:
#
PATH="$dir:$dir/$name:$dir/util:$PATH"
if echo "$dir" | grep '^/' > /dev/null; then
	:
else
	dir=`pwd`/$dir
	PATH="$dir:$dir/$name:$dir/util:$PATH"
fi

runge's avatar
runge committed
197 198 199 200 201
base=`basename "$0"`
if [ "X$1" = "X-ssl" ]; then
	shift	
	base="ssvnc_cmd"
fi
runge's avatar
runge committed
202 203 204 205 206 207

# If ours (and not cotvnc), force the use of tight encoding for localhost
# redir connection:
#
#
if [ $use_ours = 1 ]; then
runge's avatar
runge committed
208 209 210 211 212
	if [ "X$base" = "Xtightvncviewer" ]; then
		"$VNCVIEWERCMD" -encodings 'copyrect tight zrle zlib hextile' "$@"
	else
		ss_vncviewer "$@" -encodings 'copyrect tight zrle zlib hextile'
	fi
runge's avatar
runge committed
213
else
runge's avatar
runge committed
214 215 216 217 218
	if [ "X$base" = "Xtightvncviewer" ]; then
		"$VNCVIEWERCMD" "$@"
	else
		ss_vncviewer "$@"
	fi
runge's avatar
runge committed
219
fi