diff options
| author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2014-09-02 16:52:09 +0200 |
|---|---|---|
| committer | Johannes Schindelin <johannes.schindelin@gmx.de> | 2014-09-02 16:52:09 +0200 |
| commit | 70783a4d60086f1a706bbbd8dedbc3b31a4a19a0 (patch) | |
| tree | 70764988d22bc5eb501f04ed4d1188b2e16f1b8b /libvncclient | |
| parent | 50dbe1df75d983cf7d69874383445fdff18de5a3 (diff) | |
| parent | 54b2400dd761f484c9a5ac4cb63ac63fa1f6b503 (diff) | |
| download | libtdevnc-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.c | 8 | ||||
| -rw-r--r-- | libvncclient/rfbproto.c | 4 | ||||
| -rw-r--r-- | libvncclient/sockets.c | 8 | ||||
| -rw-r--r-- | libvncclient/tls_openssl.c | 68 | ||||
| -rw-r--r-- | libvncclient/vncviewer.c | 13 | ||||
| -rw-r--r-- | libvncclient/zrle.c | 2 |
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; |
