diff options
author | runge <runge@karlrunge.com> | 2010-02-22 22:35:16 -0500 |
---|---|---|
committer | runge <runge@karlrunge.com> | 2010-02-22 22:35:16 -0500 |
commit | 018aac069a88243279e4172c44fb76eb881818d2 (patch) | |
tree | 78a5e4ca840ca6b17d73799dd9b0f2272f839cec /libvncclient/rfbproto.c | |
parent | 521b9d98a4b772689061b24bcfd57dcce976aacc (diff) | |
parent | 6b2b3b8213bbe95182c91df419e0562e85f36bc0 (diff) | |
download | libtdevnc-018aac069a88243279e4172c44fb76eb881818d2.tar.gz libtdevnc-018aac069a88243279e4172c44fb76eb881818d2.zip |
Merge branch 'master' of ssh://runge@libvncserver.git.sourceforge.net/gitroot/libvncserver/libvncserver
Diffstat (limited to 'libvncclient/rfbproto.c')
-rw-r--r-- | libvncclient/rfbproto.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/libvncclient/rfbproto.c b/libvncclient/rfbproto.c index 83cfbf9..8aa6348 100644 --- a/libvncclient/rfbproto.c +++ b/libvncclient/rfbproto.c @@ -415,6 +415,51 @@ ConnectToRFBServer(rfbClient* client,const char *hostname, int port) return SetNonBlocking(client->sock); } +/* + * ConnectToRFBRepeater. + */ + +rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort) +{ + unsigned int host; + rfbProtocolVersionMsg pv; + int major,minor; + char tmphost[250]; + + if (!StringToIPAddr(repeaterHost, &host)) { + rfbClientLog("Couldn't convert '%s' to host address\n", repeaterHost); + return FALSE; + } + + client->sock = ConnectClientToTcpAddr(host, repeaterPort); + + if (client->sock < 0) { + rfbClientLog("Unable to connect to VNC repeater\n"); + return FALSE; + } + + if (!SetNonBlocking(client->sock)) + return FALSE; + + if (!ReadFromRFBServer(client, pv, sz_rfbProtocolVersionMsg)) + return FALSE; + pv[sz_rfbProtocolVersionMsg] = 0; + + /* UltraVNC repeater always report version 000.000 to identify itself */ + if (sscanf(pv,rfbProtocolVersionFormat,&major,&minor) != 2 || major != 0 || minor != 0) { + rfbClientLog("Not a valid VNC repeater (%s)\n",pv); + return FALSE; + } + + rfbClientLog("Connected to VNC repeater, using protocol version %d.%d\n", major, minor); + + snprintf(tmphost, sizeof(tmphost), "%s:%d", destHost, destPort); + if (!WriteToRFBServer(client, tmphost, sizeof(tmphost))) + return FALSE; + + return TRUE; +} + extern void rfbClientEncryptBytes(unsigned char* bytes, char* passwd); extern void rfbClientEncryptBytes2(unsigned char *where, const int length, unsigned char *key); |