x11vnc: add -rmflag option, -rawfb vt support, bpp < 8 support

for rawfb, find /dev/video better. Fix reverse SSL connection
for DH.  Some improvements for CUPS TS helper, restart if needed.
pull/1/head
runge 16 years ago
parent 6876b85df3
commit 4fdb4cc67f

@ -1,3 +1,8 @@
2009-01-03 Karl Runge <runge@karlrunge.com>
* x11vnc: add -rmflag option, -rawfb vt support, bpp < 8 support
for rawfb, find /dev/video better. Fix reverse SSL connection
for DH. Some improvements for CUPS TS helper, restart if needed.
2008-12-10 Karl Runge <runge@karlrunge.com> 2008-12-10 Karl Runge <runge@karlrunge.com>
* x11vnc: 0.9.6 release. Some strtok bugfixes. rename -tlsvnc * x11vnc: 0.9.6 release. Some strtok bugfixes. rename -tlsvnc
to -anontls. Disable ssl caching. No cert creation prompting to -anontls. Disable ssl caching. No cert creation prompting

@ -1,5 +1,5 @@
x11vnc README file Date: Mon Dec 8 22:48:46 EST 2008 x11vnc README file Date: Sat Jan 3 19:10:09 EST 2009
The following information is taken from these URLs: The following information is taken from these URLs:
@ -573,12 +573,12 @@ vncviewer -via $host localhost:0 # must be TightVNC vncviewer.
SourceForge.net. I use libvncserver for all of the VNC aspects; I SourceForge.net. I use libvncserver for all of the VNC aspects; I
couldn't have done without it. The full source code may be found and couldn't have done without it. The full source code may be found and
downloaded (either file-release tarball or CVS tree) from the above downloaded (either file-release tarball or CVS tree) from the above
link. As of Oct 2008, the [90]x11vnc-0.9.5.tar.gz source package is link. As of Dec 2008, the [90]x11vnc-0.9.6.tar.gz source package is
released (recommended download). The [91]x11vnc 0.9.5 release notes. released (recommended download). The [91]x11vnc 0.9.6 release notes.
The x11vnc package is the subset of the libvncserver package needed to The x11vnc package is the subset of the libvncserver package needed to
build the x11vnc program. Also, you can get a copy of my latest, build the x11vnc program. Also, you can get a copy of my latest,
bleeding edge [92]x11vnc-0.9.6.tar.gz tarball to build the most up to bleeding edge [92]x11vnc-0.9.7.tar.gz tarball to build the most up to
date one. date one.
Precompiled Binaries/Packages: See the [93]FAQ below for information Precompiled Binaries/Packages: See the [93]FAQ below for information
@ -616,13 +616,13 @@ vncviewer -via $host localhost:0 # must be TightVNC vncviewer.
them by default.) them by default.)
If your OS has libjpeg.so and libz.so in standard locations you can If your OS has libjpeg.so and libz.so in standard locations you can
build as follows (example given for the 0.9.5 release of x11vnc: build as follows (example given for the 0.9.6 release of x11vnc:
replace with the version you downloaded): replace with the version you downloaded):
(un-tar the x11vnc+libvncserver tarball) (un-tar the x11vnc+libvncserver tarball)
# gzip -dc x11vnc-0.9.5.tar.gz | tar -xvf - # gzip -dc x11vnc-0.9.6.tar.gz | tar -xvf -
(cd to the source directory) (cd to the source directory)
# cd x11vnc-0.9.5 # cd x11vnc-0.9.6
(run configure and then run make) (run configure and then run make)
# ./configure # ./configure
@ -864,13 +864,13 @@ make
I'd appreciate any additional testing very much. I'd appreciate any additional testing very much.
Thanks to those who suggested features and helped beta test x11vnc Thanks to those who suggested features and helped beta test x11vnc
0.9.5 released in Oct 2008! 0.9.6 released in Dec 2008!
Please help test and debug the 0.9.6 version for release sometime in Please help test and debug the 0.9.7 version for release sometime in
Spring 2009. Spring 2009.
The version 0.9.6 beta tarball is kept here: The version 0.9.7 beta tarball is kept here:
[113]x11vnc-0.9.6.tar.gz [113]x11vnc-0.9.7.tar.gz
There are also some Linux, Solaris, Mac OS X, and other OS test There are also some Linux, Solaris, Mac OS X, and other OS test
binaries [114]here. Please kick the tires and report bugs, performance binaries [114]here. Please kick the tires and report bugs, performance
@ -879,7 +879,7 @@ make
To aid testing of the [116]built-in SSL/TLS support for x11vnc, a To aid testing of the [116]built-in SSL/TLS support for x11vnc, a
number of VNC Viewer packages for Unix, Mac OS X, and Windows have number of VNC Viewer packages for Unix, Mac OS X, and Windows have
been created that provide SSL Support for the TightVNC Viewer (this is been created that provide SSL Support for the TightVNC Viewer (this is
done by [117]wrapper scripts and a GUI that start [118]STUNNEL). It done by [117]wrapper scripts and a GUI that starts [118]STUNNEL). It
should be pretty convenient for automatic SSL and SSH connections. It should be pretty convenient for automatic SSL and SSH connections. It
is described in detail at and can be downloaded from the [119]Enhanced is described in detail at and can be downloaded from the [119]Enhanced
TightVNC Viewer (SSVNC) page. The SSVNC Unix viewer also supports TightVNC Viewer (SSVNC) page. The SSVNC Unix viewer also supports
@ -887,7 +887,11 @@ make
Encryption Plugin' settings panel.) Encryption Plugin' settings panel.)
Here are some features that will appear in the 0.9.6 release: Here are some features that will appear in the 0.9.7 release:
* Coming Soon!
Here are some features that appeared in the 0.9.6 release:
* Support for [121]VeNCrypt SSL/TLS encrypted connections. It is * Support for [121]VeNCrypt SSL/TLS encrypted connections. It is
enabled by default in the [122]-ssl mode. VNC Viewers like enabled by default in the [122]-ssl mode. VNC Viewers like
vinagre, gvncviewer/gtk-vnc, the vencrypt package, and others vinagre, gvncviewer/gtk-vnc, the vencrypt package, and others
@ -917,8 +921,8 @@ make
access deployment using a central Certificate Authority (CA) via access deployment using a central Certificate Authority (CA) via
[131]-sslGenCA and [132]-sslGenCert. This way if a user has his [131]-sslGenCA and [132]-sslGenCert. This way if a user has his
laptop lost or stolen, you only have to revoke his key instead of laptop lost or stolen, you only have to revoke his key instead of
creating a new Certificate Authority and redeploying keys to all creating a new Certificate Authority and redeploying new keys to
of the users. all users.
* The default SSL/TLS mode, "[133]-ssl" (no pem file parameter * The default SSL/TLS mode, "[133]-ssl" (no pem file parameter
supplied), is now the same as "-ssl SAVE" and will save the supplied), is now the same as "-ssl SAVE" and will save the
generated self-signed cert in "~/.vnc/certs/server.pem". generated self-signed cert in "~/.vnc/certs/server.pem".
@ -7670,16 +7674,24 @@ rm -f $tmp
Installation so the Installation can be done remotely? Installation so the Installation can be done remotely?
This can be done, but it doesn't always work because it depends on how This can be done, but it doesn't always work because it depends on how
the OS does its install. We have to "sneak in" somehow. Usually the OS the OS does its install. We have to "sneak in" somehow. Note that some
install will have to be a network-install in order to have networking OS's have a remote install (ssh etc.) built in and so you might want
up during the install. Otherwise, you may have a chance to configure to use that instead.
the networking manually (ifconfig(8) and route(8)).
Usually the OS install will have to be a network-install in order to
have networking up during the install. Otherwise, you may have a
(slim) chance to configure the networking manually (ifconfig(8) and
route(8)).
To avoid library dependencies problems in the typical minimal (e.g. To avoid library dependencies problems in the typical minimal (e.g.
busybox) installation OS it is a good idea to build a statically busybox) installation OS it is a good idea to build a statically
linked x11vnc binary. A way that often works is to do a normal build linked x11vnc binary. A way that often works is to do a normal build
and then paste the final x11vnc link line into a shell script. Then and then paste the final x11vnc link line into a shell script. Then
change the "gcc" to "gcc -static" and run the shell script. change the "gcc" to "gcc -static" and run the shell script. You may
need to disable features (e.g. "--without-xfixes") if there is not a
static library for the feature available. You may also need to add
extra link options (e.g. "-lXrender") to complete library dependencies
manually.
Let's call the binary x11vnc.static. Place it on a webserver Let's call the binary x11vnc.static. Place it on a webserver
somewhere. It may be possible to retrieve it via scp(1) too. somewhere. It may be possible to retrieve it via scp(1) too.
@ -7694,7 +7706,7 @@ rm -f $tmp
If it is a Linux install that uses an X server (e.g. SuSE and probably If it is a Linux install that uses an X server (e.g. SuSE and probably
Fedora), then you can often get a shell by pressing Ctrl-Alt-F2 or Fedora), then you can often get a shell by pressing Ctrl-Alt-F2 or
similar. Then get the x11vnc binary something like this: similar. Then get the x11vnc binary via something like this:
cd /tmp cd /tmp
wget http://192.168.0.22/x11vnc.static wget http://192.168.0.22/x11vnc.static
chmod 755 ./x11vnc.static chmod 755 ./x11vnc.static
@ -7707,21 +7719,32 @@ rm -f $tmp
to connect via a vnc viewer and continue the install. Watch out for to connect via a vnc viewer and continue the install. Watch out for
the display being :1, etc. the display being :1, etc.
If there is a firewall blocking incoming connections during the
install, use the [932]"-connect hostname" option option for a reverse
connection to the hostname running the VNC viewer in listen mode.
Debian based installs are either console-text or console-framebuffer Debian based installs are either console-text or console-framebuffer
based. These are install (or expert) and installgui (or expertgui) based. These are install (or expert) and installgui (or expertgui)
boot lines, respectively. For the console-text based installs you boot lines, respectively. For the console-text based installs you
probably need to add a boot cmd line option like vga=0x314 to get the probably need to add a boot cmd line option like vga=0x314 (which is
console-text to use the linux framebuffer device properly. 800x600x16) to get the console-text to use the linux framebuffer
device properly.
For a Debian console-text based install after the network is For a Debian console-text based install after the network is
configured press Ctrl-Alt-F2 to get a shell. Retrieve via wget as configured press Ctrl-Alt-F2 to get a shell. Retrieve the binary via
above. Run it something like this: wget as above and chmod 755 it. Then run it something like this:
sleep 10; ./x11vnc.static -forever -nopw -rawfb console sleep 10; ./x11vnc.static -forever -nopw -rawfb console
then before the sleep is over press Alt-F1 to get back to the install then before the sleep is over press Alt-F1 to get back to the install
virtual console. You should be able to connect via a VNC viewer and virtual console. You should be able to connect via a VNC viewer and
continue with the install. continue with the install.
For a recent (2009) Debian install we booted with "expert vga=0x301"
and "expert vga=0x311" to get console text based installs at 640x480x8
and 640x480x16, respectively (replace "expert" with "install" if you
like.) Otherwise it was giving a 16 color 640x480x4 (4 bit per pixel)
display which x11vnc could not handle.
For Debian console-framebuffer GUI based installs (installgui or For Debian console-framebuffer GUI based installs (installgui or
expertgui) we have not be able to enter keystrokes or mouse motions. expertgui) we have not be able to enter keystrokes or mouse motions.
This may be resolved if the install had the Linux kernel module This may be resolved if the install had the Linux kernel module
@ -7730,8 +7753,8 @@ rm -f $tmp
that, you can only do the GUI view-only, which can be handy to watch a that, you can only do the GUI view-only, which can be handy to watch a
long network install from your desk instead of in front of the machine long network install from your desk instead of in front of the machine
being installed. For these, after the network is configured press being installed. For these, after the network is configured press
Ctrl-Alt-F2 to get a shell. Retrieve via wget as above. Run it Ctrl-Alt-F2 to get a shell. Retrieve the binary via wget as above and
something like this: chmod 755 it. Then run it something like this:
sleep 10; ./x11vnc.static -forever -nopw -rawfb console sleep 10; ./x11vnc.static -forever -nopw -rawfb console
then before the sleep is over press Alt-F5 to get back to the GUI then before the sleep is over press Alt-F5 to get back to the GUI
@ -7746,11 +7769,11 @@ rm -f $tmp
As of Jan/2004 x11vnc supports the "CutText" part of the rfb protocol. As of Jan/2004 x11vnc supports the "CutText" part of the rfb protocol.
Furthermore, x11vnc is able to hold the PRIMARY and CLIPBOARD Furthermore, x11vnc is able to hold the PRIMARY and CLIPBOARD
selection (Xvnc does not seem to do this). If you don't want the selection (Xvnc does not seem to do this). If you don't want the
Clipboard/Selection exchanged use the [932]-nosel option. If you don't Clipboard/Selection exchanged use the [933]-nosel option. If you don't
want the PRIMARY selection to be polled for changes use the want the PRIMARY selection to be polled for changes use the
[933]-noprimary option. (with a similar thing for CLIPBOARD). You can [934]-noprimary option. (with a similar thing for CLIPBOARD). You can
also fine-tune it a bit with the [934]-seldir dir option and also also fine-tune it a bit with the [935]-seldir dir option and also
[935]-input. [936]-input.
You may need to watch out for desktop utilities such as KDE's You may need to watch out for desktop utilities such as KDE's
"Klipper" that do odd things with the selection, clipboard, and "Klipper" that do odd things with the selection, clipboard, and
@ -7762,7 +7785,7 @@ rm -f $tmp
Yes, it is possible with a number of tools that record VNC and Yes, it is possible with a number of tools that record VNC and
transform it to swf format or others. One such popular tool is transform it to swf format or others. One such popular tool is
[936]pyvnc2swf. There are a number of [937]tutorials on how to do [937]pyvnc2swf. There are a number of [938]tutorials on how to do
this. Another option is to use the vnc2mpg that comes in the this. Another option is to use the vnc2mpg that comes in the
LibVNCServer package. LibVNCServer package.
An important thing to remember when doing this is that tuning An important thing to remember when doing this is that tuning
@ -7777,11 +7800,11 @@ rm -f $tmp
(and Windows viewers only support filetransfer it appears... but they (and Windows viewers only support filetransfer it appears... but they
do work to some degree under Wine on Linux). do work to some degree under Wine on Linux).
The [938]SSVNC Unix VNC viewer supports UltraVNC file transfer by use The [939]SSVNC Unix VNC viewer supports UltraVNC file transfer by use
of a Java helper program. of a Java helper program.
TightVNC file transfer is off by default, if you want to enable it use TightVNC file transfer is off by default, if you want to enable it use
the [939]-tightfilexfer option. the [940]-tightfilexfer option.
UltraVNC file transfer is off by default, to enable it use something UltraVNC file transfer is off by default, to enable it use something
like "-rfbversion 3.6 -permitfiletransfer" like "-rfbversion 3.6 -permitfiletransfer"
@ -7804,7 +7827,7 @@ rm -f $tmp
IMPORTANT: please understand if -ultrafilexfer or -tightfilexfer is IMPORTANT: please understand if -ultrafilexfer or -tightfilexfer is
specified and you run x11vnc as root for, say, inetd or display specified and you run x11vnc as root for, say, inetd or display
manager (gdm, kdm, ...) access and you do not have it switch users via manager (gdm, kdm, ...) access and you do not have it switch users via
the [940]-users option, then VNC Viewers that connect are able to do the [941]-users option, then VNC Viewers that connect are able to do
filetransfer reads and writes as *root*. filetransfer reads and writes as *root*.
The UltraVNC and TightVNC settings can be toggled on and off inside The UltraVNC and TightVNC settings can be toggled on and off inside
@ -7823,7 +7846,7 @@ rm -f $tmp
these extensions you will need to supply this option to x11vnc: these extensions you will need to supply this option to x11vnc:
-rfbversion 3.6 -rfbversion 3.6
Or use [941]-ultrafilexfer which is an alias for the above option and Or use [942]-ultrafilexfer which is an alias for the above option and
"-permitfiletransfer". UltraVNC evidently treats any other RFB version "-permitfiletransfer". UltraVNC evidently treats any other RFB version
number as non-UltraVNC. number as non-UltraVNC.
@ -7835,14 +7858,14 @@ rm -f $tmp
* 1/n Server Scaling * 1/n Server Scaling
* rfbEncodingUltra compression encoding * rfbEncodingUltra compression encoding
The [942]SSVNC Unix VNC viewer supports these UltraVNC extensions. The [943]SSVNC Unix VNC viewer supports these UltraVNC extensions.
To disable SingleWindow and ServerInput use [943]-noultraext (the To disable SingleWindow and ServerInput use [944]-noultraext (the
others are managed by LibVNCServer). See this option too: others are managed by LibVNCServer). See this option too:
[944]-noserverdpms. [945]-noserverdpms.
Also, the [945]UltraVNC repeater proxy is supported for use with Also, the [946]UltraVNC repeater proxy is supported for use with
reverse connections: "[946]-connect repeater://host:port+ID:NNNN". Use reverse connections: "[947]-connect repeater://host:port+ID:NNNN". Use
it for both plaintext and SSL connections. This mode can send any it for both plaintext and SSL connections. This mode can send any
string before switching to the VNC protocol, and so could be used with string before switching to the VNC protocol, and so could be used with
other proxy/gateway tools. other proxy/gateway tools.
@ -7853,12 +7876,12 @@ rm -f $tmp
reverse vnc connection from their Unix desktop to a helpdesk reverse vnc connection from their Unix desktop to a helpdesk
operator's VNC Viewer. operator's VNC Viewer.
Yes, UltraVNC's [947]Single Click (SC) mode can be done fairly well on Yes, UltraVNC's [948]Single Click (SC) mode can be done fairly well on
Unix. Unix.
We use the term "helpdesk" below, but it could be any sort of remote We use the term "helpdesk" below, but it could be any sort of remote
assistance you want to set up, e.g. something for Unix-using friends assistance you want to set up, e.g. something for Unix-using friends
or family to use. This includes [948]Mac OS X. or family to use. This includes [949]Mac OS X.
Assume you create a helpdesk directory "hd" on your website: Assume you create a helpdesk directory "hd" on your website:
http://www.mysite.com/hd (any website that you can upload files to http://www.mysite.com/hd (any website that you can upload files to
@ -7914,7 +7937,7 @@ chmod 755 ./x11vnc # platform, use $webhost/`uname`/x11vnc
So I guess this is about 3-4 clicks (start a terminal and paste) and So I guess this is about 3-4 clicks (start a terminal and paste) and
pressing "Enter" instead of "single click"... pressing "Enter" instead of "single click"...
See [949]this page for some variations on this method, e.g. how to add See [950]this page for some variations on this method, e.g. how to add
a password, SSL Certificates, etc. a password, SSL Certificates, etc.
@ -7926,11 +7949,11 @@ chmod 755 ./x11vnc # platform, use $webhost/`uname`/x11vnc
A bit of obscurity security could be put in with a -passwd, -rfbauth A bit of obscurity security could be put in with a -passwd, -rfbauth
options, etc. (note that x11vnc will require a password even for options, etc. (note that x11vnc will require a password even for
reverse connections). More info [950]here. reverse connections). More info [951]here.
Firewalls: If the helpdesk (you) with the vncviewer is behind a Firewalls: If the helpdesk (you) with the vncviewer is behind a
NAT/Firewall/Router the [951]router will have to be configured to NAT/Firewall/Router the [952]router will have to be configured to
redirect a port (i.e. 5500 or maybe different one if you like) to the redirect a port (i.e. 5500 or maybe different one if you like) to the
vncviewer machine. If the vncviewer machine also has its own vncviewer machine. If the vncviewer machine also has its own
host-level firewall, you will have to open up the port there as well. host-level firewall, you will have to open up the port there as well.
@ -7940,7 +7963,7 @@ chmod 755 ./x11vnc # platform, use $webhost/`uname`/x11vnc
configuring a router to do a port redirection (i.e. on your side, the configuring a router to do a port redirection (i.e. on your side, the
HelpDesk). To avoid modifying either firewall/router, one would need HelpDesk). To avoid modifying either firewall/router, one would need
some public (IP address reachable on the internet) redirection/proxy some public (IP address reachable on the internet) redirection/proxy
service. Perhaps such a thing exists. [952]http://sc.uvnc.com provides service. Perhaps such a thing exists. [953]http://sc.uvnc.com provides
this service for their UltraVNC Single Click users. this service for their UltraVNC Single Click users.
@ -7976,7 +7999,7 @@ chmod 755 ./x11vnc # platform, use $webhost/`uname`/x11vnc
As of Apr/2007 x11vnc supports reverse connections in SSL and so we As of Apr/2007 x11vnc supports reverse connections in SSL and so we
can do this. On the Helpdesk side (Viewer) you will need STUNNEL or can do this. On the Helpdesk side (Viewer) you will need STUNNEL or
better use the [953]Enhanced TightVNC Viewer (SSVNC) package we better use the [954]Enhanced TightVNC Viewer (SSVNC) package we
provide that automates all of the SSL for you. provide that automates all of the SSL for you.
To do this create a file named "vncs" in the website "hd" directory To do this create a file named "vncs" in the website "hd" directory
@ -8006,11 +8029,11 @@ chmod 755 ./x11vnc # platform, use $webhost/`uname`/x11vnc
with the hostnames or IP addresses customized to your case. with the hostnames or IP addresses customized to your case.
The only change from the "vnc" above is the addition of the [954]-ssl The only change from the "vnc" above is the addition of the [955]-ssl
option to x11vnc. This will create a temporary SSL cert: openssl(1) option to x11vnc. This will create a temporary SSL cert: openssl(1)
will need to be installed on the user's end. A fixed SSL cert file will need to be installed on the user's end. A fixed SSL cert file
could be used to avoid this (and provide some authentication; more could be used to avoid this (and provide some authentication; more
info [955]here.) info [956]here.)
The naive user will be doing this: The naive user will be doing this:
wget -qO - http://www.mysite.com/hd/vncs | sh - wget -qO - http://www.mysite.com/hd/vncs | sh -
@ -8019,7 +8042,7 @@ chmod 755 ./x11vnc # platform, use $webhost/`uname`/x11vnc
But before that, the helpdesk operator needs to have "vncviewer But before that, the helpdesk operator needs to have "vncviewer
-listen" running as before, however he needs an SSL tunnel at his end. -listen" running as before, however he needs an SSL tunnel at his end.
The easiest way to do this is use [956]Enhanced TightVNC Viewer The easiest way to do this is use [957]Enhanced TightVNC Viewer
(SSVNC). Start it, and select Options -> 'Reverse VNC Connection (SSVNC). Start it, and select Options -> 'Reverse VNC Connection
(-listen)'. Then UN-select 'Verify All Certs' (this can be enabled (-listen)'. Then UN-select 'Verify All Certs' (this can be enabled
later if you want; you'll need the x11vnc SSL certificate), and click later if you want; you'll need the x11vnc SSL certificate), and click
@ -8049,7 +8072,7 @@ connect = localhost:5501
answer the prompts with whatever you want; you can take the default answer the prompts with whatever you want; you can take the default
for all of them if you like. The openssl(1) package must be installed. for all of them if you like. The openssl(1) package must be installed.
See [957]this link and [958]this one too for more info on SSL certs. See [958]this link and [959]this one too for more info on SSL certs.
This creates $HOME/.vnc/certs/server-self:mystunnel.pem, then you This creates $HOME/.vnc/certs/server-self:mystunnel.pem, then you
would change the "stunnel.cfg" to look something like: would change the "stunnel.cfg" to look something like:
foreground = yes foreground = yes
@ -8070,7 +8093,7 @@ connect = localhost:5501
then all bets are off!. then all bets are off!.
More SSL variations and info about certificates can be found More SSL variations and info about certificates can be found
[959]here. [960]here.
OpenSSL libssl.so.0.9.7 problems: OpenSSL libssl.so.0.9.7 problems:
@ -8080,7 +8103,7 @@ connect = localhost:5501
distros are currently a bit of a mess regarding which version of distros are currently a bit of a mess regarding which version of
libssl is installed. libssl is installed.
You will find the [960]details here. You will find the [961]details here.
Q-120: Can I (temporarily) mount my local (viewer-side) Windows/Samba Q-120: Can I (temporarily) mount my local (viewer-side) Windows/Samba
@ -8089,7 +8112,7 @@ connect = localhost:5501
You will have to use an external network redirection for this. You will have to use an external network redirection for this.
Filesystem mounting is not part of the VNC protocol. Filesystem mounting is not part of the VNC protocol.
We show a simple [961]Samba example here. We show a simple [962]Samba example here.
First you will need a tunnel to redirect the SMB requests from the First you will need a tunnel to redirect the SMB requests from the
remote machine to the one you sitting at. We use an ssh tunnel: remote machine to the one you sitting at. We use an ssh tunnel:
@ -8129,7 +8152,7 @@ d,ip=127.0.0.1,port=1139
far-away> smbumount /home/fred/smb-haystack-pub far-away> smbumount /home/fred/smb-haystack-pub
At some point we hope to fold some automation for SMB ssh redir setup At some point we hope to fold some automation for SMB ssh redir setup
into the [962]Enhanced TightVNC Viewer (SSVNC) package we provide (as into the [963]Enhanced TightVNC Viewer (SSVNC) package we provide (as
of Sep 2006 it is there for testing). of Sep 2006 it is there for testing).
@ -8139,7 +8162,7 @@ d,ip=127.0.0.1,port=1139
You will have to use an external network redirection for this. You will have to use an external network redirection for this.
Printing is not part of the VNC protocol. Printing is not part of the VNC protocol.
We show a simple Unix to Unix [963]CUPS example here. Non-CUPS port We show a simple Unix to Unix [964]CUPS example here. Non-CUPS port
redirections (e.g. LPD) should also be possible, but may be a bit more redirections (e.g. LPD) should also be possible, but may be a bit more
tricky. If you are viewing on Windows SMB and don't have a local cups tricky. If you are viewing on Windows SMB and don't have a local cups
server it may be trickier still (see below). server it may be trickier still (see below).
@ -8173,34 +8196,44 @@ d,ip=127.0.0.1,port=1139
for Host and 6631 for Port). The main setting you want to convey is for Host and 6631 for Port). The main setting you want to convey is
the host is localhost and the port is non-standard (e.g. 6631). Some the host is localhost and the port is non-standard (e.g. 6631). Some
configuration utilities will take an Internet Printing Protocol (IPP) configuration utilities will take an Internet Printing Protocol (IPP)
URI, e.g. http://localhost:6631/ipp/, URI, e.g. http://localhost:6631/printers/,
http://localhost:6631/ipp/printer-name, ipp://localhost:6631/printers/printer-name,
ipp://localhost:6631/ipp/printer-name, etc. ipp://localhost:6631/ipp/printer-name, etc. Check your CUPS
documentation and admin interfaces to find what the syntax is and what
If you do not have root privileges, but are running a recent (version the "printer name" is.
1.2 or greater) of the Cups client software, then an easy way to
temporarily switch Cups servers is to create: $HOME/.cupsrc on the If you do not have root or print admin privileges, but are running a
remote side with a line like: recent (version 1.2 or greater) of the Cups client software, then an
easy way to temporarily switch Cups servers is to create the directory
and file: $HOME/.cups/client.conf on the remote side with a line like:
ServerName localhost:6631 ServerName localhost:6631
When not using x11vnc for remote access you can comment the above line When not using x11vnc for remote access you can comment the above line
out with a '#' (or rename the cupsrc file), to have normal cups out with a '#' (or rename the client.conf file), to have normal cups
operation. operation.
Sadly, Cups client software that is older (1.1) does not support Unfortunately, running applications may need to be restarted to notice
appending the port number, and for newer ones there is a bug the new printers (libcups does not track changes in client.conf).
preventing it from always working (fixed in 1.2.3). Kludges like these Depending on circumstances, a running application may actually notice
at the command line will work: the new printers without restarting (e.g. no print dialog has taken
place yet, or there are no CUPS printers configured on the remote
side.)
Cups client software that is older (1.1) does not support appending
the port number, and for newer ones there is a bug preventing it from
always working (fixed in 1.2.3). Kludges like these at the command
line will work:
far-away> env CUPS_SERVER=localhost IPP_PORT=6631 lpstat -p -d far-away> env CUPS_SERVER=localhost IPP_PORT=6631 lpstat -p -d
far-away> env CUPS_SERVER=localhost IPP_PORT=6631 lpr -P myprinter file.ps far-away> env CUPS_SERVER=localhost IPP_PORT=6631 lpr -P myprinter file.ps
far-away> env CUPS_SERVER=localhost IPP_PORT=6631 firefox far-away> env CUPS_SERVER=localhost IPP_PORT=6631 firefox
but are somewhat awkward since you have to retroactively set the env. but are somewhat awkward since you have to retroactively set the env.
var IPP_PORT. Its value cannot be broadcast to already running apps var IPP_PORT. Its value cannot be broadcast to already running apps
(like the $HOME/.cupsrc trick does). A common workaround for an (like the $HOME/.cups/client.conf trick sometimes does). A common
already running app is to somehow get it to "Print To File", e.g. workaround for an already running app is to somehow get it to "Print
file.ps and then use something like the lpr example above. Also, the To File", e.g. file.ps and then use something like the lpr example
option "-h host:port" works with CUPS lp(1) and lpr(1). above. Also, the option "-h host:port" works with CUPS lp(1) and
lpr(1).
You can also print to Windows shares printers in principle. You may do You can also print to Windows shares printers in principle. You may do
this with the smbspool(8) command, or configure the remote CUPS via this with the smbspool(8) command, or configure the remote CUPS via
@ -8211,7 +8244,7 @@ d,ip=127.0.0.1,port=1139
"localhost". "localhost".
At some point we hope to fold some automation for CUPS ssh redir setup At some point we hope to fold some automation for CUPS ssh redir setup
into the [964]Enhanced TightVNC Viewer (SSVNC) package we provide (as into the [965]Enhanced TightVNC Viewer (SSVNC) package we provide (as
of Sep 2006 it is there for testing). of Sep 2006 it is there for testing).
@ -8312,7 +8345,7 @@ or:
the applications will fail to run because LD_PRELOAD will point to the applications will fail to run because LD_PRELOAD will point to
libraries of the wrong wordsize. libraries of the wrong wordsize.
* At some point we hope to fold some automation for esd or artsd ssh * At some point we hope to fold some automation for esd or artsd ssh
redir setup into the [965]Enhanced TightVNC Viewer (SSVNC) package redir setup into the [966]Enhanced TightVNC Viewer (SSVNC) package
we provide (as of Sep/2006 it is there for testing). we provide (as of Sep/2006 it is there for testing).
@ -8324,14 +8357,14 @@ or:
in Solaris, see Xserver(1) for how to turn it on via +kb), and so you in Solaris, see Xserver(1) for how to turn it on via +kb), and so you
won't hear them if the extension is not present. won't hear them if the extension is not present.
If you don't want to hear the beeps use the [966]-nobell option. If If you don't want to hear the beeps use the [967]-nobell option. If
you want to hear the audio from the remote applications, consider you want to hear the audio from the remote applications, consider
trying a [967]redirector such as esd. trying a [968]redirector such as esd.
Q-124: Does x11vnc work with IPv6? Q-124: Does x11vnc work with IPv6?
Currently the only way to do this is via [968]inetd. You configure Currently the only way to do this is via [969]inetd. You configure
x11vnc to be run from inetd or xinetd and instruct it to listen on an x11vnc to be run from inetd or xinetd and instruct it to listen on an
IPv6 address. For xinetd the setting "flags = IPv6" will be needed. IPv6 address. For xinetd the setting "flags = IPv6" will be needed.
@ -8340,7 +8373,7 @@ or:
connection). Some sort of ipv4-to-ipv6 redirector tool (perhaps even a connection). Some sort of ipv4-to-ipv6 redirector tool (perhaps even a
perl script) could be useful to avoid this. perl script) could be useful to avoid this.
Also note that not all VNC Viewers are [969]IPv6 enabled, so a Also note that not all VNC Viewers are [970]IPv6 enabled, so a
redirector could even be needed on the client side. redirector could even be needed on the client side.
@ -8355,7 +8388,7 @@ or:
anything) and thank you for your support! Click on the PayPal button anything) and thank you for your support! Click on the PayPal button
below for more info. below for more info.
[PayPal] [x-click-but04.gif]-Submit
References References
@ -8448,9 +8481,9 @@ References
87. http://www.karlrunge.com/x11vnc/index.html#faq-ssl-tunnel-int 87. http://www.karlrunge.com/x11vnc/index.html#faq-ssl-tunnel-int
88. http://www.karlrunge.com/x11vnc/ssvnc.html 88. http://www.karlrunge.com/x11vnc/ssvnc.html
89. http://sourceforge.net/projects/libvncserver/ 89. http://sourceforge.net/projects/libvncserver/
90. http://sourceforge.net/project/showfiles.php?group_id=32584&package_id=119006&release_id=635593 90. http://sourceforge.net/project/showfiles.php?group_id=32584&package_id=119006&release_id=646288
91. http://sourceforge.net/project/shownotes.php?release_id=635593&group_id=32584 91. http://sourceforge.net/project/shownotes.php?release_id=646288&group_id=32584
92. http://www.karlrunge.com/x11vnc/x11vnc-0.9.6.tar.gz 92. http://www.karlrunge.com/x11vnc/x11vnc-0.9.7.tar.gz
93. http://www.karlrunge.com/x11vnc/index.html#faq-binaries 93. http://www.karlrunge.com/x11vnc/index.html#faq-binaries
94. http://www.tightvnc.com/download.html 94. http://www.tightvnc.com/download.html
95. http://www.realvnc.com/download-free.html 95. http://www.realvnc.com/download-free.html
@ -8471,7 +8504,7 @@ References
110. http://www.karlrunge.com/x11vnc/index.html#faq-solaris251build 110. http://www.karlrunge.com/x11vnc/index.html#faq-solaris251build
111. http://www.karlrunge.com/x11vnc/index.html#faq-macosx 111. http://www.karlrunge.com/x11vnc/index.html#faq-macosx
112. http://www.karlrunge.com/x11vnc/index.html#faq-ssl-tunnel-int 112. http://www.karlrunge.com/x11vnc/index.html#faq-ssl-tunnel-int
113. http://www.karlrunge.com/x11vnc/x11vnc-0.9.6.tar.gz 113. http://www.karlrunge.com/x11vnc/x11vnc-0.9.7.tar.gz
114. http://www.karlrunge.com/x11vnc/bins 114. http://www.karlrunge.com/x11vnc/bins
115. mailto:xvml@karlrunge.com 115. mailto:xvml@karlrunge.com
116. http://www.karlrunge.com/x11vnc/index.html#faq-ssl-tunnel-int 116. http://www.karlrunge.com/x11vnc/index.html#faq-ssl-tunnel-int
@ -9290,44 +9323,45 @@ References
929. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-connect 929. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-connect
930. http://www.karlrunge.com/x11vnc/index.html#faq-display-manager 930. http://www.karlrunge.com/x11vnc/index.html#faq-display-manager
931. http://www.karlrunge.com/x11vnc/index.html#faq-display-manager 931. http://www.karlrunge.com/x11vnc/index.html#faq-display-manager
932. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-nosel 932. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-connect
933. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-noprimary 933. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-nosel
934. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-seldir 934. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-noprimary
935. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-input 935. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-seldir
936. http://www.unixuser.org/~euske/vnc2swf/ 936. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-input
937. http://wolphination.com/linux/2006/06/30/how-to-record-videos-of-your-desktop/ 937. http://www.unixuser.org/~euske/vnc2swf/
938. http://www.karlrunge.com/x11vnc/ssvnc.html 938. http://wolphination.com/linux/2006/06/30/how-to-record-videos-of-your-desktop/
939. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-tightfilexfer 939. http://www.karlrunge.com/x11vnc/ssvnc.html
940. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-users 940. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-tightfilexfer
941. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-ultrafilexfer 941. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-users
942. http://www.karlrunge.com/x11vnc/ssvnc.html 942. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-ultrafilexfer
943. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-noultraext 943. http://www.karlrunge.com/x11vnc/ssvnc.html
944. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-noserverdpms 944. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-noultraext
945. http://www.uvnc.com/addons/repeater.html 945. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-noserverdpms
946. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-connect 946. http://www.uvnc.com/addons/repeater.html
947. http://www.uvnc.com/addons/singleclick.html 947. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-connect
948. http://www.karlrunge.com/x11vnc/index.html#faq-macosx 948. http://www.uvnc.com/addons/singleclick.html
949. http://www.karlrunge.com/x11vnc/single-click.html 949. http://www.karlrunge.com/x11vnc/index.html#faq-macosx
950. http://www.karlrunge.com/x11vnc/single-click.html 950. http://www.karlrunge.com/x11vnc/single-click.html
951. http://www.karlrunge.com/x11vnc/index.html#firewalls 951. http://www.karlrunge.com/x11vnc/single-click.html
952. http://sc.uvnc.com/ 952. http://www.karlrunge.com/x11vnc/index.html#firewalls
953. http://www.karlrunge.com/x11vnc/ssvnc.html 953. http://sc.uvnc.com/
954. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-ssl 954. http://www.karlrunge.com/x11vnc/ssvnc.html
955. http://www.karlrunge.com/x11vnc/single-click.html 955. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-ssl
956. http://www.karlrunge.com/x11vnc/ssvnc.html 956. http://www.karlrunge.com/x11vnc/single-click.html
957. http://www.karlrunge.com/x11vnc/single-click.html 957. http://www.karlrunge.com/x11vnc/ssvnc.html
958. http://www.karlrunge.com/x11vnc/ssl.html 958. http://www.karlrunge.com/x11vnc/single-click.html
959. http://www.karlrunge.com/x11vnc/single-click.html 959. http://www.karlrunge.com/x11vnc/ssl.html
960. http://www.karlrunge.com/x11vnc/single-click.html#libssl-problems 960. http://www.karlrunge.com/x11vnc/single-click.html
961. http://www.samba.org/ 961. http://www.karlrunge.com/x11vnc/single-click.html#libssl-problems
962. http://www.karlrunge.com/x11vnc/ssvnc.html 962. http://www.samba.org/
963. http://www.cups.org/ 963. http://www.karlrunge.com/x11vnc/ssvnc.html
964. http://www.karlrunge.com/x11vnc/ssvnc.html 964. http://www.cups.org/
965. http://www.karlrunge.com/x11vnc/ssvnc.html 965. http://www.karlrunge.com/x11vnc/ssvnc.html
966. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-nobell 966. http://www.karlrunge.com/x11vnc/ssvnc.html
967. http://www.karlrunge.com/x11vnc/index.html#faq-sound 967. http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-nobell
968. http://www.karlrunge.com/x11vnc/index.html#faq-inetd 968. http://www.karlrunge.com/x11vnc/index.html#faq-sound
969. http://jungla.dit.upm.es/~acosta/paginas/vncIPv6.html 969. http://www.karlrunge.com/x11vnc/index.html#faq-inetd
970. http://jungla.dit.upm.es/~acosta/paginas/vncIPv6.html
======================================================================= =======================================================================
http://www.karlrunge.com/x11vnc/chainingssh.html: http://www.karlrunge.com/x11vnc/chainingssh.html:
@ -11267,7 +11301,7 @@ Enhanced TightVNC Viewer (SSVNC: SSL/SSH VNC viewer)
connecting. connecting.
* Support for native MacOS X usage with bundled Chicken of the VNC * Support for native MacOS X usage with bundled Chicken of the VNC
viewer (the Unix X11 viewer is also provided for MacOS X, and is viewer (the Unix X11 viewer is also provided for MacOS X, and is
better IMHO). better IMHO. It is now the default on MacOS X.)
* [15]Dynamic VNC Server Port determination and redirection (using * [15]Dynamic VNC Server Port determination and redirection (using
ssh's builtin SOCKS proxy, ssh -D) for servers like x11vnc that ssh's builtin SOCKS proxy, ssh -D) for servers like x11vnc that
print out PORT= at startup. print out PORT= at startup.
@ -11741,12 +11775,27 @@ Enhanced TightVNC viewer (SSVNC) options:
a floating point ratio, e.g. "0.9", or a fraction, a floating point ratio, e.g. "0.9", or a fraction,
e.g. "3/4", or WxH, e.g. 1280x1024. Use "fit" e.g. "3/4", or WxH, e.g. 1280x1024. Use "fit"
to fit in the current screen size. Use "auto" to to fit in the current screen size. Use "auto" to
fit in the window size. fit in the window size. "str" can also be set by
Note that scaling is done in software and can be slow
and requires more memory. "str" can also be set by
the env. var. SSVNC_SCALE. the env. var. SSVNC_SCALE.
If you observe mouse trail painting errors, enable
X11 Cursor mode (either via Popup or -x11cursor.)
Note that scaling is done in software and so can be
slow and requires more memory. Some speedup Tips:
ZRLE is faster than Tight in this mode. When
scaling is first detected, the encoding will
be automatically switched to ZRLE. Use the
Popup menu if you want to go back to Tight.
Set SSVNC_PRESERVE_ENCODING=1 to disable this.
Use a solid background on the remote side.
(e.g. manually or via x11vnc -solid ...)
If the remote server is x11vnc, try client
side caching: x11vnc -ncache 10 ...
-ycrop n Only show the top n rows of the framebuffer. For -ycrop n Only show the top n rows of the framebuffer. For
use with x11vnc -ncache client caching option use with x11vnc -ncache client caching option
to help "hide" the pixel cache region. to help "hide" the pixel cache region.
@ -12217,7 +12266,7 @@ x11vnc: a VNC server for real X displays
Here are all of x11vnc command line options: Here are all of x11vnc command line options:
% x11vnc -opts (see below for -help long descriptions) % x11vnc -opts (see below for -help long descriptions)
x11vnc: allow VNC connections to real X11 displays. 0.9.6 lastmod: 2008-12-08 x11vnc: allow VNC connections to real X11 displays. 0.9.7 lastmod: 2009-01-03
x11vnc options: x11vnc options:
-display disp -auth file -N -display disp -auth file -N
@ -12257,57 +12306,57 @@ x11vnc options:
-blackout string -xinerama -noxinerama -blackout string -xinerama -noxinerama
-xtrap -xrandr [mode] -rotate string -xtrap -xrandr [mode] -rotate string
-padgeom WxH -o logfile -flag file -padgeom WxH -o logfile -flag file
-rc filename -norc -env VAR=VALUE -rmflag file -rc filename -norc
-prog /path/to/x11vnc -h, -help -?, -opts -env VAR=VALUE -prog /path/to/x11vnc -h, -help
-V, -version -license -dbg -?, -opts -V, -version -license
-q, -quiet -v, -verbose -bg -dbg -q, -quiet -v, -verbose
-modtweak -nomodtweak -xkb -bg -modtweak -nomodtweak
-noxkb -capslock -skip_lockkeys -xkb -noxkb -capslock
-skip_keycodes string -sloppy_keys -skip_dups -skip_lockkeys -skip_keycodes string -sloppy_keys
-noskip_dups -add_keysyms -noadd_keysyms -skip_dups -noskip_dups -add_keysyms
-clear_mods -clear_keys -clear_all -noadd_keysyms -clear_mods -clear_keys
-remap string -norepeat -repeat -clear_all -remap string -norepeat
-nofb -nobell -nosel -repeat -nofb -nobell
-noprimary -nosetprimary -noclipboard -nosel -noprimary -nosetprimary
-nosetclipboard -seldir string -cursor [mode] -noclipboard -nosetclipboard -seldir string
-nocursor -cursor_drag -arrow n -cursor [mode] -nocursor -cursor_drag
-noxfixes -alphacut n -alphafrac fraction -arrow n -noxfixes -alphacut n
-alpharemove -noalphablend -nocursorshape -alphafrac fraction -alpharemove -noalphablend
-cursorpos -nocursorpos -xwarppointer -nocursorshape -cursorpos -nocursorpos
-noxwarppointer -buttonmap string -nodragging -xwarppointer -noxwarppointer -buttonmap string
-ncache n -ncache_cr -ncache_no_moveraise -nodragging -ncache n -ncache_cr
-ncache_no_dtchange -ncache_no_rootpixmap -ncache_keep_anims -ncache_no_moveraise -ncache_no_dtchange -ncache_no_rootpixmap
-ncache_old_wm -ncache_pad n -debug_ncache -ncache_keep_anims -ncache_old_wm -ncache_pad n
-wireframe [str] -nowireframe -nowireframelocal -debug_ncache -wireframe [str] -nowireframe
-wirecopyrect mode -nowirecopyrect -debug_wireframe -nowireframelocal -wirecopyrect mode -nowirecopyrect
-scrollcopyrect mode -noscrollcopyrect -scr_area n -debug_wireframe -scrollcopyrect mode -noscrollcopyrect
-scr_skip list -scr_inc list -scr_keys list -scr_area n -scr_skip list -scr_inc list
-scr_term list -scr_keyrepeat lo-hi -scr_parms string -scr_keys list -scr_term list -scr_keyrepeat lo-hi
-fixscreen string -debug_scroll -noxrecord -scr_parms string -fixscreen string -debug_scroll
-grab_buster -nograb_buster -debug_grabs -noxrecord -grab_buster -nograb_buster
-debug_sel -pointer_mode n -input_skip n -debug_grabs -debug_sel -pointer_mode n
-allinput -speeds rd,bw,lat -wmdt string -input_skip n -allinput -speeds rd,bw,lat
-debug_pointer -debug_keyboard -defer time -wmdt string -debug_pointer -debug_keyboard
-wait time -wait_ui factor -setdefer n -defer time -wait time -wait_ui factor
-nowait_bog -slow_fb time -xrefresh time -setdefer n -nowait_bog -slow_fb time
-nap -nonap -sb time -xrefresh time -nap -nonap
-readtimeout n -ping n -nofbpm -sb time -readtimeout n -ping n
-fbpm -nodpms -dpms -nofbpm -fbpm -nodpms
-forcedpms -clientdpms -noserverdpms -dpms -forcedpms -clientdpms
-noultraext -chatwindow -noxdamage -noserverdpms -noultraext -chatwindow
-xd_area A -xd_mem f -sigpipe string -noxdamage -xd_area A -xd_mem f
-threads -nothreads -fs f -sigpipe string -threads -nothreads
-gaps n -grow n -fuzz n -fs f -gaps n -grow n
-debug_tiles -snapfb -rawfb string -fuzz n -debug_tiles -snapfb
-freqtab file -pipeinput cmd -macnodim -rawfb string -freqtab file -pipeinput cmd
-macnosleep -macnosaver -macnowait -macnodim -macnosleep -macnosaver
-macwheel n -macnoswap -macnoresize -macnowait -macwheel n -macnoswap
-maciconanim n -macmenu -macuskbd -macnoresize -maciconanim n -macmenu
-gui [gui-opts] -remote command -query variable -macuskbd -gui [gui-opts] -remote command
-QD variable -sync -noremote -query variable -QD variable -sync
-yesremote -unsafe -safer -noremote -yesremote -unsafe
-privremote -nocmds -allowedcmds list -safer -privremote -nocmds
-deny_all -allowedcmds list -deny_all
libvncserver options: libvncserver options:
-rfbport port TCP port for RFB protocol -rfbport port TCP port for RFB protocol
@ -12341,7 +12390,7 @@ libvncserver-tight-extension options:
% x11vnc -help % x11vnc -help
x11vnc: allow VNC connections to real X11 displays. 0.9.6 lastmod: 2008-12-08 x11vnc: allow VNC connections to real X11 displays. 0.9.7 lastmod: 2009-01-03
(type "x11vnc -opts" to just list the options.) (type "x11vnc -opts" to just list the options.)
@ -14786,6 +14835,13 @@ t
"file" in addition to stdout. This option could be "file" in addition to stdout. This option could be
useful by wrapper script to detect when x11vnc is ready. useful by wrapper script to detect when x11vnc is ready.
-rmflag file Remove "file" at exit to signal when x11vnc is done.
The file is created at startup if it does not already
exist or if "file" is prefixed with "create:".
If the file is created, the x11vnc PID is placed in
the file. Otherwise the files contents is not changed.
Use prefix "nocreate:" to prevent creation.
-rc filename Use "filename" instead of $HOME/.x11vncrc for rc file. -rc filename Use "filename" instead of $HOME/.x11vncrc for rc file.
-norc Do not process any .x11vncrc file for options. -norc Do not process any .x11vncrc file for options.
@ -15914,16 +15970,18 @@ t
-rawfb string Instead of polling X, poll the memory object specified -rawfb string Instead of polling X, poll the memory object specified
in "string". in "string".
For file polling to memory map mmap(2) a file use: For file polling, to memory map mmap(2) a file use:
"map:/path/to/a/file@WxHxB", with framebuffer Width, "map:/path/to/a/file@WxHxB", with framebuffer Width,
Height, and Bits per pixel. "mmap:..." is the Height, and Bits per pixel. "mmap:..." is the
same. same.
If there is trouble with mmap, use "file:/..." If there is trouble with mmap, use "file:/..."
for slower lseek(2) based reading. Use "snap:..." for slower lseek(2) based reading.
to imply -snapfb mode and the "file:" access (this
is for unseekable devices that only provide the fb all Use "snap:..." to imply -snapfb mode and the "file:"
at once, e.g. a video camera provides the whole frame). access (this is for unseekable devices that only provide
the fb all at once, e.g. a video camera provides the
whole frame).
For shared memory segments string is of the form: For shared memory segments string is of the form:
"shm:N@WxHxB" which specifies a shmid N and with "shm:N@WxHxB" which specifies a shmid N and with
@ -15943,25 +16001,29 @@ t
discussion below where the device may be queried for discussion below where the device may be queried for
(and possibly set) the framebuffer parameters. (and possibly set) the framebuffer parameters.
If the string begins with "console", "/dev/fb", or If the string begins with "console", "/dev/fb",
"fb", see the LINUX CONSOLE discussion below where "fb", or "vt", see the LINUX CONSOLE discussion
the framebuffer device is opened and keystrokes (and below where the framebuffer device is opened and
possibly mouse events) are inserted into the console. keystrokes (and possibly mouse events) are inserted
into the console.
If the string begins with "vnc", see the VNC HOST If the string begins with "vnc", see the VNC HOST
discussion below where the framebuffer is taken as that discussion below where the framebuffer is taken as that
of another remote VNC server. of another remote VNC server.
Optional suffixes are ":R/G/B" and "+O" to specify Optional suffixes are ":R/G/B" and "+O" to specify
red, green, and blue masks and an offset into the red, green, and blue masks (in hex) and an offset into
memory object. If the masks are not provided x11vnc the memory object. If the masks are not provided x11vnc
guesses them based on the bpp. guesses them based on the bpp (if the colors look wrong,
you need to provide the masks.)
Another optional suffix is the Bytes Per Line which in Another optional suffix is the Bytes Per Line which in
some cases is not WxB/4. Specify it as WxHxB-BPL some cases is not WxB/8. Specify it as WxHxB-BPL
e.g. 800x600x16-2048. This could be a normal width e.g. 800x600x16-2048. This could be a normal width
1024 at 16bpp fb, but only width 800 shows up. 1024 at 16bpp fb, but only width 800 shows up.
So the full format is: mode:file@WxHxB:R/G/B+O-BPL
Examples: Examples:
-rawfb shm:210337933@800x600x32:ff/ff00/ff0000 -rawfb shm:210337933@800x600x32:ff/ff00/ff0000
-rawfb map:/dev/fb0@1024x768x32 -rawfb map:/dev/fb0@1024x768x32
@ -15972,6 +16034,7 @@ t
-rawfb video0 -rawfb video0
-rawfb video -pipeinput VID -rawfb video -pipeinput VID
-rawfb console -rawfb console
-rawfb vt2
-rawfb vnc:somehost:0 -rawfb vnc:somehost:0
(see ipcs(1) and fbset(1) for the first two examples) (see ipcs(1) and fbset(1) for the first two examples)
@ -15995,7 +16058,7 @@ t
If the device is not "seekable" (e.g. webcam) try If the device is not "seekable" (e.g. webcam) try
reading it all at once in full snaps via the "snap:" reading it all at once in full snaps via the "snap:"
mode (note: this is a resource hog). If you are using mode (note: this is a resource hog). If you are using
file: or map: and the device needs to be reopened for file: or map: AND the device needs to be reopened for
*every* snapfb snapshot, set the environment variable: *every* snapfb snapshot, set the environment variable:
SNAPFB_RAWFB_RESET=1 as well. SNAPFB_RAWFB_RESET=1 as well.
@ -16006,6 +16069,25 @@ t
24bpp packed RGB. This is the default under "video" 24bpp packed RGB. This is the default under "video"
mode if the bpp is 24. mode if the bpp is 24.
Normally the bits per pixel, B, is 8, 16, or 32 (or
rarely 24), however there is also some support for
B < 8 (e.g. old graphics displays 4 bpp or 1 bpp).
In this case you certainly must supply the masks as
well: WxHxB:R/G/B. The pixels will be padded out to
8 bpp using depth 8 truecolor. The scheme currently
does not work with snap fb (ask if interested.) B=1
monochrome example: file:/dev/urandom@128x128x1:1/1/1
Some other like this are 128x128x2:3/3/3 128x128x4:7/7/7
For B < 8 framebuffers you can also set the env. var
RAWFB_CGA=1 to try a CGA mapping for B=4 (e.g. linux
vga16fb driver.) Note with low bpp and/or resolution
VGA and VGA16 modes on the Linux console one's attempt
to export them via x11vnc can often be thwarted due to
special color palettes, pixel packings, and even video
painting buffering. OTOH, often experimenting with the
RGB masks can yield something recognizable.
VIDEO4LINUX: on Linux some attempt is made to handle VIDEO4LINUX: on Linux some attempt is made to handle
video devices (webcams or TV tuners) automatically. video devices (webcams or TV tuners) automatically.
The idea is the WxHxB will be extracted from the The idea is the WxHxB will be extracted from the
@ -16092,37 +16174,76 @@ t
is not queried for the current values. Otherwise the is not queried for the current values. Otherwise the
device will be queried. device will be queried.
LINUX CONSOLE: If the libvncserver LinuxVNC program LINUX CONSOLE: The following describes some ways to
is on your system you may want to use that instead of view and possibly interact with the Linux text/graphics
the following method because it will be faster and more console (i.e. not X11 XFree86/Xorg)
accurate for Linux text console.
Note: If the libvncserver LinuxVNC program is on your
system you may want to use that instead of the following
method because it will be faster and more accurate
for the Linux text console and includes mouse support.
There is, however, the basic LinuxVNC functionality in
x11vnc if you replace "console" with "vt" in the
examples below.
If the rawfb string begins with "console" the If the rawfb string begins with "console" the
framebuffer device /dev/fb0 is opened (this requires framebuffer device /dev/fb0 is opened and /dev/tty0 is
the appropriate kernel modules to be installed) and so opened too. The latter is used to inject keystrokes
is /dev/tty0. The latter is used to inject keystrokes
(not all are supported, but the basic ones are). (not all are supported, but the basic ones are).
You will need to be root to inject keystrokes. You will need to be root to inject keystrokes, but
/dev/tty0 refers to the active VT, to indicate one not necessarily to open /dev/fb0. /dev/tty0 refers to
explicitly, use "console2", etc. using the VT number. the active VT, to indicate one explicitly, use, e.g.,
"console2" for /dev/tty2, etc. by indicating the
If the Linux version seems to be 2.6 or later and the specific VT number.
"uinput" module appears to be present, then the uinput
method will be used instead of /dev/ttyN. uinput allows For the Linux framebuffer device, /dev/fb0, (fb1,
insertion of BOTH keystrokes and mouse input and so it etc) to be enabled the appropriate kernel drivers must
preferred when accessing graphical (e.g. QT-embedded) be loaded. E.g. vesafb or vga16fb and also by setting
linux console apps. See -pipeinput UINPUT below for the boot parameter vga=0x301 (or 0x314, 0x317, etc.)
more information on this mode; you will have to use (The vga=... method is the preferred way; set your
-pipeinput if you want to tweak any UINPUT parameters. machines up that way.) Otherwise there will be a
You may also want to also use the -nodragging and 'No such device' error. You can also load a Linux
-cursor none options. Use "console0", etc or framebuffer driver specific to your make of video card
-pipeinput CONSOLE to force the /dev/ttyN method. for more functionality. Once the machine is booted one
can often 'modprobe' the fb driver as root to obtain
Note you can change VT remotely using the chvt(1) a framebuffer device.
command. Sometimes switching out and back corrects
the framebuffer state. If you cannot get /dev/fb0 working on Linux, try
using the LinuxVNC emulation mode by "-rawfb vtN"
To skip input injecting entirely use "consolex". where N = 1, ... 6 is the Linux Virtual Terminal (aka
virtual console) you wish to view, e.g. "-rawfb vt2".
Unlike /dev/fb mode, it need not be the active Virtual
Terminal. Note that this mode can only show text and
not graphics. x11vnc polls the text in /dev/vcsaN
Set the env. var. RAWFB_VCSA_BW=1 to disable colors in
the "vtN" mode (i.e. black and white only.) If you
do not prefer the default 16bpp set RAWFB_VCSA_BPP to
8 or 32. If you need to tweak the rawfb parameters by
using the 'console_guess' string printed at startup,
be sure to indicate the snap: method.
uinput: If the Linux version appears to be 2.6 or
later and the "uinput" module appears to be present
(modprobe uinput), then the uinput method will be used
instead of /dev/ttyN. uinput allows insertion of BOTH
keystrokes and mouse input and so it preferred when
accessing graphical (e.g. QT-embedded) linux console
apps. See -pipeinput UINPUT below for more information
on this mode; you will have to use -pipeinput if you
want to tweak any UINPUT parameters. You may also want
to also use the -nodragging and -cursor none options.
Use "console0", etc or -pipeinput CONSOLE to force
the /dev/ttyN method.
Note you can change the Linux VT remotely using the
chvt(1) command to make the one you want be the active
one (e.g. 'chvt 3'). Sometimes switching out and back
corrects the framebuffer's graphics state. For the
"-rawfb vtN" mode there is no need to switch the VT's.
To skip input injecting entirely use "consolex"
or "vtx".
The string "/dev/fb0" (1, etc.) can be used instead The string "/dev/fb0" (1, etc.) can be used instead
of "console". This can be used to specify a different of "console". This can be used to specify a different
@ -16132,8 +16253,8 @@ t
If you do not want x11vnc to guess the framebuffer's If you do not want x11vnc to guess the framebuffer's
WxHxB and masks automatically (sometimes the kernel WxHxB and masks automatically (sometimes the kernel
gives inaccurate information), specify them with a gives incorrect information), specify them with a @WxHxB
@WxHxB at the end of the string. (and optional :R/G/B masks) at the end of the string.
Examples: Examples:
-rawfb console -rawfb console
@ -16142,6 +16263,7 @@ t
-rawfb consolex (no keystrokes or mouse) -rawfb consolex (no keystrokes or mouse)
-rawfb console:/dev/nonstd -rawfb console:/dev/nonstd
-rawfb console -pipeinput UINPUT:accel=4.0 -rawfb console -pipeinput UINPUT:accel=4.0
-rawfb vt3 (/dev/tty3 w/o /dev/fb0)
VNC HOST: if the -rawfb string is of the form VNC HOST: if the -rawfb string is of the form
"vnc:host:N" then the VNC display "N" on the remote "vnc:host:N" then the VNC display "N" on the remote

@ -155,7 +155,13 @@ void clean_up_exit(int ret) {
pipeinput_fh = NULL; pipeinput_fh = NULL;
} }
if (! dpy) exit(ret); /* raw_rb hack */ if (! dpy) { /* raw_rb hack */
if (rm_flagfile) {
unlink(rm_flagfile);
rm_flagfile = NULL;
}
exit(ret);
}
/* X keyboard cleanups */ /* X keyboard cleanups */
delete_added_keycodes(0); delete_added_keycodes(0);
@ -195,6 +201,12 @@ void clean_up_exit(int ret) {
X_UNLOCK; X_UNLOCK;
fflush(stderr); fflush(stderr);
if (rm_flagfile) {
unlink(rm_flagfile);
rm_flagfile = NULL;
}
exit(ret); exit(ret);
} }
@ -452,6 +464,10 @@ static void interrupted (int sig) {
} else if (exit_flag <= 2) { } else if (exit_flag <= 2) {
return; return;
} }
if (rm_flagfile) {
unlink(rm_flagfile);
rm_flagfile = NULL;
}
exit(4); exit(4);
} }
exit_flag++; exit_flag++;
@ -482,6 +498,10 @@ static void interrupted (int sig) {
if (sig == -1) { if (sig == -1) {
/* not worth trying any more cleanup, X server probably gone */ /* not worth trying any more cleanup, X server probably gone */
if (rm_flagfile) {
unlink(rm_flagfile);
rm_flagfile = NULL;
}
exit(3); exit(3);
} }
@ -512,6 +532,10 @@ static void interrupted (int sig) {
} }
if (sig) { if (sig) {
if (rm_flagfile) {
unlink(rm_flagfile);
rm_flagfile = NULL;
}
exit(2); exit(2);
} }
} }

