summaryrefslogtreecommitdiffstats
path: root/libvncclient
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2014-09-02 16:52:09 +0200
committerJohannes Schindelin <johannes.schindelin@gmx.de>2014-09-02 16:52:09 +0200
commit70783a4d60086f1a706bbbd8dedbc3b31a4a19a0 (patch)
tree70764988d22bc5eb501f04ed4d1188b2e16f1b8b /libvncclient
parent50dbe1df75d983cf7d69874383445fdff18de5a3 (diff)
parent54b2400dd761f484c9a5ac4cb63ac63fa1f6b503 (diff)
downloadlibtdevnc-70783a4d60086f1a706bbbd8dedbc3b31a4a19a0.tar.gz
libtdevnc-70783a4d60086f1a706bbbd8dedbc3b31a4a19a0.zip
Merge branch 'msvc'
This topic branch provides compatibility for Windows, without the MINGW32 dependency. It is based on https://github.com/LibVNC/libvncserver/pull/22. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Diffstat (limited to 'libvncclient')
-rw-r--r--libvncclient/listen.c8
-rw-r--r--libvncclient/rfbproto.c4
-rw-r--r--libvncclient/sockets.c8
-rw-r--r--libvncclient/tls_openssl.c68
-rw-r--r--libvncclient/vncviewer.c13
-rw-r--r--libvncclient/zrle.c2
6 files changed, 72 insertions, 31 deletions
diff --git a/libvncclient/listen.c b/libvncclient/listen.c
index c91ad6e..6d4ad54 100644
--- a/libvncclient/listen.c
+++ b/libvncclient/listen.c
@@ -27,11 +27,13 @@
#endif
#include <unistd.h>
#include <sys/types.h>
-#ifdef __MINGW32__
+#ifdef WIN32
#define close closesocket
#include <winsock2.h>
+#ifdef _MINGW32
#undef max
-#else
+#endif // #ifdef _MINGW32
+#else // #ifdef WIN32
#include <sys/wait.h>
#include <sys/utsname.h>
#endif
@@ -46,7 +48,7 @@
void
listenForIncomingConnections(rfbClient* client)
{
-#ifdef __MINGW32__
+#ifdef WIN32
/* FIXME */
rfbClientErr("listenForIncomingConnections on MinGW32 NOT IMPLEMENTED\n");
return;
diff --git a/libvncclient/rfbproto.c b/libvncclient/rfbproto.c
index 9d48b16..0afa3dc 100644
--- a/libvncclient/rfbproto.c
+++ b/libvncclient/rfbproto.c
@@ -64,6 +64,10 @@
#include "minilzo.h"
#include "tls.h"
+#ifdef _MSC_VER
+# define snprintf _snprintf
+#endif
+
/*
* rfbClientLog prints a time-stamped message to the log file (stderr).
*/
diff --git a/libvncclient/sockets.c b/libvncclient/sockets.c
index c97a90f..e50ef0e 100644
--- a/libvncclient/sockets.c
+++ b/libvncclient/sockets.c
@@ -38,7 +38,9 @@
#ifdef WIN32
#undef SOCKET
#include <winsock2.h>
+#ifdef MINGW32
#define EWOULDBLOCK WSAEWOULDBLOCK
+#endif
#define close closesocket
#define read(sock,buf,len) recv(sock,buf,len,0)
#define write(sock,buf,len) send(sock,buf,len,0)
@@ -57,6 +59,10 @@
#endif
#include "tls.h"
+#ifdef _MSC_VER
+# define snprintf _snprintf
+#endif
+
void PrintInHex(char *buf, int len);
rfbBool errorMessageOnReadFailure = TRUE;
@@ -105,7 +111,7 @@ ReadFromRFBServer(rfbClient* client, char *out, unsigned int n)
diff.tv_sec--;
diff.tv_usec+=1000000;
}
-#ifndef __MINGW32__
+#ifndef WIN32
sleep (diff.tv_sec);
usleep (diff.tv_usec);
#else
diff --git a/libvncclient/tls_openssl.c b/libvncclient/tls_openssl.c
index 529d476..669913d 100644
--- a/libvncclient/tls_openssl.c
+++ b/libvncclient/tls_openssl.c
@@ -27,28 +27,57 @@
#include <openssl/rand.h>
#include <openssl/x509.h>
+#ifdef _MSC_VER
+typedef CRITICAL_SECTION MUTEX_TYPE;
+#define MUTEX_INIT(mutex) InitializeCriticalSection(&mutex)
+#define MUTEX_FREE(mutex) DeleteCriticalSection(&mutex)
+#define MUTEX_LOCK(mutex) EnterCriticalSection(&mutex)
+#define MUTEX_UNLOCK(mutex) LeaveCriticalSection(&mutex)
+#define CURRENT_THREAD_ID GetCurrentThreadId()
+#else
+typedef pthread_mutex_t MUTEX_TYPE;
+#define MUTEX_INIT(mutex) {\
+ pthread_mutexattr_t mutexAttr;\
+ pthread_mutexattr_init(&mutexAttr);\
+ pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_RECURSIVE);\
+ pthread_mutex_init(&mutex, &mutexAttr);\
+}
+#define MUTEX_FREE(mutex) pthread_mutex_destroy(&mutex)
+#define MUTEX_LOCK(mutex) pthread_mutex_lock(&mutex)
+#define MUTEX_UNLOCK(mutex) pthread_mutex_unlock(&mutex)
+#define CURRENT_THREAD_ID pthread_self()
+#endif
+
+#ifndef _MSC_VER
#include <pthread.h>
+#endif
#include "tls.h"
+#ifdef _MSC_VER
+#include <BaseTsd.h> // That's for SSIZE_T
+typedef SSIZE_T ssize_t;
+#define snprintf _snprintf
+#endif
+
static rfbBool rfbTLSInitialized = FALSE;
-static pthread_mutex_t *mutex_buf = NULL;
+static MUTEX_TYPE *mutex_buf = NULL;
struct CRYPTO_dynlock_value {
- pthread_mutex_t mutex;
+ MUTEX_TYPE mutex;
};
static void locking_function(int mode, int n, const char *file, int line)
{
if (mode & CRYPTO_LOCK)
- pthread_mutex_lock(&mutex_buf[n]);
+ MUTEX_LOCK(mutex_buf[n]);
else
- pthread_mutex_unlock(&mutex_buf[n]);
+ MUTEX_UNLOCK(mutex_buf[n]);
}
static unsigned long id_function(void)
{
- return ((unsigned long) pthread_self());
+ return ((unsigned long) CURRENT_THREAD_ID);
}
static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line)
@@ -59,7 +88,7 @@ static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int li
malloc(sizeof(struct CRYPTO_dynlock_value));
if (!value)
goto err;
- pthread_mutex_init(&value->mutex, NULL);
+ MUTEX_INIT(value->mutex);
return value;
@@ -70,16 +99,16 @@ err:
static void dyn_lock_function (int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)
{
if (mode & CRYPTO_LOCK)
- pthread_mutex_lock(&l->mutex);
+ MUTEX_LOCK(l->mutex);
else
- pthread_mutex_unlock(&l->mutex);
+ MUTEX_UNLOCK(l->mutex);
}
static void
dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line)
{
- pthread_mutex_destroy(&l->mutex);
+ MUTEX_FREE(l->mutex);
free(l);
}
@@ -117,14 +146,14 @@ InitializeTLS(void)
if (rfbTLSInitialized) return TRUE;
- mutex_buf = malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+ mutex_buf = malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
if (mutex_buf == NULL) {
rfbClientLog("Failed to initialized OpenSSL: memory.\n");
return (-1);
}
for (i = 0; i < CRYPTO_num_locks(); i++)
- pthread_mutex_init(&mutex_buf[i], NULL);
+ MUTEX_INIT(mutex_buf[i]);
CRYPTO_set_locking_callback(locking_function);
CRYPTO_set_id_callback(id_function);
@@ -145,7 +174,6 @@ ssl_verify (int ok, X509_STORE_CTX *ctx)
{
unsigned char md5sum[16], fingerprint[40], *f;
rfbClient *client;
- char *prompt, *cert_str;
int err, i;
unsigned int md5len;
//char buf[257];
@@ -194,7 +222,7 @@ static int sock_read_ready(SSL *ssl, uint32_t ms)
FD_SET(SSL_get_fd(ssl), &fds);
tv.tv_sec = ms / 1000;
- tv.tv_usec = (ms % 1000) * 1000;
+ tv.tv_usec = (ms % 1000) * ms;
r = select (SSL_get_fd(ssl) + 1, &fds, NULL, NULL, &tv);
@@ -203,8 +231,6 @@ static int sock_read_ready(SSL *ssl, uint32_t ms)
static int wait_for_data(SSL *ssl, int ret, int timeout)
{
- struct timeval tv;
- fd_set fds;
int err;
int retval = 1;
@@ -237,7 +263,6 @@ open_ssl_connection (rfbClient *client, int sockfd, rfbBool anonTLS)
SSL_CTX *ssl_ctx = NULL;
SSL *ssl = NULL;
int n, finished = 0;
- BIO *sbio;
ssl_ctx = SSL_CTX_new (SSLv23_client_method ());
SSL_CTX_set_default_verify_paths (ssl_ctx);
@@ -276,8 +301,6 @@ open_ssl_connection (rfbClient *client, int sockfd, rfbBool anonTLS)
static rfbBool
InitializeTLSSession(rfbClient* client, rfbBool anonTLS)
{
- int ret;
-
if (client->tlsSession) return TRUE;
client->tlsSession = open_ssl_connection (client, client->sock, anonTLS);
@@ -310,7 +333,11 @@ return TRUE;
if (ret != -1)
{
rfbClientLog("TLS handshake blocking.\n");
- sleep(1);
+#ifdef WIN32
+ Sleep(1000);
+#else
+ sleep(1);
+#endif
timeout--;
continue;
}
@@ -415,7 +442,6 @@ HandleVeNCryptAuth(rfbClient* client)
uint32_t authScheme;
rfbBool anonTLS;
// gnutls_certificate_credentials_t x509_cred = NULL;
- int ret;
if (!InitializeTLS()) return FALSE;
@@ -577,7 +603,7 @@ void FreeTLS(rfbClient* client)
CRYPTO_set_id_callback(NULL);
for (i = 0; i < CRYPTO_num_locks(); i++)
- pthread_mutex_destroy(&mutex_buf[i]);
+ MUTEX_FREE(mutex_buf[i]);
free(mutex_buf);
mutex_buf = NULL;
}
diff --git a/libvncclient/vncviewer.c b/libvncclient/vncviewer.c
index 8237254..9d657ed 100644
--- a/libvncclient/vncviewer.c
+++ b/libvncclient/vncviewer.c
@@ -21,6 +21,11 @@
* vncviewer.c - the Xt-based VNC viewer.
*/
+#ifdef WIN32
+#undef SOCKET
+#include <winsock2.h>
+#endif
+
#ifdef __STRICT_ANSI__
#define _BSD_SOURCE
#define _POSIX_SOURCE
@@ -40,12 +45,10 @@ static rfbBool DummyPoint(rfbClient* client, int x, int y) {
static void DummyRect(rfbClient* client, int x, int y, int w, int h) {
}
-#ifdef __MINGW32__
+#ifdef WIN32
static char* NoPassword(rfbClient* client) {
return strdup("");
}
-#undef SOCKET
-#include <winsock2.h>
#define close closesocket
#else
#include <stdio.h>
@@ -53,9 +56,9 @@ static char* NoPassword(rfbClient* client) {
#endif
static char* ReadPassword(rfbClient* client) {
-#ifdef __MINGW32__
+#ifdef WIN32
/* FIXME */
- rfbClientErr("ReadPassword on MinGW32 NOT IMPLEMENTED\n");
+ rfbClientErr("ReadPassword on Windows NOT IMPLEMENTED\n");
return NoPassword(client);
#else
int i;
diff --git a/libvncclient/zrle.c b/libvncclient/zrle.c
index a14ad44..7f488b5 100644
--- a/libvncclient/zrle.c
+++ b/libvncclient/zrle.c
@@ -189,7 +189,7 @@ HandleZRLE (rfbClient* client, int rx, int ry, int rw, int rh)
} /* while ( remaining > 0 ) */
if ( inflateResult == Z_OK ) {
- void* buf=client->raw_buffer;
+ char* buf=client->raw_buffer;
int i,j;
remaining = client->raw_buffer_size-client->decompStream.avail_out;