Magellan Linux

Annotation of /trunk/vnc/patches/vnc-via.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 153 - (hide annotations) (download)
Tue May 8 20:52:56 2007 UTC (17 years ago) by niro
File size: 5912 byte(s)
-import

1 niro 153 --- vnc-4_1-unixsrc/unix/vncviewer/vncviewer.cxx.via 2005-03-03 23:20:33.000000000 +0000
2     +++ vnc-4_1-unixsrc/unix/vncviewer/vncviewer.cxx 2005-03-03 23:23:33.000000000 +0000
3     @@ -41,6 +41,7 @@
4    
5     using namespace network;
6     using namespace rfb;
7     +using namespace std;
8    
9     IntParameter pointerEventInterval("PointerEventInterval",
10     "Time in milliseconds to rate-limit"
11     @@ -95,6 +96,9 @@
12     StringParameter geometry("geometry", "X geometry specification", "");
13     StringParameter displayname("display", "The X display", "");
14    
15     +/* Support for tunnelling */
16     +StringParameter via("via", "Gateway to tunnel via", "");
17     +
18     char aboutText[256];
19     char* programName;
20     extern char buildtime[];
21     @@ -157,6 +161,61 @@
22     exit(1);
23     }
24    
25     +/* Tunnelling support. */
26     +static void
27     +interpretViaParam (char **gatewayHost, char **remoteHost,
28     + int *remotePort, char **vncServerName,
29     + int localPort)
30     +{
31     + const int SERVER_PORT_OFFSET = 5900;
32     + char *pos = strchr (*vncServerName, ':');
33     + if (pos == NULL)
34     + *remotePort = SERVER_PORT_OFFSET;
35     + else {
36     + int portOffset = SERVER_PORT_OFFSET;
37     + size_t len;
38     + *pos++ = '\0';
39     + len = strlen (pos);
40     + if (*pos == ':') {
41     + /* Two colons is an absolute port number, not an offset. */
42     + pos++;
43     + len--;
44     + portOffset = 0;
45     + }
46     + if (!len || strspn (pos, "-0123456789") != len )
47     + usage ();
48     + *remotePort = atoi (pos) + portOffset;
49     + }
50     +
51     + if (**vncServerName != '\0')
52     + *remoteHost = *vncServerName;
53     +
54     + *gatewayHost = strDup (via.getValueStr ());
55     + *vncServerName = new char[50];
56     + sprintf (*vncServerName, "localhost::%d", localPort);
57     +}
58     +
59     +static void
60     +createTunnel (const char *gatewayHost, const char *remoteHost,
61     + int remotePort, int localPort)
62     +{
63     + char *cmd = getenv ("VNC_VIA_CMD");
64     + char *percent;
65     + char lport[10], rport[10];
66     + sprintf (lport, "%d", localPort);
67     + sprintf (rport, "%d", remotePort);
68     + setenv ("G", gatewayHost, 1);
69     + setenv ("H", remoteHost, 1);
70     + setenv ("R", rport, 1);
71     + setenv ("L", lport, 1);
72     + if (!cmd)
73     + cmd = "/usr/bin/ssh -f -L \"$L\":\"$H\":\"$R\" \"$G\" sleep 20";
74     + /* Compatibility with TightVNC's method. */
75     + while ((percent = strchr (cmd, '%')) != NULL)
76     + *percent = '$';
77     + system (cmd);
78     +}
79     +
80     int main(int argc, char** argv)
81     {
82     sprintf(aboutText, "VNC Viewer Free Edition 4.1 for X - built %s\n"
83     @@ -190,8 +249,6 @@
84     usage();
85     }
86    
87     - if (vncServerName)
88     - usage();
89     vncServerName = argv[i];
90     }
91    
92     @@ -207,6 +264,19 @@
93     vlog.error("Could not create .vnc directory: environment variable $HOME not set.");
94    
95     try {
96     + /* Tunnelling support. */
97     + if (strlen (via.getValueStr ()) > 0) {
98     + char *gatewayHost = "";
99     + char *remoteHost = "localhost";
100     + int localPort = findFreeTcpPort ();
101     + int remotePort;
102     + if (!vncServerName)
103     + usage();
104     + interpretViaParam (&gatewayHost, &remoteHost, &remotePort,
105     + &vncServerName, localPort);
106     + createTunnel (gatewayHost, remoteHost, remotePort, localPort);
107     + }
108     +
109     Socket* sock = 0;
110    
111     if (listenMode) {
112     --- vnc-4_1-unixsrc/unix/vncviewer/vncviewer.man.via 2005-03-03 23:23:41.000000000 +0000
113     +++ vnc-4_1-unixsrc/unix/vncviewer/vncviewer.man 2005-03-03 23:24:18.000000000 +0000
114     @@ -174,6 +174,23 @@
115     specified as an X11 keysym name (these can be obtained by removing the XK_
116     prefix from the entries in "/usr/include/X11/keysymdef.h"). Default is F8.
117    
118     +.TP
119     +\fB\-via\fR \fIgateway\fR
120     +Automatically create encrypted TCP tunnel to the \fIgateway\fR machine
121     +before connection, connect to the \fIhost\fR through that tunnel
122     +(TightVNC\-specific). By default, this option invokes SSH local port
123     +forwarding, assuming that SSH client binary can be accessed as
124     +/usr/bin/ssh. Note that when using the \fB\-via\fR option, the host
125     +machine name should be specified as known to the gateway machine, e.g.
126     +"localhost" denotes the \fIgateway\fR, not the machine where vncviewer
127     +was launched. The environment variable \fIVNC_VIA_CMD\fR can override
128     +the default tunnel command of
129     +\fB/usr/bin/ssh\ -f\ -L\ "$L":"$H":"$R"\ "$G"\ sleep\ 20\fR. The tunnel
130     +command is executed with the environment variables \fIL\fR, \fIH\fR,
131     +\fIR\fR, and \fIG\fR taken the values of the local port number, the remote
132     +host, the port number on the remote host, and the gateway machine
133     +respectively.
134     +
135     .SH SEE ALSO
136     .BR Xvnc (1),
137     .BR vncpasswd (1),
138     --- vnc-4_1-unixsrc/common/network/TcpSocket.cxx.via 2005-03-03 23:17:55.000000000 +0000
139     +++ vnc-4_1-unixsrc/common/network/TcpSocket.cxx 2005-03-03 23:19:49.000000000 +0000
140     @@ -54,6 +54,29 @@
141    
142     static rfb::LogWriter vlog("TcpSocket");
143    
144     +/* Tunnelling support. */
145     +int network::findFreeTcpPort (void)
146     +{
147     + int sock, port;
148     + struct sockaddr_in addr;
149     + memset(&addr, 0, sizeof(addr));
150     + addr.sin_family = AF_INET;
151     + addr.sin_addr.s_addr = INADDR_ANY;
152     +
153     + if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
154     + throw SocketException ("unable to create socket", errorNumber);
155     +
156     + for (port = TUNNEL_PORT_OFFSET + 99; port > TUNNEL_PORT_OFFSET; port--) {
157     + addr.sin_port = htons ((unsigned short) port);
158     + if (bind (sock, (struct sockaddr *)&addr, sizeof (addr)) == 0) {
159     + close (sock);
160     + return port;
161     + }
162     + }
163     + throw SocketException ("no free port in range", 0);
164     + return 0;
165     +}
166     +
167    
168     // -=- Socket initialisation
169     static bool socketsInitialised = false;
170     --- vnc-4_1-unixsrc/common/network/TcpSocket.h.via 2005-03-03 23:19:58.000000000 +0000
171     +++ vnc-4_1-unixsrc/common/network/TcpSocket.h 2005-03-03 23:20:21.000000000 +0000
172     @@ -32,8 +32,14 @@
173    
174     #include <list>
175    
176     +/* Tunnelling support. */
177     +#define TUNNEL_PORT_OFFSET 5500
178     +
179     namespace network {
180    
181     + /* Tunnelling support. */
182     + int findFreeTcpPort (void);
183     +
184     class TcpSocket : public Socket {
185     public:
186     TcpSocket(int sock, bool close=true);