@ -2263,8 +2263,6 @@ char *get_repeater_string(char *str, int *len) {
* Do a reverse connect for a single "host" or "host:port" * Do a reverse connect for a single "host" or "host:port"
*/ */
extern int ssl_client_mode;
static int do_reverse_connect(char *str_in) { static int do_reverse_connect(char *str_in) {
rfbClientPtr cl; rfbClientPtr cl;
char *host, *p, *str = str_in, *s = NULL; char *host, *p, *str = str_in, *s = NULL;

@ -2471,6 +2471,13 @@ void print_help(int mode) {
" \"file\" in addition to stdout. This option could be\n" " \"file\" in addition to stdout. This option could be\n"
" useful by wrapper script to detect when x11vnc is ready.\n" " useful by wrapper script to detect when x11vnc is ready.\n"
"\n" "\n"
"-rmflag file Remove \"file\" at exit to signal when x11vnc is done.\n"
" The file is created at startup if it does not already\n"
" exist or if \"file\" is prefixed with \"create:\".\n"
" If the file is created, the x11vnc PID is placed in\n"
" the file. Otherwise the files contents is not changed.\n"
" Use prefix \"nocreate:\" to prevent creation.\n"
"\n"
"-rc filename Use \"filename\" instead of $HOME/.x11vncrc for rc file.\n" "-rc filename Use \"filename\" instead of $HOME/.x11vncrc for rc file.\n"
"-norc Do not process any .x11vncrc file for options.\n" "-norc Do not process any .x11vncrc file for options.\n"
"\n" "\n"
@ -3599,16 +3606,18 @@ void print_help(int mode) {
"-rawfb string Instead of polling X, poll the memory object specified\n" "-rawfb string Instead of polling X, poll the memory object specified\n"
" in \"string\".\n" " in \"string\".\n"
"\n" "\n"
" For file polling to memory map mmap(2) a file use:\n" " For file polling, to memory map mmap(2) a file use:\n"
" \"map:/path/to/a/file@WxHxB\", with framebuffer Width,\n" " \"map:/path/to/a/file@WxHxB\", with framebuffer Width,\n"
" Height, and Bits per pixel. \"mmap:...\" is the\n" " Height, and Bits per pixel. \"mmap:...\" is the\n"
" same.\n" " same.\n"
"\n" "\n"
" If there is trouble with mmap, use \"file:/...\"\n" " If there is trouble with mmap, use \"file:/...\"\n"
" for slower lseek(2) based reading. Use \"snap:...\"\n" " for slower lseek(2) based reading.\n"
" to imply -snapfb mode and the \"file:\" access (this\n" "\n"
" is for unseekable devices that only provide the fb all\n" " Use \"snap:...\" to imply -snapfb mode and the \"file:\"\n"
" at once, e.g. a video camera provides the whole frame).\n" " access (this is for unseekable devices that only provide\n"
" the fb all at once, e.g. a video camera provides the\n"
" whole frame).\n"
"\n" "\n"
" For shared memory segments string is of the form:\n" " For shared memory segments string is of the form:\n"
" \"shm:N@WxHxB\" which specifies a shmid N and with\n" " \"shm:N@WxHxB\" which specifies a shmid N and with\n"
@ -3628,25 +3637,29 @@ void print_help(int mode) {
" discussion below where the device may be queried for\n" " discussion below where the device may be queried for\n"
" (and possibly set) the framebuffer parameters.\n" " (and possibly set) the framebuffer parameters.\n"
"\n" "\n"
" If the string begins with \"console\", \"/dev/fb\", or\n" " If the string begins with \"console\", \"/dev/fb\",\n"
" \"fb\", see the LINUX CONSOLE discussion below where\n" " \"fb\", or \"vt\", see the LINUX CONSOLE discussion\n"
" the framebuffer device is opened and keystrokes (and\n" " below where the framebuffer device is opened and\n"
" possibly mouse events) are inserted into the console.\n" " keystrokes (and possibly mouse events) are inserted\n"
" into the console.\n"
"\n" "\n"
" If the string begins with \"vnc\", see the VNC HOST\n" " If the string begins with \"vnc\", see the VNC HOST\n"
" discussion below where the framebuffer is taken as that\n" " discussion below where the framebuffer is taken as that\n"
" of another remote VNC server.\n" " of another remote VNC server.\n"
"\n" "\n"
" Optional suffixes are \":R/G/B\" and \"+O\" to specify\n" " Optional suffixes are \":R/G/B\" and \"+O\" to specify\n"
" red, green, and blue masks and an offset into the\n" " red, green, and blue masks (in hex) and an offset into\n"
" memory object. If the masks are not provided x11vnc\n" " the memory object. If the masks are not provided x11vnc\n"
" guesses them based on the bpp.\n" " guesses them based on the bpp (if the colors look wrong,\n"
" you need to provide the masks.)\n"
"\n" "\n"
" Another optional suffix is the Bytes Per Line which in\n" " Another optional suffix is the Bytes Per Line which in\n"
" some cases is not WxB/4. Specify it as WxHxB-BPL\n" " some cases is not WxB/8. Specify it as WxHxB-BPL\n"
" e.g. 800x600x16-2048. This could be a normal width\n" " e.g. 800x600x16-2048. This could be a normal width\n"
" 1024 at 16bpp fb, but only width 800 shows up.\n" " 1024 at 16bpp fb, but only width 800 shows up.\n"
"\n" "\n"
" So the full format is: mode:file@WxHxB:R/G/B+O-BPL\n"
"\n"
" Examples:\n" " Examples:\n"
" -rawfb shm:210337933@800x600x32:ff/ff00/ff0000\n" " -rawfb shm:210337933@800x600x32:ff/ff00/ff0000\n"
" -rawfb map:/dev/fb0@1024x768x32\n" " -rawfb map:/dev/fb0@1024x768x32\n"
@ -3657,6 +3670,7 @@ void print_help(int mode) {
" -rawfb video0\n" " -rawfb video0\n"
" -rawfb video -pipeinput VID\n" " -rawfb video -pipeinput VID\n"
" -rawfb console\n" " -rawfb console\n"
" -rawfb vt2\n"
" -rawfb vnc:somehost:0\n" " -rawfb vnc:somehost:0\n"
"\n" "\n"
" (see ipcs(1) and fbset(1) for the first two examples)\n" " (see ipcs(1) and fbset(1) for the first two examples)\n"
@ -3680,7 +3694,7 @@ void print_help(int mode) {
" If the device is not \"seekable\" (e.g. webcam) try\n" " If the device is not \"seekable\" (e.g. webcam) try\n"
" reading it all at once in full snaps via the \"snap:\"\n" " reading it all at once in full snaps via the \"snap:\"\n"
" mode (note: this is a resource hog). If you are using\n" " mode (note: this is a resource hog). If you are using\n"
" file: or map: and the device needs to be reopened for\n" " file: or map: AND the device needs to be reopened for\n"
" *every* snapfb snapshot, set the environment variable:\n" " *every* snapfb snapshot, set the environment variable:\n"
" SNAPFB_RAWFB_RESET=1 as well.\n" " SNAPFB_RAWFB_RESET=1 as well.\n"
"\n" "\n"
@ -3691,6 +3705,25 @@ void print_help(int mode) {
" 24bpp packed RGB. This is the default under \"video\"\n" " 24bpp packed RGB. This is the default under \"video\"\n"
" mode if the bpp is 24.\n" " mode if the bpp is 24.\n"
"\n" "\n"
" Normally the bits per pixel, B, is 8, 16, or 32 (or\n"
" rarely 24), however there is also some support for\n"
" B < 8 (e.g. old graphics displays 4 bpp or 1 bpp).\n"
" In this case you certainly must supply the masks as\n"
" well: WxHxB:R/G/B. The pixels will be padded out to\n"
" 8 bpp using depth 8 truecolor. The scheme currently\n"
" does not work with snap fb (ask if interested.) B=1\n"
" monochrome example: file:/dev/urandom@128x128x1:1/1/1\n"
" Some other like this are 128x128x2:3/3/3 128x128x4:7/7/7\n"
"\n"
" For B < 8 framebuffers you can also set the env. var\n"
" RAWFB_CGA=1 to try a CGA mapping for B=4 (e.g. linux\n"
" vga16fb driver.) Note with low bpp and/or resolution\n"
" VGA and VGA16 modes on the Linux console one's attempt\n"
" to export them via x11vnc can often be thwarted due to\n"
" special color palettes, pixel packings, and even video\n"
" painting buffering. OTOH, often experimenting with the\n"
" RGB masks can yield something recognizable.\n"
"\n"
" VIDEO4LINUX: on Linux some attempt is made to handle\n" " VIDEO4LINUX: on Linux some attempt is made to handle\n"
" video devices (webcams or TV tuners) automatically.\n" " video devices (webcams or TV tuners) automatically.\n"
" The idea is the WxHxB will be extracted from the\n" " The idea is the WxHxB will be extracted from the\n"
@ -3777,37 +3810,76 @@ void print_help(int mode) {
" is not queried for the current values. Otherwise the\n" " is not queried for the current values. Otherwise the\n"
" device will be queried.\n" " device will be queried.\n"
"\n" "\n"
" LINUX CONSOLE: If the libvncserver LinuxVNC program\n" " LINUX CONSOLE: The following describes some ways to\n"
" is on your system you may want to use that instead of\n" " view and possibly interact with the Linux text/graphics\n"
" the following method because it will be faster and more\n" " console (i.e. not X11 XFree86/Xorg)\n"
" accurate for Linux text console.\n" "\n"
" Note: If the libvncserver LinuxVNC program is on your\n"
" system you may want to use that instead of the following\n"
" method because it will be faster and more accurate\n"
" for the Linux text console and includes mouse support.\n"
" There is, however, the basic LinuxVNC functionality in\n"
" x11vnc if you replace \"console\" with \"vt\" in the\n"
" examples below.\n"
"\n" "\n"
" If the rawfb string begins with \"console\" the\n" " If the rawfb string begins with \"console\" the\n"
" framebuffer device /dev/fb0 is opened (this requires\n" " framebuffer device /dev/fb0 is opened and /dev/tty0 is\n"
" the appropriate kernel modules to be installed) and so\n" " opened too. The latter is used to inject keystrokes\n"
" is /dev/tty0. The latter is used to inject keystrokes\n"
" (not all are supported, but the basic ones are).\n" " (not all are supported, but the basic ones are).\n"
" You will need to be root to inject keystrokes.\n" " You will need to be root to inject keystrokes, but\n"
" /dev/tty0 refers to the active VT, to indicate one\n" " not necessarily to open /dev/fb0. /dev/tty0 refers to\n"
" explicitly, use \"console2\", etc. using the VT number.\n" " the active VT, to indicate one explicitly, use, e.g.,\n"
"\n" " \"console2\" for /dev/tty2, etc. by indicating the\n"
" If the Linux version seems to be 2.6 or later and the\n" " specific VT number.\n"
" \"uinput\" module appears to be present, then the uinput\n" "\n"
" method will be used instead of /dev/ttyN. uinput allows\n" " For the Linux framebuffer device, /dev/fb0, (fb1,\n"
" insertion of BOTH keystrokes and mouse input and so it\n" " etc) to be enabled the appropriate kernel drivers must\n"
" preferred when accessing graphical (e.g. QT-embedded)\n" " be loaded. E.g. vesafb or vga16fb and also by setting\n"
" linux console apps. See -pipeinput UINPUT below for\n" " the boot parameter vga=0x301 (or 0x314, 0x317, etc.)\n"
" more information on this mode; you will have to use\n" " (The vga=... method is the preferred way; set your\n"
" -pipeinput if you want to tweak any UINPUT parameters.\n" " machines up that way.) Otherwise there will be a\n"
" You may also want to also use the -nodragging and\n" " 'No such device' error. You can also load a Linux\n"
" -cursor none options. Use \"console0\", etc or\n" " framebuffer driver specific to your make of video card\n"
" -pipeinput CONSOLE to force the /dev/ttyN method.\n" " for more functionality. Once the machine is booted one\n"
"\n" " can often 'modprobe' the fb driver as root to obtain\n"
" Note you can change VT remotely using the chvt(1)\n" " a framebuffer device.\n"
" command. Sometimes switching out and back corrects\n" "\n"
" the framebuffer state.\n" " If you cannot get /dev/fb0 working on Linux, try\n"
"\n" " using the LinuxVNC emulation mode by \"-rawfb vtN\"\n"
" To skip input injecting entirely use \"consolex\".\n" " where N = 1, ... 6 is the Linux Virtual Terminal (aka\n"
" virtual console) you wish to view, e.g. \"-rawfb vt2\".\n"
" Unlike /dev/fb mode, it need not be the active Virtual\n"
" Terminal. Note that this mode can only show text and\n"
" not graphics. x11vnc polls the text in /dev/vcsaN\n"
"\n"
" Set the env. var. RAWFB_VCSA_BW=1 to disable colors in\n"
" the \"vtN\" mode (i.e. black and white only.) If you\n"
" do not prefer the default 16bpp set RAWFB_VCSA_BPP to\n"
" 8 or 32. If you need to tweak the rawfb parameters by\n"
" using the 'console_guess' string printed at startup,\n"
" be sure to indicate the snap: method.\n"
"\n"
" uinput: If the Linux version appears to be 2.6 or\n"
" later and the \"uinput\" module appears to be present\n"
" (modprobe uinput), then the uinput method will be used\n"
" instead of /dev/ttyN. uinput allows insertion of BOTH\n"
" keystrokes and mouse input and so it preferred when\n"
" accessing graphical (e.g. QT-embedded) linux console\n"
" apps. See -pipeinput UINPUT below for more information\n"
" on this mode; you will have to use -pipeinput if you\n"
" want to tweak any UINPUT parameters. You may also want\n"
" to also use the -nodragging and -cursor none options.\n"
" Use \"console0\", etc or -pipeinput CONSOLE to force\n"
" the /dev/ttyN method.\n"
"\n"
" Note you can change the Linux VT remotely using the\n"
" chvt(1) command to make the one you want be the active\n"
" one (e.g. 'chvt 3'). Sometimes switching out and back\n"
" corrects the framebuffer's graphics state. For the\n"
" \"-rawfb vtN\" mode there is no need to switch the VT's.\n"
"\n"
" To skip input injecting entirely use \"consolex\"\n"
" or \"vtx\".\n"
"\n" "\n"
" The string \"/dev/fb0\" (1, etc.) can be used instead\n" " The string \"/dev/fb0\" (1, etc.) can be used instead\n"
" of \"console\". This can be used to specify a different\n" " of \"console\". This can be used to specify a different\n"
@ -3817,8 +3889,8 @@ void print_help(int mode) {
"\n" "\n"
" If you do not want x11vnc to guess the framebuffer's\n" " If you do not want x11vnc to guess the framebuffer's\n"
" WxHxB and masks automatically (sometimes the kernel\n" " WxHxB and masks automatically (sometimes the kernel\n"
" gives inaccurate information), specify them with a\n" " gives incorrect information), specify them with a @WxHxB\n"
" @WxHxB at the end of the string.\n" " (and optional :R/G/B masks) at the end of the string.\n"
"\n" "\n"
" Examples:\n" " Examples:\n"
" -rawfb console\n" " -rawfb console\n"
@ -3827,6 +3899,7 @@ void print_help(int mode) {
" -rawfb consolex (no keystrokes or mouse)\n" " -rawfb consolex (no keystrokes or mouse)\n"
" -rawfb console:/dev/nonstd\n" " -rawfb console:/dev/nonstd\n"
" -rawfb console -pipeinput UINPUT:accel=4.0\n" " -rawfb console -pipeinput UINPUT:accel=4.0\n"
" -rawfb vt3 (/dev/tty3 w/o /dev/fb0)\n"
"\n" "\n"
" VNC HOST: if the -rawfb string is of the form\n" " VNC HOST: if the -rawfb string is of the form\n"
" \"vnc:host:N\" then the VNC display \"N\" on the remote\n" " \"vnc:host:N\" then the VNC display \"N\" on the remote\n"

@ -22,6 +22,9 @@ char *console_guess(char *str, int *fd);
void console_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client); void console_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client);
void console_pointer_command(int mask, int x, int y, rfbClientPtr client); void console_pointer_command(int mask, int x, int y, rfbClientPtr client);
void linux_dev_fb_msg(char *);
char *console_guess(char *str, int *fd) { char *console_guess(char *str, int *fd) {
char *q, *in = strdup(str); char *q, *in = strdup(str);
char *atparms = NULL, *file = NULL; char *atparms = NULL, *file = NULL;
@ -40,6 +43,10 @@ char *console_guess(char *str, int *fd) {
free(in); free(in);
in = (char *) malloc(strlen("console:/dev/") + strlen(str) + 1); in = (char *) malloc(strlen("console:/dev/") + strlen(str) + 1);
sprintf(in, "console:/dev/%s", str); sprintf(in, "console:/dev/%s", str);
} else if (strstr(in, "vt") == in) {
free(in);
in = (char *) malloc(strlen("console_") + strlen(str) + 1);
sprintf(in, "console_%s", str);
} }
if (strstr(in, "console") != in) { if (strstr(in, "console") != in) {
@ -75,7 +82,6 @@ char *console_guess(char *str, int *fd) {
file = strdup("/dev/fb0"); file = strdup("/dev/fb0");
} }
} }
rfbLog("console_guess: file is %s\n", file);
do_input = 1; do_input = 1;
if (pipeinput_str) { if (pipeinput_str) {
@ -84,9 +90,15 @@ char *console_guess(char *str, int *fd) {
} else { } else {
have_uinput = check_uinput(); have_uinput = check_uinput();
} }
if (strstr(in, "console_vt")) {
have_uinput = 0;
}
if (!strcmp(in, "consolex")) { if (!strcmp(in, "consolex")) {
do_input = 0; do_input = 0;
} else if (strstr(in, "console_vtx")) {
have_uinput = 0;
do_input = 0;
} else if (!strcmp(in, "console")) { } else if (!strcmp(in, "console")) {
/* current active VT: */ /* current active VT: */
if (! have_uinput) { if (! have_uinput) {
@ -94,11 +106,44 @@ char *console_guess(char *str, int *fd) {
} }
} else { } else {
int n; int n;
if (sscanf(in, "console%d", &n) != 1) { if (sscanf(in, "console%d", &n) == 1) {
tty = n;
have_uinput = 0;
} else if (sscanf(in, "console_vt%d", &n) == 1) {
tty = n; tty = n;
have_uinput = 0; have_uinput = 0;
} }
} }
if (strstr(in, "console_vt") == in) {
char tmp[100];
int fd, rows = 30, cols = 80, w, h;
sprintf(tmp, "/dev/vcsa%d", tty);
file = strdup(tmp);
fd = open(file, O_RDWR);
if (fd >= 0) {
read(fd, tmp, 4);
rows = (unsigned char) tmp[0];
cols = (unsigned char) tmp[1];
close(fd);
}
w = cols * 8;
h = rows * 16;
rfbLog("%s %dx%d\n", file, cols, rows);
if (getenv("RAWFB_VCSA_BPP")) {
/* 8bpp, etc */
int bt = atoi(getenv("RAWFB_VCSA_BPP"));
if (bt > 0 && bt <=32) {
sprintf(tmp, "%dx%dx%d", w, h, bt);
} else {
sprintf(tmp, "%dx%dx16", w, h);
}
} else {
/* default 16bpp */
sprintf(tmp, "%dx%dx16", w, h);
}
atparms = strdup(tmp);
}
rfbLog("console_guess: file is %s\n", file);
if (! atparms) { if (! atparms) {
#if LIBVNCSERVER_HAVE_LINUX_FB_H #if LIBVNCSERVER_HAVE_LINUX_FB_H
@ -126,6 +171,13 @@ char *console_guess(char *str, int *fd) {
gm = 0x38; gm = 0x38;
bm = 0xc0; bm = 0xc0;
} }
if (b <= 8 && (rm == gm && gm == bm)) {
if (b == 4) {
rm = 0x07;
gm = 0x38;
bm = 0xc0;
}
}
/* @66666x66666x32:0xffffffff:... */ /* @66666x66666x32:0xffffffff:... */
atparms = (char *) malloc(200); atparms = (char *) malloc(200);
@ -138,7 +190,8 @@ char *console_guess(char *str, int *fd) {
} }
} else { } else {
rfbLog("could not open: %s\n", file); rfbLog("could not open: %s\n", file);
perror("open"); rfbLogPerror("open");
linux_dev_fb_msg(file);
close(d); close(d);
} }
#endif #endif
@ -174,8 +227,12 @@ char *console_guess(char *str, int *fd) {
return NULL; return NULL;
} }
q = (char *) malloc(strlen("map:") + strlen(file) + 1 + strlen(atparms) + 1); q = (char *) malloc(strlen("mmap:") + strlen(file) + 1 + strlen(atparms) + 1);
sprintf(q, "map:%s@%s", file, atparms); if (strstr(in, "console_vt")) {
sprintf(q, "snap:%s@%s", file, atparms);
} else {
sprintf(q, "map:%s@%s", file, atparms);
}
return q; return q;
} }

@ -17,6 +17,7 @@ int set_visual_str_to_something = 0;
char *logfile = NULL; /* -o, -logfile */ char *logfile = NULL; /* -o, -logfile */
int logfile_append = 0; int logfile_append = 0;
char *flagfile = NULL; /* -flag */ char *flagfile = NULL; /* -flag */
char *rm_flagfile = NULL; /* -rmflag */
char *passwdfile = NULL; /* -passwdfile */ char *passwdfile = NULL; /* -passwdfile */
int unixpw = 0; /* -unixpw */ int unixpw = 0; /* -unixpw */
int unixpw_nis = 0; /* -unixpw_nis */ int unixpw_nis = 0; /* -unixpw_nis */
@ -145,6 +146,7 @@ int clear_mods = 0; /* -clear_mods (1) and -clear_keys (2) -clear_locks (3) */
int nofb = 0; /* do not send any fb updates */ int nofb = 0; /* do not send any fb updates */
char *raw_fb_str = NULL; /* used under -rawfb */ char *raw_fb_str = NULL; /* used under -rawfb */
char *raw_fb_pixfmt = NULL; char *raw_fb_pixfmt = NULL;
char *raw_fb_full_str = NULL;
char *freqtab = NULL; char *freqtab = NULL;
char *pipeinput_str = NULL; /* -pipeinput [tee,reopen,keycodes:]cmd */ char *pipeinput_str = NULL; /* -pipeinput [tee,reopen,keycodes:]cmd */
char *pipeinput_opts = NULL; char *pipeinput_opts = NULL;

@ -17,6 +17,7 @@ extern int set_visual_str_to_something;
extern char *logfile; extern char *logfile;
extern int logfile_append; extern int logfile_append;
extern char *flagfile; extern char *flagfile;
extern char *rm_flagfile;
extern char *passwdfile; extern char *passwdfile;
extern int unixpw; extern int unixpw;
extern int unixpw_nis; extern int unixpw_nis;
@ -117,6 +118,7 @@ extern int clear_mods;
extern int nofb; extern int nofb;
extern char *raw_fb_str; extern char *raw_fb_str;
extern char *raw_fb_pixfmt; extern char *raw_fb_pixfmt;
extern char *raw_fb_full_str;
extern char *freqtab; extern char *freqtab;
extern char *pipeinput_str; extern char *pipeinput_str;
extern char *pipeinput_opts; extern char *pipeinput_opts;

@ -993,6 +993,8 @@ if (0) fprintf(stderr, "initialize_pipeinput: %s -- %s\n", pipeinput_str, p);
} else { } else {
rfbLog("pipeinput: could not open: %s\n", dev); rfbLog("pipeinput: could not open: %s\n", dev);
rfbLogPerror("open"); rfbLogPerror("open");
rfbLog("You may need to be root to open %s.\n", dev);
rfbLog("\n");
} }
return; return;
} else if (strstr(p, "UINPUT") == p) { } else if (strstr(p, "UINPUT") == p) {

@ -5248,6 +5248,10 @@ char *process_remote_cmd(char *cmd, int stringonly) {
snprintf(buf, bufn, "aro=%s:%s", p, NONUL(flagfile)); snprintf(buf, bufn, "aro=%s:%s", p, NONUL(flagfile));
goto qry; goto qry;
} }
if (!strcmp(p, "rmflag")) {
snprintf(buf, bufn, "aro=%s:%s", p, NONUL(rm_flagfile));
goto qry;
}
if (!strcmp(p, "rc")) { if (!strcmp(p, "rc")) {
char *s = rc_rcfile; char *s = rc_rcfile;
if (rc_rcfile_default) { if (rc_rcfile_default) {

@ -2421,6 +2421,224 @@ int copy_screen(void) {
return 0; return 0;
} }
#include <rfb/default8x16.h>
/*
* Color values from the vcsadump program.
* void dumpcss(FILE *fp, char *attribs_used)
* char *colormap[] = {
* "#000000", "#0000AA", "#00AA00", "#00AAAA", "#AA0000", "#AA00AA", "#AA5500", "#AAAAAA",
* "#555555", "#5555AA", "#55FF55", "#55FFFF", "#FF5555", "#FF55FF", "#FFFF00", "#FFFFFF" };
*/
static unsigned char console_cmap[16*3]={
/* 0 */ 0x00, 0x00, 0x00,
/* 1 */ 0x00, 0x00, 0xAA,
/* 2 */ 0x00, 0xAA, 0x00,
/* 3 */ 0x00, 0xAA, 0xAA,
/* 4 */ 0xAA, 0x00, 0x00,
/* 5 */ 0xAA, 0x00, 0xAA,
/* 6 */ 0xAA, 0x55, 0x00,
/* 7 */ 0xAA, 0xAA, 0xAA,
/* 8 */ 0x55, 0x55, 0x55,
/* 9 */ 0x55, 0x55, 0xAA,
/* 10 */ 0x55, 0xFF, 0x55,
/* 11 */ 0x55, 0xFF, 0xFF,
/* 12 */ 0xFF, 0x55, 0x55,
/* 13 */ 0xFF, 0x55, 0xFF,
/* 14 */ 0xFF, 0xFF, 0x00,
/* 15 */ 0xFF, 0xFF, 0xFF
};
static void snap_vcsa_rawfb(void) {
int n;
char *dst;
char buf[32];
int i, len, del;
unsigned char rows, cols, xpos, ypos;
static int prev_rows = -1, prev_cols = -1;
static unsigned char prev_xpos = -1, prev_ypos = -1;
static char *vcsabuf = NULL;
static char *vcsabuf0 = NULL;
static unsigned int color_tab[16];
static int Cw = 8, Ch = 16;
static int db = -1, first = 1;
int created = 0;
rfbScreenInfo s;
rfbScreenInfoPtr fake_screen = &s;
int Bpp = raw_fb_native_bpp / 8;
if (db < 0) {
if (getenv("X11VNC_DEBUG_VCSA")) {
db = atoi(getenv("X11VNC_DEBUG_VCSA"));
} else {
db = 0;
}
}
if (first) {
unsigned int rm = raw_fb_native_red_mask;
unsigned int gm = raw_fb_native_green_mask;
unsigned int bm = raw_fb_native_blue_mask;
unsigned int rs = raw_fb_native_red_shift;
unsigned int gs = raw_fb_native_green_shift;
unsigned int bs = raw_fb_native_blue_shift;
unsigned int rx = raw_fb_native_red_max;
unsigned int gx = raw_fb_native_green_max;
unsigned int bx = raw_fb_native_blue_max;
for (i=0; i < 16; i++) {
int r = console_cmap[3*i+0];
int g = console_cmap[3*i+1];
int b = console_cmap[3*i+2];
r = rx * r / 255;
g = gx * g / 255;
b = bx * b / 255;
color_tab[i] = (r << rs) | (g << gs) | (b << bs);
if (db) fprintf(stderr, "cmap[%02d] 0x%08x %04d %04d %04d\n", i, color_tab[i], r, g, b);
if (i != 0 && getenv("RAWFB_VCSA_BW")) {
color_tab[i] = rm | gm | bm;
}
}
}
first = 0;
lseek(raw_fb_fd, 0, SEEK_SET);
len = 4;
del = 0;
memset(buf, 0, sizeof(buf));
while (len > 0) {
n = read(raw_fb_fd, buf + del, len);
if (n > 0) {
del += n;
len -= n;
} else if (n == 0) {
break;
} else if (errno != EINTR && errno != EAGAIN) {
break;
}
}
rows = (unsigned char) buf[0];
cols = (unsigned char) buf[1];
xpos = (unsigned char) buf[2];
ypos = (unsigned char) buf[3];
if (db) fprintf(stderr, "rows=%d cols=%d xpos=%d ypos=%d Bpp=%d\n", rows, cols, xpos, ypos, Bpp);
if (rows == 0 || cols == 0) {
usleep(100 * 1000);
return;
}
if (vcsabuf == NULL || prev_rows != rows || prev_cols != cols) {
if (vcsabuf) {
free(vcsabuf);
free(vcsabuf0);
}
vcsabuf = (char *) calloc(2 * rows * cols, 1);
vcsabuf0 = (char *) calloc(2 * rows * cols, 1);
created = 1;
if (prev_rows != -1 && prev_cols != -1) {
do_new_fb(1);
}
prev_rows = rows;
prev_cols = cols;
}
if (!rfbEndianTest) {
unsigned char tc = rows;
rows = cols;
cols = tc;
tc = xpos;
xpos = ypos;
ypos = tc;
}
len = 2 * rows * cols;
del = 0;
memset(vcsabuf, 0, len);
while (len > 0) {
n = read(raw_fb_fd, vcsabuf + del, len);
if (n > 0) {
del += n;
len -= n;
} else if (n == 0) {
break;
} else if (errno != EINTR && errno != EAGAIN) {
break;
}
}
fake_screen->frameBuffer = snap->data;
fake_screen->paddedWidthInBytes = snap->bytes_per_line;
fake_screen->serverFormat.bitsPerPixel = raw_fb_native_bpp;
for (i=0; i < rows * cols; i++) {
int ix, iy, x, y, w, h;
unsigned char chr = 0;
unsigned char attr;
unsigned int fore, back;
unsigned short *usp;
unsigned int *uip;
chr = (unsigned char) vcsabuf[2*i];
attr = vcsabuf[2*i+1];
iy = i / cols;
ix = i - iy * cols;
if (ix == prev_xpos && iy == prev_ypos) {
;
} else if (ix == xpos && iy == ypos) {
;
} else if (!created && chr == vcsabuf0[2*i] && attr == vcsabuf0[2*i+1]) {
continue;
}
if (!rfbEndianTest) {
unsigned char tc = chr;
chr = attr;
attr = tc;
}
y = iy * Ch;
x = ix * Cw;
dst = snap->data + y * snap->bytes_per_line + x * Bpp;
fore = color_tab[attr & 0xf];
back = color_tab[(attr >> 4) & 0x7];
if (ix == xpos && iy == ypos) {
unsigned int ti = fore;
fore = back;
back = ti;
}
for (h = 0; h < Ch; h++) {
if (Bpp == 1) {
memset(dst, back, Cw);
} else if (Bpp == 2) {
for (w = 0; w < Cw; w++) {
usp = (unsigned short *) (dst + w*Bpp);
*usp = (unsigned short) back;
}
} else if (Bpp == 4) {
for (w = 0; w < Cw; w++) {
uip = (unsigned int *) (dst + w*Bpp);
*uip = (unsigned int) back;
}
}
dst += snap->bytes_per_line;
}
rfbDrawChar(fake_screen, &default8x16Font, x, y + Ch, chr, fore);
}
memcpy(vcsabuf0, vcsabuf, 2 * rows * cols);
prev_xpos = xpos;
prev_ypos = ypos;
}
static void snap_all_rawfb(void) { static void snap_all_rawfb(void) {
int pixelsize = bpp/8; int pixelsize = bpp/8;
int n, sz; int n, sz;
@ -2513,7 +2731,9 @@ int copy_snap(void) {
if (raw_fb_bytes_per_line != snap->bytes_per_line) { if (raw_fb_bytes_per_line != snap->bytes_per_line) {
read_all_at_once = 0; read_all_at_once = 0;
} }
if (read_all_at_once) { if (raw_fb_full_str && strstr(raw_fb_full_str, "/dev/vcsa")) {
snap_vcsa_rawfb();
} else if (read_all_at_once) {
snap_all_rawfb(); snap_all_rawfb();
} else { } else {
/* this goes line by line, XXX not working for video */ /* this goes line by line, XXX not working for video */

@ -1165,6 +1165,24 @@ void vnc_reflect_process_client(void) {
} }
} }
void linux_dev_fb_msg(char* q) {
if (strstr(q, "/dev/fb") && strstr(UT.sysname, "Linux")) {
rfbLog("\n");
rfbLog("On Linux you may need to load a kernel module to enable\n");
rfbLog("the framebuffer device /dev/fb*; e.g.:\n");
rfbLog(" vga=0x303 (and others) kernel boot parameter\n");
rfbLog(" modprobe uvesafb\n");
rfbLog(" modprobe radeonfb (card specific)\n");
rfbLog(" modprobe nvidiafb (card specific, others)\n");
rfbLog(" modprobe vesafb (?)\n");
rfbLog(" modprobe vga16fb\n");
rfbLog("\n");
rfbLog("You may also need root permission to open /dev/fb*\n");
rfbLog("and/or /dev/tty*.\n");
rfbLog("\n");
}
}
#define RAWFB_MMAP 1 #define RAWFB_MMAP 1
#define RAWFB_FILE 2 #define RAWFB_FILE 2
#define RAWFB_SHM 3 #define RAWFB_SHM 3
@ -1414,7 +1432,7 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
} else if (strstr(str, "dev/video")) { } else if (strstr(str, "dev/video")) {
rawfb_dev_video = 1; rawfb_dev_video = 1;
} else if (strstr(str, "console") == str || strstr(str, "fb") == str || } else if (strstr(str, "console") == str || strstr(str, "fb") == str ||
strstr(str, "/dev/fb") == str) { strstr(str, "/dev/fb") == str || strstr(str, "vt") == str) {
char *str2 = console_guess(str, &raw_fb_fd); char *str2 = console_guess(str, &raw_fb_fd);
if (str2 == NULL) { if (str2 == NULL) {
rfbLog("console_guess failed for: %s\n", str); rfbLog("console_guess failed for: %s\n", str);
@ -1467,6 +1485,11 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
* -rawfb file:/path/to/file@640x480x32:ff/ff00/ff0000 * -rawfb file:/path/to/file@640x480x32:ff/ff00/ff0000
*/ */
if (raw_fb_full_str) {
free(raw_fb_full_str);
}
raw_fb_full_str = strdup(str);
/* +O offset */ /* +O offset */
if ((q = strrchr(str, '+')) != NULL) { if ((q = strrchr(str, '+')) != NULL) {
@ -1509,6 +1532,93 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
} }
*q = '\0'; *q = '\0';
if (rm == 0 && gm == 0 && bm == 0) {
/* guess masks... */
if (b == 24 || b == 32) {
rm = 0xff0000;
gm = 0x00ff00;
bm = 0x0000ff;
} else if (b == 16) {
rm = 0xf800;
gm = 0x07e0;
bm = 0x001f;
} else if (b == 8) {
rm = 0x07;
gm = 0x38;
bm = 0xc0;
}
}
/* we can fake -flipbyteorder to some degree... */
if (flip_byte_order) {
if (b == 24 || b == 32) {
tm = rm;
rm = bm;
bm = tm;
} else if (b == 16) {
unsigned short s1, s2;
s1 = (unsigned short) rm;
s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8);
rm = (unsigned long) s2;
s1 = (unsigned short) gm;
s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8);
gm = (unsigned long) s2;
s1 = (unsigned short) bm;
s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8);
bm = (unsigned long) s2;
}
}
/* native fb stuff for bpp < 8 only */
raw_fb_native_bpp = b;
raw_fb_native_red_mask = rm;
raw_fb_native_green_mask = gm;
raw_fb_native_blue_mask = bm;
raw_fb_native_red_shift = 100;
raw_fb_native_green_shift = 100;
raw_fb_native_blue_shift = 100;
raw_fb_native_red_max = 1;
raw_fb_native_green_max = 1;
raw_fb_native_blue_max = 1;
m = 1;
for (i=0; i<32; i++) {
if (raw_fb_native_red_mask & m) {
if (raw_fb_native_red_shift == 100) {
raw_fb_native_red_shift = i;
}
raw_fb_native_red_max *= 2;
}
if (raw_fb_native_green_mask & m) {
if (raw_fb_native_green_shift == 100) {
raw_fb_native_green_shift = i;
}
raw_fb_native_green_max *= 2;
}
if (raw_fb_native_blue_mask & m) {
if (raw_fb_native_blue_shift == 100) {
raw_fb_native_blue_shift = i;
}
raw_fb_native_blue_max *= 2;
}
m = m << 1;
}
raw_fb_native_red_max -= 1;
raw_fb_native_green_max -= 1;
raw_fb_native_blue_max -= 1;
if (b < 8) {
/* e.g. VGA16 */
rfbLog("raw_fb_native_bpp: %d 0x%02lx 0x%02lx 0x%02lx %d/%d/%d %d/%d/%d\n", raw_fb_native_bpp,
raw_fb_native_red_mask, raw_fb_native_green_mask, raw_fb_native_blue_mask,
raw_fb_native_red_max, raw_fb_native_green_max, raw_fb_native_blue_max,
raw_fb_native_red_shift, raw_fb_native_green_shift, raw_fb_native_blue_shift);
raw_fb_expand_bytes = 1;
b = 8;
rm = 0x07;
gm = 0x38;
bm = 0xc0;
}
/* end of stuff for bpp < 8 */
dpy_x = wdpy_x = w; dpy_x = wdpy_x = w;
dpy_y = wdpy_y = h; dpy_y = wdpy_y = h;
off_x = 0; off_x = 0;
@ -1609,11 +1719,14 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
rfbLogEnable(1); rfbLogEnable(1);
rfbLog("failed to open file: %s, %s\n", q, str); rfbLog("failed to open file: %s, %s\n", q, str);
rfbLogPerror("open"); rfbLogPerror("open");
linux_dev_fb_msg(q);
clean_up_exit(1); clean_up_exit(1);
} }
raw_fb_fd = fd; raw_fb_fd = fd;
if (xform24to32) { if (raw_fb_native_bpp < 8) {
size = w*h*raw_fb_native_bpp/8 + raw_fb_offset;
} else if (xform24to32) {
size = w*h*24/8 + raw_fb_offset; size = w*h*24/8 + raw_fb_offset;
} else { } else {
size = w*h*b/8 + raw_fb_offset; size = w*h*b/8 + raw_fb_offset;
@ -1650,14 +1763,20 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
rfbLog("failed to mmap file: %s, %s\n", q, str); rfbLog("failed to mmap file: %s, %s\n", q, str);
rfbLog(" raw_fb_addr: %p\n", raw_fb_addr); rfbLog(" raw_fb_addr: %p\n", raw_fb_addr);
rfbLogPerror("mmap"); rfbLogPerror("mmap");
clean_up_exit(1);
}
raw_fb_mmap = size;
rfbLog("rawfb: mmap file: %s\n", q); raw_fb_addr = NULL;
rfbLog(" w: %d h: %d b: %d addr: %p sz: %d\n", w, h, rfbLog("mmap(2) failed, trying slower lseek(2)\n");
b, raw_fb_addr, size); raw_fb_seek = size;
last_mode = RAWFB_MMAP; last_mode = RAWFB_FILE;
} else {
raw_fb_mmap = size;
rfbLog("rawfb: mmap file: %s\n", q);
rfbLog(" w: %d h: %d b: %d addr: %p sz: %d\n", w, h,
b, raw_fb_addr, size);
last_mode = RAWFB_MMAP;
}
#else #else
rfbLog("mmap(2) not supported on system, using" rfbLog("mmap(2) not supported on system, using"
" slower lseek(2)\n"); " slower lseek(2)\n");
@ -1739,42 +1858,6 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
snap->bitmap_unit = -1; snap->bitmap_unit = -1;
} }
if (rm == 0 && gm == 0 && bm == 0) {
/* guess masks... */
if (b == 24 || b == 32) {
rm = 0xff0000;
gm = 0x00ff00;
bm = 0x0000ff;
} else if (b == 16) {
rm = 0xf800;
gm = 0x07e0;
bm = 0x001f;
} else if (b == 8) {
rm = 0x07;
gm = 0x38;
bm = 0xc0;
}
}
/* we can fake -flipbyteorder to some degree... */
if (flip_byte_order) {
if (b == 24 || b == 32) {
tm = rm;
rm = bm;
bm = tm;
} else if (b == 16) {
unsigned short s1, s2;
s1 = (unsigned short) rm;
s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8);
rm = (unsigned long) s2;
s1 = (unsigned short) gm;
s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8);
gm = (unsigned long) s2;
s1 = (unsigned short) bm;
s2 = ((0xff & s1) << 8) | ((0xff00 & s1) >> 8);
bm = (unsigned long) s2;
}
}
raw_fb_image->red_mask = rm; raw_fb_image->red_mask = rm;
raw_fb_image->green_mask = gm; raw_fb_image->green_mask = gm;
@ -1794,6 +1877,9 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
} }
m = m << 1; m = m << 1;
} }
if (raw_fb_native_bpp < 8) {
raw_fb_image->depth = raw_fb_expand_bytes * 8;
}
if (! raw_fb_image->depth) { if (! raw_fb_image->depth) {
raw_fb_image->depth = (b == 32) ? 24 : b; raw_fb_image->depth = (b == 32) ? 24 : b;
} }
@ -1805,7 +1891,7 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
depth++; depth++;
} }
if (clipshift) { if (clipshift || raw_fb_native_bpp < 8) {
memset(raw_fb, 0xff, dpy_y * raw_fb_image->bytes_per_line); memset(raw_fb, 0xff, dpy_y * raw_fb_image->bytes_per_line);
} else if (raw_fb_addr && ! xform24to32) { } else if (raw_fb_addr && ! xform24to32) {
memcpy(raw_fb, raw_fb_addr + raw_fb_offset, dpy_y * raw_fb_image->bytes_per_line); memcpy(raw_fb, raw_fb_addr + raw_fb_offset, dpy_y * raw_fb_image->bytes_per_line);
@ -1814,7 +1900,6 @@ if (db) fprintf(stderr, "initialize_raw_fb reset\n");
} }
if (verbose) { if (verbose) {
rfbLog("\n"); rfbLog("\n");
rfbLog("rawfb: raw_fb %p\n", raw_fb); rfbLog("rawfb: raw_fb %p\n", raw_fb);
rfbLog(" format %d\n", raw_fb_image->format); rfbLog(" format %d\n", raw_fb_image->format);
@ -3273,6 +3358,31 @@ void set_vnc_desktop_name(void) {
flagfile); flagfile);
} }
} }
if (rm_flagfile) {
int create = 0;
struct stat sb;
if (strstr(rm_flagfile, "create:") == rm_flagfile) {
char *s = rm_flagfile;
create = 1;
rm_flagfile = strdup(rm_flagfile + strlen("create:"));
free(s);
}
if (strstr(rm_flagfile, "nocreate:") == rm_flagfile) {
char *s = rm_flagfile;
create = 0;
rm_flagfile = strdup(rm_flagfile + strlen("nocreate:"));
free(s);
} else if (stat(rm_flagfile, &sb) != 0) {
create = 1;
}
if (create) {
FILE *flag = fopen(rm_flagfile, "w");
if (flag) {
fprintf(flag, "%d\n", getpid());
fclose(flag);
}
}
}
} }
fflush(stdout); fflush(stdout);
} }

