summaryrefslogtreecommitdiffstats
path: root/libvncserver
diff options
context:
space:
mode:
Diffstat (limited to 'libvncserver')
-rw-r--r--libvncserver/Makefile.am74
-rw-r--r--libvncserver/httpd.c21
-rw-r--r--libvncserver/main.c36
-rw-r--r--libvncserver/rfbcrypto.h6
-rw-r--r--libvncserver/rfbserver.c3
-rw-r--r--libvncserver/scale.c13
-rw-r--r--libvncserver/sockets.c128
-rw-r--r--libvncserver/tightvnc-filetransfer/filetransfermsg.c2
-rw-r--r--libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c2
-rw-r--r--libvncserver/websockets.c56
10 files changed, 186 insertions, 155 deletions
diff --git a/libvncserver/Makefile.am b/libvncserver/Makefile.am
deleted file mode 100644
index 2f23e31..0000000
--- a/libvncserver/Makefile.am
+++ /dev/null
@@ -1,74 +0,0 @@
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/common
-
-if WITH_TIGHTVNC_FILETRANSFER
-TIGHTVNCFILETRANSFERHDRS=tightvnc-filetransfer/filelistinfo.h \
- tightvnc-filetransfer/filetransfermsg.h \
- tightvnc-filetransfer/handlefiletransferrequest.h \
- tightvnc-filetransfer/rfbtightproto.h
-
-TIGHTVNCFILETRANSFERSRCS = tightvnc-filetransfer/rfbtightserver.c \
- tightvnc-filetransfer/handlefiletransferrequest.c \
- tightvnc-filetransfer/filetransfermsg.c \
- tightvnc-filetransfer/filelistinfo.c
-endif
-
-if WITH_WEBSOCKETS
-
-if HAVE_GNUTLS
-WEBSOCKETSSSLSRCS = rfbssl_gnutls.c rfbcrypto_gnutls.c
-WEBSOCKETSSSLLIBS = @GNUTLS_LIBS@
-else
-if HAVE_LIBSSL
-WEBSOCKETSSSLSRCS = rfbssl_openssl.c rfbcrypto_openssl.c
-WEBSOCKETSSSLLIBS = @SSL_LIBS@ @CRYPT_LIBS@
-else
-WEBSOCKETSSSLSRCS = rfbssl_none.c rfbcrypto_included.c ../common/md5.c ../common/sha1.c
-endif
-endif
-
-WEBSOCKETSSRCS = websockets.c $(WEBSOCKETSSSLSRCS)
-endif
-
-includedir=$(prefix)/include/rfb
-
-include_HEADERS=../rfb/rfb.h ../rfb/rfbconfig.h \
- ../rfb/rfbproto.h ../rfb/keysym.h ../rfb/rfbregion.h ../rfb/rfbclient.h
-
-noinst_HEADERS=../common/d3des.h ../rfb/default8x16.h zrleoutstream.h \
- zrlepalettehelper.h zrletypes.h private.h scale.h rfbssl.h rfbcrypto.h \
- ../common/minilzo.h ../common/lzoconf.h ../common/lzodefs.h ../common/md5.h ../common/sha.h ../common/sha-private.h \
- $(TIGHTVNCFILETRANSFERHDRS)
-
-EXTRA_DIST=tableinit24.c tableinittctemplate.c tabletranstemplate.c \
- tableinitcmtemplate.c tabletrans24template.c \
- zrleencodetemplate.c
-
-if HAVE_LIBZ
-ZLIBSRCS = zlib.c zrle.c zrleoutstream.c zrlepalettehelper.c ../common/zywrletemplate.c
-if HAVE_LIBJPEG
-TIGHTSRCS = tight.c ../common/turbojpeg.c
-endif
-endif
-
-LIB_SRCS = main.c rfbserver.c rfbregion.c auth.c sockets.c $(WEBSOCKETSSRCS) \
- stats.c corre.c hextile.c rre.c translate.c cutpaste.c \
- httpd.c cursor.c font.c \
- draw.c selbox.c ../common/d3des.c ../common/vncauth.c cargs.c ../common/minilzo.c ultra.c scale.c \
- $(ZLIBSRCS) $(TIGHTSRCS) $(TIGHTVNCFILETRANSFERSRCS)
-
-libvncserver_la_SOURCES=$(LIB_SRCS)
-libvncserver_la_LIBADD=$(WEBSOCKETSSSLLIBS)
-
-lib_LTLIBRARIES=libvncserver.la
-libvncserver_la_LDFLAGS = -version-info 1:0:0
-
-if HAVE_RPM
-$(PACKAGE)-$(VERSION).tar.gz: dist
-
-# Rule to build RPM distribution package
-rpm: $(PACKAGE)-$(VERSION).tar.gz libvncserver.spec
- cp $(PACKAGE)-$(VERSION).tar.gz @RPMSOURCEDIR@
- rpmbuild -ba libvncserver.spec
-endif
-
-
diff --git a/libvncserver/httpd.c b/libvncserver/httpd.c
index 236ab3e..26d49af 100644
--- a/libvncserver/httpd.c
+++ b/libvncserver/httpd.c
@@ -47,6 +47,7 @@
#include <winsock2.h>
#include <ws2tcpip.h>
#define close closesocket
+#define strcasecmp _stricmp
#if defined(_MSC_VER)
#include <BaseTsd.h> /* For the missing ssize_t */
#define ssize_t SSIZE_T
@@ -81,9 +82,7 @@
"<HEAD><TITLE>Invalid Request</TITLE></HEAD>\n" \
"<BODY><H1>Invalid request</H1></BODY>\n"
-#define OK_STR "HTTP/1.0 200 OK\r\nConnection: close\r\n\r\n"
-#define OK_STR_HTML "HTTP/1.0 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n"
-
+#define OK_STR "HTTP/1.0 200 OK\r\nConnection: close\r\n"
static void httpProcessInput(rfbScreenInfoPtr screen);
@@ -454,10 +453,18 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
return;
}
- if(performSubstitutions) /* is the 'index.vnc' file */
- rfbWriteExact(&cl, OK_STR_HTML, strlen(OK_STR_HTML));
- else
- rfbWriteExact(&cl, OK_STR, strlen(OK_STR));
+ rfbWriteExact(&cl, OK_STR, strlen(OK_STR));
+ char *ext = strrchr(fname, '.');
+ char *contentType = "";
+ if(ext && strcasecmp(ext, ".vnc") == 0)
+ contentType = "Content-Type: text/html\r\n";
+ else if(ext && strcasecmp(ext, ".css") == 0)
+ contentType = "Content-Type: text/css\r\n";
+ else if(ext && strcasecmp(ext, ".svg") == 0)
+ contentType = "Content-Type: image/svg+xml\r\n";
+ rfbWriteExact(&cl, contentType, strlen(contentType));
+ /* end the header */
+ rfbWriteExact(&cl, "\r\n", 2);
while (1) {
int n = fread(buf, 1, BUF_SIZE-1, fd);
diff --git a/libvncserver/main.c b/libvncserver/main.c
index a8458e4..95c3da5 100644
--- a/libvncserver/main.c
+++ b/libvncserver/main.c
@@ -261,7 +261,16 @@ rfbLogProc rfbErr=rfbDefaultLog;
void rfbLogPerror(const char *str)
{
+#ifdef WIN32
+ wchar_t *s = NULL;
+ FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, errno, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)&s, 0, NULL);
+ rfbErr("%s: %S\n", str, s);
+ LocalFree(s);
+#else
rfbErr("%s: %s\n", str, strerror(errno));
+#endif
}
void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy)
@@ -582,7 +591,7 @@ listenerRun(void *data)
socklen_t len;
fd_set listen_fds; /* temp file descriptor list for select() */
- /* TODO: this thread wont die by restarting the server */
+ /* TODO: this thread won't die by restarting the server */
/* TODO: HTTP is not handled */
while (1) {
client_fd = -1;
@@ -612,21 +621,18 @@ listenerRun(void *data)
return(NULL);
}
-void
-rfbStartOnHoldClient(rfbClientPtr cl)
-{
- pthread_create(&cl->client_thread, NULL, clientInput, (void *)cl);
-}
-
-#else
+#endif
void
rfbStartOnHoldClient(rfbClientPtr cl)
{
- cl->onHold = FALSE;
+ cl->onHold = FALSE;
+#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
+ if(cl->screen->backgroundLoop)
+ pthread_create(&cl->client_thread, NULL, clientInput, (void *)cl);
+#endif
}
-#endif
void
rfbRefuseOnHoldClient(rfbClientPtr cl)
@@ -1055,7 +1061,15 @@ void rfbInitServer(rfbScreenInfoPtr screen)
{
#ifdef WIN32
WSADATA trash;
- WSAStartup(MAKEWORD(2,2),&trash);
+ static rfbBool WSAinitted=FALSE;
+ if(!WSAinitted) {
+ int i=WSAStartup(MAKEWORD(2,0),&trash);
+ if(i!=0) {
+ rfbErr("Couldn't init Windows Sockets\n");
+ return 0;
+ }
+ WSAinitted=TRUE;
+ }
#endif
rfbInitSockets(screen);
rfbHttpInitSockets(screen);
diff --git a/libvncserver/rfbcrypto.h b/libvncserver/rfbcrypto.h
index 9dc3e63..fec095e 100644
--- a/libvncserver/rfbcrypto.h
+++ b/libvncserver/rfbcrypto.h
@@ -1,12 +1,16 @@
#ifndef _RFB_CRYPTO_H
#define _RFB_CRYPTO_H 1
-#include <sys/uio.h>
+#include "rfb/rfbconfig.h"
#define SHA1_HASH_SIZE 20
#define MD5_HASH_SIZE 16
+#ifdef LIBVNCSERVER_HAVE_SYS_UIO_H
+#include <sys/uio.h>
+
void digestmd5(const struct iovec *iov, int iovcnt, void *dest);
void digestsha1(const struct iovec *iov, int iovcnt, void *dest);
+#endif
#endif
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
index bc9cc11..040238d 100644
--- a/libvncserver/rfbserver.c
+++ b/libvncserver/rfbserver.c
@@ -37,6 +37,7 @@
#include <rfb/rfb.h>
#include <rfb/rfbregion.h>
#include "private.h"
+#include "rfb/rfbconfig.h"
#ifdef LIBVNCSERVER_HAVE_FCNTL_H
#include <fcntl.h>
@@ -74,7 +75,9 @@
/* stst() */
#include <sys/types.h>
#include <sys/stat.h>
+#if LIBVNCSERVER_HAVE_UNISTD_H
#include <unistd.h>
+#endif
#ifndef WIN32
/* readdir() */
diff --git a/libvncserver/scale.c b/libvncserver/scale.c
index 3ca76dc..2325dc3 100644
--- a/libvncserver/scale.c
+++ b/libvncserver/scale.c
@@ -66,7 +66,18 @@
(double) ((int) (x)) : (double) ((int) (x) + 1) )
#define FLOOR(x) ( (double) ((int) (x)) )
-static inline int pad4(int value)
+#ifdef WIN32
+#define InlineX __inline
+#else
+# ifndef __STRICT_ANSI__
+# define InlineX inline
+# else
+# define InlineX
+# endif
+#endif
+
+
+static InlineX int pad4(int value)
{
int remainder = value & 3;
if (!remainder) return value;
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
index 51e86eb..bbc3d90 100644
--- a/libvncserver/sockets.c
+++ b/libvncserver/sockets.c
@@ -77,6 +77,10 @@
#include "rfbssl.h"
#endif
+#ifdef LIBVNCSERVER_WITH_SYSTEMD
+#include <systemd/sd-daemon.h>
+#endif
+
#if defined(__linux__) && defined(NEED_TIMEVAL)
struct timeval
{
@@ -122,6 +126,54 @@ int deny_severity=LOG_WARNING;
int rfbMaxClientWait = 20000; /* time (ms) after which we decide client has
gone away - needed to stop us hanging */
+static rfbBool
+rfbNewConnectionFromSock(rfbScreenInfoPtr rfbScreen, int sock)
+{
+ const int one = 1;
+#ifdef LIBVNCSERVER_IPv6
+ struct sockaddr_storage addr;
+#else
+ struct sockaddr_in addr;
+#endif
+ socklen_t addrlen = sizeof(addr);
+
+ getpeername(sock, (struct sockaddr *)&addr, &addrlen);
+
+ if(!rfbSetNonBlocking(sock)) {
+ rfbLogPerror("rfbCheckFds: setnonblock");
+ closesocket(sock);
+ return FALSE;
+ }
+
+ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
+ (char *)&one, sizeof(one)) < 0) {
+ rfbLogPerror("rfbCheckFds: setsockopt failed: can't set TCP_NODELAY flag, non TCP socket?");
+ }
+
+#ifdef USE_LIBWRAP
+ if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
+ STRING_UNKNOWN)) {
+ rfbLog("Rejected connection from client %s\n",
+ inet_ntoa(addr.sin_addr));
+ closesocket(sock);
+ return FALSE;
+ }
+#endif
+
+#ifdef LIBVNCSERVER_IPv6
+ char host[1024];
+ if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
+ rfbLogPerror("rfbProcessNewConnection: error in getnameinfo");
+ }
+ rfbLog("Got connection from client %s\n", host);
+#else
+ rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
+#endif
+
+ rfbNewClient(rfbScreen,sock);
+ return TRUE;
+}
+
/*
* rfbInitSockets sets up the TCP and UDP sockets to listen for RFB
* connections. It does nothing if called again.
@@ -138,6 +190,20 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
rfbScreen->socketState = RFB_SOCKET_READY;
+#ifdef LIBVNCSERVER_WITH_SYSTEMD
+ if (sd_listen_fds(0) == 1)
+ {
+ int sock = SD_LISTEN_FDS_START + 0;
+ if (sd_is_socket(sock, AF_UNSPEC, 0, 0))
+ rfbNewConnectionFromSock(rfbScreen, sock);
+ else if (sd_is_socket(sock, AF_UNSPEC, 0, 1))
+ rfbProcessNewConnection(rfbScreen);
+ return;
+ }
+ else
+ rfbLog("Unable to establish connection with systemd socket\n");
+#endif
+
if (rfbScreen->inetdSock != -1) {
const int one = 1;
@@ -155,10 +221,10 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
return;
}
- if(rfbScreen->autoPort) {
- int i;
- FD_ZERO(&(rfbScreen->allFds));
+ FD_ZERO(&(rfbScreen->allFds));
+ if(rfbScreen->autoPort && rfbScreen->port>0) {
+ int i;
rfbLog("Autoprobing TCP port \n");
for (i = 5900; i < 6000; i++) {
if ((rfbScreen->listenSock = rfbListenOnTCPPort(i, iface)) >= 0) {
@@ -175,8 +241,11 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
rfbLog("Autoprobing selected TCP port %d\n", rfbScreen->port);
FD_SET(rfbScreen->listenSock, &(rfbScreen->allFds));
rfbScreen->maxFd = rfbScreen->listenSock;
+ }
#ifdef LIBVNCSERVER_IPv6
+ if(rfbScreen->autoPort && rfbScreen->ipv6port>0) {
+ int i;
rfbLog("Autoprobing TCP6 port \n");
for (i = 5900; i < 6000; i++) {
if ((rfbScreen->listen6Sock = rfbListenOnTCP6Port(i, rfbScreen->listen6Interface)) >= 0) {
@@ -193,12 +262,11 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
rfbLog("Autoprobing selected TCP6 port %d\n", rfbScreen->ipv6port);
FD_SET(rfbScreen->listen6Sock, &(rfbScreen->allFds));
rfbScreen->maxFd = rfbMax((int)rfbScreen->listen6Sock,rfbScreen->maxFd);
-#endif
}
- else
- {
+#endif
+
+ if(!rfbScreen->autoPort) {
if(rfbScreen->port>0) {
- FD_ZERO(&(rfbScreen->allFds));
if ((rfbScreen->listenSock = rfbListenOnTCPPort(rfbScreen->port, iface)) < 0) {
rfbLogPerror("ListenOnTCPPort");
@@ -411,14 +479,7 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
rfbBool
rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
{
- const int one = 1;
int sock = -1;
-#ifdef LIBVNCSERVER_IPv6
- struct sockaddr_storage addr;
-#else
- struct sockaddr_in addr;
-#endif
- socklen_t addrlen = sizeof(addr);
fd_set listen_fds;
int chosen_listen_sock = -1;
@@ -439,47 +500,12 @@ rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
if (rfbScreen->listen6Sock >= 0 && FD_ISSET(rfbScreen->listen6Sock, &listen_fds))
chosen_listen_sock = rfbScreen->listen6Sock;
- if ((sock = accept(chosen_listen_sock,
- (struct sockaddr *)&addr, &addrlen)) < 0) {
+ if ((sock = accept(chosen_listen_sock, NULL, NULL)) < 0) {
rfbLogPerror("rfbCheckFds: accept");
return FALSE;
}
- if(!rfbSetNonBlocking(sock)) {
- closesocket(sock);
- return FALSE;
- }
-
- if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
- (char *)&one, sizeof(one)) < 0) {
- rfbLogPerror("rfbCheckFds: setsockopt failed: can't set TCP_NODELAY flag, non TCP socket?");
- }
-
-#ifdef USE_LIBWRAP
- if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
- STRING_UNKNOWN)) {
- rfbLog("Rejected connection from client %s\n",
- inet_ntoa(addr.sin_addr));
- closesocket(sock);
- return FALSE;
- }
-#endif
-
-#ifdef LIBVNCSERVER_IPv6
- {
- char host[1024];
- if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
- rfbLogPerror("rfbProcessNewConnection: error in getnameinfo");
- }
- rfbLog("Got connection from client %s\n", host);
- }
-#else
- rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
-#endif
-
- rfbNewClient(rfbScreen,sock);
-
- return TRUE;
+ return rfbNewConnectionFromSock(rfbScreen, sock);
}
diff --git a/libvncserver/tightvnc-filetransfer/filetransfermsg.c b/libvncserver/tightvnc-filetransfer/filetransfermsg.c
index 153f123..5f84e7f 100644
--- a/libvncserver/tightvnc-filetransfer/filetransfermsg.c
+++ b/libvncserver/tightvnc-filetransfer/filetransfermsg.c
@@ -56,7 +56,9 @@
#endif
#include <errno.h>
+#if LIBVNCSERVER_HAVE_UNISTD_H
#include <unistd.h>
+#endif
#include <sys/stat.h>
#include <sys/types.h>
diff --git a/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c b/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c
index b235fa0..c511eed 100644
--- a/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c
+++ b/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c
@@ -29,7 +29,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#if LIBVNCSERVER_HAVE_UNISTD_H
#include <unistd.h>
+#endif
#ifndef _MSC_VER
#include <dirent.h>
#include <pthread.h>
diff --git a/libvncserver/websockets.c b/libvncserver/websockets.c
index b5d99fc..72396c2 100644
--- a/libvncserver/websockets.c
+++ b/libvncserver/websockets.c
@@ -49,17 +49,32 @@
#endif
#include <string.h>
+#if LIBVNCSERVER_UNISTD_H
#include <unistd.h>
+#endif
#include "rfb/rfbconfig.h"
#include "rfbssl.h"
#include "rfbcrypto.h"
+#if defined(__APPLE__)
+
+#include <libkern/OSByteOrder.h>
+#define WS_NTOH64(n) OSSwapBigToHostInt64(n)
+#define WS_NTOH32(n) OSSwapBigToHostInt32(n)
+#define WS_NTOH16(n) OSSwapBigToHostInt16(n)
+#define WS_HTON64(n) OSSwapHostToBigInt64(n)
+#define WS_HTON16(n) OSSwapHostToBigInt16(n)
+
+#else
+
#define WS_NTOH64(n) htobe64(n)
#define WS_NTOH32(n) htobe32(n)
#define WS_NTOH16(n) htobe16(n)
#define WS_HTON64(n) htobe64(n)
#define WS_HTON16(n) htobe16(n)
+#endif
+
#define B64LEN(__x) (((__x + 2) / 3) * 12 / 3)
#define WSHLENMAX 14 /* 2 + sizeof(uint64_t) + sizeof(uint32_t) */
@@ -103,15 +118,27 @@ typedef union ws_mask_s {
* it from recognizing anonymous structs and unions.
* See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4784
*/
-typedef struct __attribute__ ((__packed__)) ws_header_s {
+typedef struct
+#if __GNUC__
+__attribute__ ((__packed__))
+#endif
+ws_header_s {
unsigned char b0;
unsigned char b1;
union {
- struct __attribute__ ((__packed__)) {
+ struct
+#if __GNUC__
+ __attribute__ ((__packed__))
+#endif
+ {
uint16_t l16;
ws_mask_t m16;
} s16;
- struct __attribute__ ((__packed__)) {
+ struct
+#if __GNUC__
+__attribute__ ((__packed__))
+#endif
+ {
uint64_t l64;
ws_mask_t m64;
} s64;
@@ -153,6 +180,11 @@ Sec-WebSocket-Accept: %s\r\n\
Sec-WebSocket-Protocol: %s\r\n\
\r\n"
+#define SERVER_HANDSHAKE_HYBI_NO_PROTOCOL "HTTP/1.1 101 Switching Protocols\r\n\
+Upgrade: websocket\r\n\
+Connection: Upgrade\r\n\
+Sec-WebSocket-Accept: %s\r\n\
+\r\n"
#define WEBSOCKETS_CLIENT_CONNECT_WAIT_MS 100
#define WEBSOCKETS_CLIENT_SEND_WAIT_MS 100
@@ -189,7 +221,7 @@ static void webSocketsGenSha1Key(char *target, int size, char *key)
iov[1].iov_base = GUID;
iov[1].iov_len = sizeof(GUID) - 1;
digestsha1(iov, 2, hash);
- if (-1 == __b64_ntop(hash, sizeof(hash), target, size))
+ if (-1 == b64_ntop(hash, sizeof(hash), target, size))
rfbErr("b64_ntop failed\n");
}
@@ -390,8 +422,12 @@ webSocketsHandshake(rfbClientPtr cl, char *scheme)
char accept[B64LEN(SHA1_HASH_SIZE) + 1];
rfbLog(" - WebSockets client version hybi-%02d\n", sec_ws_version);
webSocketsGenSha1Key(accept, sizeof(accept), sec_ws_key);
- len = snprintf(response, WEBSOCKETS_MAX_HANDSHAKE_LEN,
- SERVER_HANDSHAKE_HYBI, accept, protocol);
+ if(strlen(protocol) > 0)
+ len = snprintf(response, WEBSOCKETS_MAX_HANDSHAKE_LEN,
+ SERVER_HANDSHAKE_HYBI, accept, protocol);
+ else
+ len = snprintf(response, WEBSOCKETS_MAX_HANDSHAKE_LEN,
+ SERVER_HANDSHAKE_HYBI_NO_PROTOCOL, accept);
} else {
/* older hixie handshake, this could be removed if
* a final standard is established */
@@ -492,7 +528,7 @@ webSocketsEncodeHixie(rfbClientPtr cl, const char *src, int len, char **dst)
ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx;
wsctx->codeBufEncode[sz++] = '\x00';
- len = __b64_ntop((unsigned char *)src, len, wsctx->codeBufEncode+sz, sizeof(wsctx->codeBufEncode) - (sz + 1));
+ len = b64_ntop((unsigned char *)src, len, wsctx->codeBufEncode+sz, sizeof(wsctx->codeBufEncode) - (sz + 1));
if (len < 0) {
return len;
}
@@ -603,7 +639,7 @@ webSocketsDecodeHixie(rfbClientPtr cl, char *dst, int len)
/* Decode the rest of what we need */
buf[needlen] = '\x00'; /* Replace end marker with end of string */
/* rfbLog("buf: %s\n", buf); */
- n = __b64_pton(buf, (unsigned char *)dst+retlen, 2+len);
+ n = b64_pton(buf, (unsigned char *)dst+retlen, 2+len);
if (n < len) {
rfbErr("Base64 decode error\n");
errno = EIO;
@@ -743,7 +779,7 @@ webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len)
errno = ECONNRESET;
break;
case WS_OPCODE_TEXT_FRAME:
- if (-1 == (flength = __b64_pton(payload, (unsigned char *)wsctx->codeBufDecode, sizeof(wsctx->codeBufDecode)))) {
+ if (-1 == (flength = b64_pton(payload, (unsigned char *)wsctx->codeBufDecode, sizeof(wsctx->codeBufDecode)))) {
rfbErr("%s: Base64 decode error; %m\n", __func__);
break;
}
@@ -817,7 +853,7 @@ webSocketsEncodeHybi(rfbClientPtr cl, const char *src, int len, char **dst)
}
if (wsctx->base64) {
- if (-1 == (ret = __b64_ntop((unsigned char *)src, len, wsctx->codeBufEncode + sz, sizeof(wsctx->codeBufEncode) - sz))) {
+ if (-1 == (ret = b64_ntop((unsigned char *)src, len, wsctx->codeBufEncode + sz, sizeof(wsctx->codeBufEncode) - sz))) {
rfbErr("%s: Base 64 encode failed\n", __func__);
} else {
if (ret != blen)