summaryrefslogtreecommitdiffstats
path: root/libvncserver/sockets.c
diff options
context:
space:
mode:
authorGernot Tenchio <gernot.tenchio@securepoint.de>2011-08-16 14:02:35 +0200
committerJohannes Schindelin <johannes.schindelin@gmx.de>2011-08-17 12:41:24 +0200
commit4aa35863676335917d2a25a7952031f0fba66dfb (patch)
treed9ad5879b6b12942e22c1249377a2538038a02e2 /libvncserver/sockets.c
parent7a77cc32b25477026886b6c3ddccacc1b4293e54 (diff)
downloadlibtdevnc-4aa35863676335917d2a25a7952031f0fba66dfb.tar.gz
libtdevnc-4aa35863676335917d2a25a7952031f0fba66dfb.zip
websockets: Add encryption support
[jes: moved out GnuTLS and OpenSSL support, added a dummy support, to separate changes better, and to keep things compiling] Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Diffstat (limited to 'libvncserver/sockets.c')
-rw-r--r--libvncserver/sockets.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
index 267287d..1886187 100644
--- a/libvncserver/sockets.c
+++ b/libvncserver/sockets.c
@@ -62,6 +62,10 @@
#include <unistd.h>
#endif
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+#include "rfbssl.h"
+#endif
+
#if defined(__linux__) && defined(NEED_TIMEVAL)
struct timeval
{
@@ -392,6 +396,10 @@ rfbCloseClient(rfbClientPtr cl)
while(cl->screen->maxFd>0
&& !FD_ISSET(cl->screen->maxFd,&(cl->screen->allFds)))
cl->screen->maxFd--;
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx)
+ rfbssl_destroy(cl);
+#endif
#ifndef __MINGW32__
shutdown(cl->sock,SHUT_RDWR);
#endif
@@ -460,7 +468,9 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
if (cl->webSockets) {
n = webSocketsDecode(cl, buf, len);
- } else {
+ } else if (cl->sslctx) {
+ n = rfbssl_read(cl, buf, len);
+ } else {
n = read(sock, buf, len);
}
#else
@@ -490,6 +500,12 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
return n;
}
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx) {
+ if (rfbssl_pending(cl))
+ continue;
+ }
+#endif
FD_ZERO(&fds);
FD_SET(sock, &fds);
tv.tv_sec = timeout / 1000;
@@ -500,6 +516,7 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
return n;
}
if (n == 0) {
+ rfbErr("ReadExact: select timeout\n");
errno = ETIMEDOUT;
return -1;
}
@@ -540,7 +557,12 @@ rfbPeekExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
struct timeval tv;
while (len > 0) {
- n = recv(sock, buf, len, MSG_PEEK);
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx)
+ n = rfbssl_peek(cl, buf, len);
+ else
+#endif
+ n = recv(sock, buf, len, MSG_PEEK);
if (n == len) {
@@ -564,13 +586,19 @@ rfbPeekExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
return n;
}
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx) {
+ if (rfbssl_pending(cl))
+ continue;
+ }
+#endif
FD_ZERO(&fds);
FD_SET(sock, &fds);
tv.tv_sec = timeout / 1000;
tv.tv_usec = (timeout % 1000) * 1000;
n = select(sock+1, &fds, NULL, &fds, &tv);
if (n < 0) {
- rfbLogPerror("ReadExact: select");
+ rfbLogPerror("PeekExact: select");
return n;
}
if (n == 0) {
@@ -581,7 +609,7 @@ rfbPeekExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
}
#undef DEBUG_READ_EXACT
#ifdef DEBUG_READ_EXACT
- rfbLog("ReadExact %d bytes\n",len);
+ rfbLog("PeekExact %d bytes\n",len);
for(n=0;n<len;n++)
fprintf(stderr,"%02x ",(unsigned char)buf[n]);
fprintf(stderr,"\n");
@@ -628,7 +656,12 @@ rfbWriteExact(rfbClientPtr cl,
LOCK(cl->outputMutex);
while (len > 0) {
- n = write(sock, buf, len);
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx)
+ n = rfbssl_write(cl, buf, len);
+ else
+#endif
+ n = write(sock, buf, len);
if (n > 0) {