summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Beier <dontmind@freeshell.org>2012-01-12 17:47:06 +0100
committerChristian Beier <dontmind@freeshell.org>2012-01-12 17:47:06 +0100
commit5ea7e51e6bd25f3753a3943271e7410e2cb78f5e (patch)
tree39df608a47aee16530ab4bc8d99ae593373c4f38
parent66b0603b5a0b6c09f7c4ead72a0422f971d25882 (diff)
parentf597599d2a074a8df598b89d9d1c5ca4b109840d (diff)
downloadlibtdevnc-5ea7e51e6bd25f3753a3943271e7410e2cb78f5e.tar.gz
libtdevnc-5ea7e51e6bd25f3753a3943271e7410e2cb78f5e.zip
Merge branch 'websockets' of https://github.com/kanaka/libvncserver
-rw-r--r--CMakeLists.txt24
-rw-r--r--libvncserver/websockets.c25
2 files changed, 31 insertions, 18 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index db54c4c..6e7b837 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,6 +11,12 @@ set(FULL_PACKAGE_NAME "LibVNCServer")
set(PACKAGE_VERSION "0.9.8.1")
set(PROJECT_BUGREPORT_PATH "http://sourceforge.net/projects/libvncserver")
set(CMAKE_C_FLAGS "-O2 -W -Wall -g")
+set(LIBVNCSERVER_DIR ${CMAKE_SOURCE_DIR}/libvncserver)
+set(COMMON_DIR ${CMAKE_SOURCE_DIR}/common)
+set(LIBVNCCLIENT_DIR ${CMAKE_SOURCE_DIR}/libvncclient)
+set(LIBVNCSRVTEST_DIR ${CMAKE_SOURCE_DIR}/examples)
+set(LIBVNCCLITEST_DIR ${CMAKE_SOURCE_DIR}/client_examples)
+
include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/libvncserver ${CMAKE_SOURCE_DIR}/common)
@@ -47,11 +53,15 @@ if(GNUTLS_FOUND)
set(LIBVNCSERVER_WITH_CLIENT_TLS 1)
option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (gnutls)" ON)
set(WEBSOCKET_LIBRARIES -lresolv ${GNUTLS_LIBRARIES})
- set(WSSRCS rfbssl_gnutls)
+ set(WSSRCS ${LIBVNCSERVER_DIR}/rfbssl_gnutls ${LIBVNCSERVER_DIR}/rfbcrypto_gnutls)
elseif(OPENSSL_FOUND)
option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (openssl)" ON)
set(WEBSOCKET_LIBRARIES -lresolv ${OPENSSL_LIBRARIES})
- set(WSSRCS rfbssl_openssl)
+ set(WSSRCS ${LIBVNCSERVER_DIR}/rfbssl_openssl ${LIBVNCSERVER_DIR}/rfbcrypto_openssl)
+else()
+ option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (no ssl)" ON)
+ set(WEBSOCKET_LIBRARIES -lresolv)
+ set(WSSRCS ${LIBVNCSERVER_DIR}/rfbssl_none.c ${LIBVNCSERVER_DIR}/rfbcrypto_included.c ${COMMON_DIR}/md5.c ${COMMON_DIR}/sha1.c)
endif()
if(LIBGCRYPT_LIBRARIES)
@@ -106,12 +116,6 @@ TEST_BIG_ENDIAN(LIBVNCSERVER_WORDS_BIGENDIAN)
configure_file(${CMAKE_SOURCE_DIR}/rfb/rfbconfig.h.cmake ${CMAKE_BINARY_DIR}/rfb/rfbconfig.h)
configure_file(${CMAKE_SOURCE_DIR}/rfb/rfbint.h.cmake ${CMAKE_BINARY_DIR}/rfb/rfbint.h)
-set(LIBVNCSERVER_DIR ${CMAKE_SOURCE_DIR}/libvncserver)
-set(COMMON_DIR ${CMAKE_SOURCE_DIR}/common)
-set(LIBVNCCLIENT_DIR ${CMAKE_SOURCE_DIR}/libvncclient)
-set(LIBVNCSRVTEST_DIR ${CMAKE_SOURCE_DIR}/examples)
-set(LIBVNCCLITEST_DIR ${CMAKE_SOURCE_DIR}/client_examples)
-
set(LIBVNCSERVER_SOURCES
${LIBVNCSERVER_DIR}/main.c
${LIBVNCSERVER_DIR}/rfbserver.c
@@ -191,9 +195,7 @@ if(LIBVNCSERVER_WITH_WEBSOCKETS)
set(LIBVNCSERVER_SOURCES
${LIBVNCSERVER_SOURCES}
${LIBVNCSERVER_DIR}/websockets.c
- ${LIBVNCSERVER_DIR}/${WSSRCS}
- ${COMMON_DIR}/md5.c
- ${COMMON_DIR}/sha1.c
+ ${WSSRCS}
)
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
diff --git a/libvncserver/websockets.c b/libvncserver/websockets.c
index 7532e33..425bc15 100644
--- a/libvncserver/websockets.c
+++ b/libvncserver/websockets.c
@@ -527,7 +527,10 @@ webSocketsDecodeHixie(rfbClientPtr cl, char *dst, int len)
n = ws_peek(cl, buf, len*2+2);
if (n <= 0) {
+ /* save errno because rfbErr() will tamper it */
+ int olderrno = errno;
rfbErr("%s: peek (%d) %m\n", __func__, errno);
+ errno = olderrno;
return n;
}
@@ -642,14 +645,20 @@ webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len)
buf = wsctx->codeBuf;
header = (ws_header_t *)wsctx->codeBuf;
- if (-1 == (ret = ws_peek(cl, buf, B64LEN(len) + WSHLENMAX))) {
- rfbErr("%s: peek; %m\n", __func__);
- goto spor;
- }
+ ret = ws_peek(cl, buf, B64LEN(len) + WSHLENMAX);
if (ret < 2) {
- rfbErr("%s: peek; got %d bytes\n", __func__, ret);
- goto spor; /* Incomplete frame header */
+ /* save errno because rfbErr() will tamper it */
+ if (-1 == ret) {
+ int olderrno = errno;
+ rfbErr("%s: peek; %m\n", __func__);
+ errno = olderrno;
+ } else if (0 == ret) {
+ result = 0;
+ } else {
+ errno = EAGAIN;
+ }
+ goto spor;
}
opcode = header->b0 & 0x0f;
@@ -691,7 +700,9 @@ webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len)
payload = buf + fhlen + 4; /* header length + mask */
if (-1 == (ret = ws_read(cl, buf, total))) {
+ int olderrno = errno;
rfbErr("%s: read; %m", __func__);
+ errno = olderrno;
return ret;
} else if (ret < total) {
/* GT TODO: hmm? */
@@ -760,7 +771,7 @@ webSocketsEncodeHybi(rfbClientPtr cl, const char *src, int len, char **dst)
* 0xA - pong
**/
if (!len) {
- rfbLog("%s: nothing to encode\n", __func__);
+ /* nothing to encode */
return 0;
}