1 #!/bin/sh 2 # 3 # Copyright (c) 2006-2009 by Karl J. Runge <runge (at] karlrunge.com> 4 # 5 # ssvnc_cmd: 6 # 7 # A wrapper that calls ss_vncviewer to use the enhanced TightVNC viewer. 8 # 9 # The enhanced TightVNC viewer features are: 10 # 11 # - SSL support for connections using the co-bundled stunnel program. 12 # - rfbNewFBSize VNC support (screen resizing) 13 # - cursor alphablending with x11vnc at 32bpp 14 # - xgrabserver support for fullscreen mode (for old window mgrs) 15 # 16 # 17 # Your platform (e.g. Linux.i686) is autodetected and enhanced 18 # vncviewer and stunnel binaries for it are used (see the ./bin directory). 19 # 20 # See the build.unix script if your platform is not in this package. 21 # You can also set the env. var. UNAME=os.arch to any "os.arch" you want 22 # to override the autodetetion. 23 # 24 # Usage: 25 # 26 # ssvnc_cmd [ss_vncviewer-args] hostname:N [vncviewer-args] 27 # 28 # if, instead, this script is named "tightvncviewer" or "-viewer" is the 29 # first argument it calls the vncviewer directly (there is no encryption) 30 # and must be invoked as: 31 # 32 # tightvncviewer [vncviewer-args] hostname:N 33 # or 34 # ssvnc_cmd -viewer [vncviewer-args] hostname:N 35 # 36 # In both cases, "hostname:N" is the host and VNC display to connect to, 37 # e.g. snoopy:0. (-listen N and -appshare N modes works too.) 38 # 39 # See the script util/ss_vncviewer for details about its arguments: 40 # 41 # -verify pemfile 42 # -mycert pemfile 43 # -proxy phost:pport 44 # -alpha 45 # -grab 46 # 47 # N.B. if this script is named "tightvncviewer" the vncviewer is called 48 # directly, and there won't be any SSL or SSH encryption tunnels. 49 # 50 # If the *very first* argument is "-cotvnc" then it is assumed you are on 51 # Darwin and want to run the Chicken of the VNC viewer via our wrapper. 52 # 53 # 54 # See the TightVNC viewer documentation for on its cmdline arguments. 55 # 56 # For convenience, here is the TightVNC 1.3dev5 viewer -help output: 57 # 58 # TightVNC viewer version 1.3dev5 59 # 60 # Usage: vncviewer [<OPTIONS>] [<HOST>][:<DISPLAY#>] 61 # vncviewer [<OPTIONS>] [<HOST>][::<PORT#>] 62 # vncviewer [<OPTIONS>] -listen [<DISPLAY#>] 63 # vncviewer -help 64 # 65 # <OPTIONS> are standard Xt options, or: 66 # -via <GATEWAY> 67 # -shared (set by default) 68 # -noshared 69 # -viewonly 70 # -fullscreen 71 # -noraiseonbeep 72 # -passwd <PASSWD-FILENAME> (standard VNC authentication) 73 # -user <USERNAME> (Unix login authentication) 74 # -encodings <ENCODING-LIST> (e.g. "tight copyrect") 75 # -bgr233 76 # -owncmap 77 # -truecolour 78 # -depth <DEPTH> 79 # -compresslevel <COMPRESS-VALUE> (0..9: 0-fast, 9-best) 80 # -quality <JPEG-QUALITY-VALUE> (0..9: 0-low, 9-high) 81 # -nojpeg 82 # -nocursorshape 83 # -x11cursor 84 # -autopass 85 # 86 # Option names may be abbreviated, e.g. -bgr instead of -bgr233. 87 # See the manual page for more information. 88 # 89 # Note: the enhanced tightvnc viewer (SSVNC) has many more options, run 90 # this script as "ssvnc_cmd Vnc://a:0 -help" or "tightvncviewer -help" 91 # to seem them. 92 93 if [ "X$1" = "X-h" -o "X$1" = "X-helpxxx" -o "X$1" = "X--help" ]; then 94 tail -n +2 "$0" | sed -e '/^$/ q' -e 's/^#//' 95 exit 96 fi 97 98 # Include /usr/bin... to be sure to get regular utilities: 99 # 100 PATH=$PATH:/usr/bin:/bin 101 export PATH 102 103 if [ "X$FULLNAME" = "XKarl J. Runge" ]; then 104 if [ "X$NOPOPUFIX" = "X" ]; then 105 VNCVIEWER_POPUP_FIX=1 106 export VNCVIEWER_POPUP_FIX 107 fi 108 PATH=`echo "$PATH" | sed -e 's,runge/bin/override,-------------,'` 109 fi 110 111 # Set this for ss_vncviewer to pick up: 112 # 113 if [ "X$1" = "X-cotvnc" ]; then 114 shift 115 DARWIN_COTVNC=1 116 export DARWIN_COTVNC 117 elif [ "X$DARWIN_COTVNC" = "X" -a "X$DISPLAY" = "X" ]; then 118 uname=`uname` 119 if [ "X$uname" = "XDarwin" ]; then 120 DARWIN_COTVNC=1 121 export DARWIN_COTVNC 122 fi 123 fi 124 125 use_ours=0 126 if [ "X$VNCVIEWERCMD" = "X" ]; then 127 VNCVIEWERCMD="vncviewer" 128 export VNCVIEWERCMD 129 if [ "X$DARWIN_COTVNC" != "X1" ]; then 130 use_ours=1 131 fi 132 fi 133 134 # work out os.arch platform string and check for binaries: 135 # 136 name=$UNAME 137 if [ "X$name" = "X" ]; then 138 name=`uname -sm | sed -e 's/ /./g' -e 's,/.*,,' -e 's/Linux\.i.86/Linux.i686/'` 139 fi 140 141 dL="-L" 142 if uname -sr | egrep 'SunOS 5\.[5-8]' > /dev/null; then 143 dL="-h" 144 fi 145 146 f="$0" 147 for t in 1 2 3 4 5 6 148 do 149 if [ $dL "$f" ]; then 150 f0="$f" 151 f=`ls -l "$f" | sed -e 's/^.* -> //'` 152 if echo "$f" | grep '^/' > /dev/null; then 153 : 154 else 155 f="`dirname "$f0"`/$f" 156 fi 157 else 158 break 159 fi 160 done 161 dir=`dirname "$f"` 162 PATH="$dir:$PATH" 163 SSVNC_BASEDIR="$dir" 164 export SSVNC_BASEDIR 165 SSVNC_BASEDIRNAME="$dir/$name" 166 export SSVNC_BASEDIRNAME 167 SSVNC_UNAME="$name" 168 export SSVNC_UNAME 169 170 nearby=0 171 if [ -x "$dir/vncviewer" -a -x "$dir/stunnel" ]; then 172 nearby=1 173 fi 174 if [ "X$name" = "X." ]; then 175 : 176 #type vncviewer 177 #type stunnel 178 elif [ ! -d "$dir/$name" -a $nearby = 0 ]; then 179 echo 180 echo "Cannot find platform dir for your OS `uname -sm`:" 181 echo 182 echo " $dir/$name" 183 echo 184 PATH=$PATH:/usr/sbin:/usr/local/sbin:/dist/sbin 185 186 quit=0 187 if type vncviewer >/dev/null 2>/dev/null; then 188 : 189 else 190 echo "vncviewer not found in PATH." 191 quit=1 192 fi 193 if type stunnel >/dev/null 2>/dev/null; then 194 : 195 else 196 echo "stunnel not found in PATH." 197 quit=1 198 fi 199 echo 200 if [ "X$quit" = "X1" ]; then 201 echo "You can set the \$UNAME env. var. to override the OS setting." 202 echo "Or, if available, run the ./build.unix script to build it." 203 echo "Or install external \"vncviewer\" and \"stunnel\" packages." 204 exit 1 205 fi 206 echo "Using externel \"vncviewer\" and \"stunnel\" found in PATH." 207 208 else 209 STUNNEL=stunnel 210 #STUNNEL_EXTRA_OPTS=${STUNNEL_EXTRA_OPTS:-"maxconn = 1"} 211 #export STUNNEL STUNNEL_EXTRA_OPTS 212 SSVNC_VIEWER_INTERNAL=1 213 export SSVNC_VIEWER_INTERNAL 214 fi 215 216 if [ "X$DARWIN_COTVNC" != "X1" -a "X$VNCVIEWERCMD" = "Xvncviewer" ]; then 217 hstr=`$VNCVIEWERCMD -h 2>&1 | head -5` 218 if echo "$hstr" | grep 'SSVNC.*TightVNC.*version 1\.3' > /dev/null; then 219 # we need to avoid raw encoding 220 use_ours=1 221 fi 222 fi 223 224 # Put our os.arch and other utils dirs at head of PATH to be sure to 225 # pick them up: 226 # 227 PATH="$dir:$dir/$name:$dir/util:$PATH" 228 if echo "$dir" | grep '^/' > /dev/null; then 229 : 230 else 231 dir=`pwd`/$dir 232 PATH="$dir:$dir/$name:$dir/util:$PATH" 233 fi 234 235 if [ -f "$dir/util/ultraftp.jar" ]; then 236 SSVNC_ULTRA_FTP_JAR="$dir/util/ultraftp.jar" 237 export SSVNC_ULTRA_FTP_JAR 238 fi 239 240 base=`basename "$0"` 241 if [ "X$1" = "X-ssl" ]; then 242 shift 243 base="ssvnc_cmd" 244 fi 245 246 do_viewer_directly="" 247 if [ "X$1" = "X-viewer" ]; then 248 do_viewer_directly=1 249 shift 250 fi 251 if [ "X$base" = "Xtightvncviewer" ]; then 252 do_viewer_directly=1 253 fi 254 255 # If ours (and not cotvnc), force the use of tight encoding for localhost 256 # redir connection: 257 # 258 # 259 if [ $use_ours = 1 ]; then 260 # avoid system vncviewer app-defaults 261 #XFILESEARCHPATH="/tmp/path/nowhere"; export XFILESEARCHPATH 262 263 SSVNC_USE_OURS=1; export SSVNC_USE_OURS 264 265 if [ "X$SSVNC_TURBOVNC" != "X" ]; then 266 if echo "$VNCVIEWERCMD" | grep '\.turbovnc' > /dev/null; then 267 : 268 else 269 if type "$VNCVIEWERCMD.turbovnc" > /dev/null 2>/dev/null; then 270 VNCVIEWERCMD="$VNCVIEWERCMD.turbovnc" 271 fi 272 fi 273 fi 274 275 if [ "X$do_viewer_directly" = "X1" ]; then 276 $VNCVIEWERCMD -encodings 'copyrect tight zrle zlib hextile' "$@" 277 else 278 ss_vncviewer "$@" -encodings 'copyrect tight zrle zlib hextile' 279 fi 280 else 281 if [ "X$do_viewer_directly" = "X1" ]; then 282 $VNCVIEWERCMD "$@" 283 else 284 ss_vncviewer "$@" 285 fi 286 fi 287