x11vnc: Add "sendbell" remote cmd. Fix copyrect updates under

-reflect.  Workaround that checks valid window of selection
requestor.  Wait on some ssl helper pids earlier.  Workaround
XAUTHLOCALHOSTNAME for some new usage modes.  Set fake fb to
requested bpp with correct masks.  -padgeom once:... mode.
Set LIBXCB_ALLOW_SLOPPY_LOCK by default. rfbRandomBytes earlier.
classes/ssl: Update jars.  Add "TOP_" dropdown customization to
ultravnc java viewer applet FTP panel.
pull/1/head
runge 15 years ago
parent 3998c18e26
commit e59f78c5ea

@ -243,6 +243,16 @@ UltraVNC Java viewer only:
Home.Desktop.bin_2F_linux Home.Desktop.bin_2F_linux
If an item is prefixed with "TOP_" then the item is inserted at
the top of the drop down rather than being appended to the end.
E.g. to try to initially load the user homedir instead of /:
TOP_Home.My+Documents.Desktop
If ftpDropDown is set to the empty string, "", then no special
locations, [Desktop] etc., are placed in the drop down. Only the
ultravnc "drives" will appear.
ftpOnly ftpOnly
yes/no, default: no yes/no, default: no
The VNC viewer only shows the filetransfer panel, no desktop The VNC viewer only shows the filetransfer panel, no desktop

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -121,7 +121,7 @@ diff -Naur JavaViewer.orig/ButtonPanel.java JavaViewer/ButtonPanel.java
} }
diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
--- JavaViewer.orig/FTPFrame.java 2005-03-15 23:53:14.000000000 -0500 --- JavaViewer.orig/FTPFrame.java 2005-03-15 23:53:14.000000000 -0500
+++ JavaViewer/FTPFrame.java 2009-01-11 12:10:06.000000000 -0500 +++ JavaViewer/FTPFrame.java 2009-01-13 09:48:30.000000000 -0500
@@ -24,8 +24,17 @@ @@ -24,8 +24,17 @@
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -244,7 +244,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
// Loop through the string to create a String[] // Loop through the string to create a String[]
for (int i = 0; i < size; i = i + 3) { for (int i = 0; i < size; i = i + 3) {
@@ -150,26 +231,62 @@ @@ -150,26 +231,68 @@
driveType = str.substring(i + 2, i + 3); driveType = str.substring(i + 2, i + 3);
if (driveType.compareTo("f") == 0) if (driveType.compareTo("f") == 0)
drive[i / 3] += "\\ Floppy"; drive[i / 3] += "\\ Floppy";
@ -272,7 +272,13 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
+ String[] dd = viewer.ftpDropDown.split("\\."); + String[] dd = viewer.ftpDropDown.split("\\.");
+ for (int i=0; i < dd.length; i++) { + for (int i=0; i < dd.length; i++) {
+ if (!dd[i].equals("")) { + if (!dd[i].equals("")) {
+ remoteDrivesComboBox.addItem(" [" + dd[i] + "]"); + String s = dd[i];
+ if (s.startsWith("TOP_")) {
+ s = s.substring(4);
+ remoteDrivesComboBox.insertItemAt(" [" + s + "]", 0);
+ } else {
+ remoteDrivesComboBox.addItem(" [" + s + "]");
+ }
+ } + }
+ } + }
+ } else { + } else {
@ -313,7 +319,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
updateDriveList = false; updateDriveList = false;
return drive; return drive;
} }
@@ -185,6 +302,8 @@ @@ -185,6 +308,8 @@
stopButton.setVisible(true); stopButton.setVisible(true);
stopButton.setEnabled(true); stopButton.setEnabled(true);
receiveButton.setEnabled(false); receiveButton.setEnabled(false);
@ -322,7 +328,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
remoteTopButton.setEnabled(false); remoteTopButton.setEnabled(false);
sendButton.setEnabled(false); sendButton.setEnabled(false);
remoteFileTable.setEnabled(false); remoteFileTable.setEnabled(false);
@@ -207,6 +326,8 @@ @@ -207,6 +332,8 @@
stopButton.setVisible(false); stopButton.setVisible(false);
stopButton.setEnabled(false); stopButton.setEnabled(false);
receiveButton.setEnabled(true); receiveButton.setEnabled(true);
@ -331,7 +337,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
remoteTopButton.setEnabled(true); remoteTopButton.setEnabled(true);
sendButton.setEnabled(true); sendButton.setEnabled(true);
remoteFileTable.setEnabled(true); remoteFileTable.setEnabled(true);
@@ -221,10 +342,11 @@ @@ -221,10 +348,11 @@
/* /*
* Print Directory prints out all the contents of a directory * Print Directory prints out all the contents of a directory
*/ */
@ -344,7 +350,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
remoteFileTable.setListData(remoteList); remoteFileTable.setListData(remoteList);
} }
@@ -235,10 +357,12 @@ @@ -235,10 +363,12 @@
* @return void * @return void
*/ */
private void initialize() { private void initialize() {
@ -358,7 +364,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
/** /**
* This method initializes jContentPane. This is the main content pane * This method initializes jContentPane. This is the main content pane
* *
@@ -253,6 +377,33 @@ @@ -253,6 +383,33 @@
jContentPane.add(getRemotePanel(), java.awt.BorderLayout.EAST); jContentPane.add(getRemotePanel(), java.awt.BorderLayout.EAST);
jContentPane.add(getLocalPanel(), java.awt.BorderLayout.WEST); jContentPane.add(getLocalPanel(), java.awt.BorderLayout.WEST);
jContentPane.add(getButtonPanel(), java.awt.BorderLayout.CENTER); jContentPane.add(getButtonPanel(), java.awt.BorderLayout.CENTER);
@ -392,7 +398,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return jContentPane; return jContentPane;
} }
@@ -270,6 +421,7 @@ @@ -270,6 +427,7 @@
topPanelLocal.add(getLocalMachineLabel(), java.awt.BorderLayout.CENTER); topPanelLocal.add(getLocalMachineLabel(), java.awt.BorderLayout.CENTER);
topPanelLocal.add(getLocalTopButton(), java.awt.BorderLayout.EAST); topPanelLocal.add(getLocalTopButton(), java.awt.BorderLayout.EAST);
topPanelLocal.setBackground(java.awt.Color.lightGray); topPanelLocal.setBackground(java.awt.Color.lightGray);
@ -400,7 +406,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return topPanelLocal; return topPanelLocal;
} }
@@ -288,6 +440,7 @@ @@ -288,6 +446,7 @@
topPanelRemote.add(getRemoteMachineLabel(), java.awt.BorderLayout.CENTER); topPanelRemote.add(getRemoteMachineLabel(), java.awt.BorderLayout.CENTER);
topPanelRemote.add(getRemoteTopButton(), java.awt.BorderLayout.EAST); topPanelRemote.add(getRemoteTopButton(), java.awt.BorderLayout.EAST);
topPanelRemote.setBackground(java.awt.Color.lightGray); topPanelRemote.setBackground(java.awt.Color.lightGray);
@ -408,7 +414,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return topPanelRemote; return topPanelRemote;
} }
@@ -301,6 +454,7 @@ @@ -301,6 +460,7 @@
if (topPanelCenter == null) { if (topPanelCenter == null) {
topPanelCenter = new javax.swing.JPanel(); topPanelCenter = new javax.swing.JPanel();
topPanelCenter.add(getDummyButton(), null); topPanelCenter.add(getDummyButton(), null);
@ -416,7 +422,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return topPanelCenter; return topPanelCenter;
} }
@@ -328,6 +482,7 @@ @@ -328,6 +488,7 @@
topPanel.add(getRemoteTopButton(), null); topPanel.add(getRemoteTopButton(), null);
topPanel.setBackground(java.awt.Color.lightGray); topPanel.setBackground(java.awt.Color.lightGray);
*/ */
@ -424,7 +430,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return topPanel; return topPanel;
} }
@@ -348,6 +503,7 @@ @@ -348,6 +509,7 @@
statusPanel.add(getJProgressBar(), null); statusPanel.add(getJProgressBar(), null);
statusPanel.add(getConnectionStatus(), null); statusPanel.add(getConnectionStatus(), null);
statusPanel.setBackground(java.awt.Color.lightGray); statusPanel.setBackground(java.awt.Color.lightGray);
@ -432,7 +438,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return statusPanel; return statusPanel;
@@ -368,6 +524,7 @@ @@ -368,6 +530,7 @@
remotePanel.add(getRemoteScrollPane(), null); remotePanel.add(getRemoteScrollPane(), null);
remotePanel.add(getRemoteStatus(), null); remotePanel.add(getRemoteStatus(), null);
remotePanel.setBackground(java.awt.Color.lightGray); remotePanel.setBackground(java.awt.Color.lightGray);
@ -440,7 +446,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remotePanel; return remotePanel;
} }
@@ -390,6 +547,7 @@ @@ -390,6 +553,7 @@
localPanel.setComponentOrientation( localPanel.setComponentOrientation(
java.awt.ComponentOrientation.UNKNOWN); java.awt.ComponentOrientation.UNKNOWN);
localPanel.setName("localPanel"); localPanel.setName("localPanel");
@ -448,7 +454,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localPanel; return localPanel;
} }
@@ -405,12 +563,15 @@ @@ -405,12 +569,15 @@
buttonPanel = new javax.swing.JPanel(); buttonPanel = new javax.swing.JPanel();
buttonPanel.setLayout(null); buttonPanel.setLayout(null);
buttonPanel.add(getReceiveButton(), null); buttonPanel.add(getReceiveButton(), null);
@ -464,7 +470,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return buttonPanel; return buttonPanel;
} }
@@ -422,10 +583,11 @@ @@ -422,10 +589,11 @@
private javax.swing.JButton getSendButton() { private javax.swing.JButton getSendButton() {
if (sendButton == null) { if (sendButton == null) {
sendButton = new javax.swing.JButton(); sendButton = new javax.swing.JButton();
@ -477,7 +483,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return sendButton; return sendButton;
@@ -438,7 +600,7 @@ @@ -438,7 +606,7 @@
private javax.swing.JButton getReceiveButton() { private javax.swing.JButton getReceiveButton() {
if (receiveButton == null) { if (receiveButton == null) {
receiveButton = new javax.swing.JButton(); receiveButton = new javax.swing.JButton();
@ -486,7 +492,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
receiveButton.setText("<< Receive"); receiveButton.setText("<< Receive");
receiveButton.setName("receiveButton"); receiveButton.setName("receiveButton");
receiveButton.addActionListener(this); receiveButton.addActionListener(this);
@@ -453,7 +615,7 @@ @@ -453,7 +621,7 @@
private javax.swing.JButton getDeleteButton() { private javax.swing.JButton getDeleteButton() {
if (deleteButton == null) { if (deleteButton == null) {
deleteButton = new javax.swing.JButton(); deleteButton = new javax.swing.JButton();
@ -495,7 +501,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
deleteButton.setText("Delete File"); deleteButton.setText("Delete File");
deleteButton.setName("deleteButton"); deleteButton.setName("deleteButton");
deleteButton.addActionListener(this); deleteButton.addActionListener(this);
@@ -468,7 +630,7 @@ @@ -468,7 +636,7 @@
private javax.swing.JButton getNewFolderButton() { private javax.swing.JButton getNewFolderButton() {
if (newFolderButton == null) { if (newFolderButton == null) {
newFolderButton = new javax.swing.JButton(); newFolderButton = new javax.swing.JButton();
@ -504,7 +510,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
newFolderButton.setText("New Folder"); newFolderButton.setText("New Folder");
newFolderButton.setName("newFolderButton"); newFolderButton.setName("newFolderButton");
newFolderButton.addActionListener(this); newFolderButton.addActionListener(this);
@@ -476,6 +638,39 @@ @@ -476,6 +644,39 @@
return newFolderButton; return newFolderButton;
} }
@ -544,7 +550,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
/** /**
* This method initializes stopButton * This method initializes stopButton
* *
@@ -486,7 +681,7 @@ @@ -486,7 +687,7 @@
if (stopButton == null) if (stopButton == null)
{ {
stopButton = new javax.swing.JButton(); stopButton = new javax.swing.JButton();
@ -553,7 +559,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
stopButton.setText("Stop"); stopButton.setText("Stop");
stopButton.setName("stopButton"); stopButton.setName("stopButton");
stopButton.addActionListener(this); stopButton.addActionListener(this);
@@ -503,8 +698,12 @@ @@ -503,8 +704,12 @@
private javax.swing.JButton getCloseButton() { private javax.swing.JButton getCloseButton() {
if (closeButton == null) { if (closeButton == null) {
closeButton = new javax.swing.JButton(); closeButton = new javax.swing.JButton();
@ -568,7 +574,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
closeButton.setName("closeButton"); closeButton.setName("closeButton");
closeButton.addActionListener(this); closeButton.addActionListener(this);
} }
@@ -551,6 +750,7 @@ @@ -551,6 +756,7 @@
//Select the second entry (e.g. C:\) //Select the second entry (e.g. C:\)
// localDrivesComboBox.setSelectedIndex(1); // localDrivesComboBox.setSelectedIndex(1);
localDrivesComboBox.addActionListener(this); localDrivesComboBox.addActionListener(this);
@ -576,7 +582,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
updateDriveList = false; updateDriveList = false;
return localDrivesComboBox; return localDrivesComboBox;
@@ -567,6 +767,7 @@ @@ -567,6 +773,7 @@
remoteDrivesComboBox.setFont( remoteDrivesComboBox.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
remoteDrivesComboBox.addActionListener(this); remoteDrivesComboBox.addActionListener(this);
@ -584,7 +590,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remoteDrivesComboBox; return remoteDrivesComboBox;
@@ -587,6 +788,7 @@ @@ -587,6 +794,7 @@
localMachineLabel.setFont( localMachineLabel.setFont(
new java.awt.Font("Dialog", java.awt.Font.BOLD, 11)); new java.awt.Font("Dialog", java.awt.Font.BOLD, 11));
localMachineLabel.setEditable(false); localMachineLabel.setEditable(false);
@ -592,7 +598,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localMachineLabel; return localMachineLabel;
} }
@@ -622,6 +824,7 @@ @@ -622,6 +830,7 @@
localTopButton.setFont( localTopButton.setFont(
new java.awt.Font("Dialog", java.awt.Font.BOLD, 10)); new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));
localTopButton.addActionListener(this); localTopButton.addActionListener(this);
@ -600,7 +606,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localTopButton; return localTopButton;
} }
@@ -638,6 +841,7 @@ @@ -638,6 +847,7 @@
remoteTopButton.setFont( remoteTopButton.setFont(
new java.awt.Font("Dialog", java.awt.Font.BOLD, 10)); new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));
remoteTopButton.addActionListener(this); remoteTopButton.addActionListener(this);
@ -608,7 +614,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remoteTopButton; return remoteTopButton;
} }
@@ -650,9 +854,24 @@ @@ -650,9 +860,24 @@
private javax.swing.JList getLocalFileTable() { private javax.swing.JList getLocalFileTable() {
if (localFileTable == null) { if (localFileTable == null) {
localList = new Vector(0); localList = new Vector(0);
@ -633,7 +639,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localFileTable; return localFileTable;
} }
@@ -669,6 +888,7 @@ @@ -669,6 +894,7 @@
localScrollPane.setFont( localScrollPane.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
localScrollPane.setName("localFileList"); localScrollPane.setName("localFileList");
@ -641,7 +647,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localScrollPane; return localScrollPane;
} }
@@ -680,10 +900,25 @@ @@ -680,10 +906,25 @@
private javax.swing.JList getRemoteFileTable() { private javax.swing.JList getRemoteFileTable() {
if (remoteFileTable == null) { if (remoteFileTable == null) {
remoteList = new Vector(0); remoteList = new Vector(0);
@ -667,7 +673,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remoteFileTable; return remoteFileTable;
@@ -698,6 +933,7 @@ @@ -698,6 +939,7 @@
remoteScrollPane = new javax.swing.JScrollPane(); remoteScrollPane = new javax.swing.JScrollPane();
remoteScrollPane.setViewportView(getRemoteFileTable()); remoteScrollPane.setViewportView(getRemoteFileTable());
remoteScrollPane.setPreferredSize(new java.awt.Dimension(325, 418)); remoteScrollPane.setPreferredSize(new java.awt.Dimension(325, 418));
@ -675,7 +681,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remoteScrollPane; return remoteScrollPane;
} }
@@ -716,6 +952,7 @@ @@ -716,6 +958,7 @@
remoteLocation.setBackground(new Color(255,255,238)); remoteLocation.setBackground(new Color(255,255,238));
remoteLocation.setFont( remoteLocation.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
@ -683,7 +689,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remoteLocation; return remoteLocation;
} }
@@ -732,6 +969,7 @@ @@ -732,6 +975,7 @@
localLocation.setBackground( new Color(255,255,238)); localLocation.setBackground( new Color(255,255,238));
localLocation.setFont( localLocation.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
@ -691,7 +697,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localLocation; return localLocation;
} }
@@ -748,6 +986,7 @@ @@ -748,6 +992,7 @@
localStatus.setFont( localStatus.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
localStatus.setEditable(false); localStatus.setEditable(false);
@ -699,7 +705,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return localStatus; return localStatus;
} }
@@ -764,6 +1003,7 @@ @@ -764,6 +1009,7 @@
remoteStatus.setFont( remoteStatus.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
remoteStatus.setEditable(false); remoteStatus.setEditable(false);
@ -707,7 +713,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return remoteStatus; return remoteStatus;
} }
@@ -777,9 +1017,10 @@ @@ -777,9 +1023,10 @@
historyComboBox = new javax.swing.JComboBox(); historyComboBox = new javax.swing.JComboBox();
historyComboBox.setFont( historyComboBox.setFont(
new java.awt.Font("Dialog", java.awt.Font.BOLD, 10)); new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));
@ -719,7 +725,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return historyComboBox; return historyComboBox;
} }
@@ -791,6 +1032,7 @@ @@ -791,6 +1038,7 @@
private javax.swing.JProgressBar getJProgressBar() { private javax.swing.JProgressBar getJProgressBar() {
if (jProgressBar == null) { if (jProgressBar == null) {
jProgressBar = new javax.swing.JProgressBar(); jProgressBar = new javax.swing.JProgressBar();
@ -727,7 +733,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
return jProgressBar; return jProgressBar;
} }
@@ -806,6 +1048,7 @@ @@ -806,6 +1054,7 @@
connectionStatus.setBackground(java.awt.Color.lightGray); connectionStatus.setBackground(java.awt.Color.lightGray);
connectionStatus.setFont( connectionStatus.setFont(
new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10)); new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
@ -735,7 +741,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
connectionStatus.setEditable(false); connectionStatus.setEditable(false);
return connectionStatus; return connectionStatus;
@@ -815,7 +1058,12 @@ @@ -815,7 +1064,12 @@
* Implements Action listener. * Implements Action listener.
*/ */
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
@ -749,7 +755,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if (evt.getSource() == closeButton) if (evt.getSource() == closeButton)
{ // Close Button { // Close Button
@@ -829,15 +1077,27 @@ @@ -829,15 +1083,27 @@
{ {
doReceive(); doReceive();
} }
@ -779,7 +785,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
else if (evt.getSource() == localTopButton) else if (evt.getSource() == localTopButton)
{ {
@@ -845,12 +1105,17 @@ @@ -845,12 +1111,17 @@
} }
else if (evt.getSource() == remoteTopButton) else if (evt.getSource() == remoteTopButton)
{ {
@ -797,7 +803,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
else if(evt.getSource()==newFolderButton) else if(evt.getSource()==newFolderButton)
{ {
doNewFolder(); doNewFolder();
@@ -864,7 +1129,7 @@ @@ -864,7 +1135,7 @@
private void doNewFolder() private void doNewFolder()
{ {
@ -806,7 +812,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if(selectedTable.equals("remote")) if(selectedTable.equals("remote"))
{ {
name = remoteLocation.getText()+name; name = remoteLocation.getText()+name;
@@ -880,34 +1145,106 @@ @@ -880,34 +1151,106 @@
historyComboBox.setSelectedIndex(0); historyComboBox.setSelectedIndex(0);
} }
} }
@ -923,7 +929,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
return; return;
} }
@@ -916,7 +1253,7 @@ @@ -916,7 +1259,7 @@
// sf@2004 - Delete prompt // sf@2004 - Delete prompt
if (remoteList.contains(sFileName)) if (remoteList.contains(sFileName))
{ {
@ -932,7 +938,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if (r == JOptionPane.NO_OPTION) if (r == JOptionPane.NO_OPTION)
return; return;
} }
@@ -926,18 +1263,22 @@ @@ -926,18 +1269,22 @@
} }
else else
{ {
@ -958,7 +964,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if (r == JOptionPane.NO_OPTION) if (r == JOptionPane.NO_OPTION)
return; return;
} }
@@ -952,21 +1293,25 @@ @@ -952,21 +1299,25 @@
private void doReceive() private void doReceive()
{ {
@ -988,7 +994,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if (r == JOptionPane.NO_OPTION) if (r == JOptionPane.NO_OPTION)
return; return;
} }
@@ -979,23 +1324,101 @@ @@ -979,23 +1330,101 @@
viewer.rfb.requestRemoteFile(remoteFileName,localDestinationPath); viewer.rfb.requestRemoteFile(remoteFileName,localDestinationPath);
} }
@ -1094,7 +1100,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if (r == JOptionPane.NO_OPTION) if (r == JOptionPane.NO_OPTION)
return; return;
} }
@@ -1013,6 +1436,7 @@ @@ -1013,6 +1442,7 @@
// //
private void doStop() private void doStop()
{ {
@ -1102,7 +1108,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
viewer.rfb.fAbort = true; viewer.rfb.fAbort = true;
} }
/** /**
@@ -1024,6 +1448,14 @@ @@ -1024,6 +1454,14 @@
System.out.println("History: " + message); System.out.println("History: " + message);
historyComboBox.insertItemAt(new String(message), 0); historyComboBox.insertItemAt(new String(message), 0);
} }
@ -1117,7 +1123,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
/** /**
* This method updates the file table to the current selection of the remoteComboBox * This method updates the file table to the current selection of the remoteComboBox
@@ -1034,11 +1466,44 @@ @@ -1034,11 +1472,44 @@
remoteSelection = null; remoteSelection = null;
if (!updateDriveList) { if (!updateDriveList) {
@ -1165,7 +1171,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
remoteFileTable.setListData(remoteList); remoteFileTable.setListData(remoteList);
} }
/** /**
@@ -1048,6 +1513,7 @@ @@ -1048,6 +1519,7 @@
private void changeLocalDrive() private void changeLocalDrive()
{ {
File currentDrive = new File(localDrivesComboBox.getSelectedItem().toString()); File currentDrive = new File(localDrivesComboBox.getSelectedItem().toString());
@ -1173,7 +1179,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
if(currentDrive.canRead()) if(currentDrive.canRead())
{ {
localSelection = null; localSelection = null;
@@ -1057,9 +1523,11 @@ @@ -1057,9 +1529,11 @@
else else
{ {
localList.clear(); localList.clear();
@ -1185,7 +1191,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
/** /**
* Determines which FileTable was double-clicked and updates the table * Determines which FileTable was double-clicked and updates the table
@@ -1098,10 +1566,18 @@ @@ -1098,10 +1572,18 @@
selectedTable = "remote"; selectedTable = "remote";
localFileTable.setBackground(new Color(238, 238, 238)); localFileTable.setBackground(new Color(238, 238, 238));
remoteFileTable.setBackground(new Color(255, 255, 255)); remoteFileTable.setBackground(new Color(255, 255, 255));
@ -1206,7 +1212,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
/* /*
@@ -1115,10 +1591,38 @@ @@ -1115,10 +1597,38 @@
localFileTable.setBackground(new Color(255, 255, 255)); localFileTable.setBackground(new Color(255, 255, 255));
File currentSelection = new File(currentLocalDirectory, getTrimmedSelection()); File currentSelection = new File(currentLocalDirectory, getTrimmedSelection());
@ -1246,7 +1252,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
/** /**
* Updates the Remote File Table based on selection. Called from mouseClicked handler * Updates the Remote File Table based on selection. Called from mouseClicked handler
*/ */
@@ -1126,20 +1630,29 @@ @@ -1126,20 +1636,29 @@
String name = null; String name = null;
String action = null; String action = null;
String drive = null; String drive = null;
@ -1278,7 +1284,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
remoteFileTable.setListData(remoteList); remoteFileTable.setListData(remoteList);
} }
else if (!name.substring(0, 2).equals(" [") && !name.substring((name.length() - 1), name.length()).equals("]")) else if (!name.substring(0, 2).equals(" [") && !name.substring((name.length() - 1), name.length()).equals("]"))
@@ -1149,6 +1662,7 @@ @@ -1149,6 +1668,7 @@
remoteSelection = remoteLocation.getText() + name.substring(0, name.length()); remoteSelection = remoteLocation.getText() + name.substring(0, name.length());
drive = remoteLocation.getText(); drive = remoteLocation.getText();
// ?? // ??
@ -1286,7 +1292,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
else else
{ {
@@ -1159,10 +1673,12 @@ @@ -1159,10 +1679,12 @@
remoteLocation.setText(drive); remoteLocation.setText(drive);
viewer.rfb.readServerDirectory(drive); viewer.rfb.readServerDirectory(drive);
remoteList.clear(); remoteList.clear();
@ -1299,7 +1305,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
/** /**
* Updates the Local File Table based on selection. Called from MouseClicked handler * Updates the Local File Table based on selection. Called from MouseClicked handler
*/ */
@@ -1188,6 +1704,7 @@ @@ -1188,6 +1710,7 @@
else if (currentSelection.isFile()) else if (currentSelection.isFile())
{ {
localSelection = currentSelection.getAbsoluteFile(); localSelection = currentSelection.getAbsoluteFile();
@ -1307,7 +1313,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
else if (currentSelection.isDirectory()) else if (currentSelection.isDirectory())
{ {
@@ -1201,13 +1718,22 @@ @@ -1201,13 +1724,22 @@
* *
*/ */
private String getTrimmedSelection(){ private String getTrimmedSelection(){
@ -1337,7 +1343,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
} }
/* /*
@@ -1241,36 +1767,148 @@ @@ -1241,36 +1773,148 @@
return null; return null;
} }
@ -1494,7 +1500,7 @@ diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java
FilesList.clear(); FilesList.clear();
DirsList.clear(); DirsList.clear();
@@ -1296,3 +1934,147 @@ @@ -1296,3 +1940,147 @@
} }
} // @jve:visual-info decl-index=0 visual-constraint="10,10" } // @jve:visual-info decl-index=0 visual-constraint="10,10"

@ -1,3 +1,13 @@
2009-02-03 Karl Runge <runge@karlrunge.com>
* x11vnc: Add "sendbell" remote cmd. Fix copyrect updates under
-reflect. Workaround that checks valid window of selection
requestor. Wait on some ssl helper pids earlier. Workaround
XAUTHLOCALHOSTNAME for some new usage modes. Set fake fb to
requested bpp with correct masks. -padgeom once:... mode.
Set LIBXCB_ALLOW_SLOPPY_LOCK by default. rfbRandomBytes earlier.
* classes/ssl: Update jars. Add "TOP_" dropdown customization to
ultravnc java viewer applet FTP panel.
2009-01-11 Karl Runge <runge@karlrunge.com> 2009-01-11 Karl Runge <runge@karlrunge.com>
* classes/ssl: Add configurable Ultra java applet Filexfer Drives * classes/ssl: Add configurable Ultra java applet Filexfer Drives
drop down (e.g. ftpDropDown=Home.Desktop.bin). Document all drop down (e.g. ftpDropDown=Home.Desktop.bin). Document all

File diff suppressed because it is too large Load Diff

@ -52,7 +52,7 @@ void print_help(int mode) {
"Also, use of a VNC password (-rfbauth or -passwdfile) is strongly recommended.\n" "Also, use of a VNC password (-rfbauth or -passwdfile) is strongly recommended.\n"
"\n" "\n"
"For additional info see: http://www.karlrunge.com/x11vnc/\n" "For additional info see: http://www.karlrunge.com/x11vnc/\n"
" and http://www.karlrunge.com/x11vnc/#faq\n" " and http://www.karlrunge.com/x11vnc/faq.html\n"
"\n" "\n"
"\n" "\n"
"Config file support: if the file $HOME/.x11vncrc exists then each line in\n" "Config file support: if the file $HOME/.x11vncrc exists then each line in\n"
@ -1343,10 +1343,11 @@ void print_help(int mode) {
" The VNC Viewer-side needs to support SSL/TLS as well.\n" " The VNC Viewer-side needs to support SSL/TLS as well.\n"
" See this URL and also the discussion below for\n" " See this URL and also the discussion below for\n"
" ideas on how to enable SSL support for the viewer:\n" " ideas on how to enable SSL support for the viewer:\n"
" http://www.karlrunge.com/x11vnc/#faq-ssl-tunnel-viewers\n" " http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-tun\n"
" x11vnc provides an SSL enabled Java viewer applet in\n" " nel-viewers x11vnc provides an SSL enabled Java\n"
" the classes/ssl directory (-http or -httpdir options.)\n" " viewer applet in the classes/ssl directory (-http or\n"
" The SSVNC viewer package supports SSL tunnels too.\n" " -httpdir options.) The SSVNC viewer package supports\n"
" SSL tunnels too.\n"
"\n" "\n"
" If the VNC Viewer supports VeNCrypt or ANONTLS (vino's\n" " If the VNC Viewer supports VeNCrypt or ANONTLS (vino's\n"
" encryption mode) they are also supported by the -ssl\n" " encryption mode) they are also supported by the -ssl\n"
@ -2460,6 +2461,10 @@ void print_help(int mode) {
" to handle all subsequent resizes (e.g. under -xrandr,\n" " to handle all subsequent resizes (e.g. under -xrandr,\n"
" -remote id:windowid, rescaling, etc.)\n" " -remote id:windowid, rescaling, etc.)\n"
"\n" "\n"
" In -unixpw mode this sets the size of the login screen.\n"
" Use \"once:WxH\" it ignore padgeom after the login\n"
" screen is set up.\n"
"\n"
"-o logfile Write stderr messages to file \"logfile\" instead of to\n" "-o logfile Write stderr messages to file \"logfile\" instead of to\n"
" the terminal. Same as \"-logfile file\". To append\n" " the terminal. Same as \"-logfile file\". To append\n"
" to the file use \"-oa file\" or \"-logappend file\".\n" " to the file use \"-oa file\" or \"-logappend file\".\n"
@ -4382,6 +4387,7 @@ void print_help(int mode) {
" fb disable -nofb mode.\n" " fb disable -nofb mode.\n"
" bell enable bell (if supported).\n" " bell enable bell (if supported).\n"
" nobell disable bell.\n" " nobell disable bell.\n"
" sendbell ring the bell now.\n"
" nosel enable -nosel mode.\n" " nosel enable -nosel mode.\n"
" sel disable -nosel mode.\n" " sel disable -nosel mode.\n"
" noprimary enable -noprimary mode.\n" " noprimary enable -noprimary mode.\n"
@ -4914,7 +4920,7 @@ void xopen_display_fail_message(char *disp) {
fprintf(stderr, " change and the directory the cookie file resides in" fprintf(stderr, " change and the directory the cookie file resides in"
" is system dependent.\n"); " is system dependent.\n");
fprintf(stderr, "\n"); fprintf(stderr, "\n");
fprintf(stderr, "See also: http://www.karlrunge.com/x11vnc/#faq\n"); fprintf(stderr, "See also: http://www.karlrunge.com/x11vnc/faq.html\n");
} }
void nopassword_warning_msg(int gotloc) { void nopassword_warning_msg(int gotloc) {
@ -4974,7 +4980,7 @@ void nopassword_warning_msg(int gotloc) {
"#@ Please Read the documention for more info about @#\n" "#@ Please Read the documention for more info about @#\n"
"#@ passwords, security, and encryption. @#\n" "#@ passwords, security, and encryption. @#\n"
"#@ @#\n" "#@ @#\n"
"#@ http://www.karlrunge.com/x11vnc/#faq-passwd @#\n" "#@ http://www.karlrunge.com/x11vnc/faq.html#faq-passwd @#\n"
; ;
char str3[] = char str3[] =
"#@ @#\n" "#@ @#\n"

@ -2537,6 +2537,14 @@ char *process_remote_cmd(char *cmd, int stringonly) {
sound_bell = 0; sound_bell = 0;
goto done; goto done;
} }
if (!strcmp(p, "sendbell")) {
NOTAPP
rfbLog("remote_cmd: sendbell.\n");
if (screen && client_count) {
rfbSendBell(screen);
}
goto done;
}
if (!strcmp(p, "sel")) { if (!strcmp(p, "sel")) {
if (query) { if (query) {
snprintf(buf, bufn, "ans=%s:%d", p, watch_selection); snprintf(buf, bufn, "ans=%s:%d", p, watch_selection);

@ -1004,6 +1004,48 @@ void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, i
set_cursor(cursor_x, cursor_y, get_which_cursor()); set_cursor(cursor_x, cursor_y, get_which_cursor());
} }
static void from_libvncclient_CopyRectangleFromRectangle(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y) {
int i,j;
#define COPY_RECT_FROM_RECT(BPP) \
{ \
uint##BPP##_t* _buffer=((uint##BPP##_t*)client->frameBuffer)+(src_y-dest_y)*client->width+src_x-dest_x; \
if (dest_y < src_y) { \
for(j = dest_y*client->width; j < (dest_y+h)*client->width; j += client->width) { \
if (dest_x < src_x) { \
for(i = dest_x; i < dest_x+w; i++) { \
((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \
} \
} else { \
for(i = dest_x+w-1; i >= dest_x; i--) { \
((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \
} \
} \
} \
} else { \
for(j = (dest_y+h-1)*client->width; j >= dest_y*client->width; j-=client->width) { \
if (dest_x < src_x) { \
for(i = dest_x; i < dest_x+w; i++) { \
((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \
} \
} else { \
for(i = dest_x+w-1; i >= dest_x; i--) { \
((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \
} \
} \
} \
} \
}
switch(client->format.bitsPerPixel) {
case 8: COPY_RECT_FROM_RECT(8); break;
case 16: COPY_RECT_FROM_RECT(16); break;
case 32: COPY_RECT_FROM_RECT(32); break;
default:
rfbClientLog("Unsupported bitsPerPixel: %d\n",client->format.bitsPerPixel);
}
}
void vnc_reflect_got_copyrect(rfbClient *cl, int src_x, int src_y, int w, int h, int dest_x, int dest_y) { void vnc_reflect_got_copyrect(rfbClient *cl, int src_x, int src_y, int w, int h, int dest_x, int dest_y) {
sraRegionPtr reg; sraRegionPtr reg;
int dx, dy, rc = -1; int dx, dy, rc = -1;
@ -1021,13 +1063,15 @@ void vnc_reflect_got_copyrect(rfbClient *cl, int src_x, int src_y, int w, int h,
if (dx != last_dx || dy != last_dy) { if (dx != last_dx || dy != last_dy) {
rc = fb_push_wait(0.05, FB_COPY|FB_MOD); rc = fb_push_wait(0.05, FB_COPY|FB_MOD);
} }
if (0) fprintf(stderr, "vnc_reflect_got_copyrect: %dx%d+%d+%d %d %d rc=%d\n", dest_x, dest_y, w, h, dx, dy, rc); if (1) fprintf(stderr, "vnc_reflect_got_copyrect: %03dx%03d+%03d+%03d %3d %3d rc=%d\n", dest_x, dest_y, w, h, dx, dy, rc);
reg = sraRgnCreateRect(dest_x, dest_y, dest_x + w, dest_y + h); reg = sraRgnCreateRect(dest_x, dest_y, dest_x + w, dest_y + h);
do_copyregion(reg, dx, dy, 0); do_copyregion(reg, dx, dy, 0);
sraRgnDestroy(reg); sraRgnDestroy(reg);
last_dx = dx; last_dx = dx;
last_dy = dy; last_dy = dy;
from_libvncclient_CopyRectangleFromRectangle(cl, src_x, src_y, w, h, dest_x, dest_y);
} }
rfbBool vnc_reflect_resize(rfbClient *cl) { rfbBool vnc_reflect_resize(rfbClient *cl) {

@ -169,11 +169,38 @@ void selection_request(XEvent *ev, char *type) {
} }
if (! trapped_xerror) { if (! trapped_xerror) {
int ret = XSendEvent(req_event->display, req_event->requestor, False, 0, int ret = -2, skip_it = 0, ms = 0;
(XEvent *)&notify_event); double now = dnow();
static double last_check = 0.0;
if (now > last_check + 0.2) {
XFlush_wr(dpy);
if (!valid_window(req_event->requestor , NULL, 1)) {
sync_it = 1;
skip_it = 1;
if (debug_sel) {
rfbLog("selection_request: not a valid window: 0x%x\n",
req_event->requestor);
}
ms = 10;
}
if (trapped_xerror) {
sync_it = 1;
skip_it = 1;
}
last_check = dnow();
}
if (!skip_it) {
ret = XSendEvent(req_event->display, req_event->requestor, False, 0,
(XEvent *)&notify_event);
}
if (debug_sel) { if (debug_sel) {
rfbLog("XSendEvent() -> %d\n", ret); rfbLog("XSendEvent() -> %d\n", ret);
} }
if (ms > 0) {
usleep(ms * 1000);
}
} }
if (trapped_xerror) { if (trapped_xerror) {
rfbLog("selection_request: ignored XError while sending " rfbLog("selection_request: ignored XError while sending "
@ -182,7 +209,7 @@ void selection_request(XEvent *ev, char *type) {
XFlush_wr(dpy); XFlush_wr(dpy);
if (sync_it) { if (sync_it) {
usleep(5 * 1000); usleep(10 * 1000);
XSync(dpy, False); XSync(dpy, False);
} }

@ -1248,18 +1248,23 @@ void ssl_helper_pid(pid_t pid, int sock) {
# define HPSIZE 256 # define HPSIZE 256
static pid_t helpers[HPSIZE]; static pid_t helpers[HPSIZE];
static int sockets[HPSIZE], first = 1; static int sockets[HPSIZE], first = 1;
int i, empty, set, status, db = 0; int i, empty, set, status;
static int db = 0;
if (first) { if (first) {
for (i=0; i < HPSIZE; i++) { for (i=0; i < HPSIZE; i++) {
helpers[i] = 0; helpers[i] = 0;
sockets[i] = 0; sockets[i] = 0;
} }
if (getenv("SSL_HELPER_PID_DB")) {
db = 1;
}
first = 0; first = 0;
} }
if (pid == 0) { if (pid == 0) {
/* killall */ /* killall or waitall */
for (i=0; i < HPSIZE; i++) { for (i=0; i < HPSIZE; i++) {
if (helpers[i] == 0) { if (helpers[i] == 0) {
sockets[i] = -1; sockets[i] = -1;
@ -1279,13 +1284,17 @@ void ssl_helper_pid(pid_t pid, int sock) {
} }
#if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID #if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID
if (db) fprintf(stderr, "waitpid(%d)\n", helpers[i]);
wret = waitpid(helpers[i], &status, WNOHANG); wret = waitpid(helpers[i], &status, WNOHANG);
if (db) fprintf(stderr, "waitpid(%d)\n", helpers[i]);
if (db) fprintf(stderr, " waitret1=%d\n", wret);
if (kret == 0 && wret != helpers[i]) { if (kret == 0 && wret != helpers[i]) {
int k; int k;
for (k=0; k < 10; k++) { for (k=0; k < 10; k++) {
usleep(100 * 1000); usleep(100 * 1000);
wret = waitpid(helpers[i], &status, WNOHANG); wret = waitpid(helpers[i], &status, WNOHANG);
if (db) fprintf(stderr, " waitret2=%d\n", wret);
if (wret == helpers[i]) { if (wret == helpers[i]) {
break; break;
} }
@ -1310,10 +1319,12 @@ if (db) fprintf(stderr, "ssl_helper_pid(%d, %d)\n", pid, sock);
for (i=0; i < HPSIZE; i++) { for (i=0; i < HPSIZE; i++) {
if (helpers[i] == pid) { if (helpers[i] == pid) {
if (sock == -1) { if (sock == -1) {
#if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID #if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID
pid_t wret;
wret = waitpid(helpers[i], &status, WNOHANG);
if (db) fprintf(stderr, "waitpid(%d) 2\n", helpers[i]); if (db) fprintf(stderr, "waitpid(%d) 2\n", helpers[i]);
waitpid(helpers[i], &status, WNOHANG); if (db) fprintf(stderr, " waitret1=%d\n", wret);
#endif #endif
helpers[i] = 0; helpers[i] = 0;
} }
@ -2456,6 +2467,7 @@ void accept_openssl(int mode, int presock) {
} }
screen->port = origport; screen->port = origport;
rfbLog("SSL: guessing child https finished.\n"); rfbLog("SSL: guessing child https finished.\n");
ssl_helper_pid(0, -2);
if (mode == OPENSSL_INETD) { if (mode == OPENSSL_INETD) {
clean_up_exit(1); clean_up_exit(1);
} }
@ -2490,8 +2502,11 @@ void accept_openssl(int mode, int presock) {
} }
rfbLog("SSL: OPENSSL_INETD guessing " rfbLog("SSL: OPENSSL_INETD guessing "
"child https finished.\n"); "child https finished.\n");
ssl_helper_pid(0, -2);
clean_up_exit(1); clean_up_exit(1);
} }
/* this will actually only get earlier https */
ssl_helper_pid(0, -2);
return; return;
} }
kill(pid, SIGTERM); kill(pid, SIGTERM);
@ -3522,6 +3537,8 @@ static void ssl_xfer(int csock, int s_in, int s_out, int is_https) {
} else { } else {
tv_use = tv_vnc_later; tv_use = tv_vnc_later;
} }
/* try to clean out some zombies if we can. */
ssl_helper_pid(0, -2);
} }
if (ssl_timeout_secs > 0) { if (ssl_timeout_secs > 0) {
tv_use = ssl_timeout_secs; tv_use = ssl_timeout_secs;
@ -3742,7 +3759,16 @@ void check_openssl(void) {
static double last_check = 0.0; static double last_check = 0.0;
double now; double now;
if (! use_openssl || openssl_sock < 0) { if (! use_openssl) {
return;
}
if (time(NULL) > last_waitall + 120) {
last_waitall = time(NULL);
ssl_helper_pid(0, -2); /* waitall */
}
if (openssl_sock < 0) {
return; return;
} }
@ -3752,11 +3778,6 @@ void check_openssl(void) {
} }
last_check = now; last_check = now;
if (time(NULL) > last_waitall + 150) {
last_waitall = time(NULL);
ssl_helper_pid(0, -2); /* waitall */
}
FD_ZERO(&fds); FD_ZERO(&fds);
FD_SET(openssl_sock, &fds); FD_SET(openssl_sock, &fds);
@ -3809,6 +3830,7 @@ void check_https(void) {
static void init_prng(void) { static void init_prng(void) {
int db = 0, bytes, ubytes, fd; int db = 0, bytes, ubytes, fd;
char file[MSZ], dtmp[100]; char file[MSZ], dtmp[100];
unsigned int sr;
RAND_file_name(file, MSZ); RAND_file_name(file, MSZ);
@ -3838,6 +3860,9 @@ static void init_prng(void) {
RAND_poll(); RAND_poll();
} }
RAND_bytes((unsigned char *)&sr, 4);
srand(sr);
if (bytes > 0) { if (bytes > 0) {
if (! quiet) { if (! quiet) {
rfbLog("initialized PRNG with %d random bytes.\n", rfbLog("initialized PRNG with %d random bytes.\n",

@ -798,6 +798,9 @@ char find_display[] =
" exit 1\n" " exit 1\n"
"fi\n" "fi\n"
"\n" "\n"
"LC_ALL=C\n"
"export LC_ALL\n"
"\n"
"# util to try to match a display with a Linux VT and print\n" "# util to try to match a display with a Linux VT and print\n"
"# disp,VT=... etc. Otherwise just print out display.\n" "# disp,VT=... etc. Otherwise just print out display.\n"
"#\n" "#\n"
@ -980,19 +983,21 @@ char find_display[] =
"list=\"$list \"`who 2>/dev/null | grep \"^${user}[ ]\" | awk '{print $NF}' | grep '(:[0-9]' | sed -e 's/[()]//g'`\n" "list=\"$list \"`who 2>/dev/null | grep \"^${user}[ ]\" | awk '{print $NF}' | grep '(:[0-9]' | sed -e 's/[()]//g'`\n"
"host=`hostname 2>/dev/null | sed -e 's/\\..*$//'`\n" "host=`hostname 2>/dev/null | sed -e 's/\\..*$//'`\n"
"\n" "\n"
"got_local_dm_file=\"\"\n"
"\n"
"if [ \"X$X11VNC_FINDDISPLAY_SKIP_XAUTH\" = \"X\" ]; then\n" "if [ \"X$X11VNC_FINDDISPLAY_SKIP_XAUTH\" = \"X\" ]; then\n"
" # do a normal xauth list:\n" " # do a normal xauth list:\n"
" list=\"$list \"`xauth list | awk '{print $1}' | grep /unix | grep \"^${host}\" | sed -e 's/^.*:/:/' | sort -n | uniq`\n" " list=\"$list \"`xauth list | awk '{print $1}' | grep /unix | grep \"^${host}\" | sed -e 's/^.*:/:/' | sort -n | uniq`\n"
"\n" "\n"
" # check for gdm and kdm non-NFS cookies in /tmp:\n" " # check for gdm and kdm non-NFS cookies in /tmp: (and now /var/run/gdm)\n"
" for xa in /tmp/.gdm* /tmp/.Xauth*\n" " for xa in /tmp/.gdm* /tmp/.Xauth* /var/run/gdm/auth-for-*/database /var/run/gdm/auth-cookie-*-for-*\n"
" do\n" " do\n"
" # try to be somewhat careful about the real owner of the file:\n" " # try to be somewhat careful about the real owner of the file:\n"
" if id | sed -e 's/ gid.*$//' | grep -w root > /dev/null; then\n" " if id | sed -e 's/ gid.*$//' | grep -w root > /dev/null; then\n"
" break\n" " break\n"
" fi\n" " fi\n"
" if [ -f $xa -a -r $xa ]; then\n" " if [ -f $xa -a -r $xa ]; then\n"
" if ls -l \"$xa\" | sed -e 's,/tmp.*$,,' | grep -w \"$user\" > /dev/null; then\n" " if ls -l \"$xa\" | sed -e 's,/tmp.*$,,' -e 's,/var.*$,,' | grep -w \"$user\" > /dev/null; then\n"
" # append these too:\n" " # append these too:\n"
" if find \"$xa\" -user \"$user\" -perm 600 > /dev/null; then\n" " if find \"$xa\" -user \"$user\" -perm 600 > /dev/null; then\n"
" :\n" " :\n"
@ -1000,7 +1005,12 @@ char find_display[] =
" continue\n" " continue\n"
" fi\n" " fi\n"
" # it passes the ownership tests, add it:\n" " # it passes the ownership tests, add it:\n"
" list=\"$list \"`xauth -f \"$xa\" list | awk '{print $1}' | grep /unix | grep \"^${host}\" | sed -e 's/^.*:/:/' | sort -n | uniq | sed -e \"s,\\$,\\,$xa,\"`\n" " # since the directory is (evidently) local, \"localhost\" is good too. (but beware XAUTHLOCALHOSTNAME in libxcb)\n"
" sav0=\"$list \"\n"
" list=\"$list \"`xauth -f \"$xa\" list | awk '{print $1}' | grep /unix | egrep -i \"^${host}|^localhost\" | sed -e 's/^.*:/:/' | sort -n | uniq | sed -e \"s,\\$,\\,$xa,\"`\n"
" if [ \"X$sav0\" != \"X$list\" ]; then\n"
" got_local_dm_file=1\n"
" fi\n"
" fi\n" " fi\n"
" fi\n" " fi\n"
" done\n" " done\n"
@ -1073,10 +1083,6 @@ char find_display[] =
" if [ \"X$ok\" = \"X1\" ]; then\n" " if [ \"X$ok\" = \"X1\" ]; then\n"
" # ok, put it on the list\n" " # ok, put it on the list\n"
" poss=\"$poss $p\"\n" " poss=\"$poss $p\"\n"
" if [ \"X$xa\" != \"X\" ]; then\n"
" # xauth file too, if applicable\n"
" poss=\"$poss,$xa\"\n"
" fi\n"
" fi\n" " fi\n"
"done\n" "done\n"
"\n" "\n"
@ -1148,12 +1154,24 @@ char find_display[] =
"\n" "\n"
" # check xauth for it:\n" " # check xauth for it:\n"
" if [ \"X$xa\" != \"X\" ]; then\n" " if [ \"X$xa\" != \"X\" ]; then\n"
" XAUTHORITY=\"$xa\" xdpyinfo -display \"$p\" >/dev/null 2>&1\n" " myenv=\"XAUTHORITY=$xa\"\n"
" else\n" " else\n"
" xdpyinfo -display \"$p\" >/dev/null 2>&1\n" " myenv=\"FOO_BAR_=baz\"\n"
" fi\n"
" env \"$myenv\" xdpyinfo -display \"$p\" >/dev/null 2>&1\n"
" rc=$?\n"
" if [ $rc != 0 -a \"X$XAUTHLOCALHOSTNAME\" = \"X\" ]; then\n"
" # guard against libxcb/desktop silliness: \n"
" env \"$myenv\" XAUTHLOCALHOSTNAME=localhost xdpyinfo -display \"$p\" >/dev/null 2>&1\n"
" rc=$?\n"
" if [ $rc = 0 ]; then\n"
" # better export it for cmds below...\n"
" XAUTHLOCALHOSTNAME=localhost\n"
" export XAUTHLOCALHOSTNAME\n"
" fi\n"
" fi\n" " fi\n"
"\n" "\n"
" if [ $? = 0 ]; then\n" " if [ $rc = 0 ]; then\n"
" if [ \"X$FD_TAG\" != \"X\" ]; then\n" " if [ \"X$FD_TAG\" != \"X\" ]; then\n"
" # look for x11vnc special FD_TAG property:\n" " # look for x11vnc special FD_TAG property:\n"
" if [ \"X$xa\" = \"X\" ]; then\n" " if [ \"X$xa\" = \"X\" ]; then\n"
@ -1286,6 +1304,9 @@ char create_display[] =
"COLUMNS=256\n" "COLUMNS=256\n"
"export COLUMNS\n" "export COLUMNS\n"
"\n" "\n"
"LC_ALL=C\n"
"export LC_ALL\n"
"\n"
"findfree() {\n" "findfree() {\n"
" try=20\n" " try=20\n"
" sry=99\n" " sry=99\n"

@ -16,6 +16,7 @@ extern char *crypt(const char*, const char *);
#include "connections.h" #include "connections.h"
#include "user.h" #include "user.h"
#include "connections.h" #include "connections.h"
#include "sslhelper.h"
#include "cursor.h" #include "cursor.h"
#include <rfb/default8x16.h> #include <rfb/default8x16.h>
@ -1518,6 +1519,8 @@ static void apply_opts (char *user) {
void unixpw_accept(char *user) { void unixpw_accept(char *user) {
apply_opts(user); apply_opts(user);
ssl_helper_pid(0, -2); /* waitall */
if (accept_cmd && strstr(accept_cmd, "popup") == accept_cmd) { if (accept_cmd && strstr(accept_cmd, "popup") == accept_cmd) {
if (use_dpy && strstr(use_dpy, "WAIT:") == use_dpy && if (use_dpy && strstr(use_dpy, "WAIT:") == use_dpy &&
dpy == NULL) { dpy == NULL) {

@ -13,6 +13,7 @@
#include "keyboard.h" #include "keyboard.h"
#include "cursor.h" #include "cursor.h"
#include "remote.h" #include "remote.h"
#include "sslhelper.h"
#include "avahi.h" #include "avahi.h"
void check_switched_user(void); void check_switched_user(void);
@ -590,6 +591,7 @@ static int guess_user_and_switch(char *str, int fb_mode) {
free(t); free(t);
continue; continue;
} }
if (switch_user(user, fb_mode)) { if (switch_user(user, fb_mode)) {
rfbLog("switched to guessed user: %s\n", user); rfbLog("switched to guessed user: %s\n", user);
free(t); free(t);
@ -684,6 +686,8 @@ int switch_user(char *user, int fb_mode) {
user++; user++;
} }
ssl_helper_pid(0, -2); /* waitall */
if (strstr(user, "guess=") == user) { if (strstr(user, "guess=") == user) {
return guess_user_and_switch(user, fb_mode); return guess_user_and_switch(user, fb_mode);
} }
@ -1370,10 +1374,27 @@ static void setup_fake_fb(XImage* fb_image, int w, int h, int b) {
fb_image->bits_per_pixel = b; fb_image->bits_per_pixel = b;
fb_image->bytes_per_line = w*b/8; fb_image->bytes_per_line = w*b/8;
fb_image->bitmap_unit = -1; fb_image->bitmap_unit = -1;
fb_image->depth = 24; if (b >= 24) {
fb_image->red_mask = 0xff0000; fb_image->depth = 24;
fb_image->green_mask = 0x00ff00; fb_image->red_mask = 0xff0000;
fb_image->blue_mask = 0x0000ff; fb_image->green_mask = 0x00ff00;
fb_image->blue_mask = 0x0000ff;
} else if (b >= 16) {
fb_image->depth = 16;
fb_image->red_mask = 0x003f;
fb_image->green_mask = 0x07c0;
fb_image->blue_mask = 0xf800;
} else if (b >= 2) {
fb_image->depth = 8;
fb_image->red_mask = 0x07;
fb_image->green_mask = 0x38;
fb_image->blue_mask = 0xc0;
} else {
fb_image->depth = 1;
fb_image->red_mask = 0x1;
fb_image->green_mask = 0x1;
fb_image->blue_mask = 0x1;
}
depth = fb_image->depth; depth = fb_image->depth;
@ -2574,7 +2595,7 @@ int wait_for_client(int *argc, char** argv, int http) {
/* ugh, here we go... */ /* ugh, here we go... */
XImage* fb_image; XImage* fb_image;
int w = 640, h = 480, b = 32; int w = 640, h = 480, b = 32;
int w0, h0, i, chg_raw_fb = 0; int w0 = -1, h0 = -1, i, chg_raw_fb = 0;
char *str, *q, *cmd = NULL; char *str, *q, *cmd = NULL;
int db = 0, dt = 0; int db = 0, dt = 0;
char *create_cmd = NULL; char *create_cmd = NULL;
@ -2618,10 +2639,32 @@ int wait_for_client(int *argc, char** argv, int http) {
w = w0; w = w0;
h = h0; h = h0;
rfbLog("wait_for_client set: w=%d h=%d\n", w, h); rfbLog("wait_for_client set: w=%d h=%d\n", w, h);
} else {
w0 = -1;
h0 = -1;
} }
*q = ':'; *q = ':';
str = q; str = q;
} }
if ((w0 == -1 || h0 == -1) && pad_geometry != NULL) {
int b0, del = 0;
char *s = pad_geometry;
if (strstr(s, "once:") == s) {
del = 1;
s += strlen("once:");
}
if (sscanf(s, "%dx%dx%d", &w0, &h0, &b0) == 3) {
w = nabs(w0);
h = nabs(h0);
b = nabs(b0);
} else if (sscanf(s, "%dx%d", &w0, &h0) == 2) {
w = nabs(w0);
h = nabs(h0);
}
if (del) {
pad_geometry = NULL;
}
}
/* str currently begins with a ':' */ /* str currently begins with a ':' */
if (strstr(str, ":cmd=") == str) { if (strstr(str, ":cmd=") == str) {

@ -9015,7 +9015,7 @@ if (ncdb && c) fprintf(stderr, "check_ncache purged %d events\n", c);
"If there are painting errors press 3 Alt_L's (Left \"Alt\" key) in a row to repaint the screen.", "If there are painting errors press 3 Alt_L's (Left \"Alt\" key) in a row to repaint the screen.",
white_pixel()); white_pixel());
rfbDrawString(screen, &default8x16Font, dx, ds + Dy+6*dy, rfbDrawString(screen, &default8x16Font, dx, ds + Dy+6*dy,
"More info: http://www.karlrunge.com/x11vnc/#faq-client-caching", "More info: http://www.karlrunge.com/x11vnc/faq.html#faq-client-caching",
white_pixel()); white_pixel());
ds += 11 * dy; ds += 11 * dy;

@ -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" "January 2009" "x11vnc " "User Commands" .TH X11VNC "1" "February 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.7, lastmod: 2009-01-11 version: 0.9.7, lastmod: 2009-01-24
.SH SYNOPSIS .SH SYNOPSIS
.B x11vnc .B x11vnc
[OPTION]... [OPTION]...
@ -40,7 +40,7 @@ ssh \fB-t\fR \fB-L\fR 5900:localhost:5900 far-host 'x11vnc \fB-localhost\fR \fB-
Also, use of a VNC password (-rfbauth or \fB-passwdfile)\fR is strongly recommended. Also, use of a VNC password (-rfbauth or \fB-passwdfile)\fR is strongly recommended.
.PP .PP
For additional info see: http://www.karlrunge.com/x11vnc/ For additional info see: http://www.karlrunge.com/x11vnc/
and http://www.karlrunge.com/x11vnc/#faq and http://www.karlrunge.com/x11vnc/faq.html
.PP .PP
Config file support: if the file $HOME/.x11vncrc exists then each line in Config file support: if the file $HOME/.x11vncrc exists then each line in
it is treated as a single command line option. Disable with \fB-norc.\fR For it is treated as a single command line option. Disable with \fB-norc.\fR For
@ -1548,10 +1548,11 @@ is prescribed.
The VNC Viewer-side needs to support SSL/TLS as well. The VNC Viewer-side needs to support SSL/TLS as well.
See this URL and also the discussion below for See this URL and also the discussion below for
ideas on how to enable SSL support for the viewer: ideas on how to enable SSL support for the viewer:
http://www.karlrunge.com/x11vnc/#faq-ssl-tunnel-viewers http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-tun
x11vnc provides an SSL enabled Java viewer applet in nel-viewers x11vnc provides an SSL enabled Java
the classes/ssl directory (-http or \fB-httpdir\fR options.) viewer applet in the classes/ssl directory (-http or
The SSVNC viewer package supports SSL tunnels too. \fB-httpdir\fR options.) The SSVNC viewer package supports
SSL tunnels too.
.IP .IP
If the VNC Viewer supports VeNCrypt or ANONTLS (vino's If the VNC Viewer supports VeNCrypt or ANONTLS (vino's
encryption mode) they are also supported by the \fB-ssl\fR encryption mode) they are also supported by the \fB-ssl\fR
@ -2786,6 +2787,10 @@ that do not support NewFBSize and one wants to make
sure the initial viewer geometry will be big enough sure the initial viewer geometry will be big enough
to handle all subsequent resizes (e.g. under \fB-xrandr,\fR to handle all subsequent resizes (e.g. under \fB-xrandr,\fR
\fB-remote\fR id:windowid, rescaling, etc.) \fB-remote\fR id:windowid, rescaling, etc.)
.IP
In \fB-unixpw\fR mode this sets the size of the login screen.
Use "once:WxH" it ignore padgeom after the login
screen is set up.
.PP .PP
\fB-o\fR \fIlogfile\fR \fB-o\fR \fIlogfile\fR
.IP .IP
@ -5164,6 +5169,8 @@ bell enable bell (if supported).
.IP .IP
nobell disable bell. nobell disable bell.
.IP .IP
sendbell ring the bell now.
.IP
nosel enable \fB-nosel\fR mode. nosel enable \fB-nosel\fR mode.
.IP .IP
sel disable \fB-nosel\fR mode. sel disable \fB-nosel\fR mode.

@ -1809,7 +1809,7 @@ char msg[] =
" 2) You can actually see the cached pixel data if you scroll down\n" " 2) You can actually see the cached pixel data if you scroll down\n"
" to it in your viewer; adjust your viewer's size to hide it.\n" " to it in your viewer; adjust your viewer's size to hide it.\n"
"\n" "\n"
"More info: http://www.karlrunge.com/x11vnc/#faq-client-caching\n" "More info: http://www.karlrunge.com/x11vnc/faq.html#faq-client-caching\n"
"\n" "\n"
"waiting for connections:\n" "waiting for connections:\n"
; ;
@ -1824,7 +1824,7 @@ char msg2[] =
"\n" "\n"
" x11vnc -ncache 10 ...\n" " x11vnc -ncache 10 ...\n"
"\n" "\n"
"more info: http://www.karlrunge.com/x11vnc/#faq-client-caching\n" "more info: http://www.karlrunge.com/x11vnc/faq.html#faq-client-caching\n"
"\n" "\n"
; ;
@ -3775,6 +3775,11 @@ int main(int argc, char* argv[]) {
} }
} }
if (! getenv("NO_LIBXCB_ALLOW_SLOPPY_LOCK")) {
/* libxcb is a bit too strict for us sometimes... */
set_env("LIBXCB_ALLOW_SLOPPY_LOCK", "1");
}
/* set OS struct UT */ /* set OS struct UT */
uname(&UT); uname(&UT);
@ -4167,6 +4172,14 @@ int main(int argc, char* argv[]) {
rfbLog("-passwd must be supplied when using -viewpasswd\n"); rfbLog("-passwd must be supplied when using -viewpasswd\n");
exit(1); exit(1);
} }
if (1) {
/* mix things up a little bit */
unsigned char buf[CHALLENGESIZE];
int k, kmax = (int) (500 * rfac()) + 100;
for (k=0; k < kmax; k++) {
rfbRandomBytes(buf);
}
}
if (SHOW_NO_PASSWORD_WARNING) { if (SHOW_NO_PASSWORD_WARNING) {
char message[] = "-rfbauth, -passwdfile, -passwd password, " char message[] = "-rfbauth, -passwdfile, -passwd password, "
@ -4943,7 +4956,7 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
rfbLog(" client sides. This mode works with any VNC viewer.\n"); rfbLog(" client sides. This mode works with any VNC viewer.\n");
rfbLog(" However, in most you can actually see the cached pixel\n"); rfbLog(" However, in most you can actually see the cached pixel\n");
rfbLog(" data by scrolling down, so you need to re-adjust its size.\n"); rfbLog(" data by scrolling down, so you need to re-adjust its size.\n");
rfbLog(" See http://www.karlrunge.com/x11vnc/#faq-client-caching.\n"); rfbLog(" See http://www.karlrunge.com/x11vnc/faq.html#faq-client-caching.\n");
rfbLog(" If this mode yields undesired behavior (poor response,\n"); rfbLog(" If this mode yields undesired behavior (poor response,\n");
rfbLog(" painting errors, etc) it may be disabled via: '-ncache 0'\n"); rfbLog(" painting errors, etc) it may be disabled via: '-ncache 0'\n");
rfbLog(" You can press 3 Alt_L's (Left \"Alt\" key) in a row to \n"); rfbLog(" You can press 3 Alt_L's (Left \"Alt\" key) in a row to \n");

@ -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.7 lastmod: 2009-01-11"; char lastmod[] = "0.9.7 lastmod: 2009-01-24";
/* X display info */ /* X display info */

@ -1262,6 +1262,24 @@ Display *XOpenDisplay_wr(char *display_name) {
d = XOpenDisplay(display_name); d = XOpenDisplay(display_name);
if (db) fprintf(stderr, "XOpenDisplay_wr: %s %p\n", display_name, (void *)d); if (db) fprintf(stderr, "XOpenDisplay_wr: %s %p\n", display_name, (void *)d);
if (d == NULL) {
if (!getenv("NO_XAUTHLOCALHOSTNAME")) {
if (!getenv("XAUTHLOCALHOSTNAME")) {
rfbLog("XOpenDisplay(\"%s\") failed.\n",
display_name ? display_name : "");
rfbLog("Trying again with XAUTHLOCALHOSTNAME=localhost ...\n");
set_env("XAUTHLOCALHOSTNAME", "localhost");
d = XOpenDisplay(display_name);
if (0) {
char *ptr = getenv("XAUTHLOCALHOSTNAME");
if (ptr) {
*(ptr-2) = '_'; /* yow */
}
}
}
}
}
xauth_raw(0); xauth_raw(0);
return d; return d;

Loading…
Cancel
Save