@ -980,6 +980,7 @@ void openssl_init(int isclient) {
" be used in -sslCRL mode.\n"); " be used in -sslCRL mode.\n");
clean_up_exit(1); clean_up_exit(1);
} }
/* n.b. new ctx */
if (!switch_to_anon_dh()) { if (!switch_to_anon_dh()) {
rfbLog("openssl_init: Anonymous Diffie-Hellman setup" rfbLog("openssl_init: Anonymous Diffie-Hellman setup"
" failed.\n"); " failed.\n");
@ -2746,10 +2747,17 @@ static int switch_to_anon_dh(void) {
rfbLog("Using Anonymous Diffie-Hellman mode.\n"); rfbLog("Using Anonymous Diffie-Hellman mode.\n");
rfbLog("WARNING: Anonymous Diffie-Hellman uses encryption but is\n"); rfbLog("WARNING: Anonymous Diffie-Hellman uses encryption but is\n");
rfbLog("WARNING: susceptible to a Man-In-The-Middle attack.\n"); rfbLog("WARNING: susceptible to a Man-In-The-Middle attack.\n");
ctx = SSL_CTX_new( SSLv23_server_method() ); if (ssl_client_mode) {
ctx = SSL_CTX_new( SSLv23_client_method() );
} else {
ctx = SSL_CTX_new( SSLv23_server_method() );
}
if (ctx == NULL) { if (ctx == NULL) {
return 0; return 0;
} }
if (ssl_client_mode) {
return 1;
}
if (!SSL_CTX_set_cipher_list(ctx, "ADH:@STRENGTH")) { if (!SSL_CTX_set_cipher_list(ctx, "ADH:@STRENGTH")) {
return 0; return 0;
} }
@ -2959,10 +2967,12 @@ static int check_vnc_tls_mode(int s_in, int s_out) {
if (ssl_client_mode) { if (ssl_client_mode) {
/* XXX check if this can be done in SSL client mode. */ /* XXX check if this can be done in SSL client mode. */
if (vencrypt_mode == VENCRYPT_FORCE || anontls_mode == ANONTLS_FORCE) { if (vencrypt_mode == VENCRYPT_FORCE || anontls_mode == ANONTLS_FORCE) {
rfbLog("check_vnc_tls_mode: VENCRYPT_FORCE/ANONTLS_FORCE prevents normal SSL\n"); rfbLog("check_vnc_tls_mode: VENCRYPT_FORCE/ANONTLS_FORCE in client\n");
return 0; rfbLog("check_vnc_tls_mode: connect mode prevents normal SSL.\n");
//return 0;
} else {
return 1;
} }
return 1;
} }
if (ssl_verify && vencrypt_mode != VENCRYPT_FORCE && anontls_mode == ANONTLS_FORCE) { if (ssl_verify && vencrypt_mode != VENCRYPT_FORCE && anontls_mode == ANONTLS_FORCE) {
rfbLog("check_vnc_tls_mode: Cannot use ANONTLS_FORCE with -sslverify (Anon DH only)\n"); rfbLog("check_vnc_tls_mode: Cannot use ANONTLS_FORCE with -sslverify (Anon DH only)\n");
@ -3194,14 +3204,15 @@ static int ssl_init(int s_in, int s_out, int skip_vnc_tls) {
if (db > 1) fprintf(stderr, "ssl_init: 4\n"); if (db > 1) fprintf(stderr, "ssl_init: 4\n");
while (1) { while (1) {
if (db) fprintf(stderr, "calling SSL_accept...\n");
signal(SIGALRM, ssl_timeout); signal(SIGALRM, ssl_timeout);
alarm(timeout); alarm(timeout);
if (ssl_client_mode) { if (ssl_client_mode) {
if (db) fprintf(stderr, "calling SSL_connect...\n");
rc = SSL_connect(ssl); rc = SSL_connect(ssl);
} else { } else {
if (db) fprintf(stderr, "calling SSL_accept...\n");
rc = SSL_accept(ssl); rc = SSL_accept(ssl);
} }
err = SSL_get_error(ssl, rc); err = SSL_get_error(ssl, rc);
@ -3209,7 +3220,11 @@ static int ssl_init(int s_in, int s_out, int skip_vnc_tls) {
alarm(0); alarm(0);
signal(SIGALRM, SIG_DFL); signal(SIGALRM, SIG_DFL);
if (db) fprintf(stderr, "SSL_accept %d/%d\n", rc, err); if (ssl_client_mode) {
if (db) fprintf(stderr, "SSL_connect %d/%d\n", rc, err);
} else {
if (db) fprintf(stderr, "SSL_accept %d/%d\n", rc, err);
}
if (err == SSL_ERROR_NONE) { if (err == SSL_ERROR_NONE) {
break; break;
} else if (err == SSL_ERROR_WANT_READ) { } else if (err == SSL_ERROR_WANT_READ) {
@ -3283,7 +3298,11 @@ static int ssl_init(int s_in, int s_out, int skip_vnc_tls) {
usleep(10 * 1000); usleep(10 * 1000);
} }
rfbLog("SSL: ssl_helper[%d]: SSL_accept() succeeded for: %s:%d\n", getpid(), name, peerport); if (ssl_client_mode) {
rfbLog("SSL: ssl_helper[%d]: SSL_connect() succeeded for: %s:%d\n", getpid(), name, peerport);
} else {
rfbLog("SSL: ssl_helper[%d]: SSL_accept() succeeded for: %s:%d\n", getpid(), name, peerport);
}
pr_ssl_info(0); pr_ssl_info(0);
@ -3848,13 +3867,13 @@ void raw_xfer(int csock, int s_in, int s_out) {
/* change buf size some direction. */ /* change buf size some direction. */
} }
/* this is for testing, no SSL just socket redir */
if (pid < 0) {
exit(1);
}
if (getenv("X11VNC_DEBUG_RAW_XFER")) { if (getenv("X11VNC_DEBUG_RAW_XFER")) {
db = atoi(getenv("X11VNC_DEBUG_RAW_XFER")); db = atoi(getenv("X11VNC_DEBUG_RAW_XFER"));
} }
if (pid < 0) {
exit(1);
}
/* this is for testing or special helper usage, no SSL just socket redir */
if (pid) { if (pid) {
if (db) rfbLog("raw_xfer start: %d -> %d/%d\n", csock, s_in, s_out); if (db) rfbLog("raw_xfer start: %d -> %d/%d\n", csock, s_in, s_out);

@ -1287,12 +1287,24 @@ static void parse_str(char *str, char **dev, char **settings, char **atparms) {
} }
if (*dev == NULL) { if (*dev == NULL) {
s = (char *) malloc(strlen("/dev/") + strlen(str) + 1); struct stat sbuf;
s = (char *) malloc(strlen("/dev/") + strlen(str) + 2);
if (strstr(str, "/dev/") == str) { if (strstr(str, "/dev/") == str) {
sprintf(s, "%s", str); sprintf(s, "%s", str);
} else { } else {
sprintf(s, "/dev/%s", str); sprintf(s, "/dev/%s", str);
} }
rfbLog("Checking existence of '%s'\n", s);
if (stat(s, &sbuf) != 0) {
rfbLogPerror("stat");
strcat(s, "0");
rfbLog("switching to '%s'\n", s);
}
if (stat(s, &sbuf) != 0) {
rfbLogPerror("stat");
rfbLog("You will need to specify the video device more explicity.\n");
}
*dev = s; *dev = s;
rfbLog("set video device to: '%s'\n", *dev); rfbLog("set video device to: '%s'\n", *dev);
} }

@ -1,8 +1,8 @@
.\" This file was automatically generated from x11vnc -help output. .\" This file was automatically generated from x11vnc -help output.
.TH X11VNC "1" "December 2008" "x11vnc " "User Commands" .TH X11VNC "1" "January 2009" "x11vnc " "User Commands"
.SH NAME .SH NAME
x11vnc - allow VNC connections to real X11 displays x11vnc - allow VNC connections to real X11 displays
version: 0.9.6, lastmod: 2008-12-08 version: 0.9.7, lastmod: 2009-01-03
.SH SYNOPSIS .SH SYNOPSIS
.B x11vnc .B x11vnc
[OPTION]... [OPTION]...
@ -2802,6 +2802,15 @@ Write the "PORT=NNNN" (e.g. PORT=5900) string to
\fIfile\fR in addition to stdout. This option could be \fIfile\fR in addition to stdout. This option could be
useful by wrapper script to detect when x11vnc is ready. useful by wrapper script to detect when x11vnc is ready.
.PP .PP
\fB-rmflag\fR \fIfile\fR
.IP
Remove \fIfile\fR at exit to signal when x11vnc is done.
The file is created at startup if it does not already
exist or if \fIfile\fR is prefixed with "create:".
If the file is created, the x11vnc PID is placed in
the file. Otherwise the files contents is not changed.
Use prefix "nocreate:" to prevent creation.
.PP
\fB-rc\fR \fIfilename\fR \fB-rc\fR \fIfilename\fR
.IP .IP
Use \fIfilename\fR instead of $HOME/.x11vncrc for rc file. Use \fIfilename\fR instead of $HOME/.x11vncrc for rc file.
@ -4209,20 +4218,22 @@ webcams, or where window tearing is a problem.
Instead of polling X, poll the memory object specified Instead of polling X, poll the memory object specified
in \fIstring\fR. in \fIstring\fR.
.IP .IP
For file polling to memory map For file polling, to memory map
.IR mmap (2) .IR mmap (2)
a file use: a file use:
"map:/path/to/a/file@WxHxB", with framebuffer Width, "map:/path/to/a/file@WxHxB", with framebuffer Width,
Height, and Bits per pixel. "mmap:..." is the Height, and Bits per pixel. "mmap:..." is the
same. same.
.IP .IP
If there is trouble with mmap, use "file:/..." If there is trouble with mmap, use "file:/..."
for slower for slower
.IR lseek (2) .IR lseek (2)
based reading. Use "snap:..." based reading.
to imply \fB-snapfb\fR mode and the "file:" access (this .IP
is for unseekable devices that only provide the fb all Use "snap:..." to imply \fB-snapfb\fR mode and the "file:"
at once, e.g. a video camera provides the whole frame). access (this is for unseekable devices that only provide
the fb all at once, e.g. a video camera provides the
whole frame).
.IP .IP
For shared memory segments string is of the form: For shared memory segments string is of the form:
"shm:N@WxHxB" which specifies a shmid N and with "shm:N@WxHxB" which specifies a shmid N and with
@ -4245,25 +4256,29 @@ If the string begins with "video", see the VIDEO4LINUX
discussion below where the device may be queried for discussion below where the device may be queried for
(and possibly set) the framebuffer parameters. (and possibly set) the framebuffer parameters.
.IP .IP
If the string begins with "console", "/dev/fb", or If the string begins with "console", "/dev/fb",
"fb", see the LINUX CONSOLE discussion below where "fb", or "vt", see the LINUX CONSOLE discussion
the framebuffer device is opened and keystrokes (and below where the framebuffer device is opened and
possibly mouse events) are inserted into the console. keystrokes (and possibly mouse events) are inserted
into the console.
.IP .IP
If the string begins with "vnc", see the VNC HOST If the string begins with "vnc", see the VNC HOST
discussion below where the framebuffer is taken as that discussion below where the framebuffer is taken as that
of another remote VNC server. of another remote VNC server.
.IP .IP
Optional suffixes are ":R/G/B" and "+O" to specify Optional suffixes are ":R/G/B" and "+O" to specify
red, green, and blue masks and an offset into the red, green, and blue masks (in hex) and an offset into
memory object. If the masks are not provided x11vnc the memory object. If the masks are not provided x11vnc
guesses them based on the bpp. guesses them based on the bpp (if the colors look wrong,
you need to provide the masks.)
.IP .IP
Another optional suffix is the Bytes Per Line which in Another optional suffix is the Bytes Per Line which in
some cases is not WxB/4. Specify it as WxHxB-BPL some cases is not WxB/8. Specify it as WxHxB-BPL
e.g. 800x600x16-2048. This could be a normal width e.g. 800x600x16-2048. This could be a normal width
1024 at 16bpp fb, but only width 800 shows up. 1024 at 16bpp fb, but only width 800 shows up.
.IP .IP
So the full format is: mode:file@WxHxB:R/G/B+O-BPL
.IP
Examples: Examples:
.IP .IP
\fB-rawfb\fR shm:210337933@800x600x32:ff/ff00/ff0000 \fB-rawfb\fR shm:210337933@800x600x32:ff/ff00/ff0000
@ -4279,6 +4294,7 @@ Examples:
\fB-rawfb\fR video0 \fB-rawfb\fR video0
\fB-rawfb\fR video \fB-pipeinput\fR VID \fB-rawfb\fR video \fB-pipeinput\fR VID
\fB-rawfb\fR console \fB-rawfb\fR console
\fB-rawfb\fR vt2
\fB-rawfb\fR vnc:somehost:0 \fB-rawfb\fR vnc:somehost:0
.IP .IP
(see (see
@ -4306,7 +4322,7 @@ something strange with /dev/fb0.
If the device is not "seekable" (e.g. webcam) try If the device is not "seekable" (e.g. webcam) try
reading it all at once in full snaps via the "snap:" reading it all at once in full snaps via the "snap:"
mode (note: this is a resource hog). If you are using mode (note: this is a resource hog). If you are using
file: or map: and the device needs to be reopened for file: or map: AND the device needs to be reopened for
*every* snapfb snapshot, set the environment variable: *every* snapfb snapshot, set the environment variable:
SNAPFB_RAWFB_RESET=1 as well. SNAPFB_RAWFB_RESET=1 as well.
.IP .IP
@ -4317,6 +4333,25 @@ say, a video camera that delivers the pixel data as
24bpp packed RGB. This is the default under "video" 24bpp packed RGB. This is the default under "video"
mode if the bpp is 24. mode if the bpp is 24.
.IP .IP
Normally the bits per pixel, B, is 8, 16, or 32 (or
rarely 24), however there is also some support for
B < 8 (e.g. old graphics displays 4 bpp or 1 bpp).
In this case you certainly must supply the masks as
well: WxHxB:R/G/B. The pixels will be padded out to
8 bpp using depth 8 truecolor. The scheme currently
does not work with snap fb (ask if interested.) B=1
monochrome example: file:/dev/urandom@128x128x1:1/1/1
Some other like this are 128x128x2:3/3/3 128x128x4:7/7/7
.IP
For B < 8 framebuffers you can also set the env. var
RAWFB_CGA=1 to try a CGA mapping for B=4 (e.g. linux
vga16fb driver.) Note with low bpp and/or resolution
VGA and VGA16 modes on the Linux console one's attempt
to export them via x11vnc can often be thwarted due to
special color palettes, pixel packings, and even video
painting buffering. OTOH, often experimenting with the
RGB masks can yield something recognizable.
.IP
VIDEO4LINUX: on Linux some attempt is made to handle VIDEO4LINUX: on Linux some attempt is made to handle
video devices (webcams or TV tuners) automatically. video devices (webcams or TV tuners) automatically.
The idea is the WxHxB will be extracted from the The idea is the WxHxB will be extracted from the
@ -4405,38 +4440,77 @@ As above, if you specify a "@WxHxB..." after the
is not queried for the current values. Otherwise the is not queried for the current values. Otherwise the
device will be queried. device will be queried.
.IP .IP
LINUX CONSOLE: If the libvncserver LinuxVNC program LINUX CONSOLE: The following describes some ways to
is on your system you may want to use that instead of view and possibly interact with the Linux text/graphics
the following method because it will be faster and more console (i.e. not X11 XFree86/Xorg)
accurate for Linux text console. .IP
Note: If the libvncserver LinuxVNC program is on your
system you may want to use that instead of the following
method because it will be faster and more accurate
for the Linux text console and includes mouse support.
There is, however, the basic LinuxVNC functionality in
x11vnc if you replace "console" with "vt" in the
examples below.
.IP .IP
If the rawfb string begins with "console" the If the rawfb string begins with "console" the
framebuffer device /dev/fb0 is opened (this requires framebuffer device /dev/fb0 is opened and /dev/tty0 is
the appropriate kernel modules to be installed) and so opened too. The latter is used to inject keystrokes
is /dev/tty0. The latter is used to inject keystrokes
(not all are supported, but the basic ones are). (not all are supported, but the basic ones are).
You will need to be root to inject keystrokes. You will need to be root to inject keystrokes, but
/dev/tty0 refers to the active VT, to indicate one not necessarily to open /dev/fb0. /dev/tty0 refers to
explicitly, use "console2", etc. using the VT number. the active VT, to indicate one explicitly, use, e.g.,
.IP "console2" for /dev/tty2, etc. by indicating the
If the Linux version seems to be 2.6 or later and the specific VT number.
"uinput" module appears to be present, then the uinput .IP
method will be used instead of /dev/ttyN. uinput allows For the Linux framebuffer device, /dev/fb0, (fb1,
insertion of BOTH keystrokes and mouse input and so it etc) to be enabled the appropriate kernel drivers must
preferred when accessing graphical (e.g. QT-embedded) be loaded. E.g. vesafb or vga16fb and also by setting
linux console apps. See \fB-pipeinput\fR UINPUT below for the boot parameter vga=0x301 (or 0x314, 0x317, etc.)
more information on this mode; you will have to use (The vga=... method is the preferred way; set your
\fB-pipeinput\fR if you want to tweak any UINPUT parameters. machines up that way.) Otherwise there will be a
You may also want to also use the \fB-nodragging\fR and \'No such device' error. You can also load a Linux
\fB-cursor\fR none options. Use "console0", etc or framebuffer driver specific to your make of video card
\fB-pipeinput\fR CONSOLE to force the /dev/ttyN method. for more functionality. Once the machine is booted one
.IP can often 'modprobe' the fb driver as root to obtain
Note you can change VT remotely using the a framebuffer device.
.IP
If you cannot get /dev/fb0 working on Linux, try
using the LinuxVNC emulation mode by "\fB-rawfb\fR \fIvtN\fR"
where N = 1, ... 6 is the Linux Virtual Terminal (aka
virtual console) you wish to view, e.g. "\fB-rawfb\fR \fIvt2\fR".
Unlike /dev/fb mode, it need not be the active Virtual
Terminal. Note that this mode can only show text and
not graphics. x11vnc polls the text in /dev/vcsaN
.IP
Set the env. var. RAWFB_VCSA_BW=1 to disable colors in
the "vtN" mode (i.e. black and white only.) If you
do not prefer the default 16bpp set RAWFB_VCSA_BPP to
8 or 32. If you need to tweak the rawfb parameters by
using the 'console_guess' string printed at startup,
be sure to indicate the snap: method.
.IP
uinput: If the Linux version appears to be 2.6 or
later and the "uinput" module appears to be present
(modprobe uinput), then the uinput method will be used
instead of /dev/ttyN. uinput allows insertion of BOTH
keystrokes and mouse input and so it preferred when
accessing graphical (e.g. QT-embedded) linux console
apps. See \fB-pipeinput\fR UINPUT below for more information
on this mode; you will have to use \fB-pipeinput\fR if you
want to tweak any UINPUT parameters. You may also want
to also use the \fB-nodragging\fR and \fB-cursor\fR none options.
Use "console0", etc or \fB-pipeinput\fR CONSOLE to force
the /dev/ttyN method.
.IP
Note you can change the Linux VT remotely using the
.IR chvt (1) .IR chvt (1)
command. Sometimes switching out and back corrects command to make the one you want be the active
the framebuffer state. one (e.g. 'chvt 3'). Sometimes switching out and back
corrects the framebuffer's graphics state. For the
"\fB-rawfb\fR \fIvtN\fR" mode there is no need to switch the VT's.
.IP .IP
To skip input injecting entirely use "consolex". To skip input injecting entirely use "consolex"
or "vtx".
.IP .IP
The string "/dev/fb0" (1, etc.) can be used instead The string "/dev/fb0" (1, etc.) can be used instead
of "console". This can be used to specify a different of "console". This can be used to specify a different
@ -4446,8 +4520,8 @@ nonstandard, use "console:/dev/foofb"
.IP .IP
If you do not want x11vnc to guess the framebuffer's If you do not want x11vnc to guess the framebuffer's
WxHxB and masks automatically (sometimes the kernel WxHxB and masks automatically (sometimes the kernel
gives inaccurate information), specify them with a gives incorrect information), specify them with a @WxHxB
@WxHxB at the end of the string. (and optional :R/G/B masks) at the end of the string.
.IP .IP
Examples: Examples:
\fB-rawfb\fR console \fB-rawfb\fR console
@ -4456,6 +4530,7 @@ Examples:
\fB-rawfb\fR consolex (no keystrokes or mouse) \fB-rawfb\fR consolex (no keystrokes or mouse)
\fB-rawfb\fR console:/dev/nonstd \fB-rawfb\fR console:/dev/nonstd
\fB-rawfb\fR console \fB-pipeinput\fR UINPUT:accel=4.0 \fB-rawfb\fR console \fB-pipeinput\fR UINPUT:accel=4.0
\fB-rawfb\fR vt3 (/dev/tty3 w/o /dev/fb0)
.IP .IP
VNC HOST: if the \fB-rawfb\fR string is of the form VNC HOST: if the \fB-rawfb\fR string is of the form
"vnc:host:N" then the VNC display "N" on the remote "vnc:host:N" then the VNC display "N" on the remote

@ -194,17 +194,19 @@ int tsdo(int port, int lsock, int *conn) {
*conn = csock; *conn = csock;
} else { } else {
csock = *conn; csock = *conn;
if (db) rfbLog("tsdo: using exiting csock: %d, port: %d\n", csock, port); if (db) rfbLog("tsdo: using existing csock: %d, port: %d\n", csock, port);
} }
rsock = rfbConnectToTcpAddr("127.0.0.1", port); rsock = rfbConnectToTcpAddr("127.0.0.1", port);
if (rsock < 0) { if (rsock < 0) {
if (db) rfbLog("tsdo: rfbConnectToTcpAddr(port=%d) failed.\n", port); if (db) rfbLog("tsdo: rfbConnectToTcpAddr(port=%d) failed.\n", port);
close(csock);
return 2; return 2;
} }
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
close(csock);
close(rsock); close(rsock);
return 3; return 3;
} }
@ -212,8 +214,8 @@ int tsdo(int port, int lsock, int *conn) {
ts_taskn = (ts_taskn+1) % TASKMAX; ts_taskn = (ts_taskn+1) % TASKMAX;
ts_tasks[ts_taskn] = pid; ts_tasks[ts_taskn] = pid;
close(csock); close(csock);
*conn = -1;
close(rsock); close(rsock);
*conn = -1;
return 0; return 0;
} }
if (pid == 0) { if (pid == 0) {
@ -225,15 +227,21 @@ int tsdo(int port, int lsock, int *conn) {
#if LIBVNCSERVER_HAVE_SETSID #if LIBVNCSERVER_HAVE_SETSID
if (setsid() == -1) { if (setsid() == -1) {
perror("setsid"); perror("setsid");
close(csock);
close(rsock);
exit(1); exit(1);
} }
#else #else
if (setpgrp() == -1) { if (setpgrp() == -1) {
perror("setpgrp"); perror("setpgrp");
close(csock);
close(rsock);
exit(1); exit(1);
} }
#endif /* SETSID */ #endif /* SETSID */
raw_xfer(rsock, csock, csock); raw_xfer(rsock, csock, csock);
close(csock);
close(rsock);
exit(0); exit(0);
} }
return 0; return 0;
@ -245,11 +253,13 @@ void set_redir_properties(void);
#define TSSTK 16 #define TSSTK 16
void terminal_services(char *list) { void terminal_services(char *list) {
int i, j, n = 0, db = 1; int i, j, n, db = 1;
char *p, *q, *r, *str = strdup(list); char *p, *q, *r, *str;
#if !NO_X11 #if !NO_X11
char *tag[TSMAX]; char *tag[TSMAX];
int listen[TSMAX], redir[TSMAX][TSSTK], socks[TSMAX], tstk[TSSTK]; int listen[TSMAX], redir[TSMAX][TSSTK], socks[TSMAX], tstk[TSSTK];
double rate_start;
int rate_count;
Atom at, atom[TSMAX]; Atom at, atom[TSMAX];
fd_set rd; fd_set rd;
Window rwin; Window rwin;
@ -265,6 +275,7 @@ void terminal_services(char *list) {
if (! dpy) { if (! dpy) {
return; return;
} }
rwin = RootWindow(dpy, DefaultScreen(dpy)); rwin = RootWindow(dpy, DefaultScreen(dpy));
at = XInternAtom(dpy, "TS_REDIR_LIST", False); at = XInternAtom(dpy, "TS_REDIR_LIST", False);
@ -275,15 +286,24 @@ void terminal_services(char *list) {
} }
if (db) fprintf(stderr, "TS_REDIR_LIST Atom: %d.\n"); if (db) fprintf(stderr, "TS_REDIR_LIST Atom: %d.\n");
oh_restart_it_all:
for (i=0; i<TASKMAX; i++) { for (i=0; i<TASKMAX; i++) {
ts_tasks[i] = 0; ts_tasks[i] = 0;
} }
for (i=0; i<TSMAX; i++) { for (i=0; i<TSMAX; i++) {
socks[i] = -1;
listen[i] = -1;
for (j=0; j<TSSTK; j++) { for (j=0; j<TSSTK; j++) {
redir[i][j] = 0; redir[i][j] = 0;
} }
} }
rate_start = 0.0;
rate_count = 0;
n = 0;
str = strdup(list);
p = strtok(str, ","); p = strtok(str, ",");
while (p) { while (p) {
int m1, m2; int m1, m2;
@ -339,6 +359,7 @@ void terminal_services(char *list) {
} }
for (i=0; i<n; i++) { for (i=0; i<n; i++) {
int k;
atom[i] = XInternAtom(dpy, tag[i], False); atom[i] = XInternAtom(dpy, tag[i], False);
if (db) fprintf(stderr, "tag: %s atom: %d\n", tag[i], (int) atom[i]); if (db) fprintf(stderr, "tag: %s atom: %d\n", tag[i], (int) atom[i]);
if (atom[i] == None) { if (atom[i] == None) {
@ -350,7 +371,15 @@ void terminal_services(char *list) {
PropModeReplace, (unsigned char *)num, strlen(num)); PropModeReplace, (unsigned char *)num, strlen(num));
XSync(dpy, False); XSync(dpy, False);
socks[i] = rfbListenOnTCPPort(listen[i], htonl(INADDR_LOOPBACK)); for (k=1; k <= 5; k++) {
socks[i] = rfbListenOnTCPPort(listen[i], htonl(INADDR_LOOPBACK));
if (socks[i] >= 0) {
if (db) fprintf(stderr, " listen succeeded: %d\n", listen[i]);
break;
}
if (db) fprintf(stderr, " listen failed***: %d\n", listen[i]);
usleep(k * 2000*1000);
}
} }
if (getenv("TSD_RESTART")) { if (getenv("TSD_RESTART")) {
@ -385,6 +414,7 @@ void terminal_services(char *list) {
continue; continue;
} }
if (nfd > 0) { if (nfd > 0) {
int did_ts = 0;
for(i=0; i<n; i++) { for(i=0; i<n; i++) {
int k = 0; int k = 0;
for (j = 0; j < TSSTK; j++) { for (j = 0; j < TSSTK; j++) {
@ -439,7 +469,16 @@ if (tstk[j] != 0) fprintf(stderr, "B redir[%d][%d] = %d %s\n", i, j, tstk[j], t
redir[i][j] = 0; redir[i][j] = 0;
continue; continue;
} }
if (dnow() > rate_start + 10.0) {
rate_start = dnow();
rate_count = 0;
}
rate_count++;
rc = tsdo(p, s, &conn); rc = tsdo(p, s, &conn);
did_ts++;
if (rc == 0) { if (rc == 0) {
/* AOK */ /* AOK */
if (db) fprintf(stderr, "tsdo[%d] OK: %d\n", i, p); if (db) fprintf(stderr, "tsdo[%d] OK: %d\n", i, p);
@ -452,16 +491,18 @@ if (tstk[j] != 0) fprintf(stderr, "B redir[%d][%d] = %d %s\n", i, j, tstk[j], t
break; break;
} else if (rc == 1) { } else if (rc == 1) {
/* accept failed */ /* accept failed */
if (db) fprintf(stderr, "tsdo[%d] accept failed: %d\n", i, p); if (db) fprintf(stderr, "tsdo[%d] accept failed: %d, sleep 50ms\n", i, p);
usleep(50*1000);
break; break;
} else if (rc == 2) { } else if (rc == 2) {
/* connect failed */ /* connect failed */
if (db) fprintf(stderr, "tsdo[%d] connect failed: %d\n", i, p); if (db) fprintf(stderr, "tsdo[%d] connect failed: %d, sleep 50ms rate: %d/10s\n", i, p, rate_count);
redir[i][j] = 0; redir[i][j] = 0;
usleep(50*1000);
continue; continue;
} else if (rc == 3) { } else if (rc == 3) {
/* fork failed */ /* fork failed */
usleep(250*1000); usleep(500*1000);
break; break;
} }
} }
@ -470,6 +511,41 @@ if (tstk[j] != 0) fprintf(stderr, "B redir[%d][%d] = %d %s\n", i, j, tstk[j], t
} }
} }
} }
if (did_ts && rate_count > 100) {
int k, db_netstat = 1;
char dcmd[100];
if (no_external_cmds) {
db_netstat = 0;
}
rfbLog("terminal_services: throttling high connect rate %d/10s\n", rate_count);
usleep(2*1000*1000);
rfbLog("terminal_services: stopping ts services.\n");
for(i=0; i<n; i++) {
int s = socks[i];
if (s < 0) {
continue;
}
rfbLog("terminal_services: closing listen=%d sock=%d.\n", listen[i], socks[i]);
if (listen[i] >= 0 && db_netstat) {
sprintf(dcmd, "netstat -an | grep -w '%d'", listen[i]);
fprintf(stderr, "#1 %s\n", dcmd);
system(dcmd);
}
close(s);
socks[i] = -1;
usleep(2*1000*1000);
if (listen[i] >= 0 && db_netstat) {
fprintf(stderr, "#2 %s\n", dcmd);
system(dcmd);
}
}
usleep(10*1000*1000);
rfbLog("terminal_services: restarting ts services\n");
goto oh_restart_it_all;
}
} }
for (i=0; i<TASKMAX; i++) { for (i=0; i<TASKMAX; i++) {
pid_t p = ts_tasks[i]; pid_t p = ts_tasks[i];
@ -1408,6 +1484,8 @@ static void print_settings(int try_http, int bg, char *gui_str) {
fprintf(stderr, " logappend: %d\n", logfile_append); fprintf(stderr, " logappend: %d\n", logfile_append);
fprintf(stderr, " flag: %s\n", flagfile ? flagfile fprintf(stderr, " flag: %s\n", flagfile ? flagfile
: "null"); : "null");
fprintf(stderr, " rm_flag: %s\n", rm_flagfile ? rm_flagfile
: "null");
fprintf(stderr, " rc_file: \"%s\"\n", rc_rcfile ? rc_rcfile fprintf(stderr, " rc_file: \"%s\"\n", rc_rcfile ? rc_rcfile
: "null"); : "null");
fprintf(stderr, " norc: %d\n", rc_norc); fprintf(stderr, " norc: %d\n", rc_norc);
@ -2768,6 +2846,11 @@ int main(int argc, char* argv[]) {
flagfile = strdup(argv[++i]); flagfile = strdup(argv[++i]);
continue; continue;
} }
if (!strcmp(arg, "-rmflag")) {
CHECK_ARGC
rm_flagfile = strdup(argv[++i]);
continue;
}
if (!strcmp(arg, "-rc")) { if (!strcmp(arg, "-rc")) {
i++; /* done above */ i++; /* done above */
continue; continue;

@ -438,6 +438,12 @@ extern int raw_fb_seek;
extern int raw_fb_fd; extern int raw_fb_fd;
extern int raw_fb_back_to_X; extern int raw_fb_back_to_X;
extern int raw_fb_native_bpp;
extern int raw_fb_expand_bytes;
extern unsigned long raw_fb_native_red_mask, raw_fb_native_green_mask, raw_fb_native_blue_mask;
extern unsigned short raw_fb_native_red_max, raw_fb_native_green_max, raw_fb_native_blue_max;
extern unsigned short raw_fb_native_red_shift, raw_fb_native_green_shift, raw_fb_native_blue_shift;
extern int rfb_bytes_per_line; extern int rfb_bytes_per_line;
extern int main_bytes_per_line; extern int main_bytes_per_line;
extern int rot_bytes_per_line; extern int rot_bytes_per_line;

@ -15,7 +15,7 @@ int xtrap_base_event_type = 0;
int xdamage_base_event_type = 0; int xdamage_base_event_type = 0;
/* date +'lastmod: %Y-%m-%d' */ /* date +'lastmod: %Y-%m-%d' */
char lastmod[] = "0.9.6 lastmod: 2008-12-08"; char lastmod[] = "0.9.7 lastmod: 2009-01-03";
/* X display info */ /* X display info */
@ -75,6 +75,12 @@ int raw_fb_seek = 0;
int raw_fb_fd = -1; int raw_fb_fd = -1;
int raw_fb_back_to_X = 0; /* kludge for testing rawfb -> X */ int raw_fb_back_to_X = 0; /* kludge for testing rawfb -> X */
int raw_fb_native_bpp = 0;
int raw_fb_expand_bytes = 1;
unsigned long raw_fb_native_red_mask = 0, raw_fb_native_green_mask = 0, raw_fb_native_blue_mask = 0;
unsigned short raw_fb_native_red_max = 0, raw_fb_native_green_max = 0, raw_fb_native_blue_max = 0;
unsigned short raw_fb_native_red_shift = 0, raw_fb_native_green_shift = 0, raw_fb_native_blue_shift = 0;
int rfb_bytes_per_line = 0; int rfb_bytes_per_line = 0;
int main_bytes_per_line = 0; int main_bytes_per_line = 0;
int rot_bytes_per_line = 0; int rot_bytes_per_line = 0;

@ -352,6 +352,164 @@ XImage *XCreateImage_wr(Display *disp, Visual *visual, unsigned int depth,
#endif /* NO_X11 */ #endif /* NO_X11 */
} }
static void copy_raw_fb_low_bpp(XImage *dest, int x, int y, unsigned int w,
unsigned int h) {
char *src, *dst;
unsigned int line;
static char *buf = NULL;
static int buflen = -1;
int bpl = wdpy_x * raw_fb_native_bpp / 8;
int n, ix, len, del, sz = wdpy_x * raw_fb_expand_bytes;
unsigned int rm_n = raw_fb_native_red_mask;
unsigned int gm_n = raw_fb_native_green_mask;
unsigned int bm_n = raw_fb_native_blue_mask;
unsigned int rm_f = main_red_mask;
unsigned int gm_f = main_green_mask;
unsigned int bm_f = main_blue_mask;
unsigned int rs_n = raw_fb_native_red_shift;
unsigned int gs_n = raw_fb_native_green_shift;
unsigned int bs_n = raw_fb_native_blue_shift;
unsigned int rs_f = main_red_shift;
unsigned int gs_f = main_green_shift;
unsigned int bs_f = main_blue_shift;
unsigned int rx_n = raw_fb_native_red_max;
unsigned int gx_n = raw_fb_native_green_max;
unsigned int bx_n = raw_fb_native_blue_max;
unsigned int rx_f = main_red_max;
unsigned int gx_f = main_green_max;
unsigned int bx_f = main_blue_max;
static unsigned int msk[8];
static int last_bpp = -1;
static int cga = -1;
if (cga < 0) {
if (getenv("RAWFB_CGA")) {
cga = 1;
} else {
cga = 0;
}
}
if (sz > buflen || buf == NULL) {
if (buf) {
free(buf);
}
buflen = sz + 1000;
buf = (char *) malloc(buflen);
}
if (clipshift && ! use_snapfb) {
x += coff_x;
y += coff_y;
}
if (last_bpp != raw_fb_native_bpp) {
int br;
for (br = 0; br < 8; br++) {
unsigned int pbit, k, m = 0;
for (k=0; k < raw_fb_native_bpp; k++) {
pbit = 1 << (br+k);
m |= pbit;
}
msk[br] = m;
}
last_bpp = raw_fb_native_bpp;
}
dst = dest->data;
if (0) fprintf(stderr, "x=%d y=%d w=%d h=%d bpl=%d d_bpl=%d-%dx%dx%d/%d %p\n",
x, y, w, h, bpl, dest->bytes_per_line, dest->width, dest->height, dest->bits_per_pixel, dest->depth, dst);
for (line = 0; line < h; line++) {
//fprintf(stderr, "w=%d h=%d x=%d y+line=%d\n", w, h, x, y+line);
if (! raw_fb_seek) {
/* mmap */
src = raw_fb_addr + raw_fb_offset + bpl*(y+line);
memcpy(buf, src, bpl);
} else {
/* lseek */
off_t off;
off = (off_t) (raw_fb_offset + bpl*(y+line));
lseek(raw_fb_fd, off, SEEK_SET);
len = bpl;
del = 0;
while (len > 0) {
n = read(raw_fb_fd, buf + del, len);
if (n > 0) {
del += n;
len -= n;
} else if (n == 0) {
break;
} else if (errno != EINTR && errno != EAGAIN) {
break;
}
}
}
for (ix = 0; ix < w; ix++) {
int bx = (x + ix) * raw_fb_native_bpp;
int ib = bx / 8;
int br = bx - ib * 8;
unsigned char val;
//fprintf(stderr, "%d\n", ix);
val = *((unsigned char*) (buf + ib));
val = msk[br] & val;
val = val >> br;
if (cga) {
/* this is expt for CGA */
double r, g, b;
int ir, ig, ib;
r = (2./3)*(val & 4) + (1./3)*(val & 8);
g = (2./3)*(val & 2) + (1./3)*(val & 8);
b = (2./3)*(val & 1) + (1./3)*(val & 8);
if (val == 6) {
g = g/2.;
}
ir = rx_f * r;
ig = gx_f * g;
ib = bx_f * b;
val = (ib << bs_f) | (ig << gs_f) | (ir << rs_f);
} else {
unsigned char rval, gval, bval;
rval = (val & rm_n) >> rs_n;
gval = (val & gm_n) >> gs_n;
bval = (val & bm_n) >> bs_n;
rval = (rx_f * rval) / rx_n;
gval = (gx_f * gval) / gx_n;
bval = (bx_f * bval) / bx_n;
rval = rval << rs_f;
gval = gval << gs_f;
bval = bval << bs_f;
val = rval | gval | bval;
}
*(dst+ix) = (char) val;
}
//fprintf(stderr, "\n", ix);
dst += dest->bytes_per_line;
}
}
static void copy_raw_fb_24_to_32(XImage *dest, int x, int y, unsigned int w, static void copy_raw_fb_24_to_32(XImage *dest, int x, int y, unsigned int w,
unsigned int h) { unsigned int h) {
/* /*
@ -491,6 +649,10 @@ void copy_raw_fb(XImage *dest, int x, int y, unsigned int w, unsigned int h) {
copy_raw_fb_24_to_32(dest, x, y, w, h); copy_raw_fb_24_to_32(dest, x, y, w, h);
return; return;
} }
if (raw_fb_native_bpp < 8) {
copy_raw_fb_low_bpp(dest, x, y, w, h);
return;
}
if (clipshift && ! use_snapfb) { if (clipshift && ! use_snapfb) {
x += coff_x; x += coff_x;

Loading…
Cancel
Save